.decl scc_dep(scc:number, src:number) // SCC dependency edges
scc_dep(scc_a, scc_b) :- rel_dep(a, b), scc(scc_a, a), scc(scc_b, b), scc_a != scc_b.
// SCC transitive closure
.decl scc_dep_tc(scc:number, src:number, dist:number)
scc_dep_tc(a, b, 1) :- scc_dep(a, b).
scc_dep_tc(a, c, ab + bc) :- scc_dep_tc(a, b, ab), scc_dep_tc(b, c, bc).
// topological order of SCC
.decl scc_order(index:number, scc:number)
scc_order(0, a) :- scc(a, _), !scc_dep(a, _).
scc_order(mxi, a) :- scc(a, _),
mxi = max i : {
scc_dep_tc(a, _, i)
}.