Создание базы знаний и запросы в Prolog
Я хочу создать базу знаний, эквивалентную приведенным ниже утверждениям в Prolog.
Джон любит всякую еду.
Яблоко и овощ это еда
Все, что кто-либо ест и не убивает, является едой.
Анил ест арахис и все еще жив
Гарри ест все, что ест Анил.
Так что это одна из версий, заимствованных отсюда
После создания этого файла я хочу найти ответ на запрос «Джон любит арахис». говоря
likes(john, peanut).
Попытка написать правила на Прологе с моей стороны выглядит следующим образом:
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)).
Но я получаю ошибки и предупреждения, как показано ниже;
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 ответ
«Джон любит любую еду».
likes(john,X) :- food(X).
«Яблоко и овощи — это еда».
food(apple).
food(X) :- vegetable(X).
«Все, что кто-либо ест и не убит, является едой».
food(X) :- eats(P,X), alive(P).
«Анил ест арахис и все еще жив».
eats(anil,peanuts).
alive(anil).
«Гарри ест все, что ест Анил».
eats(harry,X) :- eats(anil,X).
спрашивать
?- likes(john,X).
производит (в 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 ?-
Исправление с помощью
:- dynamic(vegetable/1).
мы получаем
75 ?- likes(john,X).
X = apple ;
X = peanuts ;
false.
а так, конечно,
101 ?- likes(john,peanuts).
true .