Я работаю над простой экспертной системой, основанной на правилах диагностики. Он должен задавать вопросы и распознавать проблемы со здоровьем животных. Я использую обратную цепочку для рассуждений. Как узнать, какие вопросы задавать в интерфейсе для утверждения новых правил? Допустим, у меня есть куча правил IF A THEN B, IF B THEN C. Знайте, что он проверит C, если утверждается B, а затем проверит, если утверждается A. Теперь, поскольку a не утверждается, мне нужно задать вопрос на переднем конце. Есть ли какая-то методология, чтобы узнать, какой вопрос задавать?
Как узнать, какие вопросы задавать во внешнем интерфейсе для системы, основанной на правилах
Ответы (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
Спасибо за ваш ответ. Что произойдет, если у меня есть подвопросы для определенных вопросов. Например, предположим, что я хочу. Пациент кашляет? и Есть ли у пациента головная боль? И затем у меня есть подвопрос по поводу кашля: чувствует ли больной боль в легких при кашле? Если больной отвечает да, кашляет, то вопрос о головной боли ему следует пропустить, а задать вопрос об ощущении боли в легких. Каков подход к этому?
- person vonum; 04.05.2016
Подробное объяснение того, как работает обратная цепочка, слишком широкое, чтобы на него можно было дать краткий ответ. Я бы предложил использовать поисковую систему с алгоритмом обратной цепочки ключевых слов.
- person Gary Riley; 04.05.2016
Еще один вопрос. Симптом потребности верен, если в рабочей памяти нет симптома факта? Например, обратная цепочка проверяет левую часть кори, проверяет, подтверждена ли лихорадка, и если это не так, то срабатывает правило, задающее вопрос У пациента лихорадка?
- person vonum; 05.05.2016
Цели потребности-симптома генерируются автоматически, когда существует правило, которое имеет непревзойденное условие симптома, и все предыдущие условия удовлетворены. Таким образом, изначально генерируется цель (симптом-нужды (название имеет-лихорадка) (значение да)), поскольку она соответствует первому непревзойденному симптому правил кори и эпидемического паротита. Когда факт (симптом (название есть-лихорадка) (значение да)) создается, то генерируются цели для (симптом-потребности (название кожная сыпь) (значение да)) и (симптом-нужды (название опухшая шея) (значение да)).
- person Gary Riley; 05.05.2016