Prolog从列表列表中选择元素

时间:2015-11-26 15:48:18

标签: list recursion prolog accumulator

给定一个列表列表(例如,[[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).

这很好但是逐个返回元素,因此输出如下:

?- 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

我想我应该添加另一个参数来累积元素,但是不能清楚地看到如何。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

只需使用findall/3收集所有输出:

使用get_elements/2之类的内容重命名get_elements1/2并添加此程序:

get_elements(L, R):-
  findall(E, get_elements1(L, E), R).