2014-04-08 35 views
0

我是新來的Prolog,我很難用動態謂詞。序言 - 使用動態斷言

首先,這裏我執行

:- dynamic(list/1). 

add(X, LL) :- asserta(list([])), asserta(list(X)), retract(list(LL)). 

代碼我知道代碼看起來怪異,但我只是在尋找使用正確的語法。

現在,如果我這樣做:

add(2,LL)。

答案將是:

LL = 2;

LL = []。

但我想要做的是將X(2)添加到數組([])中。所以..

LL = [2]。

它看起來很簡單(可能是),但我無法得到它的工作。

非常感謝。

+0

我想將它添加到前面。我希望它失敗,X = []。 –

+3

如果你是Prolog的新手,忘記斷言。首先了解其他所有內容:邏輯變量,統一,謂詞和/或列表,遞歸,... – jschimpf

回答

0

如果你想添加X到列表的前面:

add(X, LL) :- 
    ( retract(list(Prev)) 
    -> LL = [X|Prev] 
    ; LL = [X] 
    ), 
    asserta(list(LL)). 

但我@ jschimpf的建議達成一致。斷言/回退只能在某些情況下使用,因爲在某些應用中可能相當有效。

+0

肯定可能的時候最好避免非邏輯特徵,但是Prolog的DB非常適合他們的任務,我不會說'低效率'。在我的2分錢的機器,我得到一個完全索引WORDNET圖像中約8秒......(這是關於300K記錄...) – CapelliC

+0

@CapelliC的確,我想我有資格評論爲「在某些情況下」,但沒有字好吧。 – lurker