我有以下规则可以找到图表中的所有路径。
path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z), path(Z,Y).
但是,我想要每个节点n ,添加边缘n-> n (如果尚未存在)。
如何在没有任何节点关系的情况下执行此操作?
答案 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).