2016-05-03 3 views
0

Je travaille sur un système expert basé sur des règles de diagnostic simples. Il devrait poser des questions et reconnaître les problèmes de santé animale. J'utilise le chaînage en arrière pour raisonner. Comment puis-je savoir quelles questions poser au début pour affirmer de nouvelles règles? Disons que j'ai un tas de règles SI A B ALORS, SI B PUIS C. Sachez qu'il va vérifier C si B est affirmé, alors il va vérifier si A est affirmé. Maintenant, comme un n'est pas affirmé, je dois poser la question sur le front-end. Y a-t-il une méthodologie pour savoir quelle question poser?Comment savoir quelles questions poser sur le système frontal

Répondre

1

Cela dépend en grande partie des détails de la mise en œuvre du chaînage arrière. Par exemple, voici comment vous pouvez le faire dans Jess où le moteur génère des objectifs qui peuvent être assortis de règles:

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

Merci pour votre réponse. Que se passera-t-il si j'ai des sous-questions pour certaines questions? Par exemple, disons que je veux "Est-ce que le patient tousse?" et "Est-ce que le patient a mal à la tête?". Et puis j'ai une question sous-jacente pour la toux, "Est-ce que le patient ressent une douleur dans les poumons en se couchant?". Si un patient répond oui, il tousse, il devrait sauter la question pour un mal de tête, et poser la question pour ressentir une douleur dans les poumons. Quelle est l'approche pour cela? – vonum

+0

Une explication détaillée de la façon dont fonctionne le chaînage arrière est trop large pour être traitée brièvement. Je suggère d'utiliser un moteur de recherche avec l'algorithme de chaînage arrière des mots clés. –

+0

Encore une question. Le besoin-symptôme est vrai s'il n'y a pas de symptôme de fait dans la mémoire de travail? Par exemple, le chaînage arrière vérifie le côté gauche de la «rougeole», vérifie si «a-fièvre» est affirmé, sinon il déclenche la règle pour poser la question «Est-ce que le patient a de la fièvre? – vonum