type rank(node, int, float).
type calcRank(node, int, sum float).
% type persistent numPages(node,  int).
type persistent numPages(node, sum int).
type numLinks(node, sum int).
type path(node, node).

const damping = 0.85.
const num_iterations = 100.
% extern float to_float(int).
% extern float float_abs(float).

rank(A, 0, 1.0 / to_float(T)) :- numPages(A,T).
rank(A, I, V) :-
	numLinks(B,L),
	numPages(A, Ps),
	calcRank(A, I, T),
%	Before = I - 1,
%	rank(A, Before, VOld),
	V = damping + (1.0 - damping) * T,
	I =< num_iterations.

% //float_abs((damping + (1.0 - damping) * T) - VOld) > 0.001.

calcRank(A, I + 1, 0.0) :-
	 rank(A, I, _).
calcRank(A, I + 1, O / to_float(C)) :-
	edge(B, A),
	rank(B, I, O),
	numLinks(B, C).

numLinks(A, 1) :-
	edge(A,B).

numPages(A, 1) :- path(A,_).

path(A, B) :-
	edge(A,B).
path(A, B) :-
	edge(B,A).
path(A, B) :-
	edge(A,C),
	path(C,B).
path(A, B) :-
	edge(C,A),
	path(C,B).