:- use_module(library(real)). %:- r(install..packages("igraph")). :- r(library("igraph") ). aleph :- pagerank('aleph.pl'). pagerank(F) :- % g <- graph([0,0],n=1000), parse(F,S), g <- graph(S), r <- page..rank(g), Scores <- r$vector, max_element(Scores, I, V), found(N, A, I), format('most linked predicate is ~a/~d, score ~2f.~n',[N,A,V]). max_element(S, IF, VF) :- S = [V|Els], max_element(Els, V, 0, 0, IF, VF). max_element([], VF, IM, _, IM, VF). max_element([V|Els], VM, _IM, I0, IF, VF) :- V > VM, !, I is I0+1, max_element(Els, V, I0, I, IF, VF). max_element([_|Els], VM, IM, I0, IF, VF) :- I is I0+1, max_element(Els, VM, IM, I, IF, VF). parse(File, L) :- open(File, read, S), findall(O, process(S, O),L), close(S). process(S, O) :- repeat, read(S, T), % writeln(T), ( T == end_of_file -> !, fail ; do(T, O) ). do((A :- B), O) :- id(A, IDA), process_body(B, IDA, O). do((:- G),_) :- catch(call(G),_,fail), !, fail. process_body(B, _IDA, _) :- var(B), !, fail. process_body((B1,B2), IDA,O) :- !, process_body(B1, IDA, O) ; process_body(B2, IDA, O). process_body((B1;B2), IDA, O) :- !, process_body(B1, IDA, O) ; process_body(B2, IDA, O). process_body((B1->B2), IDA, O) :- !, process_body(B1, IDA, O) ; process_body(B2, IDA, O). process_body(B, IDA, O) :- id(B,IDB), ( O = IDB; O = IDA ). % r(add..edges(g,c(IDA,IDB))). :- dynamic ids/1, found/3, exists/2. new(IDA,IDB) :- \+ exists(IDA,IDB), assert(exists(IDA,IDB)). id(F, I) :- functor(F,N,A), (found(N,A,I) -> true ; new(N, A, I) ). ids(0). new(N, A, I) :- retract(ids(I)), I1 is I+1, assert(found(N,A,I)), assert(ids(I1)).