Prolog:如何在使用前检查变量是否已初始化?

时间:2011-05-04 21:42:16

标签: variables prolog initialization

我的代码如下:

path(Node1, Node2, Distance):- edge(Node1, Node2, Dist),
    Distance is Dist + Distance, !.

这个规则将被递归调用;但是,每当我尝试调用它时,都会发生错误,指出Distance没有充分初始化。为什么会这样?我假设解决方案是检查距离是否初始化。有没有办法做到这一点?

2 个答案:

答案 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)中“初始化”,并将初始化为Node1Node2之间的距离,并且在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, !.