首页 > 解决方案 > 将谓词中生成的所有列表添加到最后的一个大列表中

问题描述

我有一个函数,它为每次迭代生成一个列表。(因此在查询结束时会生成许多列表)。

是否可以将所有生成的列表收集到谓词循环之外的一个大列表中?

?- 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)] ? ;

变成类似的东西

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

*我的代码很复杂,所以像 [1,2,3,4,5] 这样的简单示例的代码片段就足够了。

标签: listrecursionprologpredicate

解决方案


您可以使用setof内置谓词。我在下面链接了它的工作原理。

path([1,2,3,4]).
path([1,2,3,5]).
path([1,2,3,6]).

pathAll(X):- setof(A,(path(A)),X).

输出

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

您可以按如下方式重写代码。

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

输出

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

希望这对你有帮助。如果这对您有帮助,我们将不胜感激


推荐阅读