Возможные усовершенствования
Рассматриваемый в данном разделе простой интерпретатор для программ, управляемых шаблонами, вполне позволяет проиллюстрировать некоторые идеи программирования, управляемого шаблонами. Но для использования в более сложных приложениях он должен быть доработан в определенных отношениях. Ниже приведены некоторые критические замечания и указания по его усовершенствованию.
В данном интерпретаторе разрешение конфликтов сводится к использованию постоянной, заранее определенной последовательности модулей. Но часто требуются более гибкие схемы. Для обеспечения более сложного управления необходимо организовать поиск всех потенциально активных модулей и передачу их в специальный, программируемый пользователем модуль управления.
Если база данных велика и в программе содержится много модулей, управляемых шаблонами, то процесс сопоставления с шаблонами может стать чрезвычайно неэффективным. В этом отношении эффективность может быть повышена за счет более продуманной организации базы данных. Для этого может потребоваться индексация информации в базе данных, сегментирование информации на подбазы или сегментирование множества управляемых шаблонами модулей на подмножества. Преимущество сегментирования состоит в том, что в любой конкретный момент времени доступ предоставляется только к подмножеству базы данных или к определенной части модулей, поэтому сопоставление с шаблоном ограничивается только этим подмножеством или этой частью. Безусловно, в таком случае требуется более развитый механизм управления, который позволил бы обеспечить переход от одного из таких подмножеств к другому по принципу активизации подмножеств или перевода их из активного состояния в пассивное. Для этого могут использоваться своего рода метаправила.
К сожалению, рассматриваемый интерпретатор в том виде, в каком он реализован
в программе, исключает возможность применять какие-либо методы перебора с воз
вратами, поскольку в нем предусмотрен способ непосредственного манипулирования
базой данных с помощью предикатов sssertz и retract. Поэтому мы не имеем воз
можности изучать альтернативные пути выполнения. Указанный недостаток можно
устранить, используя другую реализацию базы данных, в которой не применяются
предикаты asserts и retract языка Prolog. Один из способов решения такой зада
чи может предусматривать представление всего состояния базы данных с помощью
терма Prolog, передаваемого в качестве параметра в процедуру run. Наиболее про
стая возможность реализации такого решения состоит в организации этого терма как
списка объектов в базе данных. В подобном случае верхний уровень интерпретатора
может выглядеть следующим образом:
run( State) :-
Condition----------> Action,
Часть [!. Применение языка Prolog в области искусственного интеллекта
test! Condition, State), execute[ Action, State).
Затем процедура execute вычисляет новое состояние и вызывает процедуру run с
этим новым состоянием.
Проект
Реализуйте интерпретатор для программ, управляемых шаблонами, в котором база данных не сопровождается в виде собственной внутренней базы данных Prolog (т.е. с помощью предикатов assertz и retract), а для ее сопровождения используется параметр процедуры, в соответствии с приведенным выше замечанием. В таком случае новый интерпретатор будет обеспечивать автоматический перебор с возвратами. Попробуйте спроектировать представление базы данных, которое обеспечивало бы эффективное сопоставление с шаблонами.