Малая экспертная система в prolog

Я делаю эту экспертную систему для классификации животных с помощью prolog, и я использую GNU/Prolog и 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("nnPlease press the space bar to exitn"),
    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.nn"),
    clear_facts.

run.

у меня проблема с этой программой. Я компилирую программу, но получаю сообщение об ошибке:

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

Я пытаюсь решить мою проблему, но я все еще получаю сообщение об ошибке:

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

сообщение об ошибке:

| ?- [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

Спасибо за помощь заранее

1 ответов


вы используете источник из WinProlog (был TurboProlog).

Просто отбросьте все эти объявления, т. е. те строки без конечной точки (до запуска, включены). Не требуются в Prolog.

вам также нужно будет переименовать вызовы write или, для простоты, добавить квадратные скобки вокруг аргументов, чтобы сделать их arity 1. Например:

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

тогда вы позвоните

?- run.

на консоли.