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).