% count.pl % % Information about contents of a valid Prolog file % Any files prefixed ":- consult(file)" will be count-ed too. % The information given is % Number of predicates % Number of clauses in each predicate % % % The output from "count('count.pl')" is as follows: % % 5 predicates % count/1: 3 clauses in count.pl % count/2: 2 clauses in count.pl % summarise/0: 2 clauses in count.pl % dump/1: 1 clauses in count.pl % look_at/2: 3 clauses in count.pl count([File|Others]) :- !, dump(File), count(Others). count([]) :- !, summarise. count(File) :- dump(File), summarise. summarise :- recorded(pred_count,I,_), write(I), write(' predicates'), nl, recorded(pred_name,Name,_), recorded(Name,[Arity,N,File],_), write(Name), write('/'), write(Arity), write(': '), write(N), write(' clauses in '), write(File), nl, fail. summarise. dump(File) :- seeing(Seeing), see(File), !, read(Term), look_at(Term,File), seen, see(Seeing). look_at(end_of_file,_) :- !. look_at((:- consult(Different)),File) :- !, dump(Different), read(Another_thing), look_at(Another_thing,File). look_at(Thing,File) :- count(Thing,File), read(Another_thing), look_at(Another_thing,File). count((Head :- _),File) :- !, count(Head,File). count(Head,File) :- /* This clause is long but straighforward. 1. Get the functor name for the clause and its arity 2. Count the number of occurrences of functor/arity */ functor(Head,Func_name,Arity), ( recorded(Func_name, [Arity,I,File], Akey) -> ( J is I + 1, record(Func_name, [Arity,J,File], _), erase(Akey) ) ; record(Func_name, [Arity,1,File], _), ( recorded(pred_name, Func_name, _) ; record(pred_name, Func_name, _) ), ( recorded(pred_count, A, Bkey) -> ( B is A + 1, record(pred_count, B, _), erase(Bkey) ) ; record(pred_count,1,_) ) ), !.