我有以下工作程序:(可以在此站点上进行测试:http: //swish.swi-prolog.org,我删除了指向已保存程序的直接链接,因为我注意到任何人都可以编辑它。)
它在无向图中搜索两点之间的路径。重要的部分是结果在“主”谓词的范围内返回。(在 Track 变量中)
edge(a, b).
edge(b, c).
edge(d, b).
edge(d, e).
edge(v, w).
connected(Y, X) :-
(
edge(X, Y);
edge(Y, X)
).
path(X, X, _, []) :-
connected(X, _).
path(X, Y, _, [X, Y]) :-
connected(Y, X).
path(X, Z, Visited, [X|Track]) :-
connected(X, Y),
not(member(X, Visited)),
path(Y, Z, [X|Visited], Track).
main(X, Y) :-
path(X, Y, [], Track),
print(Track),
!.
结果:
?- main(a, e).
[a, b, d, e]
true
?- main(c, c).
[]
true
?- main(b, w).
false
我的问题:
访问节点列表以两种不同的方式传递给谓词。在绑定的 Visited 变量和未绑定的 Track 变量中。这两种不同形式的参数传递的名称是什么?
通常我只想使用未绑定的参数传递(跟踪变量),将结果放在主谓词的范围内。但是我也必须添加 Visited 变量,因为成员检查对 Track 变量不起作用(我不知道为什么)。是否有可能仅以无限制的方式通过 Track 使其工作?(没有 Visited 变量)
非常感谢!