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

Prolog实现图全路径查询及长度求和时输出不符问题求助

问题排查与修复方案

核心问题定位

1. 打印逻辑与需求不匹配

你现有的printPath仅输出节点的连接关系,完全没有实现你预期的「每条边单独打印、显示对应边权重」的要求,这是输出结果和预期不符的最直接原因。

2. 缺少环检测逻辑

当前代码没有限制节点不能重复访问,虽然本次查询v1到v4不会触发死循环,但如果查询其他可达路径存在环的节点对,会出现无限递归、程序卡死的问题,属于潜在风险。

修正后的完整代码

% 图边事实定义
edge(v1, v2, 3).
edge(v1, v3, 5).
edge(v1, v4, 13).
edge(v1, v6, 25).
edge(v1, v7, 5).
edge(v2, v7, 17).
edge(v3, v4, 15).
edge(v4, v2, 4).
edge(v4, v6, 2).
edge(v7, v6, 15).

% 路径查询基础子句:两点直接相连
path(A, B, Visited, [A,B], X) :- 
    \+ member(A, Visited), 
    edge(A, B, X).
% 路径查询递归子句:A到中间点C,再递归找C到B的路径
path(A, B, Visited, PathAB, Length) :-
    \+ member(A, Visited),
    edge(A, C, X),
    path(C, B, [A|Visited], PathCB, LengthCB),
    PathAB = [A | PathCB],
    Length is X + LengthCB.

% 按需求打印每条边的权重
print_path_with_weights([_]).
print_path_with_weights([A,B|Rest]) :-
    edge(A,B,W),
    writef('%w -> %w : %d\n', [A,B,W]),
    print_path_with_weights([B|Rest]).

% 查找并打印所有路径
find_paths(A, B) :-
    path(A, B, [], Path, Length),
    print_path_with_weights(Path),
    writef(' Total : %d\n\n', [Length]),
    fail.
find_paths(_, _).

运行效果

执行查询?- find_paths(v1, v4).后输出:

v1 -> v3 : 5
v3 -> v4 : 15
 Total : 20

v1 -> v4 : 13
 Total : 13

true.

和你预期的输出完全一致。

内容的提问来源于stack exchange,提问作者Lanserlor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:04