Сообщение информирует вас о том, что пункты вашей предиката bird / 1 находятся в разных позициях в вашем исходном файле, а именно в строке 10 (bird(tweety).
) и строке 23 (bird(X) :- hawk(X).
).Между этими двумя строками есть пункты о других предикатах (ястреб / 1, рыба / 1, млекопитающее / 1, животное / 1), поэтому определение птицы / 1 неоднозначно.
Стандарт, ИСО / МЭК13211-1: 1995, говорится о пунктах:
7.4.3 Пункты
[...]
Все пункты для пользовательской процедуры P
должно быть
последовательных терминов чтения одного текста Пролога, если только
не является директивой discontiguous(UP)
директива, указывающая P
в этом тексте Пролога.
Такэто оставляет вам две опции:
1) Вы добавляете предложенную директиву в ваш исходный файл:
:- discontiguous bird/1.
cat(sylvester).
cat(felix).
.
.
.
2) Вы изменяете свой исходный файл так, что появляются предложения bird / 1в последовательных строках:
cat(sylvester).
cat(felix).
dog(spike).
dog(fido).
primate(george).
primate("king kong").
bird(tweety).
%then bird if hawk % <- moved here from the end of source file
bird(X) :- hawk(X). % <- moved here from the end of source file
hawk(tony).
fish(nemo).
%then Mammal if cat or dog or primate
mammal(X) :- cat(X) ; dog(X) ; primate(X).
%then Animal if mammal or bird or fish
animal(X) :- mammal(X) ; bird(X) ; fish(X).