【问题标题】:Prolog. Construct a transitive closure of a graph序言。构造图的传递闭包
【发布时间】:2020-11-29 17:53:30
【问题描述】:

我对 Prolog 很陌生。 我有这样一张图:

edge(a,e).
edge(e,f).
edge(f,d).
edge(d,a).

我将传递闭包定义为:

p(X,Y) :- edge(X,Y).
tran(X,Z) :- p(X,Y), p(Y,Z).

我需要构造一个图的传递闭包。请让我知道如何继续。

【问题讨论】:

标签: prolog transitive-closure


【解决方案1】:

trans/2 的问题在于它只会走两条条边,而不是任意数量。

我们可以定义一个谓词tran(X, Z),如果edge(X, Z) 成立,或者edge(X, Y) 然后tran(Y, Z) 成立。因此,我们在后者中跟随一个边缘,然后在tran/2 上递归:

tran(X, Z) :-
    edge(X, Z).
tran(X, Z) :-
    edge(X, Y),
    tran(Y, Z).

【讨论】:

  • 如何向图中添加满足条件的边?
  • @willemvanonsem - 循环呢?你的程序可能永远循环。见stackoverflow.com/questions/27258188/…
  • @peak:在这种情况下,您添加一个累加器:一个包含已看到项目的列表。
猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多