List 有人能帮我写一个删除列表的prolog程序吗?

List 有人能帮我写一个删除列表的prolog程序吗?,list,prolog,sublist,meta-predicate,List,Prolog,Sublist,Meta Predicate,例:如果给我两个列表[1,4,3,2,5,6]和[1,2,3],最后的列表应该是[4,5,6] i、 例如,Del([1,4,3,2,5,6],[1,2,3],结果)。 ----应输出结果=[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).

例:如果给我两个列表[1,4,3,2,5,6]和[1,2,3],最后的列表应该是[4,5,6]

i、 例如,
Del([1,4,3,2,5,6],[1,2,3],结果)。

----应输出结果=[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]

有谁能帮我做这件事吗

因此,您的
delete1
是一个良好的开端,它允许从列表中删除单个元素,但并不处理所有情况。例如,不包含要删除的元素的列表。
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).
所以正确的答案应该是:

delete1(_, [], []).
delete1(A, [A|B], B).
delete1(A, [C|B], [C|E]) :- delete1(A, B, E).
然后使用它,您可以通过在整个列表上递归应用
delete1
来定义您的
del1

del1([], _, []).
del1(L, [], L).
del1(L, [H|T], R) :- 
    delete1(H, L, R1),
    del1(R1, T, R).
当然,您可以使用其他答案中所述的内置列表谓词

纯粹而简单:与
list\u nonmember\u t/3一起使用

与我们使用时一样,我们基于以下内容定义
list\u nonmember\u t/3

让我们把它放在一起

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

谢谢你,亚当。但是你给的程序出错了。这里是输出:|?-del1([1,2,3,4],[3,2],R)。(0)调用:del1([1,2,3,4],[3,2],h226)?(1) 电话:见(0)?(1) 退出:请参阅(0)?(2) 调用:默认错误处理程序(错误(存在错误(过程,usermod:member/2),[],[[399471843995264039952512463684094982441346496400289604135472040680192406792164007209639940656406289763995600040720209639940656])?对于del1([1,2,4,5],[2,3],Res),输出应该是Res=[1,4,5]。有关纯版本,请参阅。
?- tfilter(list_nonmember_t([1,2,3]), [1,4,3,2,5,6], Xs).
Xs = [4,5,6].                         % succeeds deterministically