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
相关产品推荐
相关产品推荐

