Markus Triska报告了一种确定strongly connected components(SCC)的算法。是否有一种解决方案,可以在不使用属性变量的情况下确定SCC,并且可以随时使用。这样某些顶点可以具有无限多个边?
我之所以问是因为我想知道他们所谓的B-Prologs anytime tabling是否可以复制。 B-Prolog确定群集,它们是SCC的名称。但是,它还有一种制表模式,可以快速返回表格结果。
答案 0 :(得分:0)
我猜想这个algorithm符合要求,因为只需稍加修改,它就可以在根中实现无限的度数。当所有边都指向有限多个顶点时,这是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-[]]