Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Small Expert System in prolog

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

like image 740
Qmails Avatar asked Dec 20 '12 16:12

Qmails


1 Answers

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.

like image 114
CapelliC Avatar answered Oct 16 '22 10:10

CapelliC