バックワードチェインの実装方法の詳細によって大きく異なります。たとえば、ルールでマッチできる目標をエンジンが生成するジェスでは、次のようにすることができます。
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>
ご返信ありがとうございます。 特定の質問にサブクラスがある場合はどうなりますか?たとえば、私は "患者は咳をしていますか?" "患者は頭痛を抱えていますか?"そして、私は咳をすることに腹を立てます。「寝そべっていると、患者は肺に痛みを感じますか?」。患者が「はい」と答えた場合は、咳をしています。頭痛のために質問をスキップし、肺の痛みを感じるように質問してください。それに対するアプローチは何ですか? – vonum
後方連鎖の動作の仕方についての詳細な説明はあまりにも広すぎて簡単には答えられません。私はキーワードの後方連鎖アルゴリズムを持つ検索エンジンを使用することをお勧めします。 –
もう1つ質問があります。ワーキングメモリに事実の症状がない場合、必要な症状は真です。例えば、後方連鎖は "麻疹"の左側をチェックし、 "has-fever"がアサートされているかどうかをチェックし、それがルールを起動して "患者は熱を持っていますか? – vonum