Prolog 从列表列表中选择元素
Prolog selecting elements from list of lists
给定一个列表列表(例如,[[1],[1,2,3],[3,4]]
)我想创建子列表成员的所有可能排列,因此上述示例的预期结果如下所示:
?- get_elements([[1], [1,2,3], [3,4]], R).
R = [[1,1,3],[1,1,4],[1,2,3],[1,2,4],[1,3,3],[1,3,4]] ? ;
no
我有以下内容:
get_elements([], []).
get_elements([[H|_]|Lists], [H|L]) :-
get_elements(Lists, L).
get_elements([[_,H|T]|Lists], L) :-
get_elements([[H|T]|Lists], L).
效果很好,但是 returns 元素一个一个地输出,所以输出如下:
?- get_elements([[1],[1,2,3],[3,4]], R).
R = [1,1,3] ? ;
R = [1,1,4] ? ;
R = [1,2,3] ? ;
R = [1,2,4] ? ;
R = [1,3,3] ? ;
R = [1,3,4] ? ;
no
我想我应该添加另一个参数来累加元素,但看不清楚如何。任何帮助将不胜感激。
只需使用 findall/3
收集所有输出:
将 get_elements/2
重命名为 get_elements1/2
并添加此过程:
get_elements(L, R):-
findall(E, get_elements1(L, E), R).
给定一个列表列表(例如,[[1],[1,2,3],[3,4]]
)我想创建子列表成员的所有可能排列,因此上述示例的预期结果如下所示:
?- get_elements([[1], [1,2,3], [3,4]], R).
R = [[1,1,3],[1,1,4],[1,2,3],[1,2,4],[1,3,3],[1,3,4]] ? ;
no
我有以下内容:
get_elements([], []).
get_elements([[H|_]|Lists], [H|L]) :-
get_elements(Lists, L).
get_elements([[_,H|T]|Lists], L) :-
get_elements([[H|T]|Lists], L).
效果很好,但是 returns 元素一个一个地输出,所以输出如下:
?- get_elements([[1],[1,2,3],[3,4]], R).
R = [1,1,3] ? ;
R = [1,1,4] ? ;
R = [1,2,3] ? ;
R = [1,2,4] ? ;
R = [1,3,3] ? ;
R = [1,3,4] ? ;
no
我想我应该添加另一个参数来累加元素,但看不清楚如何。任何帮助将不胜感激。
只需使用 findall/3
收集所有输出:
将 get_elements/2
重命名为 get_elements1/2
并添加此过程:
get_elements(L, R):-
findall(E, get_elements1(L, E), R).