我的代码如下:
path(Node1, Node2, Distance):- edge(Node1, Node2, Dist),
Distance is Dist + Distance, !.
这个规则将被递归调用;但是,每当我尝试调用它时,都会发生错误,指出Distance没有充分初始化。为什么会这样?我假设解决方案是检查距离是否初始化。有没有办法做到这一点?
答案 0 :(得分:1)
看来您的代码无论如何都不会按照您的意愿行事。是否应该计算图中节点之间的距离?比你开始使用这段代码(未经测试):
path(Node1, Node2, Dist):-edge(Node1, Node2, Dist), !. (0)
path(Node1, Node2, Dist):-
edge(Node1, NodeBetween, DistToBetween),
path(NodeBetween, Node2, DistFromBetween), (1)
Dist is DistToBetween + DistFromBetween. (2)
现在,当您询问Prolog引擎path(a,b,Distance)
时,它会给出变量Distance中a和b之间的距离。
对这里发生的事情进行了一些非正式的描述:
该变量将在edge(Node1, Node2, Dist), !.
(0)中“初始化”,并将初始化为Node1
和Node2
之间的距离,并且在Prolog将评估时将添加其他数字(1) )和(2)。
然而,逻辑编程与“通常的”程序编程不同,人们必须设法以不同的方式思考。祝你好运。顺便说一句。 SWI prolog有一个很好的调试器,可以安静地帮助理解在评估谓词时发生的事情。
答案 1 :(得分:0)
我相信在Distance is Dist + Distance, !.
未初始化时,您无法使用距离。
您正在尝试在初始化之前添加距离距离。
你可能要做的就是
path(Node1, Node2, Distance):- edge(Node1, Node2, Dist), Distance is Dist.
修改强>
在不混合输入和输出变量的情况下尝试相同的操作:
path(Node1, Node2, Distance):- path(Node1, Node2, Distance).
path(Node1, Node2, InitialDistance, Distance):- edge(Node1, Node2, Dist),
Distance is InitialDistance + Dist, !.