首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >定义的网格中2个节点之间的路径长度[Prolog]

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

Stack Overflow用户
提问于 2013-04-16 08:38:59
回答 2查看 1.7K关注 0票数 0
代码语言:javascript
运行
复制
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的过程来测试两个节点之间是否存在连接:

代码语言:javascript
运行
复制
isConnected(X1, X2) :- edge(X1, X2).

代码语言:javascript
运行
复制
isConnected(X1, X2) :- edge(X1, X), isConnected(X, X2).

但我不确定如何从这里开始。我知道我应该有一个调用isConnecteddist过程,and的结果是移动到下一条边,然后将结果与L is Length之类的东西相加。但我不确定该怎么做。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2013-04-16 14:11:14

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

代码语言:javascript
运行
复制
isConnected(X1, X2, 1) :- edge(X1, X2).
isConnected(X1, X2, D) :- edge(X1, X), isConnected(X, X2, T), D is T + 1.
票数 1
EN

Stack Overflow用户

发布于 2013-04-16 11:24:35

信不信由你,你们真的很接近了!你甚至正在生成你需要的所有信息,只是你没有把它保存在任何地方。我在您的第二条isConnected/2规则中指的是X:这就是您需要保留的所有内容,以便完成剩下的步骤。

代码语言:javascript
运行
复制
isConnected(X1, X2, [X2])      :- edge(X1, X2).
isConnected(X1, X2, [X |Rest]) :- edge(X1, X),  isConnected(X, X2, Rest).

基本上就是这样:

代码语言:javascript
运行
复制
?- 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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16026899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档