2

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

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

但是,我还想为每个节点 n添加边缘 n->n如果不存在的话。

在没有任何节点关系的情况下如何做到这一点?

4

1 回答 1

3

仅在 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).
于 2016-03-31T14:16:22.563 回答