通过Prolog的任意强连接组件

通过Prolog的任意强连接组件,prolog,strongly-connected-graph,prolog-tabling,Prolog,Strongly Connected Graph,Prolog Tabling,Markus Triska报告了一种用于确定(SCC)的算法。是否有一种解决方案可以在不使用属性变量的情况下确定SCC,并且可以随时工作。所以一些顶点可以有无限多条边 我这样问是因为我想知道他们称之为“渴望”的B-Prologs是否可以复制。B-Prolog确定集群,集群是SCC的名称。但它也有一种表格模式,在这种模式下,它会急切地返回表格中的结果。我想这符合要求,因为只要稍加修改,它将允许根中有一个无限度。当所有边指向有限多个顶点时,这是SCC算法: % plan(+Atom, -Assoc)

Markus Triska报告了一种用于确定(SCC)的算法。是否有一种解决方案可以在不使用属性变量的情况下确定SCC,并且可以随时工作。所以一些顶点可以有无限多条边

我这样问是因为我想知道他们称之为“渴望”的B-Prologs是否可以复制。B-Prolog确定集群,集群是SCC的名称。但它也有一种表格模式,在这种模式下,它会急切地返回表格中的结果。

我想这符合要求,因为只要稍加修改,它将允许根中有一个无限度。当所有边指向有限多个顶点时,这是SCC算法:

% plan(+Atom, -Assoc)
plan(P, R) :-
  sccforpred(P, [], [], R, _).

% sccforpred(+Atom, +List, +Assoc, -Assoc, -List)
sccforpred(P, S, H, H, [P]) :-
  member(P, S), !.
sccforpred(P, _, H, H, []) :-
  member(Q-L, H), (Q = P; member(P, L)), !.
sccforpred(P, S, I, O2, R2) :-
  findall(Q, edge(P, Q), L),
  sccforlist(L, [P|S], I, O, R),
  (member(U, R), member(U, S) ->
      O2 = O, R2 = [P|R];
      O2 = [P-R|O], R2 = []).

% sccforlist(+List, +List, +Assoc, -Assoc, -List)
sccforlist([], _, H, H, []).
sccforlist([P|Q], S, I, O, R) :-
  sccforpred(P, S, I, H, R1),
  sccforlist(Q, S, H, O, R2),
  findall(U, (member(U, R1); member(U, R2)), K),
  sort(K, R).
使用此示例图:

我得到这个结果:

Jekejeke Prolog 4, Runtime Library 1.4.1 (August 20, 2019)

?- plan(21,X).
X = [21-[], 22-[22, 23], 26-[24, 25, 26], 27-[]]
我想这符合条例草案,因为稍加修改,它将允许在根无限度。当所有边指向有限多个顶点时,这是SCC算法:

% plan(+Atom, -Assoc)
plan(P, R) :-
  sccforpred(P, [], [], R, _).

% sccforpred(+Atom, +List, +Assoc, -Assoc, -List)
sccforpred(P, S, H, H, [P]) :-
  member(P, S), !.
sccforpred(P, _, H, H, []) :-
  member(Q-L, H), (Q = P; member(P, L)), !.
sccforpred(P, S, I, O2, R2) :-
  findall(Q, edge(P, Q), L),
  sccforlist(L, [P|S], I, O, R),
  (member(U, R), member(U, S) ->
      O2 = O, R2 = [P|R];
      O2 = [P-R|O], R2 = []).

% sccforlist(+List, +List, +Assoc, -Assoc, -List)
sccforlist([], _, H, H, []).
sccforlist([P|Q], S, I, O, R) :-
  sccforpred(P, S, I, H, R1),
  sccforlist(Q, S, H, O, R2),
  findall(U, (member(U, R1); member(U, R2)), K),
  sort(K, R).
使用此示例图:

我得到这个结果:

Jekejeke Prolog 4, Runtime Library 1.4.1 (August 20, 2019)

?- plan(21,X).
X = [21-[], 22-[22, 23], 26-[24, 25, 26], 27-[]]