Я новичок в прологе. Я был бы очень признателен за любую помощь в компиляции этого примера. Я предполагаю, что правила имеют форму «следствие :-антецедент»
%rules
prey(Y2), watch(X2,Y2) :- predator(X2).
false :- predator(X1),prey(Y1),intelligent(Y1),watch(X1,Y1),catch(X1,Y1).
catch(X3,Y3);hungry(X3) :- predator(X3),prey(Y3),watch(X3,Y3).
%facts
predator(shaki).
prey(pelusa).
intelligent(shaki).
intelligent(pelusa).
watch(shaki,pelusa).
Я скомпилировал код, используя SWI -Prolog версии 5.10.4 (i386, Ubuntu Natty Narwhal):
swipl -s "pathofthecode.pl"
Swi -Пролог выдал эту ошибку для второго правила:
'$record_clause'/2: No permission to modify static_procedure `(;)/2'
Спасибо, azhrei, вы сказали :"Я думаю, что вы пытаетесь сказать, что X1 не сможет поймать Y1, даже несмотря на то, что X1 - хищник, наблюдающий за добычей Y1, потому что Y1 умен", да, это так! !
Я обнаружил, что у Пролога есть некоторые сильные ограничения [1]:
Поэтому я изменил код вот так:
%rules
predator(X) :- prey(Y), watch(X,Y).
catch(X,Y) :- predator(X),prey(Y),not(intelligent(Y)),watch(X,Y).
hungry(X) :- predator(X),prey(Y),watch(X,Y),not(catch(X,Y)).
%facts
prey(pelusa).
intelligent(shaki).
intelligent(pelusa).
watch(shaki,pelusa).
Я также пытался использовать:
false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).
И он компилируется, но когда прологу нужно выяснить, истинен ли catch (X,Y )или нет, он не может, потому что предикат не находится в консеквенте правила.
--
[1]. Нил С. Роу, URL:http://faculty.nps.edu/ncrowe/book/chap14.html
Примечание:этот пример был взят из курса профессора Ядиры Солано в UCR, Коста-Рика