我有一个看起来像这样的代码:序言:如何检查变量是否在使用前被初始化?
path(Node1, Node2, Distance):- edge(Node1, Node2, Dist),
Distance is Dist + Distance, !.
此规则将被递归调用;但是,每当我尝试调用它时都会发生错误,指出距离未被充分初始化。这是为什么发生?我假设解决方案是检查距离是否初始化。有没有办法做到这一点?
我有一个看起来像这样的代码:序言:如何检查变量是否在使用前被初始化?
path(Node1, Node2, Distance):- edge(Node1, Node2, Dist),
Distance is Dist + Distance, !.
此规则将被递归调用;但是,每当我尝试调用它时都会发生错误,指出距离未被充分初始化。这是为什么发生?我假设解决方案是检查距离是否初始化。有没有办法做到这一点?
看来你的代码无论如何不会做你想做的事情。它应该计算图中节点之间的距离吗?当你问的Prolog引擎喜欢path(a,b,Distance)
它会给A和B之间的距离,你在可变距离
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)
现在:比你开始使用这段代码(未测试)。
点点的东西在这里发生的非正式描述: 中的变量将被“初始化” edge(Node1, Node2, Dist), !.
(0)和Node1
和Node2
之间,比其他数字将被添加到它,而序言将评估将被初始化的距离(1)和(2)。但是,逻辑程序设计与'通常'程序设计不同,必须设法有点不同。祝你好运。顺便说一句。 SWI prolog有一个很好的调试器,它可以帮助理解判断谓词时正在发生的事情。
我相信你不能在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, !.
是的,所以我相信解决方案是检查它是否未初始化,然后将其设置为0,否则加起来。这怎么能在prolog中完成? – 2011-05-04 21:49:19
我不是Prolog的专家,但我相信你不能混合输入和输出变量,也不能检查变量是否被初始化。我会用不同的方法编辑我的答案。 – 2011-05-04 21:53:00
我知道这个作品;然而,这不是我想要做的。如果我直接将Distance设置为Dist,那么我将失去Distance的累计值。 – 2011-05-04 21:57:31
工作。谢谢。 – 2011-05-04 22:18:12