请帮我解决这个问题:我有一个列表清单
[[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]
用于访问单个列表元素的谓词,它是最基本的Prolog构建块:member/2.并且您需要所有列表元素的列表:maplist/3执行此类映射.因此我们可以写
combine(Ls, Rs) :-
maplist(get1, Ls, Rs).
get1(L, E) :-
member(E, L).
Run Code Online (Sandbox Code Playgroud)
请注意,get1/2只需要交换成员/ 2参数:因为在(纯)Prolog中我们描述了参数之间的关系,我们可以交换参数的顺序并简化更多:
combine(Ls, Rs) :-
maplist(member, Rs, Ls).
Run Code Online (Sandbox Code Playgroud)
测试输出:
?- combine([[1,2],[a,b]],X).
X = [1, a] ;
X = [1, b] ;
X = [2, a] ;
X = [2, b].
Run Code Online (Sandbox Code Playgroud)
编辑
一个笑话:真的,我的第一个组合/ 2应该写得像
combine(Ls, Rs) :-
maplist(rebmem, Ls, Rs).
rebmem(L, E) :-
member(E, L).
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
lists([], []).
lists([[Head|_]|Lists], [Head|L]):-
lists(Lists, L).
lists([[_,Head|Tail]|Lists], L):-
lists([[Head|Tail]|Lists], L).
Run Code Online (Sandbox Code Playgroud)
也就是说,获取输入列表中第一个列表的第一个元素,并继续递归处理其余列表。作为第二次机会,跳过该元素并重做剩余的元素。