Recursion 定义网格中2个节点之间的路径长度[Prolog]

Recursion 定义网格中2个节点之间的路径长度[Prolog],recursion,prolog,Recursion,Prolog,(假设每条边的长度相同) 例如,要获取a和d之间的路径长度,请执行以下操作: ?-长度(a,d) 应该返回2*常量(a->b和b->d) 我知道要做一个递归过程,我已经开始调用isConnected来测试两个节点之间是否存在连接: edge(a, b). edge(b, d). edge(d, c). edge(d, e). edge(d, f). edge(e, g). edge(f, g). edge(g, h). 及 但我不知道如何从这里开始。我知道我应该有一个dist过程,调用isCo

(假设每条边的长度相同)

例如,要获取a和d之间的路径长度,请执行以下操作:
?-长度(a,d)
应该返回
2*常量(a->b和b->d)

我知道要做一个递归过程,我已经开始调用
isConnected
来测试两个节点之间是否存在连接:

edge(a, b).
edge(b, d).
edge(d, c).
edge(d, e).
edge(d, f).
edge(e, g).
edge(f, g).
edge(g, h).

但我不知道如何从这里开始。我知道我应该有一个
dist
过程,调用
isConnected
,然后移动到下一条边,然后添加类似
L是长度的结果。但我不知道该怎么做


任何帮助都将不胜感激

信不信由你,你真的很接近了!你甚至可以生成你所需要的所有信息,你只是没有把它保存在任何地方。我的意思是
X
在你的第二个
isConnected/2
规则中:这就是你需要保留的所有内容,以完成剩下的部分

isConnected(X1, X2) :- edge(X1, X), isConnected(X, X2).
基本上就是这样:

isConnected(X1, X2, [X2])      :- edge(X1, X2).
isConnected(X1, X2, [X |Rest]) :- edge(X1, X),  isConnected(X, X2, Rest).

Daniel的回答是可以的,您只需将length/2应用于返回的列表。 这里有一种更直接的方法,即在建立路径后添加单元步骤:

?- isConnected(a,X,P).
X = b,
P = [b] ;
X = d,
P = [b, d] ;
X = c,
P = [b, d, c] ;
X = e,
P = [b, d, e] ;
X = f,
P = [b, d, f] ;
X = g,
P = [b, d, e, g] ;
X = h,
P = [b, d, e, g, h] ;
X = g,
P = [b, d, f, g] ;
X = h,
P = [b, d, f, g, h] ;
false.
?- isConnected(a,X,P).
X = b,
P = [b] ;
X = d,
P = [b, d] ;
X = c,
P = [b, d, c] ;
X = e,
P = [b, d, e] ;
X = f,
P = [b, d, f] ;
X = g,
P = [b, d, e, g] ;
X = h,
P = [b, d, e, g, h] ;
X = g,
P = [b, d, f, g] ;
X = h,
P = [b, d, f, g, h] ;
false.
isConnected(X1, X2, 1) :- edge(X1, X2).
isConnected(X1, X2, D) :- edge(X1, X), isConnected(X, X2, T), D is T + 1.