2010-08-18 6 views
1

J'utilise l'ancien Turbo Prolog puisqu'il est inclus dans notre programme d'études. Pourquoi ce programme ne fonctionne-t-il pas?variable est seulement utilisé une fois

domains 
    disease, indication = symbol 
    Patient = string 
    Fe,Ra,He,Ch,Vo,Ru = char 
predicates 
    hypothesis(Patient,disease) 
    symptom(Patient,indication,char) 
    response(char) 
    go 
clauses 


    go:- 

     write("What is patient's name?"), 
     readln(Patient), 

     symptom(Patient,fever,Fe), 
     symptom(Patient,rash,Ra), 
     symptom(Patient,head_ache,He), 
     symptom(Patient,chills,Ch), 


     symptom(Patient,runny_nose,Ru), 
     symptom(Patient,head_ache,He), 
     symptom(Patient,vomit,Vo), 


     hypothesis(Patient,Disease), 
     write(Patient," probably has ", Disease , "."),nl. 

    go:- 
     write("Sorry unable to seem to be diagnose disease"),nl. 

    symptom(Patient,Fever,Feedback) :- 
     Write("Does " , Patient , " have " , Fever , "(y/n) ?"), 
     response(Reply), 
     Feedback = Reply. 


    hypothesis(Patient, chicken_pox) :- 

     Fe = Ra = He = Ch = 'y'. 

    hypothesis(Patient, caner) :- 
     Ru = Ra = He = Vo = 'y'. 

    hypothesis(Patient, measles) :- 
     Vo = Ra = Ch = Fe = He = 'y'. 

    response(Reply):- 
     readchar(Reply), 
     write(Reply),nl. 

Je reçois la variable d'avertissement est utilisé uniquement à toutes les lignes qui contient symtoms. Le paramètre ne passe-t-il pas appel par référence? Quand je passe Fe à symptoms la valeur devrait être copiée à Fe et quand je la compare dans l'hypothèse cela devrait fonctionner en conséquence. = opérateur dans Turbo Prolog fonctionne très étrangement. Lorsqu'elle n'est liée à aucune variable, l'instruction a = 3 affectera 3 à a et, si elle contient déjà une valeur, a = 5 vérifiera si la valeur de a est 5 ou non.

Veuillez m'aider pourquoi le programme ne fonctionne pas?

Merci à l'avance :)

+1

Je ne suis pas expérimenté dans Turbo Prolog mais dans "normal" prologue '' 'fait exactement ce qu'il devrait. '=' ne concerne pas l'évaluation arithmétique mais à propos de l'unification, 'LHS = RHS' essaie de ** unifier **' LHS' et 'RHS' et de lier toutes les variables si nécessaire. – rvirding

+0

@rvirding, vous avez raison à propos de l'unification. Mais la règle pour '=' est que si la variable est non liée, '=' agira comme opérateur d'affectation et si elle est liée signifiant qu'elle contient une valeur, alors '=' agira comme opérateur de comparaison. – TCM

+0

Oui, mais ce que vous décrivez ** est ** unification, ou du moins à un niveau simple. Les variables peuvent être dans des termes imbriqués. Donc, avec 'foo (X) = foo (3)', la variable 'X' sera unifiée avec' 3', soit liée, soit appariée. – rvirding

Répondre

2

Le problème est pas avec votre symptoms/3 prédicat, ils vont se lier (unifier) ​​leur 3ème argument à ce que response/1 donne. Le problème est que ces valeurs ne sont jamais passées dans votre procédure hypothesis/2 dans go/0 afin qu'elles ne soient jamais utilisées pour essayer de générer une hypothèse. Prolog n'a pas de variables globales, donc vous devez passer explicitement toutes les valeurs, bien que vous puissiez garder des choses dans la base de données, ce qui peut facilement causer des problèmes si vous ne faites pas attention.

Cela signifie que dans hypothesis/2 vous ne testez pas les valeurs de Fe, Ra, He, etc, mais la liaison des variables locales avec les mêmes noms. C'est aussi pourquoi vous obtenez des avertissements que les variables ne sont référencées qu'une fois, vous les liez mais ne les utilisez jamais. Rappelez-vous qu'ils sont locaux, toutes les variables sont locales à la clause dans laquelle ils se produisent.

Tout cela s'applique au prologue standard, je n'ai jamais utilisé Turbo Prolog.

Questions connexes