Prolog library: count.pl
pereira at sri-unix.UUCP
pereira at sri-unix.UUCP
Mon Aug 15 15:51:45 AEST 1983
% File: Mec:Count.Pl Author: R.A.O'Keefe Updated: 7 December 82
% This program is a re-implementation of Chris Mellish's clause counter,
% which uses my 'try_hard_to_see' and 'help' mechanisms. For information
% on how to use the program, run it and type 'help' or .Help Mec:Count
% NEEDS give_help/2 and try_hard_to_see/3 from Mec:Helper.Pl .
% Has now been rehacked to live in ToolKit, so 'help' is redundant.
:- public
/* help/0, % displays Mec:Count.Hlp */
count/0. % top level
:- mode
count_command(+,-),
count_command(+,-,-),
getfile(-),
count,
count(+,-,+,-),
count(+,+,-,+,-),
/* help, */
load_goals(+,-,-),
load_list(+,-,-),
proceed(+,-,-),
proceed(+,+,-,+,-),
read_and_expand(-),
read_a_line(+,-),
rest_of_line(+,-).
/* help :- */
/* give_help(count, count). */
count :-
/* abolish(noticed, 2), */
count(0, C, 0, P),
writef('%20L%5R clauses%4R predicates.\n',
['Grand total:', C, P]).
count(Cold, Cnew, Pold, Pnew) :-
getfile(File), !,
count(File, Cold, Cnew, Pold, Pnew).
count('', Cfin, Cfin, Pfin, Pfin) :- !.
count('?', Cold, Cnew, Pold, Pnew) :-
give_help(count, files), !,
count(Cold, Cnew, Pold, Pnew).
count(File, Cold, Cnew, Pold, Pnew) :-
proceed(File, C, P),
Cmid is Cold+C,
Pmid is Pold+P, !,
count(Cmid, Cnew, Pmid, Pnew).
getfile(File) :-
read_a_line('Next file: ', Chars),
name(File, Chars).
read_a_line(Prompt, Chars) :-
display(Prompt), ttyflush,
get0(Char), !,
rest_of_line(Char, Chars).
rest_of_line(31, []) :- !.
rest_of_line(27, []) :- !.
rest_of_line(Ch, [Ch|Rest]) :-
get0(C2), !,
rest_of_line(C2, Rest).
proceed(File, C, P) :-
seeing(OldFile),
try_hard_to_see(File, ['press','mec','util'], ['pl', 'cpl']), !,
read_and_expand(Term),
proceed(Term, 0, C, 0, P),
seeing(FileName),
seen,
see(OldFile), !,
writef('%20L%5R clauses%4R predicates.\n', [FileName, C, P]).
proceed(File, 0).
read_and_expand(Term) :-
read(Read),
( var(Read), Term = true, !
; expand_term(Read, Term)
).
proceed(end_of_file, Cfin, Cfin, Pfin, Pfin) :- !.
proceed(Term, Cold, Cnew, Pold, Pnew) :-
count_command(Term, C, P),
Cmid is Cold+C,
Pmid is Pold+P,
read_and_expand(Next), !,
proceed(Next, Cmid, Cnew, Pmid, Pnew).
count_command(( :- Goals ), C, P) :- !,
load_goals(Goals, C, P).
count_command(( ?- Goals ), C, P) :- !,
load_goals(Goals, C, P).
count_command((Head:-Body), 1, P) :- !,
count_command(Head, P).
count_command(Head, 1, P) :- !,
count_command(Head, P).
count_command(Head, 1) :-
functor(Head, F, N),
\+ '$seen'(F, N), !,
seeing(File),
assertz('$seen'(F, N)),
assertz('$defn'(F, N, File)).
count_command(Head, 0).
load_goals((G1,G2), C, P) :- !,
load_goals(G1, C1, P1),
load_goals(G2, C2, P2),
C is C1+C2,
P is P1+P2.
load_goals(compile(L), C, P) :- !,
load_list(L, C, P).
load_goals([A|B], C, P) :- !,
load_list([A|B], C, P).
load_goals(consult(L), C, P) :- !,
load_list(L, C, P).
load_goals(load(L), C, P) :- !,
load_list(L, C, P).
load_goals(op(P,T,A), 0, 0) :- !,
op(P, T, A).
load_goals(_, 0, 0).
load_list([File|Rest], C, P) :- !,
proceed(File, C1, P1),
load_list(Rest, C2, P2),
C is C1+C2,
P is P1+P2.
load_list([], 0, 0) :- !.
load_list(File, C, P) :-
atom(File), !,
proceed(File, C, P).
load_list(_, 0, 0).
More information about the Comp.sources.unix
mailing list