访问单个列表元素的谓词是最基本的 Prolog 构建块:member/2。
你想要一个所有列表元素的列表:maplist/3 进行这样的映射。这样我们就可以写
combine(Ls, Rs) :-
maplist(get1, Ls, Rs).
get1(L, E) :-
member(E, L).
请注意,get1/2 仅是必需的,以便我们交换 member/2 参数。但是因为在(纯)Prolog 中我们描述的是参数之间的关系,所以我们可以交换参数的顺序并进一步简化它:
combine(Ls, Rs) :-
maplist(member, Rs, Ls).
测试输出:
?- combine( [[1,2],[a,b]], Xs).
Xs = [1, a] ;
Xs = [1, b] ;
Xs = [2, a] ;
Xs = [2, b].
%% this is the same as:
%% maplist( member, Xs, [[1,2],[a,b]]) :-
%% member( X1, [1,2] ),
%% member( X2, [a,b]), Xs = [X1,X2].
编辑
开个玩笑:真的,我的第一个 combine/2 应该这样写
combine(Ls, Rs) :-
maplist(rebmem, Ls, Rs).
rebmem(L, E) :-
member(E, L).