Prolog - 参数未充分实例化。递归深度

Prolog - Arguments are not sufficiently instantiated. Recursion depth

我是 prolog 的新手,想限制递归深度,但它一直抛出 "Arguments are not sufficiently instantiated" 错误。我会将问题归纳为图表。

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) 抛出 "Arguments are not sufficiently instantiated",我不明白原因。

继续你的想法:

:- 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).