0
votes

I want to create the Knowledge base equivalent to the statements as below in Prolog.

  1. John likes all kind of food.

  2. Apple and vegetable are food

  3. Anything anyone eats and not killed is food.

  4. Anil eats peanuts and still alive

  5. Harry eats everything that Anil eats.

So this one of the version borrowed from here

enter image description here

Once this file is created I want to find the answer for the query "John likes peanuts." saying likes(john, peanut).

Attempt to write rules in Prolog from my side is as below

alive(anil).
eats(anil,peanut).
food(apple).
food(vegitables).

food(X):-likes(john,X).

eats(X,Y),not(killed(X)):-food(Y).

eats(anil,X):-eats(harry,X).

killed(X):-not(alive(X)).

alive(X):-not(killed(X)).

But I am getting the errors and warnings as below;

ERROR:    No permission to modify static procedure `(',')/2'

Warning:    Clauses of eats/2 are not together in the source-file

Warning:    Current predicate: food/1

Warning:    Use ':- discontiguous eats/2.' to suppress this message

Warning:    Clauses of alive/1 are not together in the source-file

Warning:    Current predicate: killed/1

Warning:    Use ':- discontiguous alive/1.' to suppress this message
1

1 Answers

1
votes

"John likes all kind of food."

likes(john,X) :- food(X).

"Apple and vegetable are food."

food(apple).
food(X) :- vegetable(X).

"Anything anyone eats and not killed is food."

food(X) :- eats(P,X), alive(P).

"Anil eats peanuts and still alive."

eats(anil,peanuts).
alive(anil).

"Harry eats everything that Anil eats."

eats(harry,X) :- eats(anil,X).

Asking

?- likes(john,X).

produces (in SWI Prolog)

70 ?- likes(john,X).
X = apple ;
ERROR: food/1: Undefined procedure: vegetable/1
   Exception: (9) vegetable(_G19387424) ? fail
   Exception: (8) food(_G19387424) ? fail
71 ?- 

Fixing it with

:- dynamic(vegetable/1).

we get

75 ?- likes(john,X).
X = apple ;
X = peanuts ;
false.

and so, of course,

101 ?- likes(john,peanuts).
true .