2017-04-14 97 views
1

我一直試圖在序言中做不同的事情,並想刪除最後一個元素,但我不知道如何。需要刪除序列中的最後一個元素

這是我的代碼:

without(X,[X,_],[]). 
without(X,[K|Xs],[K|AlmoustLast]) :- 
    without(X,Xs,AlmoustLast). 

這是編譯時我收到。

?- without(X,[1,2,3,4,5],A). 
X = 4, 
A = [1, 2, 3] . 

當我試圖達到的answear是A = [1,2,3,5]。

+0

[相關](http://stackoverflow.com/q/36685680/772868)。 – false

+0

看看沒有(1,[1,2],L)'! – false

回答

2

你幾乎用權

without(X,[X,_],[]). 
without(X,[K|Xs],[K|AlmoustLast]) :- 
    without(X,Xs,AlmoustLast). 

事實上,以下

without(X,[X,Y],[Y]). 
without(X,[K|Xs],[K|AlmostLast]) :- 
    without(X,Xs,AlmostLast). 

給你

?- without(X,[1,2,3,4,5],A). 

A = [1,2,3,5] 
X = 4 
+0

謝謝!事實上,我使用相同的東西(sumf(X,Y,[X,Y],_)。)當我計算最後2個數字的總和,但我沒有想到在這裏使用它... – UnKn0wn27

2

Rafalon給了修正結果,我將提供一個解釋。

你基本情況規則邏輯是有缺陷的:

without(X,[X,_],[]). 

在這裏,我們說,如果你刪除了倒數第二個從[X,_],那麼你得到元素X和列表[],但是那並不是」聽起來合乎邏輯,是嗎? _發生了什麼事?你在這裏使用一個匿名變量,這意味着你不關心它,但你真的很在乎!作爲Rafalon表示,這個規則應該是:

without(X, [X,Y], [Y]). 

所以,最後,但名單[X, Y]的人給你的元素X和列表[Y]

+0

這是真的,我可以和我應該解釋它。 +1爲您解釋。 – Rafalon

相關問題