请帮我解决这个问题: 我有一份清单
[[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]
答案 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).
即,获取输入列表中第一个列表的第一个元素,并继续递归剩余列表。作为第二次机会,跳过该元素并重做其余元素。