例如:如果给我两个清单[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]
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
纯粹而简单:与list_nonmember_t/3
同时使用meta-predicate 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).
当然,您可以使用其他答案中所述的内置列表谓词。