Одним из важнейших средств обеспечения эффективности реализации является представление символов не в виде строк, а в виде целых чисел. Поскольку все интерфейсы работают со строками (это обеспечивает интуитивность на этапе инициализации), нужно создать внутренний механизм, выполняющий преобразование строк в соответствующие целочисленные символы.
Когда это будет сделано, рабочую память можно представить в виде простого массива, напрямую индексируемого целочисленными символами. Это позволит ассоциировать по целочисленному индексу эффекторы и сенсоры, хранящиеся в двух контейнерах, с соответствующими внешними функциями, передаваемыми через интерфейс.
Интерпретатор
Как вы уже знаете, основной цикл интерпретатора разбит на три основных этапа. На первом этапе функция CheckSensors () выполняет вызов внешних функций для установки соответствующих символов. Выполнение этого вызова до перехода к этапу проверки соответствия гарантирует нам, что функция будет вызвана только один раз. Тем не менее мы можем, в принципе, пожертвовать небольшим объемом памяти и применить механизм предварительной оценки (например, проверяя бит gathered). В таком случае внешние функции будут проверяться при выборке правил только в том случае, если значение соответствующего символа не обновлено.
Затем вызывается функция ApplyRules (), которая сканирует все правила в том порядке, в котором они были заданы. При этом последовательно проверяется выполнение условий, содержащихся в заголовке каждого правила. Если одно из условий не выполняется, проверка прерывается и осуществляется переход к проверке следующего правила. Если все условия выполняются, символам назначаются значения, заданные по умолчанию. Только после этого выполняется тело правила для перекрытия значений, назначенных по умолчанию, а также для установки значений других символов. Если не будет найдено ни одно правило, применяются значения символов, заданные по умолчанию.
Наконец вызывается функция CheckEffectorsO, которая сканирует лишь символы эффекторов в рабочей памяти и, если находит символы, которые имеют значение true, вызывает соответствующие внешние функции. Поскольку мы используем RBS-систему для управления, проверка эффекторов на каждой итерации является более приемлемым решением, чем при выполнении соответствующего правила, поскольку это позволяет снизить количество требуемых правил