Search code examples
listrecursionprologpredicate

Add all generated lists from a predicate into one big list at the end


I have a function which generates one list for each iteration. (so there are many lists generated at the end of the query).

Is it possible to gather all the generated list into one big list outside of the predicate loop?

?- path(i,k,Path).

Path = [segmentTime(red,i,m,2),segmentTime(blue,m,j,4),segmentTime(blue,j,k,2)] ? ;

Path = [segmentTime(blue,i,m,3),segmentTime(blue,m,j,4),segmentTime(blue,j,k,2)] ? ;

Path = [segmentTime(purple,i,j,3),segmentTime(blue,j,k,2)] ? ;

into something like

AllPaths = [[segmentTime(red,i,m,2),segmentTime(blue,m,j,4),segmentTime(blue,j,k,2)], 
         [segmentTime(blue,i,m,3),segmentTime(blue,m,j,4),segmentTime(blue,j,k,2)], 
         [segmentTime(purple,i,j,3),segmentTime(blue,j,k,2)]]

*my code is complex so snippet code of an easy example of something like [1,2,3,4,5] will suffice.


Solution

  • You can use setof built-in predicate. I have linked how it works below.

    path([1,2,3,4]).
    path([1,2,3,5]).
    path([1,2,3,6]).
    
    pathAll(X):- setof(A,(path(A)),X).
    

    OUTPUT

    ?- X = [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 3, 6]]
    

    You can rewrite your code as follows.

    pathAll(X) :- setof(Path,(path(i,j,Path)) , X).
    

    OUTPUT

    ?- pathAll(AllPaths).
       AllPaths = [[segmentTime(red,i,m,2),segmentTime(blue,m,j,4),segmentTime(blue,j,k,2)], 
             [segmentTime(blue,i,m,3),segmentTime(blue,m,j,4),segmentTime(blue,j,k,2)], 
             [segmentTime(purple,i,j,3),segmentTime(blue,j,k,2)]]