% Logik og sprog, Modul 2, datalogi RUC Henning Christiansen % % % En "Profiler" for Prolog som source-to-source overs¾tter; % afsnit 11.2 i "Sprog og abstrakte maskiner" % % (c) 2000, Henning Christiansen % Profiler % - et v¾rkt¿j, som f¿rer statistik % over antallet af gange, de forskellige % klausuler kaldes og hvor mange gange % de giver succes. % % profiler( Hovede ) % % Hovede er et kald af pr¾dikat med anonyme % variable som argumenter, % f.eks. profiler( p(_,_) ) % % profiler(Hovede):- snup_alle_klausuler(Hovede,Ker), dekorer_klausuler(Ker). snup_alle_klausuler(Hovede,[(KopiHovede:-Krop)|Ker]):- copy_term(Hovede, KopiHovede), % indbygget retract((KopiHovede:- Krop)), !, snup_alle_klausuler(Hovede, Ker). snup_alle_klausuler(_,[]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % dekorer_klausuler(Klausuler) % % assertz'er klausulerne, men har forinden tilf¿jet % ekstra kode, som udf¿rer statistik til profilering dekorer_klausuler([]). dekorer_klausuler([(Hovede:-Krop)|Ker]):- nyt_indeks(I), % s¾t en t¾ller op: assertz( taelle(I, (Hovede:-Krop), 0, 0) ), assertz( (Hovede :- tael_en_starter(I), Krop, tael_en_success(I) ) ), dekorer_klausuler(Ker). :- dynamic taelle/4. % taelle( Indeks, Klausul, AntalStarter, AntalSuccesser) tael_en_starter(I):- retract(taelle(I, Klausul, Start, Slut)), StartPlusEn is Start+1, asserta(taelle(I, Klausul, StartPlusEn, Slut)). tael_en_success(I):- retract(taelle(I, Klausul, Start, Slut)), SlutPlusEn is Slut+1, asserta(taelle(I, Klausul, Start, SlutPlusEn)). % statistik statistik:- \+ ( taelle(_, Klausul, Start, Slut), write('Klausul: '), write(Klausul),nl, write('kald: '), write(Start), write(' '), write('succes: '), write(Slut), nl,nl, fail % for at fŒ l¿kke ). % Vor lille indekst¾ller. :- dynamic indeks/1. indeks(0). nyt_indeks(I):- retract(indeks(Gammel)), I is Gammel + 1, asserta(indeks(I)).