【问题标题】:Prolog, Determine if graph is acyclicProlog,确定图是否是非循环的
【发布时间】:2014-11-16 21:35:33
【问题描述】:

我需要定义一个谓词 acyclic/1,它将一个图作为输入并确定该图是否是非循环的。所以据我了解

graph1(a,b).
graph1(b,c). 
graph1(c,a). 

将返回 no 和

graph2(a,b).
graph2(b,c). 

将返回是

我做了一个谓词来确定图中的 2 个节点是否连接,如果连接,它们将返回 yes。

isConnected(X,Y) :- a(X,Z), isConnected(Z,Y).

有没有一种方法可以用来确定图形是否是非循环的?

我不想使用任何预定义的谓词。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请阅读stackoverflow.com/tour 了解本网站的运作方式;如果您的答案是好的,请点击复选标记接受它!
  • 请务必阅读导览!否则 Stack Overflow 对你的帮助不会很大。

标签: prolog graph-theory directed-acyclic-graphs transitive-closure meta-predicate


【解决方案1】:

使用closure0/3

:- meta_predicate acyclic(2).
:- meta_predicate cyclic(2).

acyclic(R_2) :-
   \+cyclic(R_2).

cyclic(R_2) :-
  closure0(R_2, X0,X),
  call(R_2, X,X0).

?- acyclic(graph2).
true.

?- acyclic(graph1).
false.

cyclic/1 成功,如果存在以下情况:

  1. X0X 的非循环连接,因此:

    closure0(R_2, X0,X) 或更详细:

    call(R_2, X0,X1), call(R_2, X1,X2), call(R_2, X2,X3), ..., call(R_2, Xn,X)X0,X1,...,Xn 都成对不同

  2. 一个边缘向后

    call(R_2, X,X0).

所以这是一个循环。换句话说,循环图是包含至少一个循环的图。而那个循环由一个非循环部分加上一个边缘向后组成。也只有这个边缘才使这成为一个循环。

【讨论】:

  • 你能解释一下这里发生了什么吗?
【解决方案2】:

您的递归谓词 isConnected/2 错过了基本情况:

isConnected(X,Y) :- graph1(X,Y).

(当然,假设我们正在检查 graph1)。

无论如何,你不能使用 isConnected/2,因为 Prolog 会在循环图上循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2021-07-28
    相关资源
    最近更新 更多