2013-10-08 34 views
1

我有存儲在一個文件test.pl.幾個事實如何在prolog文件中指定事實?

memory(0, 0, 0). 
memory(0, 1, 0). 
memory(0, 2, 0). 

現在在同一目錄下,我開始gprolog並加載該文件。

| ?- ['test.pl']. 
compiling /home/cib/projects/prolog/test.pl for byte code... 
/home/cib/projects/prolog/test.pl compiled, 3 lines read - 501 bytes written, 5 ms 

yes 

但它會奇怪地處理加載的事實。嘗試查詢其中的一個:

| ?- memory(0, 1, 0). 

true ? h 
Action (; for next solution, a for all solutions, RET to stop) ? ; 

no 

這就像它試圖列舉一些unifications,只是沒有變量統一。如果我用[用戶]指定事實,則沒有問題。

| ?- [user]. 
compiling user for byte code... 
memory(0, 1, 0). 

user compiled, 2 lines read - 229 bytes written, 10237 ms 
warning: user:1: redefining procedure memory/3 
     /home/cib/projects/prolog/test.pl:1: previous definition 

yes 
| ?- memory(0, 1, 0). 

yes 

我真的不知道發生了什麼事。我試圖尋找它是如何文件的加載工作以及如何從是對谷歌的解釋不同的一些定義,但無濟於事。

+1

如果輸入三個你的事實根據'[用戶] .'你會真正得到相同的行爲使用文件'[「test.pl」] '。因此,行爲與存在多於一個事實斷言'memory'和它的整個斷言他們不同的方式是一致的。 – lurker

回答

1

你應該考慮的警告意味着什麼:它更換所有的事實,那麼當你查詢?- memory(0,1,0).有沒有辦法進行搜索。

然後你得到yes,而不是true當你有可能是更多的解決方案。

確實似乎gprolog計算只是第一個參數索引,因爲在第一個方案中有更多的事實與0作爲第一個參數,合理地等待你的選擇。

可以驗證數據庫內容發出?- listing(memory).

+0

啊,沒想到!謝謝。我還不熟悉/ 3語法,所以我沒有意識到這意味着所有3個定義都被替換了。好吧,讓我原來的問題是基於錯誤的假設 - 事情困惑我實際上總是正確的(爲什麼它認爲可能有更多的解決方案的3時,只有一個完全匹配我的查詢?)。 – cib

+1

其實,匹配*可以*是一個相當複雜的操作,並通過設計Prolog的算法*必須*嘗試匹配(統一)任何可能的條款。任何現代的Prolog實現都有第一個參數索引,這意味着在簡單的情況下,引擎可以實際「跳轉」到第一個匹配的引擎。但是,所有這三個條款在您的案例中都被同等索引。 – CapelliC