1

我想要做的是删除另一个列表ieeg中指定的列表的一部分

?- 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).          
4

2 回答 2

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].
于 2012-11-28T15:46:28.773 回答
1

我必须承认,我根本不懂你的deleteSome代码。这是我要做的(这里没有 Prolog,所以可能包含错误):

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

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

有一些混淆,您似乎deleteOne有(Original,ToDelete,Result)参数,但deleteSome有(ToDelete,Original,Result)。为了一致性,我宁愿重写它,以便签名兼容:

deleteSome([], Y, Y).
deleteSome([X|Xs], Y, Z) :-
    deleteOne(X, Y, T),
    deleteSome(Xs, T, Z).
于 2012-11-28T15:36:16.553 回答