2012-07-19 30 views
3

我是一個序言初學者。我非常感謝編譯這個例子的任何幫助。我想規則的形式爲 「隨之而來: - 先行」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]:

  1. 的Prolog不允許 「或」 d(析取)的事實或結論。
  2. 序言不允許「不」(否定)事實或結論。
  3. 序言不允許大多數事實或結論存在量化。
  4. 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

+0

好的工作 - 我已經更新了我的答案,以免誤導任何人。 :-)不知道你的最後一個謂詞在編譯! – azhrei 2012-07-25 03:24:40

回答

1

該錯誤消息是關於您的分號的使用,;。你不能重新定義它。您也不能更改false謂詞。所以,我很驚訝,你說這編譯:

false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).

它不會編譯我。 :-)(SWI-Prolog的)

在第二個規則,我想你想說的是: X1將無法趕上Y1,即使X1是捕食者看着獵物Y1,因爲Y1是智能的。在這種情況下,你將需要:

catch(X,Y) :- ...,...,...,...,not(intelligent(Y)).

(正如你發現自己,並在您的文章編輯:-)

注:您所提供的鏈接顯示了一些命題與邏輯等價但這並不意味着您可以在代碼中使用它們,因爲它們在Prolog中不具有程序上的等效性。您可以在查詢中(在序言提示符處)或規則正文中使用false;,但不能在規則正文中使用。

相關問題