Prolog 从列表中删除一些元素

Prolog 从列表中删除一些元素,prolog,Prolog,我想做的是删除另一个列表中指定的列表的一部分,例如 ?- 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). 那么,下面的操作就没有预期的效果了 deleteSome([], [], _). deleteSome([X|Xs], Y, Zs

我想做的是删除另一个列表中指定的列表的一部分,例如

?- 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).
那么,下面的操作就没有预期的效果了

deleteSome([], [], _).
deleteSome([X|Xs], Y, Zs) :- 
    deleteSome(Xs, Y, [X|Zs]).
deleteSome([X|Xs], Y, Zs) :- 
    member(X,Y),
    deleteOne(X,Y,Y),
    deleteSome(Xs, Y, Zs).          

我必须承认,我根本不理解你的
删除一些
代码。下面是我要做的(这里没有序言,因此可能包含错误):

也就是说,如果没有要删除的内容,则没有更改。否则,结果是删除第一个要删除的对象,然后删除其余的对象

您的
deleteOne
似乎有(原始,ToDelete,Result)参数,但
deleteSome
有(ToDelete,原始,Result)参数,这是一种混淆。为了一致性,我宁愿重写它,使签名兼容:

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

我会使用强大的select/3内置

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


@每个
deleteOne
只杀死一个元素,而不是一个值。谢谢@Amadan,你说得对!我将删除我的答案。。。
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].