Объявления методов Set () и Get о, обеспечивающих доступ к внутренним символам, при использовании булевых значений выглядят тривиально. Первая функция (Set ()) может перекрываться для обеспечения работы с различными типами данных (проще говоря, в случае необходимости можно ее скопировать и изменить тип последнего параметра). Вторую же функцию (Get ()) во избежание конфликтов в ситуациях, когда нужно работать с разными типами данных, лучше скопировать и переименовать (например, в GetBool ()). Конечно, другими способами гарантировать устранение угрозы возникновения ошибки, вызванной несоответствием типов, нельзя, поскольку функции для разных типов Get () различаются только типом возвращаемого значения. (На это обязательно укажет компилятор.)
void Set{ const string& symbol, const bool value ); bool Get{ const stringSc symbol ) const;
Хотя задача динамического добавления правил в систему не относится к разряду постоянно используемых, однако, в случае необходимости, ее также можно решить с помощью следующих двух методов.
void AddCondition{ const string& symbol, const bool value ); bool SetAction{ const stringSc action );
Первый метод может вызываться несколько раз подряд, чтобы обеспечить конъюнкцию, а второй предназначен для проверки условия и назначения ему конкретной операции.
Реализация
После того как мы определили формалііммй интерфейс, реализация RBS-системы — это, как говорится, дело техники. Для ранения базы правил и рабочей памяти можно предусмотреть повторное использование контейнеров из библиотеки STL, а остальной код реализуется также достаточно просто. Использование гибкого формата файлов (как, например, показано в пре;гіядушем разделе) позволяет возложить задачу написания технического задания на самого разработчика. В частности, задача упрощается еще и потому, что, благодаря использованию приоритетов правил, алгоритм работы интерпретатора может быть достаточно простым, при этом полностью соопветствуя требованиям инженера по представлению знаний.
Поскольку реализация выполняется прозрачно и скрыта за интерфейсом, расширение модуля, скорее всего, не нарушит работоспособности всей системы. Например, если мы захотим оптимизировать правила, можем построить дерево внутри системы после загрузки правил (хотя при этом, возможно, придется игнорировать их рейтинги).