Как узнать, какие вопросы задавать во внешнем интерфейсе для системы, основанной на правилах

Я работаю над простой экспертной системой, основанной на правилах диагностики. Он должен задавать вопросы и распознавать проблемы со здоровьем животных. Я использую обратную цепочку для рассуждений. Как узнать, какие вопросы задавать в интерфейсе для утверждения новых правил? Допустим, у меня есть куча правил IF A THEN B, IF B THEN C. Знайте, что он проверит C, если утверждается B, а затем проверит, если утверждается A. Теперь, поскольку a не утверждается, мне нужно задать вопрос на переднем конце. Есть ли какая-то методология, чтобы узнать, какой вопрос задавать?


person vonum    schedule 03.05.2016    source источник


Ответы (1)


Это во многом зависит от деталей реализации обратной цепочки. Например, вот как вы можете сделать это в Jess, где движок генерирует цели, которым можно сопоставить правила:

Jess> 
(deftemplate symptom
   (declare (backchain-reactive TRUE))
   (slot name)
   (slot value))
TRUE
Jess>    
(deftemplate diagnosis
   (slot name))
TRUE
Jess>    
(deftemplate question
   (slot name)
   (slot string))
TRUE
Jess>    
(deffacts questions
   (question (name has-fever) (string "Does patient have a fever?"))
   (question (name swollen-neck) (string "Does patient have a swollen neck?"))
   (question (name skin-rash) (string "Does patient have a skin rash?")))
TRUE
Jess>    
(defrule measles
   (symptom (name has-fever) (value yes))
   (symptom (name skin-rash) (value yes))
   =>
   (assert (diagnosis (name measles)))
   (printout t "Patient has measles." crlf))
TRUE
Jess> 
(defrule mumps
   (symptom (name has-fever) (value yes))
   (symptom (name swollen-neck) (value yes))
   =>
   (assert (diagnosis (name mumps)))
   (printout t "Patient has mumps." crlf))
TRUE
Jess>    
(defrule ask-question
   (need-symptom (name ?name))
   (question (name ?name) (string ?string))
   (not (diagnosis))
   =>
   (printout t ?string " ")
   (assert (symptom (name ?name) (value (read)))))
TRUE
Jess> (reset)
TRUE
Jess> (run)
Does patient have a fever? yes
Does patient have a swollen neck? yes
Patient has mumps.
3
Jess> (reset)
TRUE
Jess> (run)
Does patient have a fever? yes
Does patient have a swollen neck? no
Does patient have a skin rash? yes
Patient has measles.
4
Jess> 
person Gary Riley    schedule 04.05.2016
comment
Спасибо за ваш ответ. Что произойдет, если у меня есть подвопросы для определенных вопросов. Например, предположим, что я хочу. Пациент кашляет? и Есть ли у пациента головная боль? И затем у меня есть подвопрос по поводу кашля: чувствует ли больной боль в легких при кашле? Если больной отвечает да, кашляет, то вопрос о головной боли ему следует пропустить, а задать вопрос об ощущении боли в легких. Каков подход к этому? - person vonum; 04.05.2016
comment
Подробное объяснение того, как работает обратная цепочка, слишком широкое, чтобы на него можно было дать краткий ответ. Я бы предложил использовать поисковую систему с алгоритмом обратной цепочки ключевых слов. - person Gary Riley; 04.05.2016
comment
Еще один вопрос. Симптом потребности верен, если в рабочей памяти нет симптома факта? Например, обратная цепочка проверяет левую часть кори, проверяет, подтверждена ли лихорадка, и если это не так, то срабатывает правило, задающее вопрос У пациента лихорадка? - person vonum; 05.05.2016
comment
Цели потребности-симптома генерируются автоматически, когда существует правило, которое имеет непревзойденное условие симптома, и все предыдущие условия удовлетворены. Таким образом, изначально генерируется цель (симптом-нужды (название имеет-лихорадка) (значение да)), поскольку она соответствует первому непревзойденному симптому правил кори и эпидемического паротита. Когда факт (симптом (название есть-лихорадка) (значение да)) создается, то генерируются цели для (симптом-потребности (название кожная сыпь) (значение да)) и (симптом-нужды (название опухшая шея) (значение да)). - person Gary Riley; 05.05.2016