Рекомендуемая литература. Упражнения.
Упражнение 5
Проанализируйте программу диагностики болей в брюшной полости, представленную в листинге 5.5. (Предупреждаю ипохондриков: эти правила скопированы из первого попавшегося под руку справочника, поэтому не стоит пользоваться ими для самодиагноза).
В этой программе есть одно обычное для таких программ ограничение. В исходном состоянии рабочей памяти необходимо представить все симптомы, но многие пациенты говорят только о самом явном (боли) и могут даже и не упомянуть о других, например ссадине на лодыжке.
Модифицируйте программу таким образом, чтобы она запрашивала о забытых симптомах. Самый простой способ сделать это – добавить правила, которые в предпосылках имеют только одно условие – жалобы на боль. Такое условие, например, может иметь вид:
(sign (symptom pain) (organ abdomen) (site lower))
Действие правила состоит в том, чтобы добавить в рабочую память вопрос, который нужно задать. Затем понадобится правило, которое собственно и задаст вопрос и поместит в рабочую память вектор sign, сформированный в соответствии с полученным ответом. Шаблон для вектора question (вопрос) имеет такой вид:
(deftemplate question (field symptom (type SYMBOL)) (field organ (type SYMBOL) (default NIL)) (field answer (type SYMBOL) (default NIL)))
Таким образом, и образец в левой части порождающего правила, и сопоставляемые с ним элементы в рабочей памяти должны соответствовать этим шаблонам.
В чем, по-вашему, состоит ограничение возможностей подхода, использующего свойство salience, описанное во врезке 5.5?
Листинг 5.5. Набор диагностических правил заболеваний брюшной полости на языке CLIPS.
;; Шаблоны ;; Объект 'sign' – это симптом, связанный с органом ;; или придатком, (deftemplate sign (field symptom (type SYMBOL)) (field organ (type SYMBOL)) (field site (type SYMBOL))) ;; Вектор 'diagnosis' классифицирует патологию ;; некоторого органа. (deftemplate diagnosis (field disorder (type SYMBOL)) (field organ (type SYMBOL) (default NIL)) ) ;; Факты ;; Некоторые простые симптомы. (deffacts the-facts (sign (symptom pain) (organ abdomen) (site lower)) (sign (symptom poor-appetite)) (sign (symptom weight-loss)) ) ;; ПРАВИЛА ;; Признаки: боль в нижней части брюшной полости И ;; плохой аппетит, И потеря веса. (defrule stomach-tumor (sign (symptom pain) (organ abdomen) (site lower)) (sign (symptom poor-appetite)) (sign (symptom weight-loss)) › (assert (diagnosis (disorder tumor) (organ stomach))) ;; Признаки: боль (pain) – в нижней части (lower) ;; брюшной полости (abdomen), ;; И понос (diarrhea), И рвота (nausea), ;; но высокой температуры нет. (defrule inflammationl (sign (symptom pain) (organ abdomen) (site lower)) (sign (symptom diarrhea)) (sign (symptom nausea)) › (assert (diagnosis (disorder inflammation) (organ large-intestine))) ) ;; Признаки: боль (pain) в нижней части (lower) ;; брюшной полости (abdomen), ;; И понос (diarrhea), ;; И высокая температура (fever). (defrule inflamation2 (sign (symptom pain) (organ abdomen) (site lower)) (sign (symptom diarrhea)) (sign (symptom fever)) › (assert (diagnosis (disorder inflammation) (organ large-intestine))) ) ;; Признаки: боль в верхней правой части брюшной полости ;; И отсутствие высокой температуры. (defrule gallstones (sign (symptom pain) (organ abdomen) (site upper-right)) › (assert (diagnosis (disorder gallstones) (organ gallbladder))) ) ;; Признаки: боль в верхней правой части брюшной полости, ;; И рвота, И высокая температура. (defrule gallbladder (sign (symptom pain) (organ abdomen) (site upper-right)) (sign (symptom vomiting)) (sign (symptom fever)) › (assert (diagnosis (disorder inflammation) (organ gallbladder))))