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 :)
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
@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
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