如何编写二元谓词获取journey谓词结果中的最小N值?
实现Prolog中journey的最小路径长度二元谓词
要获取从起点X到终点Y的最短路径长度,核心是先收集所有可能的路径长度,再从中筛选最小值,具体实现如下:
先修正原journey谓词
原journey里的!(cut操作)会阻断回溯,导致无法枚举所有路径。建议修改为无cut的版本,确保能找到所有可能的路径:
journey(X, 0, X). journey(X, N, Z) :- line(X, L, Y), journey(Y, M, Z), N is L + M.
实现minimum二元谓词
利用findall/3收集所有路径长度,再用内置的min_list/2取最小值:
minimum(X, Y) :- % 把所有从X到Y的路径长度存入列表NList findall(N, journey(X, N, Y), NList), % 排除无路径的情况 NList \= [], % 提取列表中的最小值 min_list(NList, Min), % 输出结果 write('从'), write(X), write('到'), write(Y), write('的最短路径长度: '), write(Min).
代码解释
findall(N, journey(X,N,Y), NList):遍历所有符合journey(X,N,Y)的N值,将它们统一存入列表NList。NList \= []:避免当X到Y没有可行路径时程序抛出错误。min_list(NList, Min):调用Prolog内置谓词直接计算列表最小值,主流Prolog环境(如SWI-Prolog)都支持该谓词。
测试示例
查询minimum(a, f).,会输出:
从a到f的最短路径长度: 50
对应路径是a -> b -> d -> f,总长度为10 + 20 + 20 = 50。
内容的提问来源于stack exchange,提问作者user92499
相关产品推荐
相关产品推荐

