Автор: Пользователь скрыл имя, 04 Марта 2013 в 18:15, курсовая работа
Название языка CLIPS – аббревиатура от C Language Integrated Production System. Язык был разработан в центре космических исследований NASA
{NASA’s Johnson Space Center} в середине 1980-х годов и во многом сходен с языками , созданными на базе LIPS, в частности OPS5 и ART. Использование C в качестве языка реализации объясняется тем, что компилятор LISP не поддерживается частью распространенных платформ, а также сложностью интеграции LISP-кода в приложения, которые используют отличный от LIPS язык программирования.
А.1. Краткая история CLIPS 3
А.2. Правила и функции в CLIPS 3
А.3. Обектно-ориентированные средства в CLIPS 10
А.4. Задача «Правдолюбцы и лжецы» 15
А.5 Стиль программирования на языке CLIPS 66
(defrule undirected-falsity
(declare (salience 20))
(world (tag ?N) (scope falsity) (task contra))
?W <- (world (tag ?M&: (< ?M ?N))
(scope truth) (task check))
=>
(modify ?W (task back))
)
;;----------------------------
;; Хронологический откат к тому «миру», который был
;; покинут без завершения анализа дизъюнктов.
(defrule undirected-disjunct
(declare (salience 20))
(world (tag ?N) (scope falsity) (task contra))
?V <- (world (tag ?M&: (< ?M ?N)) (task check)
(context 1))
(claim (content OR ?P ?X ?Q ?Y) (reason ?M)
(scope ?S))
=>
;; Дизъюнкт в ране покинутом «мире», анализ которого
;; не был выполнен.
(assert (claim (content ?Q ?Y) (reason ?M) (scope ?S)
(context 2))
;; Зафиксировать необходимость отката в этот «мир».
(modify ?V (task back))
)
;;----------------------------
;; Удаление объектов world.
;; ЕСЛИ выполняется откат к объекту М,
;; ТО удалить все объекты world,
;; имеющие идентификатор, больший М.
(defrule undo-world
(declare (salience 50))
(world (tag ?M) (task back))
?W <- (world (tag ?N&: (> ?N ?M)))
=>
(retract ?W)
)
;;----------------------------
;; Откат к прежним высказываниям.
(defrule restate
(declare (salience 50))
(world (tag ?M) (task back))
?S <- (statement (tag ?N&: (> ?N ?M))
(reason 0) (done ?X&~0)
=>
(modify ?S (done 0))
)
;;----------------------------
;; Удаление объектов claim.
;; ЕСЛИ выполняется откат к объекту world M,
;; ТО удалить все объекты claim,
;; связанные с удалёнными объектами world.
(defrule unclaim
(declare (salience 30))
(world (tag ?M) (task back))
?F <- (claim (reason ?N&: (> ?N ?M)))
=>
(retract ?F)
)
;;----------------------------
;; Возобновление процесса вычислений,
;; начиная с точки возврата.
;; ЕСЛИ все объекты world, созданные
;; после объекта М, удалены,
;; ТО повторно сформировать объект М,
;; предположив лживость высказывания.
(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)
)
Я не сомневаюсь в том,
что эту программу можно
На примере этой программы вы также могли убедиться в том, что несмотря на модульную структуру, расширение её функциональных возможностей сопряжено с определённой модификацией ранее разработанных модулей (правил), которые должны учитывать изменения, вносимые в структуру данных.
А.5. СТИЛЬ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ CLIPS
В главе 17 был представлен обзор инструментальных средств конструирования экспертных систем и ряд рекомендаций, касающихся методики их проектирования. Многие из описанных в той главе средств имеют функциональные возможности, весьма близкие к тем которые вы можете найти в CLIPS. Большинство рекомендаций, относящихся к методике проектирования систем, основанных на правилах, сохраняют свою силу и при использовании в качестве основного инструмента проектирования языка CLIPS. В частности, работая с CLIPS, нужно стараться так организовать систему правил, чтобы каждое из них было как можно проще. Я бы рекомендовал вновь перечитать главу 17 после того, как вы внимательно проанализируете описанную в этом Приложении программу.
Эта программа является относительно простой и включает всего 35 правил, тогда как в практических экспертных системах их может быть значительно больше. Наприме, в прототипе системы R1/XCON, который был разработан в 1980 году, содержалось около 750 правил, причём по мере совершенствования системы их число росло и к 1984 году достигло 3300. В среднем каждое правило в R1 анализирует шесть условий и выполняет три действия.
Как и при программировании любфх других задач, ключевым условием разработки «хорошого» программного кода является правильный выбор набора абстрактных понятий, которыми должна манипулировать программа, и набора операций, которые она должна выполнять. Первое условие поможет рационально выбрать структуру объектов и форму представления условий в левой части правил, а второе – рационально организовать действия в правой части. Как было сказано в разделе А.3, использование объектов и обработчиков сообщений позволяет успешно решить задачу рациональной организации данных и процедур в программе.