Recursion Prolog参数没有充分实例化。递归深度
我是prolog新手,希望限制递归深度,但它不断抛出“参数未充分实例化”错误。我将把这个问题归纳成一个图表Recursion Prolog参数没有充分实例化。递归深度,recursion,prolog,instantiation-error,Recursion,Prolog,Instantiation Error,我是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) :- e
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.
有限路径(a、b、2)为真,
但是limitedPath(a,c,1)抛出“参数没有充分实例化”,我无法找到原因。继续你的想法:
:- use_module(library(clpfd)).
limitedPath(X,Y,N) :- N #>= 0, edge(X,Y).
limitedPath(X,Y,N) :- N #>= 0, N #= M+1, edge(X,Z), limitedPath(Z,Y,M).
有关一般方法,请参阅。也就是说:
闭包(edge,A,B)
M
在递归调用中没有实例化。如果N
被认为是一个极限,那么减去一就更有意义了。在调用之前,一个教程把我搞糊涂了。N=M+1
不会做你想做的事(除非你使用的是一些时髦的Prolog版本,比如Visual、PDC或Turbo-Prolog)。它试图将N
中的术语与+(M,1)
中的术语统一起来。它不计算M+1
并与N
进行比较。您可能希望N是M+1
。或者,正如@false在他的答案中所说的,使用CLP(FD),这是Prolog中使用整数进行推理的首选方法。是的,我明白了。谢谢