嘿我正在尝试附加两个没有“双重”成员的列表
例如
A = [a, b, c]
B = [x, c, q]
然后 - >
append2(A,B,P)
P= [a,b,c,x,q]
我写这段代码,但它不起作用......
not_member(_, []).
not_member(X, [Y|Ys]) :- X \= Y, not_member(X, Ys).
append2(A, [], A).
append2([], A, A).
append2([h1|ls], B, [h1|P]) :- not_member(h1, B), !, append2(ls, B, P).
append2([h1|ls], B, P) :- member(h1, P), append2(ls, B, P).
感谢您的帮助:)
答案 0 :(得分:1)
假设输入列表中没有变量,但允许每个列表中有重复项,您可以写:
append2(A,B,C):-
findall(Item, append2_item(A,B,Item), C).
append2_item(A,_,ItemA):-
append(HeadA, [ItemA|_], A),
\+ member(ItemA, HeadA).
append2_item(A,B,ItemB):-
append(HeadB, [ItemB|_], B),
\+ member(ItemB, HeadB),
\+ member(ItemB, A).
append2_item/3
的第一个子句从第一个列表中选择(排序)不同的项目。 append2_item/3
的第二个子句从第二个列表中选择(排序)不同的项目,这些项目不在第一个列表中。
append2/3
只收集这些元素。
测试用例:
?- append2([a,b,c,a],[x,c,q,x],C).
C = [a, b, c, x, q].
答案 1 :(得分:1)
查看my answer中的纯代码 相关问题" intersection and union of 2 lists"!
根据您的要求,谓词list_list_union/3
正是您所寻找的:
?- list_list_union([a,b,c],[x,c,q],Ls).
Ls = [a,b,c,x,q]. % succeeds deterministically
list_list_union/3
单调,因此我们得到声音答案
即使使用非基础术语:
?- As = [_,_,_], Bs = [_,_,_], list_list_union(As,Bs,Ls), As = [a,b,c], Bs = [x,c,q].
As = [a,b,c], Bs = [x,c,q], Ls = [a,b,c,x,q] ; % logically sound result
false.