Ahmed Fouda
Ahmed Fouda

Reputation: 33

PROLOG: “Syntax error: Operator expected”

I cannot figure out what's the problem in this code. Please help me out. I get this error:

ERROR: c:/users/ahmed/downloads/test.pl:2:4: Syntax error: Operator expected
% c:/Users/Ahmed/Downloads/test.pl compiled 0.00 sec, 21 clauses

Here is the code:

domains
disease,indication = symbol
Patient,name = string

predicates
hypothesis(string,disease)
symptom(name,indication)
response(char)
go

clauses
go :-
    write("What is the patient's name? "),
    readln(Patient),
    hypothesis(Patient,Disease),
    write(Patient,"probably has ",Disease,"."),nl.

go :-
    write("Sorry, I don't seem to be able to"),nl,
    write("diagnose the disease."),nl.

symptom(Patient,fever) :-
    write("Does ",Patient," have a fever (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,rash) :-
    write("Does ",Patient," have a rash (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,headache) :-
    write("Does ",Patient," have a headache (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,runny_nose) :-
    write("Does ",Patient," have a runny_nose (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,conjunctivitis) :-
    write("Does ",Patient," have a conjunctivitis (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,cough) :-
    write("Does ",Patient," have a cough (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,body_ache) :-
    write("Does ",Patient," have a body_ache (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,chills) :-
    write("Does ",Patient," have a chills (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,sore_throat) :-
    write("Does ",Patient," have a sore_throat (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,sneezing) :-
    write("Does ",Patient," have a sneezing (y/n) ?"),
    response(Reply),
    Reply='y'.

symptom(Patient,swollen_glands) :-
    write("Does ",Patient," have a swollen_glands (y/n) ?"),
    response(Reply),
    Reply='y'.

hypothesis(Patient,measles) :-
    symptom(Patient,fever),
    symptom(Patient,cough),
    symptom(Patient,conjunctivitis),
    symptom(Patient,runny_nose),
    symptom(Patient,rash).

hypothesis(Patient,german_measles) :-
    symptom(Patient,fever),
    symptom(Patient,headache),
    symptom(Patient,runny_nose),
    symptom(Patient,rash).

hypothesis(Patient,flu) :-
    symptom(Patient,fever),
    symptom(Patient,headache),
    symptom(Patient,body_ache),
    symptom(Patient,conjunctivitis),
    symptom(Patient,chills),
    symptom(Patient,sore_throat),
    symptom(Patient,runny_nose),
    symptom(Patient,cough).

hypothesis(Patient,common_cold) :-
    symptom(Patient,headache),
    symptom(Patient,sneezing),
    symptom(Patient,sore_throat),
    symptom(Patient,runny_nose),
    symptom(Patient,chills).

hypothesis(Patient,mumps) :-
    symptom(Patient,fever),
    symptom(Patient,swollen_glands).

hypothesis(Patient,chicken_pox) :-
    symptom(Patient,fever),
    symptom(Patient,chills),
    symptom(Patient,body_ache),
    symptom(Patient,rash).

hypothesis(Patient,measles) :-
    symptom(Patient,cough),
    symptom(Patient,sneezing),
    symptom(Patient,runny_nose).

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

Upvotes: 0

Views: 3113

Answers (2)

CapelliC
CapelliC

Reputation: 60014

to be able to run that code in SWI-Prolog, you could replace starting lines (until go :- ...) in this way:

:- redefine_system_predicate(write(_)).
:- redefine_system_predicate(readln(_)).

write(S) :-
    is_list(S) -> format('~s', [S]) ; format('~w', [S]).
write(A,B,C,D) :-
    maplist(write, [A,B,C,D]).
write(A,B,C) :-
    maplist(write, [A,B,C]).
readchar(S) :-
    get(C), atom_codes(S, [C]).
readln(A) :-
    system:readln(L), atomic_list_concat(L,' ',A).

go :-
   ...

after those 'adapter' predicates

?- go.
What is the patient's name? Carlo
Does Carlo have a fever (y/n) ?y
y
Does Carlo have a cough (y/n) ?|: y
y
Does Carlo have a conjunctivitis (y/n) ?|: y
y
Does Carlo have a runny_nose (y/n) ?|: y
y
Does Carlo have a rash (y/n) ?|: y
y
Carloprobably has measles.
true .

Now it's time to know what is a measles. Going to Wikipedia... :)

Upvotes: 1

liori
liori

Reputation: 42277

You're using SWI-Prolog, which follows Edinburgh syntax. The code looks like code for Visual Prolog, which follows different syntax rules. You need to port your code to the Edingburgh syntax if you want to run it under SWI-Prolog. Otherwise, you can install Visual Prolog and run the code there.

Upvotes: 3

Related Questions