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过程,该过程调用isConnected ,并且将结果移至下一个边缘,然后将结果添加为L is Length 但是我不确定该怎么做。

任何帮助,将不胜感激!

===============>>#1 票数:1

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

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

===============>>#2 票数:0

信不信由你,你真的亲密! 您甚至正在生成所需的所有信息,只是没有将其保留在任何地方。 我的意思是第二条isConnected/2规则中的X :这是您剩下的所有内容。

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.

  ask by translate from so

未解决问题?本站智能推荐: