2011-01-10 58 views
6

嗨,我試圖插入一個列表中的元素,但它是非常重要的從我的程序,結果存儲在原始列表中,而不是在一個新的。
如果您創建了一個保存最終結果的新列表,那麼我在互聯網上編寫或發現的任何代碼都會成功。
所以我的問題是誰能告訴我如何定義一個函數:insert(X,L)其中X是一個元素,L是一個列表?插入列表中的元素並返回相同的列表更新

+0

如果您需要更新該列表,那麼您試圖想的太過於迫切。你能更詳細地描述你想解決的問題嗎? – Juliet 2011-01-10 00:23:37

回答

3

不,Prolog只是不這樣工作。沒有「修改」一個值的東西。一個變量可以與一個特定值統一,但是如果它已經是[1,3],那麼以後它將永遠不會是[1,2,3]

2

正如aschepler所說,您不能添加或更改正確的列表,即每個元素已經綁定的列表。我們能做的唯一「修改」是將一個表達與另一個表達統一起來。

但是有一個部分列表的概念,可以在最後將「附加」元素添加到其中。這通常被稱爲差異列表,儘管該術語可能無法立即被理解。

假設我們開始,而不是一個空的列表,但與一個自由變量X.然而,人們可能會想到從X中減去X並得到「無」。也就是說,一個空的差異列表由X - X表示。這裏的減號「 - 」是一個純粹的形式運算符;沒有評估差異的意圖。這只是一個方便的語法,你可以從差異列表如何用來完成你(可能)想要做的事情看到。

我們可以用下面的元素添加到差異列表:

insertDL(M,X-Y,X-Z) :- Y = [M|Z]. 

這裏M爲我們要添加新的元素,XY是「舊」的區別列表,XZ是「新」通過將先前自由變量Y與部分列表[M | Z]統一起來,使得Z成爲部分列表X的「開放」尾部。

當我們最終完成將事物插入到差異列表中時,我們可以通過在該點將空白列表設置爲空白列表來將X轉換爲適當的列表。在這個意義上,X是與我們第一次開始時的「相同」變量,只是從自由變量到適當列表的增量步驟統一起來。

這是一個Prolog編程中非常強大的技術,需要一些練習才能使用它。一些環節,進一步討論在網絡上:

[從Prolog的列表,以差異表]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[Prolog中實現差異表]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

[講義:差異表]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

1

某些prologs提供了setarg/3謂詞以修改地方。

爲了使用它在列表中,你只需要考慮它們與仿'.'/2

複合項鍊在任何情況下的一個不錯的表現,當你需要在序言使用setarg/3,它可能意味着你做錯了什麼。

相關問題