在数据记录中添加循环边(bddbddb)

时间:2016-03-31 12:13:34

标签: graph identity transitive-closure datalog

我有以下规则可以找到图表中的所有路径。

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

但是,我想要每个节点n 添加边缘n-> n (如果尚未存在)。

如何在没有任何节点关系的情况下执行此操作?

1 个答案:

答案 0 :(得分:3)

仅在Prolog中,你会写:

path(X,X).
path(X,Y) :- false, edge(X,Y).
path(X,Y) :- edge(X,Z), path(Z,Y).

或更短,使用closure0/3更多终止。

path(X,Y) :-
   closure0(edge, X,Y).

在(许多定义)Datalog作为Prolog的子集中,不允许使用像path(X,X).这样的事实,因为它们承认了无限的解决方案。

所以你需要将这个事实限制在一组有限的节点上。但是,由于您没有明确的节点定义,因此您需要根据边缘构成一个:

node(X) :-
   edge(X,_).
node(Y) :_
   edge(_,Y).

现在导致:

path(X,X) :-
   node(X).
path(X,Y) :-
   edge(X,Z),
   path(Z,Y).