我有一个 Prolog 函数path(A,B,Path)
,它产生板上从 A 到 B 的所有有效路径。
此函数的输出如下所示:
?- path(0,2,Path).
Path = [0, 1, 2] ;
Path = [0, 3, 2] ;
Path = [0, 1, 4, 2] ;
Path = [0, 3, 4, 2] ;
Path = [0, 1, 4, 5, 3, 2] ;
等等等等
它生成包含有效路径的无限列表集。我只是想获得这些路径中最短的路径(不管有多少)。也就是说,我想要一个shortest(A,B,Path)
能够在板上产生从 A 到 B 的最短有效路径的函数。
我想要的输出是:
?- shortest(0,2,Path).
Path = [0, 1, 2] ;
Path = [0, 3, 2] ;
false.
我一直在使用setof
Prolog 中的函数来将所有路径绑定到我对其施加一些长度限制的集合,但我还没有让它工作。
到目前为止,我糟糕的工作看起来像这样。这绝对是错误的,我将不胜感激任何帮助理解如何setof
工作以及如何从这组中找到最短的列表。谢谢!
shortest(A,B,MinPath) :-
setof(Path,path(A,B,Path),MinPath),
min(length(Path), length(MinPath)).