Автор: Пользователь скрыл имя, 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
NOT AND F A T B.
Легче всего восстановить исходный вид выражения, представленного в польской нотации, просматривая его справа налево. При этом операнды считываются до тех пор, пока не встретится объединяющий их оператор. Полученное выражение оказвается операндом следующего оператора. В представленном выше выражении В является операндом одноместного оператора Т, а пара операндов Т(В) и F(A) объединяется оператором AND.
Задавшись таким способом представления составных высказываний, сформируем правило выполнения отрицания дизъюнктивной и конъюнктивной форм, в котором будет использоваться функция flip, заменяющая “T” на “F” и наоборот.
(defrule not-or
?F <- (claim (content NOT OR ?P ?X ?Q ?Y))
=>
(modify ?F (content AND (flip ?P) ?X (flip ?Q) ?Y))
)
(defrule not-and
?F <- (claim (content NOT AND ?P ?X ?Q ?Y))
=>
(modify ?F (content OR (flip ?P) ?X (flip ?Q) ?Y))
)
Использование функции flip упрощает преобразование и позволяет перейти от выражения
NOT AND F A T B
Прямо к
OR T A F B,
Минуя
OR NOT F A NOT T B.
Функция flip определена следующим образом:
(deffunction flip (?P)
(if (eq ?P T) then F else T)
)
Для упрощения мы ограничимся утверждениями в виде простых дизъюнкций или конъюнкций вида
T(A)vT(B)
Или
F(A)^T(B),
Но не будем использовать более сложные утверждения в форме
F(B)^(T(A)vT(B))
Или
-(F(A)vF(B))^(T(A)vT(B)),
поскольку для решения большинства интересных головоломок вполне достаточно простых выражений.
Наибольшие сложности при
Реализовать такой анализ локальных и глобальных противоречий можно, добавив в шаблон объекта claim атрибут contest:
(deftemplate claim
(multifield content (type SYMBOL))
(multifield reason (type INTEGER) (default 0))
(field scope (type SYMBOL))
(field context (type INTEGER) (default 0))
)
Значение 0 в поле context означает, что мы имеем дело с глобальным контекстом, значение 1 – с локальным контекстом левого операнда, а значение2 – с локальным контекстом правого операнда дизъюнкции. Пусть, например, анализируется дизъюнкция
T(A)vF(B),
Причем Т(А) будет истинным в контексте 1, а F(B) – истинным в контексте 2. В этом случае все выражение будет истинным глобально, т.е. в контексте 0.
Структуру объекта world также нужно модифицировать – внести в нее поле context. Это позволит отслеживать ход вычислений. Пусть, например, объект world имеет вид
(world (tag 1) (scope truth) (context 2)).
Это означает, что данный «мир» создан следующей парой предположений:
Новый вариант шаблона объекта world приведен ниже.
;; Объект world представляет контекст,
;; сформированный определенными предположениями
;; о правдтвости или лживости персонажей.
;; Объект имеет уникальный
;; а смысл допущения –
;; фиксируется в поле scope.
;; В поле context сохраняется текущий контекст
;; анализируемого операнда
;; 0 означает глобальный контекст дизъюнкции,
;; 1 означает левый операнд,
;; 2 означает правый операнд.
(deftemplate world
(field tag (type INTEGER) (default 1))
(field scope (type SYMBOL) (default truth))
(field context (type INTEGER) (default 0))
)
Следующий шаг – разработка правил, манипулирующих контекстом. Приведенное ниже правило формирует контекст для левого операнда дизъюнкции.
(defrule left-or
?W <- (world (tag ?N) (context 0))
(claim (content OR ?P ?X ?Q ?Y) (reason ?N)
(scope ?V))
=>
(modify ?W (context 1))
(assert (claim
(content ?P ?X) (reason ?N) (scope ?V)
(context 1)))
)
Это правило устанавливает значение 1 в поле context объекта world т формирует соответствующий объект claim.
По этому же принципу разработаем правило для формирования контекста правого операнда дизъюнкции.
(defrule right-or
?W <- (world (tag ?N) (context 1))
(claim (content OR ?P ?X ?Q ?Y) (reason ?N)
(scope ?V))
=>
(modify ?W (context 2))
(assert (claim
(content ?Q ?Y) (reason ?N) (scope ?V)
(context 2))
)
Упражнение 2
Разработайте самостоятельно правило, которое оперировало бы с объектом claim содержим утверждение в конъюнктивной форме, как показано ниже.
(claim (content AND T A F B ) (reason 1) (scope truth))
Это правило должно разделить такое утверждение на два: суть первого – утверждение, что А – правдолюбец, а второго – утверждение, что В – лжец. Новяе объекты claim должны существовать в текущем контексте, определенном в объекте world.
Далее разработаем правила, чувствительные к контексту, которые будут выявлять наличие противоречий в анализируемых утверждениях.
;; Выявление противоречия между предположением о
;; правдивости и следующими из него фактами
;; в разных контекстах одного и того же объекта world.
(defrule contra-truth-scope
(declare (salience 10))
(world (tag ?N) (scope truth) (context ?T))
(claim
(content T ?X) (reason ?N) (scope truth)
(context ?S&: (< ?S ?T)))
?Q <- (claim (content P ?x) (reason ?N)
(scope truth) (context ?T))
=>
(printout t “Disjunct “ ?T
“ is inconsistent with earlier truth context. “
;; “Дизъюнкт “ ?T
;; “ противоречит ранее установленному контексту правдивости. “
crlf)
(retract ?Q)
)
;; Выявление противоречия между предположением о
;; лживости и следующими из него фактами
;; в разных контекстах
одного и того же объекта world
(defrule contra-falsity-scope
(declare (salience 10))
?W <- (world (tag ?N) (scope falsity) (context ?T))
(claim
(content F ?X) (reason ?N) (scope falsity)
(context ?S&: (< ?S ?T)))
?Q <- (claim (content T ?X) (reason ?N)
(scope falsity) (context ?T))
=>
(printout t “Disjunct “ ?T
“ is inconsistent with earlier falsity context. “
;; “Дизъюнкт” ?T
;; “ противоречит ранее установленному контексту лживости. “
crlf)
retract ?Q)
)
Нам потребуется модифицировать и
прежний вариант правила
;; Выявление противоречия между предположением о
;; правдивости и следующими из него фактами
;; в одном и том же контексте оджного и того же объекта world.
(defrule contra-truth
(declare (salience 10))
?W <- (world (tag ?N) (scope truth))
?P <- (claim (content T ?X) (reason ?N) (context ?S)
(scope truth))
?Q <- (claim (content F ?X) (reason ?N) (context ?S)
(scope truth))
=>
(printout t
“Statement is inconsistent if “?X “ is a knight”
;; “Высказывание противоречиво, если “? X
;; “ правдолюбец.”
crlf)
(retract ?Q)
(retract ?P)
(modify ?W (scope falsity) (context 0)
)
;; Выявление противоречия между предположением о
;; лживости и следующими из него фактами
;; в одном и том же контексте одного и того же объекта world.
(defrule contra-falsity
(declare (salience 10))
?W <- (world (tag ?N) (scope falsity))
?P <- (claim (content F ?X) (reason ?N) (context ?S)
(scope falsity))
?Q <- (claim (content T ?X) (reason ?N) (context ?S)
(scope falsity))
=>
(printout t
“Statement is inconsistent whether “ ?X
“ is a knight or knave.”
;; “Высказывание противоречиво, независимо от того,”
;; “является ли “ ?X “ прадолюбцем или лжецом.”
crlf)
(modify ?W (scope contra)
)
Поскольку теперь постановка задачи усложнилась по сравнению с вырожденным случаем, имеет смысл включить в программу распечатку предположений о характеристиках персонажей, упомянутых в высказываниях.
(defrule consist-truth
(declare (salience -10))
?W <- (world (tag ?N) (scope truth)
(statement (speaker ?Y) (tag ?N))
=>
(printout t
“Statement is consistent:”
;; “Высказывание непротиворечиво:”
crlf)
(modify ?W (scope consist)
)
(defrule consist-falsity
(declare (salience -10))
?W <- (world (tag ?N) (scope falsity))
(statement (speaker ?Y (tag ?N))
=>
(printout t
“Statement is consistent:”
;; “Высказывание непротиворечиво:”
crlf)
(modify ?W (scope consist)
)
(defrule true-knight
(world (tag ?N) (scope consist))
?C <- (claim (content T ?X) reason ?N)
=>
(printout t
?X “is a knight”
;; ?X “ – правдолюбец”
crlf)
(retract ?C)
)
(defrule false-knave
(world (tag ?M) (scope consist))
?C <- (claim (content F ?X) (reason ?N))
=>
(printout t
?X “ is a knave”
;; ?X “ – лжец”
crlf)
(retract ?C)
)
Ниже приведенное правило
(defrule conj
(world (tag ?N) (context ?S))
(claim (content AND ?P ?X ?Q ?Y) (reason ?N)
(scope ?V))
=>
(assert (claim
(content ?P ?X) (reason ?N) (scope ?V)
(context ?S)))
(assert (claim
(content ?Q ?Y) (reason ?N) (scope ?V)
(context ?S)))
)
Прежде чем запустить
(deffacts the-facts
(world)
(statement (speaker A) (claim AND F A F B ) (tag 1))
)
После запуска программы в режиме
трассировки интерпретатор
Листинг А.2. Трассировка решения задачи Р4