首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写用于循环图的谓词,以使用prolog检查两个节点之间是否存在路径。

编写用于循环图的谓词,以使用prolog检查两个节点之间是否存在路径。
EN

Stack Overflow用户
提问于 2020-10-07 10:23:03
回答 1查看 152关注 0票数 0

我试图写一个谓词isway(A,B),它应该适用于循环图。我试图得到的预期结果是,如果在两个节点之间存在一条路径,或者不存在路径。如果我问isway(a,f),希望它回答是或否。下面是我的代码,但它从来不起作用,并且总是给我一个错误的输出。

代码语言:javascript
复制
%given facts

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

edge2(d,a).
edge2(h,f).
edge2(X,Y) :- edge(X,Y).

%my implementation
isway(A,B) :- edge2(A,B,[]).

edge2(A,B,V) :- edge(A,X), not(member(X,V)), (B = X ; edge2(X,B,[A|V])).

%my output
?- isway(b,a). %I expect true for this one
false

?- isway(a,f). %False for this is ok but I am not confident about my logic
false.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 14:01:52

您可以使用制表计算边缘关系的传递闭包:

代码语言:javascript
复制
edge(a,b).
edge(a,c).
edge(b,c).
edge(c,d).
edge(c,e).
edge(d,e).
edge(f,g).
edge(g,h).

edge(d,a). % acyclic
edge(h,f). % acyclic

:- table path/2.
path(X, Y) :- edge(X, Y).
path(X, Y) :- path(X, Z), path(Z, Y).

然后,查询将如您所期望的那样工作:

代码语言:javascript
复制
?- path(a, f).
false.

?- path(b, a).
true.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64242062

复制
相关文章

相似问题

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