Question

I'm doing this expert system for classification animals using prolog and I'm using GNU/Prolog and Debian GNU/Linux.

xpositive(symbol,symbol)
xnegative(symbol,symbol)

nondeterm animal_is(symbol)
nondeterm it_is(symbol)
ask(symbol,symbol,symbol)
remember(symbol,symbol,symbol)
positive(symbol,symbol)
negative(symbol,symbol)
clear_facts
run

animal_is(cheetah):-
    it_is(mammal),
    it_is(carnivore),
    positive(has,tawny_color),
    positive(has,dark_spots).

animal_is(tiger):-
    it_is(mammal),
    it_is(carnivore),
    positive(has, tawny_color),
    positive(has, black_stripes).

animal_is(giraffe):-
    it_is(ungulate),
    positive(has,long_neck),
    positive(has,long_legs),
    positive(has, dark_spots).

animal_is(zebra):-
    it_is(ungulate),
    positive(has,black_stripes).

animal_is(ostrich):-
    it_is(bird),
    negative(does,fly),
    positive(has,long_neck),
    positive(has,long_legs),
    positive(has, black_and_white_color).

animal_is(penguin):-
    it_is(bird),
    negative(does,fly),
    positive(does,swim),
    positive(has,black_and_white_color).

animal_is(albatross):-
    it_is(bird),positive(does,fly_well).

it_is(mammal):-
    positive(has,hair).
it_is(mammal):-
    positive(does,give_milk).

it_is(bird):-
    positive(has,feathers).
it_is(bird):-
    positive(does,fly),
    positive(does,lay_eggs).

it_is(carnivore):-
    positive(does,eat_meat).

it_is(carnivore):-
    positive(has,pointed_teeth),
    positive(has, claws),
    positive(has,forward_eyes).

it_is(ungulate):-
    it_is(mammal),
    positive(has,hooves).

it_is(ungulate):-
    it_is(mammal),
    positive(does,chew_cud).

positive(X,Y):-
    xpositive(X,Y),!.
positive(X,Y):-
    not(xnegative(X,Y)),
    ask(X,Y,yes).

negative(X,Y):-
    xnegative(X,Y),!.
negative(X,Y):-
    not(xpositive(X,Y)),
    ask(X,Y,no).

ask(X,Y,yes):-
    !,
    write(X," it ",Y,'\n'),
    readln(Reply),nl,
    frontchar(Reply,'y',_),
    remember(X,Y,yes).
ask(X,Y,no):-
    !,
    write(X," it ",Y,'\n'),
    readln(Reply),nl,
    frontchar(Reply,'n',_),
    remember(X,Y,no).

remember(X,Y,yes):-
    assertz(xpositive(X,Y)).
remember(X,Y,no):-
    assertz(xnegative(X,Y)).

clear_facts:-
    write("\n\nPlease press the space bar to exit\n"),
    retractall(_,dbasedom),readchar(_).

run:-
    animal_is(X),!,
    write("\nYour animal may be a (an) ",X),
    nl,nl,clear_facts.
run:-
    write("\nUnable to determine what"),
    write("your animal is.\n\n"),
    clear_facts.

run.

I have a problem with this program. I compile the program, but I get an error message:

GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- [system].
compiling /root/Dokumenty/Lab/Expert/system.pl for byte code...
/root/Dokumenty/Lab/Expert/system.pl:2:1: syntax error: . or operator expected after > expression
        1 error(s)
compilation failed

I'm trying to solve my problem, but I'm still getting the error message:

xpositive(symbol,symbol).
xnegative(symbol,symbol).

nondeterm animal_is(symbol)
nondeterm it_is(symbol)
ask(symbol,symbol,symbol)
remember(symbol,symbol,symbol)
positive(symbol,symbol)
negative(symbol,symbol)
clear_facts
run

Error message:

| ?- [system].
compiling /root/Dokumenty/Lab/Expert/system.pl for byte code...
/root/Dokumenty/Lab/Expert/system.pl:4:11: syntax error: . or operator expected after expression
    1 error(s)
compilation failed

Thank you for your help in advance

Was it helpful?

Solution

You are using source from WinProlog (was TurboProlog).

Simply drop all those declarations, i.e. those lines without ending dot (up to run, included). Are not required in Prolog.

You will also need to rename write calls, or, for simplicity, add squared brackets around arguments, to make them of arity 1. For instance:

...
write([X," it ",Y,'\n']),
...

Then you'll call

?- run.

on console.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top