Ниже приведены некоторые диагностические правила для той предметной области, на которую ориентирована система MUD. Правила, реализованные в виде программы на языке CLIPS, описывают те же причинно-следственные связи, что и на рис. 12.1. Если вы запустите эту программу на выполнение и ответите на оба вопроса утвердительно, то программа придет к заключению, что возможны два варианта объяснения наличия указанных симптомов— и загрязнение сланцами, и приток воды. Если на один из вопросов ответить отрицательно, то программа отдаст предпочтение одной из гипотез.
;; ШАБЛОНЫ (deftamplate symptom
(field datum (type SYMBOL))
(field change (type SYMBOL))
(field degree (type SYMBOL) (default NIL))
)
(deftamplate hypothesis
(field object (type SYMBOL))
(field event (type SYMBOL))
(field status (type SYMBOL) (default NIL))
(deftemplate testing
(field name (type SYMBOL))
(field for (type SYMBOL))
(field status (type SYMBOL) (default NIL)) )
;; ФАКТЫ
(deffacts mud
a(symptom (datum viscosity)
(change increase))
(symptom (datum density)
(change decrease) (degree gradual))
(testing (name МВТ)
(for low-SG-solids))
(testing (name oil-mud)
(for unemulsified-water))
)
;; ПРАВИЛА
;; Правило обратного вывода, принимающее во внимание
;; вязкость (viscosity).
(defrule viscosity (symptom
(datum viscosity) (change increase))
=>
(assert (hypothesis (object low-SG-water)
(event increase))) (assert (hypothesis
(object unemulsified-water) (event increase)))
)
;; Правила обратного вывода, принимающие во внимание
;; плотность (density). (defrule density :
(symptom (datum density)
(change decrease) (degree gradual))
=>
(assert (hypothesis (object shale)
(event contamination)))
)
(defrule density
(symptom (datum density) (change decrease)
(degree rapid)) =>
(assert (hypothesis (object water) (event influx»)
)
;; Свидетельства в пользу загрязнения сланцами
(shale contamination) (defrule shale ?effect
<- (hypothesis (object low-SG-water)
(event increase)
(status yes)) => (assert (hypothesis
(object shale) (event contamination)
(status yes)))
(modify ?effect (status done)) )
;; Свидетельства в пользу притока воды (water influx)
(defrule water ?effect <- (hypothesis
(object unemulsified-water)
(event increase) (status yes)) =>
(assert (hypothesis (object water)
(event influx)
(status yes))) (modify ?effect
(status done))
)
;; Поиск теста гипотезы (defrule peek-test
(hypothesis (object ?obj) (event ? change))
?operator <- (testing (name ?name)
(for ?obj) (status NIL)) =>
(printout
t crlf
"Is there " ?obj " " ?change " according to the "
?name " test? "
;; "Существует " ?obj " " ?change " в соответствии с " ,
;; " тестом " ?name " ? "
) ;; (modify ?operator (status (read)))
)
;; Применить результат теста к гипотезе.
{defrule poke-test
?cause <- (hypothesis (object ?obj)
(event ?change))
?operator <- (testing (name ?name)
(for ?obj) (status yes))
=>
(modify ?cause (status yes)
(modify ?operator (status done))
)
; ; Вывести активную гипотезу.
(defrule show-and-tell
(hypothesis (object ?obj)
(event ?ev) (status yes))
=>
(printout
t crlf
?obj " " ?ev "is a possibility. " t crlf
;; ?obj " " ?ev " является вероятной. "
)