Prolog,附加,不重复

时间:2013-07-04 14:03:19

标签: prolog append member

嘿我正在尝试附加两个没有“双重”成员的列表

例如

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).

感谢您的帮助:)

2 个答案:

答案 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.