2012-11-28 215 views
1

我想要做的是刪除另一個列表中指定的列表的一部分,例如,刪除列表中的某些元素

?- deleteSome([1,4,3,3,2,2],[1,2,4],Z). 
Z = [3,3,2]. 

我首先定義了以下內容。那裏沒問題。

deleteOne(X, [X|Z], Z). 
deleteOne(X, [V|Z], [V|Y]) :- 
    X \== V, 
    deleteOne(X,Z,Y). 

然後,以下按預期方式不起作用。

​​3210
+0

爲什麼不Z = [3,3]? – CapelliC

+0

@CapelliC:每個'deleteOne'只殺死一個元素,而不是一個值。 – Amadan

+0

謝謝@Amadan,你是對的!我會刪除我的答案... – CapelliC

回答

1

我必須承認,我完全不理解你的deleteSome代碼。這裏是我要做的事情(這裏沒有Prolog,所以可能包含錯誤):

deleteSome(X, [], X). 
deleteSome(X, [Y|Ys], Z) :- 
    deleteOne(Y, X, T), 
    deleteSome(T, Ys, Z). 

I.e.如果沒有東西需要刪除,則不需要更改。否則,結果是我們刪除了第一個要刪除的對象,然後刪除其餘的對象。

有一些混淆,看起來你的deleteOne有(原始,ToDelete,結果)參數,但deleteSome已(ToDelete,原始,結果)。爲了保持一致性,我寧願把它改寫這樣的簽名兼容:

deleteSome([], Y, Y). 
deleteSome([X|Xs], Y, Z) :- 
    deleteOne(X, Y, T), 
    deleteSome(Xs, T, Z). 
2

我會用強大的選擇/ 3內置

deleteSome(L, D, R) :- 
    select(E, L, L1), 
    select(E, D, D1), 
    !, deleteSome(L1, D1, R). 
deleteSome(L, _, L). 

測試:

?- deleteSome([1,4,3,3,2,2],[1,2,4],Z). 
Z = [3, 3, 2].