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

时间:2013-04-16 00:38:59

标签: recursion prolog

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

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

例如,要获取a和d之间的路径长度: ?- length(a,d) 应该返回2*constant (a->b and b->d)

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

isConnected(X1, X2) :- edge(X1, X2).

isConnected(X1, X2) :- edge(X1, X), isConnected(X, X2).

但我不确定如何从这里开始。我知道我应该有一个调用dist的{​​{1}}过程,然后移动到下一个边缘,然后使用类似isConnected的结果添加结果。但我不知道该怎么做。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

Daniel的答案还可以,你只需将长度/ 2应用于返回的列表。 这是一种更直接的方法,在路径建立后添加单位步骤:

isConnected(X1, X2, 1) :- edge(X1, X2).
isConnected(X1, X2, D) :- edge(X1, X), isConnected(X, X2, T), D is T + 1.

答案 1 :(得分:0)

信不信由你,你真的真的关闭!您甚至可以生成所需的所有信息,而不是将其保留在任何位置。我的意思是X你的第二个isConnected/2规则中的isConnected(X1, X2, [X2]) :- edge(X1, X2). isConnected(X1, X2, [X |Rest]) :- edge(X1, X), isConnected(X, X2, Rest). :这就是你需要保留以完成其余部分的所有内容。

?- 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.

基本上就是这样:

{{1}}