将 2 个列表合并成第三个但成对

Merging 2 lists into a third but in pairs

给定 2 个列表,我想将它们合并到第三个列表中,但第三个列表的每个元素都是第一个和第二个列表元素的列表。

例如给定 list1 [1,2,3] 和 list2 [1,2,3] 我希望最终列表是 [[1,1],[2,2],[3,3]]

到目前为止我所做的是

merge([],[],Z).
merge([H1|T1],[T2|T2],Z):-
    append([H1],[H2],W),merge(T1,T2,[W,Z]). 

但我得到了错误的结果。为什么它不起作用?

您的代码中存在一些缺陷:

  • 当前两个列表为空时,结果也必须为空列表;
  • 而不是 [T2|T2] 你应该写 [H2|T2] 来代表第二个列表;
  • 不需要使用append([H1],[H2],W)来创建一个包含两个元素的列表,只需要写[H1,H2];
  • 因为递归调用必须合并第一个和第二个列表的尾部,所以这个调用的结果不可能是一个以元素 [H1,H2].
  • 开头的列表

因此,该谓词的正确定义如下:

my_merge([], [], []).
my_merge([H1|T1], [H2|T2], [[H1,H2]|T3]):-
    my_merge(T1, T2, T3).

示例:

?- my_merge([a,b,c], [1,2,3], L3).
L3 = [[a, 1], [b, 2], [c, 3]].

?- my_merge(L1, L2, [[1,a],[2,b],[3,c]]).
L1 = [1, 2, 3],
L2 = [a, b, c].

备注 考虑将对 [H1,H2] 表示为 H1-H2 的可能性,因为后一种表示在 Prolog 中更常用。