我有以下规则可以找到图表中的所有路径。
path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z), path(Z,Y).
但是,我还想为每个节点 n添加边缘 n->n如果不存在的话。
在没有任何节点关系的情况下如何做到这一点?
我有以下规则可以找到图表中的所有路径。
path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z), path(Z,Y).
但是,我还想为每个节点 n添加边缘 n->n如果不存在的话。
在没有任何节点关系的情况下如何做到这一点?
仅在 Prolog 中,您将编写:
路径(X,X)。路径(X,Y):-假,边缘(X,Y)。路径(X,Y):-边缘(X,Z),路径(Z,Y)。
或者使用closure0/3
.
路径(X,Y):- 闭包0(边缘,X,Y)。
在作为 Prolog 子集的 Datalog (许多定义)中,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).