1

我是 prolog 的新手,想限制递归深度,但它不断抛出“参数没有充分实例化”错误。我会将问题概括为图表。

edge(a,b).
edge(a,x).
edge(b,c).
edge(b,x).
edge(c,d).

所以,有一条从 a 到 d 的路径: abcd 很容易检查两个顶点之间是否有路径:

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)抛出“参数没有充分实例化”,我不明白原因。

4

1 回答 1

3

继续你的想法:

:- 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).
于 2017-12-10T01:24:06.537 回答