Prolog结合了两个列表

时间:2014-05-30 16:57:29

标签: list prolog nested-lists

例如我有A = [a,b,c,d]B = [[q,w,e],[r,t],[y,u],[i,o]],我想创建像C = [[a,[q,w,e]],[b,[r,t]],[c,[y,u]],[d,[i,o]]].这样的对 我可以创建对列表,但我不想将每个人彼此组合在一起。有一个简单的方法吗?我无法正确地向Google定义问题。

3 个答案:

答案 0 :(得分:5)

这个问题对我来说似乎没有多大意义,但让我们试一试:

我的第一个观察是所有三个列表的长度相同。有效地,你在这里有一个像元素一样的映射:

a_b_c(A,B,[A,B]).

现在使用maplist / 4:

?- As = [a,b,c,d], Bs = [[q,w,e],[r,t],[y,u],[i,o]], maplist(a_b_c, As, Bs, Cs).
As = [a,b,c,d],
Bs = [[q,w,e],[r,t],[y,u],[i,o]],
Cs = [[a,[q,w,e]],[b,[r,t]],[c,[y,u]],[d,[i,o]]].

但是,我敢说,我真的会考虑配对!我无法在上述任何表示中看到任何优点。

key_value_pair(K,V,K-V).

?-  As = [a,b,c,d], Bs = [[q,w,e],[r,t],[y,u],[i,o]], maplist(a_b_c, As, Bs, Cs).
As = [a,b,c,d],
Bs = [[q,w,e],[r,t],[y,u],[i,o]],
Cs = [a-[q,w,e],b-[r,t],c-[y,u],d-[i,o]].

maplist/4是常见的预定义或库谓词。 See also this post。如果你没有它:

maplist(_C_3, [], [], []).
maplist(Cont_3, [A|As], [B|Bs], [C|Cs]) :-
   call(Cont_3, A, B, C),
   maplist(Cont_3, As, Bs, Cs).

答案 1 :(得分:1)

我定义了以下谓词来解决该任务。

merge([X], [Y], [[X,Y]]).
merge([X|L1], [Y|L2], [[X,Y]|L3]):-merge(L1, L2, L3).

第一行是事实。将两个列表合并为一个元素的结果每个列表只有一个元素,该列表包含两个元素 X Y

第二行指出:合并两个具有至少两个元素的列表的结果是一个列表,其中第一个元素等于两个元素的列表(每个列表的第一个元素),其余部分是合并的结果前两个列表的其余部分。

修改

如果你想处理空列表的情况,那么你可以使用这个定义:

merge([X], [Y], [[X,Y]]):-!.
merge([], [], []).
merge([X|L1], [Y|L2], [[X,Y]|L3]):-merge(L1, L2, L3).

它有点复杂,因为它使用 cut !谓词来停止寻找解决方案。

答案 2 :(得分:0)

尝试这样的事情:

zip( []     , [Y|Ys  , [ nil:Y | Zs ] ) :- % for lists of unequal length,
  zip( [] , Ys , Zs ) .                    %   create unmatched pairs and recurse down
zip( [X|Xs] , []     , [ X:nil | Zs ] ) :- % for lists of unqual lengths,
  zip( Xs , [] , Zs ) .                    %   create unmatched paris and recurs down
zip( [X|Xs] , [Y|Ys] , [ X:Y   | Zs ] ) :- % otherwise
  zip( Xs , Ys , Zs )                      % - pair up and recurse down.
  .                                        %

处理不等长度源列表的其他策略:

  • 失败
  • 丢弃多余的