Эффективность RBS-решений

При выполнении программного кода систем, основанных на знаниях, максимальная вычислительная нагрузка приходится на обработку правил. Давайте проанализируем оба аспекта таких правил (условия и операции) в терминах процедурного (с жестким кодированием) и декларативного (управляемого данными) подходов.
Процедурный подход (правила жестко записаны в программном коде):
if (а && b && с) { d = true; }
Декларативный подход (правила хранятся во внешнем файле):
IF а AND b AND с THEN d
С точки зрения одной лишь скорости выполнения, система с жестко запрограммированными правилами всегда будет значительно опережать систему, построенную на любых других принципах (например, управляемую сценариями или интерпретирующую). Однако это вовсе не является основанием для отказа от декларативного подхода, поскольку система, построенная на процедурном подходе, не может применять высокоуровневый анализ условий. С другой стороны, когда правила обрабатываются отдельно от программного кода, система может не только прочесть, но и проанализировать условия. Это позволяет RBS-модулю реорганизовать рабочие правила в более оптимальной форме (например, в виде дерева или графа). Таким образом, система, основанная на декларативном подходе, может минимизировать количество проверок соответствия каждого правила текущему состоянию. Поэтому в системах с очень большим количеством правил эффективность работы RBS-рещений, основанных на декларативном подходе, не только не уступает эффективности аналогичных решений, основанных на процедурном подходе, но и часто превосходит ее.
Что касается тела правила, то здесь картина также подобна описанной выше. Жестко закодированные операции выполняются более эффективно благодаря как прямому переводу их в машинный код, так и универсальности таких языков программирования, как C++. С другой стороны, декларативный подход, обеспечивая немного больше гибкости во время выполнения, значительно отстает от процедурного по скорости, а также по ограничениям синтаксиса (обычно весь "синтаксис" сводится к установке значений символов в рабочей памяти системы). Если вам нужно применить выборку с обратным логическим выводом, то с этими недостатками придется мириться. Однако в случае использования выборки с прямым логическим выводом можно применить компромиссное решение, которое заключается в жестком кодировании операций, используемых по умолчанию, с сохранением ссылок на них в небольшой базе данных. Затем создаются декларативные правила, которые, используя эту базу данных, вызывают соответствующие операции во время выполнения. Таким образом, мы получаем решение, использующее преимущества обоих подходов одновременно!