Search code examples
prologturbo-prolog

Getting errors with prolog program


global facts
  xpositive(symbol,symbol)
  xnegative(symbol,symbol)

predicates
  animal_is(symbol) - nondeterm (o)
  it_is(symbol) - nondeterm (i)
  ask(symbol,symbol,symbol) - determ (i,i,i)
  remember(symbol,symbol,symbol) - determ (i,i,i)
  positive(symbol,symbol) - determ (i,i)
  negative(symbol,symbol) - determ (i,i)
  clear_facts - determ ()
  run - determ ()

clauses
  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,
clear_facts.
  run:-
write("\nUnable to determine what"),
write("your animal is.\n\n"),
clear_facts.

goal
  run.

I'm trying to run this expert system program but when I compile I get the following error.

compiling C:/Users/daemon/Desktop/ch16E01.PRO for byte code...
C:/Users/daemon/Desktop/ch16E01.PRO:1:8: syntax error: . or operator expected after     expression
C:/Users/daemon/Desktop/ch16E01.PRO:127:3: syntax error: . or operator expected after     expression
 2 error(s)
compilation failed

Solution

  • Then you will need to convert the code to Prolog. Despite their names, TurboProlog/VisualProlog, although interesting logic programming languages, are not Prolog systems as per official and de facto standard definitions of Prolog.

    Some of the changes to the code required for compiling it with a standard Prolog system (such as GNU Prolog) would include: removing the lines with the "clauses", and "goal" text"; also removing the "global facts" and "predicates" block; replacing double quotes in the arguments of write/1 by single quotes; replacing the call to readchar/1 with a call to get_char/1. But there are other not so trivial changes. In the end, better to look for tutorial code written for Prolog in the first place.