Recursion 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

我是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.
有限路径(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中使用整数进行推理的首选方法。是的,我明白了。谢谢