2011-09-13 49 views
17

對於百靈,我已經開始通過http://www.learnprolognow.org/來學習Prolog。我的藉口是,我只有只是開始。來自GNU Prolog的不連續謂詞警告

我不確定以下(簡單?)練習應如何書寫以按預期工作。 http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

我可以看到Gnu Prolog 1.4(http://www.gprolog.org/)並不開心第二個嚮導的謂詞不在第一個謂詞旁邊。我可以重新排列程序以使其工作,但最終我得到的代碼對我的新手Prolog眼睛來說不如下面所介紹的那樣容易理解。

我錯過了一些明顯的東西嗎?

wiz.pl

wizard(ron). 
hasWand(harry). 
quidditchPlayer(harry). 

wizard(X) :- hasBroom(X),hasWand(X). 
hasBroom(X) :- quidditchPlayer(X). 

諮詢wiz.pl

| ?- [wiz]. 
compiling D:/wiz.pl for byte code... 
D:/wiz.pl:5: warning: discontiguous predicate wizard/1 - clause ignored 
D:/wiz.pl compiled, 5 lines read - 632 bytes written, 24 ms 

回答

19

大多數Prologs要針對任何特定謂詞的條款被列在一起,除非你做一些魔法。我很驚訝Striegnitz和Bos忽略了這一點。該程序更改爲

% all clauses for wizard/1 
wizard(ron). 
wizard(X) :- hasBroom(X),hasWand(X). 

hasWand(harry). 
quidditchPlayer(harry). 
hasBroom(X) :- quidditchPlayer(X). 

請注意,我已經把子句wizard/1以相同的順序作爲原始程序。對於這樣的簡單知識庫,順序無關緊要,但是在實現非確定性算法時,子句順序可以決定解決方案的生成順序。

+1

好,謝謝,我曾天真地認爲事實會被放在一起,然後導出規則。我會記住下一步的想法。我也會寄給作者評論。 –

+1

@AdamStraughan他們有沒有迴應? –

+0

@DanielLyons,我不記得,我的電子郵件搜索沒有發現。對不起,我忍不住了。 –

6

有一個ISO Prolog的discontiguous指令,你可以用它來放寬這項規定特定謂詞:

http://www.gprolog.org/manual/gprolog.html#htoc53

+0

這很有用,但我一直在努力弄清楚如何使用該指令。我使用的是與OP相同的學習材料,並且我發現如何在源代碼中使用該指令來解決問題。簡單地使用這個: –

+0

不知何故,我錯過了我的編輯窗口 - 只需將它添加到知識庫的頂部即可: ':-discontiguous(wizard/1).' –