1

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

例如

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

感谢您的帮助:)

4

2 回答 2

1

查看我 对相关问题“ 2 个列表的交集和并集”的回答中的代码!

根据您的要求,谓词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.
于 2015-04-30T17:09:19.963 回答
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].
于 2013-07-04T14:29:39.490 回答