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

SWI-Prolog递归构建路径时递归无回溯结果错误如何解决

问题原因

你的递归子句逻辑存在错误:递归调用path(Y,TO, W)直接将最终输出的W绑定为了从Y到TO的路径,后续的add(FROM, W, _)计算了把FROM加在路径头部的结果,但你直接把这个结果丢弃了,没有赋值给外层的W,所以最终只会返回最深层base case生成的路径。

修正方案

调整递归子句的逻辑,把递归返回的子路径和当前节点拼接后再赋值给输出变量,修正后的完整代码如下:

% 原有事实和谓词
edge(a,b).
edge(b,c).

add(X, L, [X | L]).

% 修正后的path谓词
% base case:两点直接相连
path(FROM, TO, W):-
    edge(FROM, TO),
    add(TO, [], X),
    add(FROM, X, W).
% 递归 case:先走一步到Y,再从Y走到TO,把当前节点加到子路径头部
path(FROM, TO, W):-
    edge(FROM, Y),
    path(Y, TO, SUB_PATH),
    add(FROM, SUB_PATH, W).
测试验证

执行查询path(a,c,X),即可得到预期结果:

X = [a, b, c]

补充优化建议:你定义的add谓词本质就是Prolog原生的列表头部拼接逻辑,也可以直接写成W = [FROM|SUB_PATH]省略add调用,代码会更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:24:04