我有一个 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.
我一直在尝试使用Prolog中的setof
函数来将所有路径绑定到一个集合上,其中我对其设置了一些长度限制,但是我还没有让它工作起来。
到目前为止,我的工作很糟糕。它肯定是错误的,我希望能得到任何帮助,理解setof
如何工作以及如何从这个集合中找到最短的列表。谢谢!
shortest(A,B,MinPath) :-
setof(Path,path(A,B,Path),MinPath),
min(length(Path), length(MinPath)).