任何人都可以帮我写一个删除列表的prolog程序吗?

时间:2014-12-03 09:04:48

标签: list prolog sublist

例如:如果给我两个清单[1,4,3,2,5,6]和[1,2,3],最终清单应为[4,5,6]。

即,Del([1,4,3,2,5,6], [1,2,3], Result).
       ----应该输出Result = [4,5,6]。

我尝试过这样的事情:

 delete1(A, [A|B], B).
 delete1(A, [B, C|D], [B|E]) :- delete1(A, [C|D], E).

但我得到的输出是删除作为参数传递的元素而不是列表。

输出:

delete1(a,[a,b,c,d],Res).

   (0) Call: delete1(a,[a,b,c,d],_h210) ?
   (0) Exit: delete1(a,[a,b,c,d],[b,c,d]) ?

Res = [b,c,d]

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

纯粹而简单:与list_nonmember_t/3同时使用 tfilter/3

就像我们对memberd_t/3所做的那样,我们根据if_/3 and (=)/3定义list_nonmember_t/3

list_nonmember_t([],_,true).
list_nonmember_t([E|Es],X,T) :-
   if_(E=X, T=false, list_nonmember_t(Es,X,T)).

让我们把它放在一起!

?- tfilter(list_nonmember_t([1,2,3]), [1,4,3,2,5,6], Xs).
Xs = [4,5,6].                         % succeeds deterministically

答案 1 :(得分:0)

del1([], _, []).
del1([A|L], B, R) :- member(A, B), del1(L, B, R).
del1([A|L], B, [A|R]) :- not(member(A,B)), del1(L, B, R).

答案 2 :(得分:0)

所以你的delete1是一个好的开始,它允许从列表中删除单个元素,但它不处理所有情况。例如,不包含要删除的元素的列表。 所以正确的是:

delete1(_, [], []).
delete1(A, [A|B], B).
delete1(A, [C|B], [C|E]) :- delete1(A, B, E).

然后使用此功能,您可以通过递归方式在整个列表中应用del1来定义delete1

del1([], _, []).
del1(L, [], L).
del1(L, [H|T], R) :- 
    delete1(H, L, R1),
    del1(R1, T, R).

当然,您可以使用其他答案中所述的内置列表谓词。