2012-11-28 173 views
1

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

?- 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
+0

为什么不Z = [3,3]? – CapelliC

+0

@CapelliC:每个'deleteOne'只杀死一个元素,而不是一个值。 – Amadan

+0

谢谢@Amadan,你是对的!我会删除我的答案... – CapelliC

回答

1

我必须承认,我完全不理解你的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). 
2

我会用强大的选择/ 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].