我想要做的是删除另一个列表中指定的列表的一部分,例如
?- 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).
答案 0 :(得分:2)
我会使用强大的select / 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].
答案 1 :(得分:1)
我必须承认,我根本不理解您的deleteSome
代码。这是我要做的(这里没有Prolog,所以可能包含错误):
deleteSome(X, [], X).
deleteSome(X, [Y|Ys], Z) :-
deleteOne(Y, X, T),
deleteSome(T, Ys, Z).
即。如果没有什么可以删除,没有变化。否则,结果是当我们删除第一个to-deletes,然后删除其余的。
有一些混淆,似乎你的deleteOne
有(Original,ToDelete,Result)参数,但deleteSome
有(ToDelete,Original,Result)。为了保持一致性,我宁愿重写它以便签名兼容:
deleteSome([], Y, Y).
deleteSome([X|Xs], Y, Z) :-
deleteOne(X, Y, T),
deleteSome(Xs, T, Z).