2012-12-20 2 views
4

저는 프롤로그를 사용하여 분류 동물을위한 전문가 시스템을 만들고 있으며 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("\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. 

이 프로그램에 문제가 있습니다. 나는 프로그램을 컴파일,하지만 오류 메시지가 얻을 :

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 

은 (TurboProlog했다) 당신은 WinProlog에서 소스를 사용하는 사전

+1

누락되었습니다. 당신 라인의 일부 이후에 (점)? –

답변

4

에 도움을 주셔서 감사합니다.

모든 선언, 즉 도트를 끝내지 않은 줄 (실행까지 포함) 만 삭제하면됩니다. 프롤로그에는 필요하지 않습니다.

또한 예를 들어 인수에 대응 1. 그들을 만들기 위해, 인수 주위 제곱 브래킷을 추가, 단순화를 위해, 쓰기 호출의 이름을 변경해야하거나됩니다

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

그런 다음 당신이 전화 할게

?- run. 
콘솔의

관련 문제