使用Prolog中的列表列表

时间:2012-01-25 00:21:50

标签: prolog

请帮我解决这个问题: 我有一份清单

  

[[1,2],[3,4]

我如何获得:

  

[1,3]

     

[1,4]

     

[2,3]

     

[2,4]

或者,如果我有一个列表列表

  

[[1,2],[3,4],[6,7]]

我如何获得:

  

[1,3,6]

     

[1,3,7]

     

[1,4,6]

     

[1,4,7]

     

[2,3,6]

     

[2,3,7]

     

[2,4,6]

     

[2,4,7]

2 个答案:

答案 0 :(得分:8)

用于访问单个列表元素的谓词,它是最基本的Prolog构建块:member / 2。并且您需要所有列表元素的列表:maplist / 3执行此类映射。因此我们可以写

combine(Ls, Rs) :-
    maplist(get1, Ls, Rs).
get1(L, E) :-
    member(E, L).

请注意,get1 / 2只需要交换成员/ 2参数:因为在(纯)Prolog中我们描述了参数之间的关系,我们可以交换参数的顺序并简化更多:

combine(Ls, Rs) :-
    maplist(member, Rs, Ls).

测试输出:

?- combine([[1,2],[a,b]],X).
X = [1, a] ;
X = [1, b] ;
X = [2, a] ;
X = [2, b].

修改

一个笑话:真的,我的第一个组合/ 2应该写成

combine(Ls, Rs) :-
    maplist(rebmem, Ls, Rs).
rebmem(L, E) :-
    member(E, L).

答案 1 :(得分:1)

您可以这样做:

lists([], []).
lists([[Head|_]|Lists], [Head|L]):-
  lists(Lists, L).
lists([[_,Head|Tail]|Lists], L):-
  lists([[Head|Tail]|Lists], L).

即,获取输入列表中第一个列表的第一个元素,并继续递归剩余列表。作为第二次机会,跳过该元素并重做其余元素。