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).
但我不确定如何从这里开始。我知道我应该有一个调用isConnected
的dist
过程,and的结果是移动到下一条边,然后将结果与L is Length
之类的东西相加。但我不确定该怎么做。
任何帮助都将不胜感激!
发布于 2013-04-16 14:11:14
Daniel的回答是ok,您只需对返回的列表应用length/2即可。这里是一种更直接的方法,在路径建立后添加单位步骤:
isConnected(X1, X2, 1) :- edge(X1, X2).
isConnected(X1, X2, D) :- edge(X1, X), isConnected(X, X2, T), D is T + 1.
https://stackoverflow.com/questions/16026899
复制相似问题