You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写二元谓词获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:55:20