This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/real/examples/pagerank.pl
2015-10-13 08:25:49 +01:00

83 lines
1.7 KiB
Prolog

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