我想要做的是刪除另一個列表中指定的列表的一部分,例如,刪除列表中的某些元素
?- 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我想要做的是刪除另一個列表中指定的列表的一部分,例如,刪除列表中的某些元素
?- 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我必須承認,我完全不理解你的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).
我會用強大的選擇/ 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].
爲什麼不Z = [3,3]? – CapelliC
@CapelliC:每個'deleteOne'只殺死一個元素,而不是一個值。 – Amadan
謝謝@Amadan,你是對的!我會刪除我的答案... – CapelliC