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).
我是 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).