我想要做的是删除另一个列表中指定的列表的一部分,例如,删除列表中的某些元素
?- 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