2015-02-09 61 views
4

我在七週內使用七種語言的Prolog教程,並嘗試使用Android Jekejeke Runtime執行一些示例。 例如,如果我從教程添加無法在Jekejeke Prolog中創建事實

likes(wallace, grommit). 

,我得到。

Error: Undefined, private or package local predicate likes/2 

我嘗試使用斷言,如How to create a fact in SWI-Prolog?描述,但隨後說,assert是不確定的,而不是喜歡。

大概我錯過了關於運行時如何工作的一些基本知識,或者它的prolog.it方言。

+1

Jekejeke是正確的。看[這個答案](http://stackoverflow.com/a/20027252/772868)爲什麼。 – false 2015-02-10 00:02:09

回答

3

assert/1不是一個標準的謂詞,雖然有幾個實現提供它。 Jekejeke Prolog似乎不是這種情況。使用asserta/1assertz/1標準謂詞。第一個斷言謂詞的第一個。後者斷言一個子句是謂詞的最後一個。

+0

我需要用它們來證實一個事實?七語教程已跳過目前爲止,如果你這樣做 – 2015-02-09 10:15:32

+0

取決於你的意思是「斷言一個事實」。謂詞定義通常在您編譯和加載的源文件中定義。在運行時爲* dynamic *謂詞添加子句時使用斷言謂詞。 – 2015-02-09 10:18:34

+0

謝謝 - 認爲這是有道理的。 – 2015-02-09 10:25:24

1

這是一個常見錯誤。也就是說,有一個假設 事實可以通過鍵入它直接輸入頂層。

解釋器發出錯誤,因爲他理解什麼是輸入作爲查詢並且查詢中的謂詞尚未定義。

但最終用戶有多個選項:

1)首先使用選項assertz/1或asserta的/ 1:
頂層是用於執行的目標。您需要一個指示解釋器執行斷言的目標。使用asserta的/ 1或assertz/1:

頂層:

?- assertz(likes(foo, bar)). 

請不是已經被用作靜態謂詞謂詞,即已經通過方法2加)或3),不能再被宣稱。然後使用dynamic/1指令。

不支持內置的assert/1,因爲它不是ISO核心標準的一部分,通常是assertz/1的冗餘。

2)第二個選項使用文件,並諮詢一下吧:
地點的事實和規則到文件中。並通過內置的諮詢/ 1進行諮詢。

文件baz.p:

likes(foo, bar). 

頂層:

?- consult('baz.p'). 

而不是諮詢/ 1,你也可以使用ensure_loaded/1或use_module/1。

3)第三種選擇從控制檯直接諮詢:
直接在頂層輸入事實和規則。通過文件結束鍵擊完成輸入事實和規則。

頂層:

?- [user]. 
likes(foo, bar). 
^D 

再見

+0

另請參閱https://de.wikipedia.org/wiki/Prolog_%28Programmierspra​​che%29#Laden_von_Prolog-Texten – 2015-10-06 13:02:07