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.
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)]]