Полный листинг программы
;;ПЕРЕХОД К АНАЛИЗУ СЛЕДУЮЩЕГО "МИРА" И ;;ВЫВОД ОТЧЕТА О РЕЗУЛЬТАТАХ ;;Переход к анализу следующего "мира", ;;ЕСЛИ никакие другие правила не ожидают активизации, ;;ТО анализ текущего "мира" завершен и ;;можно приступить к формированию нового "мира", ;;если имеются необработанные высказывания. ;;ПРИМЕЧАНИЕ. Это правило имеет приоритет, ;;более низкий, чем все прочие правила, ;;исключая правило вывода результатов, (defrule move (declare (salience -50)) ;;Существует "мир", сформированный на основе ;;исходного высказывания. ?W ← (world (tag?N&:(>?N 0)) (task check)) ;;В базе фактов отсутствуют объекты world, ;;созданные позже текущего. (not (world (tag?T&:(>?T?N)))) В базе фактов имеется высказывание, подготовленное к созданию нового объекта world. (statement (reason 0) (done 0)) › ;; Сформировать новый объект world на основе ;; этого объекта statement. (assert (world (tag (+?N 1)))) ) ;;ЕСЛИ отсутствуют противоречия в объектах world, ;;ТО распечатать результаты. ;;ПРИМЕЧАНИЕ. Это правило будет активизироваться ;;повторно до тех пор, пока не будет выведена ;;непротиворечивая интерпретация, (defrule report-results (declare (salience -40)) (not (world (task contra))) (not (statement (reason 0) (done 0))) (statement (tag?N) (done?MS~0)) (claim (content?P?X) (reason?N)) › (printout t crlf "RESULT: "?P?X " from statement "?N ;; "РЕЗУЛЬТАТ: "?P?X " из высказывания "?N t crlf) ;; ЕСЛИ противоречие остается и после анализа всех точек отката ;; и нет больше правил, которые можно было бы активизировать, ;; ТО прекратить процесс вычислений, (defrule sanity-check (declare (salience -100)) (world (tag?N) (task?T&:(or (eg?T contra) (eq?T back)))) (not (world (tag?M&:(<?M?N)) (scope truth) (task check))) › (printout t crlf "FAIL: Statements inconsistent, detected in world "?N ;; "РЕШЕНИЕ НЕ НАЙДЕНО: Высказывания противоречивы, ;; обнаружены в мире "?N t crlf) (halt) )
Я не сомневаюсь в том, что эту программу можно совершенствовать и далее. Можно, например, попытаться использовать технологию отката, основанную на комбинировании направленных и хронологических методов поиска точки возврата. Но и в том виде, в каком она здесь представлена, программа справляется со всеми сформулированными в тексте приложения задачами. Анализируя текст программы, вы можете убедиться в том, что язык CLIPS позволяет реализовать многие из описанных в данной книге технологий, в частности:
- методику прямого логического вывода, которая обеспечивает разрешение конфликтов (глава 5);
- целенаправленный логический вывод с использованием лексем задач (главы 5 и 14);
- анализ множества контекстов при разных исходных предположениях (главы 17 и 19).
На примере этой программы вы также могли убедиться в том, что несмотря на модульную структуру, расширение ее функциональных возможностей сопряжено с определенной модификацией ранее разработанных модулей (правил), которые должны учитывать изменения, вносимые в структуру данных.