Будем считать, что в нашем случае оптимальным решением является RBS-система, реализованная в виде модуля. Это означает, что нам нужно принять решение, какой тип выборки будет использоваться этой RBS-системой. Учитывая особенности различных типов выборки, описанные в главе 11, "Системы, основанные на правилах", мы остановимся на выборке с прямым логическим выводом, исходя из двух следующих соображений.
> Имитация поведения. Поскольку мы собираемся имитировать управление поведением, а не решение проблем, выборка с обратным логическим выводом является не самым лучшим вариантом.
> Процедурные операции. При выборке с прямым логическим выводом тела правил не обязательно должны иметь декларативную форму. Иными словами, RBS-система может выполнять соответствующие операщіи, не владея информацией о том, в какой форме они записаны. Это позволит нам использовать жесткое программирование основных операций непосредственно в программном коде. Таким образом, мы можем получить значительный выигрыш в гибкости и эффективности, обеспечиваемый с помощью программирования на языке C++.
Основная цель, которую мы преследуем, используя выборку с прямым логическим выводом, заключается в одновременной реализации жестко запрограммированных эффекторов (которые выполняют все операции в окружающей среде) и декларативных (т.е. гибко определенных) условий, загружаемых из файла. Реализацию сенсоров мы обеспечим в неявной форме, используя препроцессинг для сбора информации об окружающей среде.
Упрощение правил
Даже сложные правила с концептуальной точки ^)ения представляют собой довольно простые конструкции, однако в идеальном случае всегда нужно стремиться снизить уровень сложности до минимального (это касается как заголовков, так и тел правил). Кроме того, нужно минимизировать количество правил. Понятно, что если нам удастся решить эту задачу, мы в значительной степени упростим процесс накопления знаний.
Если каждому правилу задать неявный рейтинг, это будет для интерпретатора своего рода подсказкой о том, какие правила следует выбирать прежде всего. Когда обработка начинается с правил, имеющих более высокий приоритет, можно считать, выбирая последующие правила, что условия предыдушдх правил истинны. Это позволяет упростить условия правил, снижая их сложность в соответсвии с рештшгом.
Кроме того, в телах разных правил одним и тем же символам часто назначаются одни и те же значения. Например, все правила, кроме одного, могут назначать символу А значение true. Понятно, что явное включение такой операции в каждое правило приводит к ненужной избыточности. Вместо этого мы можем использовать значения, присваиваемые по умолчанию (т.е. по умолчанию считать, что А присвоено значение true, кроме тех случаев, когда А будет явно присвоено иное значение).
Наконец, чтобы уменьшить количество правил, мы можем разрешить выполнение нескольких операций в теле одного правила. Это позволит нам избежать дубли-
Глава 12. Синтез перемещений в системах, основанных на правилах 193
рования правил, а также обеспечить поддержку атомарных операций. В некоторых случаях нам придется устанавливать в одном правиле значения двух символов сразу, чтобы не ждать выполнения второго оператора присваивания в очередном цикле интерпретатора.