В любое время сильно подключенные компоненты через Пролог - PullRequest
0 голосов
/ 26 октября 2019

Маркус Триска сообщил об алгоритме определения сильно связанных компонентов (SCC). Есть ли решение, которое определяет SCC без использования атрибутивной переменной и которое может работать в любое время. Так что некоторые вершины могут иметь бесконечно много ребер?

Я спрашиваю, потому что мне интересно, могут ли B-Prologs табулировать в любое время , которые они называют готовыми, копироваться. B-Prolog определяет кластеры, которые являются их названиями для SCC. Но у него также есть режим табулирования, где он с готовностью возвращает результаты в виде таблицы.

1 Ответ

0 голосов
/ 27 октября 2019

Полагаю, этот алгоритм отвечает всем требованиям, поскольку с небольшими изменениями он позволит получить бесконечную степень в корне. Это алгоритм 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).

Используя этот пример графика:

enter image description here

Iполучить такой результат:

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

?- plan(21,X).
X = [21-[], 22-[22, 23], 26-[24, 25, 26], 27-[]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...