Swi -Пролог :Нет разрешения на изменение статической процедуры

Я новичок в прологе. Я был бы очень признателен за любую помощь в компиляции этого примера. Я предполагаю, что правила имеют форму «следствие :-антецедент»

%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]:

  1. Пролог не допускает «или» (разделительных )фактов или заключений.
  2. Пролог не допускает "не" (отрицательных )фактов или заключений.
  3. Пролог не позволяет большинству фактов или заключений иметь экзистенциальную количественную оценку.
  4. Пролог напрямую не допускает логику второго -порядка.

Поэтому я изменил код вот так:

%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, Коста-Рика

5
задан JFonseca 24 March 2019 в 21:19
поделиться