我是一個序言初學者。我非常感謝編譯這個例子的任何幫助。我想規則的形式爲 「隨之而來: - 先行」Swi-Prolog:沒有權限修改靜態過程
%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的納蒂獨角鯨):
swipl -s "pathofthecode.pl"
Swi-序言拋出此錯誤的第二個規則:
'$record_clause'/2: No permission to modify static_procedure `(;)/2'
感謝azhrei,你說:「我想你想說的是X1將ñ即使X1是捕食者Y1的捕食者,因爲Y1是聰明的,但它不能捕捉Y1。「,是的,它是!
我發現,Prolog有一些強約束[1]:
- 的Prolog不允許 「或」 d(析取)的事實或結論。
- 序言不允許「不」(否定)事實或結論。
- 序言不允許大多數事實或結論存在量化。
- Prolog不直接允許二階邏輯。
所以我改變了代碼:
%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).
而且它編譯,但在序言需要找到,如果趕上(X,Y)爲真它不會因爲謂詞不是規則的後果。
-
[1]。尼爾C.羅,網址:http://faculty.nps.edu/ncrowe/book/chap14.html
注:這個例子是從教授亞迪拉索拉諾過程中所採取的UCR,CR
好的工作 - 我已經更新了我的答案,以免誤導任何人。 :-)不知道你的最後一個謂詞在編譯! – azhrei 2012-07-25 03:24:40