2016-05-03 7 views
0

私は簡単な診断ルールベースのエキスパートシステムに取り組んでいます。それは質問をし、動物の健康問題を認識すべきです。私は推論のために後方連鎖を使用しています。どのルールを新しいルールを宣言するためにフロントエンドで尋ねるべきかを私はどのように知っていますか?私はルールの束を持っていると言いましょう。その場合はB、それでBならばCです.Bがアサートされている場合はCをチェックし、Aがアサートされているかどうかを確認します。今は、アサートされていないので、私はフロントエンドで質問をする必要があります。どのような質問をするべきかを知るための方法論はありますか?ルールベースのシステムのフロントエンドで質問する質問を知る方法

答えて

1

バックワードチェインの実装方法の詳細によって大きく異なります。たとえば、ルールでマッチできる目標をエンジンが生成するジェスでは、次のようにすることができます。

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> 
+0

ご返信ありがとうございます。 特定の質問にサブクラスがある場合はどうなりますか?たとえば、私は "患者は咳をしていますか?" "患者は頭痛を抱えていますか?"そして、私は咳をすることに腹を立てます。「寝そべっていると、患者は肺に痛みを感じますか?」。患者が「はい」と答えた場合は、咳をしています。頭痛のために質問をスキップし、肺の痛みを感じるように質問してください。それに対するアプローチは何ですか? – vonum

+0

後方連鎖の動作の仕方についての詳細な説明はあまりにも広すぎて簡単には答えられません。私はキーワードの後方連鎖アルゴリズムを持つ検索エンジンを使用することをお勧めします。 –

+0

もう1つ質問があります。ワーキングメモリに事実の症状がない場合、必要な症状は真です。例えば、後方連鎖は "麻疹"の左側をチェックし、 "has-fever"がアサートされているかどうかをチェックし、それがルールを起動して "患者は熱を持っていますか? – vonum