【发布时间】:2017-12-10 00:37:23
【问题描述】:
我是 prolog 的新手,想限制递归深度,但它不断抛出“参数没有充分实例化”错误。我会将问题概括为图表。
edge(a,b).
edge(a,x).
edge(b,c).
edge(b,x).
edge(c,d).
所以,有一条从 a 到 d 的路径:a-b-c-d 检查两个顶点之间是否存在路径非常容易:
path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z), path(Z,Y).
现在我想限制路径的长度为 N:
limitedPath(X,Y,N) :- edge(X,Y), N >= 0.
limitedPath(X,Y,N) :- edge(X,Z),limitedPath(Z,Y,M), N = M + 1, N>0.
limitedPath(a,b,2) 为真, 但是 limitedPath(a,c,1) 抛出“参数没有充分实例化”,我无法理解原因。
【问题讨论】:
-
查看this 了解一般方法。即:
closure(edge, A, B) -
M未在递归调用中实例化。如果N应该是一个限制,那么在调用之前减去一个更有意义。 -
啊,一个教程把我弄糊涂了。
-
N = M + 1不会按照你的想法做(除非你使用一些时髦的 Prolog 版本,比如 Visual、PDC 或 Turbo Prolog)。它试图将N中的术语与+(M, 1)术语统一起来。它不会评估M + 1并与N进行比较。你可能想要N is M + 1。或者,正如@false 在他的回答中所说,使用 CLP(FD),这是在 Prolog 中使用整数进行推理的首选方法。 -
是的,我明白了。谢谢。
标签: recursion prolog instantiation-error