Лекции 2013 / Lektsia_6_23_03_13
.docxprocedure Solve_Goal (goal)
if Value of the Goal
.
.
.
for each Rule …
call Attempt_Rule
procedure Attempt_Rule (rule)
rule: rule to be attempted to solve goal
for each in the antecendent of the rule do
call Solve_Goal_with_condition attribute
if the Value by Solve_goal is not equal to the value required by the condition then
return Fail
end if
end for
Return Successfully
end procedure
Работа процедуры Attempt_Rule начинается с проверки первого условия правила и попытки доказать его. После этого осуществляются попытки доказать остальные условия правила. Для определения того, выполнено ли условие процедура Attempt_Rule должна иметь информацию о том, какое значение имеет атрибут, проверяемый в данном условии. Для определения этого значения рекурсивно вызывается процедура Solve_Rule. Если значение, возвращенное процедурой Solve_Rule не равно знач-ю возвр при проверке условия, то процедура Attempt_Rule заверш. свою работу и возвр. знач-е, свидетельствующее о неудаче. В противном случае проверяется очередное условие правила. Если выполнены все условия правила, то процедура Attempt_Rule заканчивает свою работу, возвращая значение, свидетельствующее об успешном завершении.
(deffact MAIN::med-rules
(rule (if temp is Very-High and headache is Yes and contra-indication is No)
(then make-injection is Yes))
(rule (if temp is High)
(then give-a-pyretic is Yes))
(rule (if temp is High)
(then make-injection is No))
Машина обратного логического вывода в среде CLIPS может быть реализована с использованием двух множеств правил:
1 группа правил применяется для выработки целей при достижении которых выявляются значения атрибутов и для передачи запроса пользователю, чтобы он предоставил значения атрибутов, если эти значения невозможно определить с помощью правил;
2 группа правил осуществляет операции обновления; к числу операций обновления относятся операции модификации правил после выполнения их условия и операции удаления целей после их достижения
(defrule BC::Attempt_Rule
(goal (attribute ?g-name))
(rule (if ?a-name $?)
(then ?g-name $?))
(not (attribute (name ?a-name)))
(not (goal (attribute ?a-name)))
=>
(assert (goal (attribute ?a-name))))
(defrule BC::Ask-Attr-Value
?goal <- (goal (attribute ?g-name))
(not (attribute (name ?g-name)))
(not (rule (then ?g-name)))
=>
(retract ?goal)
(printout t “What is value of g-name?”)
(assert (attribute (name ?g-name)
(value (read)))))
(deffact MAIN::initial-goal
(goal (attribute make-injection)))
(attribute (name temp) (value Very-High))
(rule (if
-
Goal-Satisfied
-
Rule-Satisfied
-
Remove-Rule-No-Match
-
Modify-Rule-Match
(declare (salience 100))
С помощью правила Goal-Satisfied удаляются все цели, для которых было определено значение атрибута. С помощью правила Rule-Satisfied осуществляется поиск всех правил, в которых имеется единственное оставшееся условие. Если существует атрибут, который соответствует этому оставшемуся условию и имеется цель определения значения этого атрибута, то в список фактов вносится значение атрибута из консеквента данного правила. С помощью правила Remove-Rule-No-Match осуществляется поиск правил антеценденты которых могут предоставить значение атрибута для атрибута Goal и которые содержат одно или несколько таких условий, что первое из них конфликтует со значением, присвоенным атрибутом. Если обнаружится такая ситуация – соответствующее правило удаляется из списка фактов, поскольку является неприменимым. С помощью правила Modify-Rule-Match осуществляется поиск правил, антеценденты которых могут предоставить значение атрибута для атрибута Goal и которые содержат 2 или несколько таких условий, что первое из них выполняется при наличии некоторого значения присвоенного атрибута. Если обнаруживается такое правило, то первое условие удаляется из этого правила, чтобы в нём присутствовали только оставшиеся условия, подлежащие проверке.
(load
(watch activations)
(reset)
(run 1)