Смекни!
smekni.com

Программирование на языке CLIPS (стр. 12 из 12)

;; предположив лживость высказывания.

(defrule restart

(declare (salience 20))

?W <- (world (tag ?M) (scope truth)

(task back) (context ?C&~1))

=>

(modify ?W (scope falsity) (task check) (context 0))

)

;;----------------------------------------------------------------------

;; ПЕРЕХОД К АНАЛИЗУ СЛЕДУЮЩЕГО «МИРА» И

;; ВЫВОД ОТЧЕТА О РЕЗУЛЬТАТАХ

;;----------------------------------------------------------------------

;; Переход к анализу следующего «мира»,

;; ЕСЛИ никакие другие правила не ожидают активизации,

;; ТО анализ текущего «мира» завершён и

;; можно приступить к формированию нового «мира»,

;; если имеются необработанные высказывания.

;; ПРИМЕЧАНИЕ. Это правило имеет приоритет,

;; более низкий, чем все прочие правила,

;; исключая правило вывода результатов.

(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-result

(declare (salience -40))

(not (world (task contra)))

(not (statement (reason 0) (done 0)))

(statement (tag ?N) (done ?M&~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 (eq ?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. СТИЛЬ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ CLIPS

В главе 17 был представлен обзор инструментальных средств конструирования экспертных систем и ряд рекомендаций, касающихся методики их проектирования. Многие из описанных в той главе средств имеют функциональные возможности, весьма близкие к тем которые вы можете найти в CLIPS. Большинство рекомендаций, относящихся к методике проектирования систем, основанных на правилах, сохраняют свою силу и при использовании в качестве основного инструмента проектирования языка CLIPS. В частности, работая с CLIPS, нужно стараться так организовать систему правил, чтобы каждое из них было как можно проще. Я бы рекомендовал вновь перечитать главу 17 после того, как вы внимательно проанализируете описанную в этом Приложении программу.

Эта программа является относительно простой и включает всего 35 правил, тогда как в практических экспертных системах их может быть значительно больше. Наприме, в прототипе системы R1/XCON, который был разработан в 1980 году, содержалось около 750 правил, причём по мере совершенствования системы их число росло и к 1984 году достигло 3300. В среднем каждое правило в R1 анализирует шесть условий и выполняет три действия.

Как и при программировании любфх других задач, ключевым условием разработки «хорошого» программного кода является правильный выбор набора абстрактных понятий, которыми должна манипулировать программа, и набора операций, которые она должна выполнять. Первое условие поможет рационально выбрать структуру объектов и форму представления условий в левой части правил, а второе – рационально организовать действия в правой части. Как было сказано в разделе А.3, использование объектов и обработчиков сообщений позволяет успешно решить задачу рациональной организации данных и процедур в программе.