1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2%%                                                                           %%
    3%%      Version:  1.00   Date: 20/06/96   File: hooks.pl                     %%
    4%% Last Version:                          File:                              %%
    5%% Changes:                                                                  %%
    6%% 20/06/96 Created                                                          %%
    7%%                                                                           %%
    8%% Purpose:                                                                  %%
    9%%                                                                           %%
   10%% Author:  Torsten Schaub                                                   %%
   11%%                                                                           %%
   12%% Usage:   prolog hooks.pl                                                  %%
   13%%                                                                           %%
   14%%                                                                           %%
   15%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   16
   17:- dynamic(body_hooks_flag/0).   18:- dynamic(pred_hooks_flag/0).   19
   20%%% ----------------------------------------------------------------------
   21%%% HOOKS CONFIGURATION
   22
   23hook_configuration :-
   24	nl,write('HOOK CONFIGURATION:'),nl,nl,
   25	
   26	write("body hook handling     "),
   27	write(' = '),
   28	(body_hooks_flag -> write(on) ; write(off)),
   29	nl,
   30
   31	write("predicate hook handling"),
   32	write(' = '),
   33	(pred_hooks_flag -> write(on) ; write(off)),
   34	nl.
   35
   36%%% Hook handling is turned off by no_hook_handling
   37
   38no_hook_handling :- no_body_hooks, no_pred_hooks.
   39
   40%%% Body hooks are turned on by body_hooks.
   41%%% off by no_body_hooks.
   42
   43body_hooks :-                          % enable body hooks
   44        retract(body_hooks_flag),
   45        fail.
   46body_hooks :-
   47        assert(body_hooks_flag).
   48
   49no_body_hooks :-                       % disable body hooks
   50        retract(body_hooks_flag),
   51        fail.
   52no_body_hooks.
   53
   54%%% Predicate hooks are turned on by pred_hooks.
   55%%% off by no_pred_hooks.
   56
   57pred_hooks :-                          % enable predicate hooks
   58        retract(pred_hooks_flag),
   59        fail.
   60pred_hooks :-
   61        assert(pred_hooks_flag).
   62
   63no_pred_hooks :-                       % disable predicate hooks
   64        retract(pred_hooks_flag),
   65        fail.
   66no_pred_hooks.
   67
   68%%% SETTINGS for HOOKS HANDLING
   69%%%
   70
   71:- compile(hooks_config).   72
   73%%% ----------------------------------------------------------------------
   74%%% BODY HOOKS
   75
   76add_body_hooks((Head :- Body),(Head :- Body2)) :-
   77	body_hooks_flag,
   78	!,
   79	(bhook1_p(Head :- Body) ->
   80	    conjoin((bhook1(Head :- Body)),Body,Body1);
   81        %true ->
   82	    Body1=Body),
   83	(bhook2_p(Head :- Body) ->
   84	    conjoin(Body1,(bhook2(Head :- Body)),Body2);
   85        %true ->
   86	    Body2=Body1).
   87add_body_hooks((Head :- Body),(Head :- Body)).
   88
   89%%% COMPILE-TIME conditions for body hook insertion
   90
   91bhook1_p(Head :- Body) :-
   92	true.
   93bhook2_p(Head :- Body) :-
   94	true.
   95
   96%%% RUN-TIME predicates for body hooks
   97
   98bhook1(Head :- Body) :-
   99	(Head = _) ->
  100	    Head =.. [P|_],
  101	    nl,write(b1:(P)),nl,nl;
  102        %true ->
  103	     true.
  104bhook2(Head :- Body) :-
  105	(Head = _) ->
  106	    Head =.. [P|_],
  107	    nl,write(b2:(P)),nl,nl;
  108        %true ->
  109	     true.
  110
  111%%% ----------------------------------------------------------------------
  112%%% BODY HOOKS
  113
  114%%% COMPILE-TIME conditions for PREDICATE hook insertion
  115
  116phook_tests(P,N,TestsA,Proc,ProcP) :-
  117	pred_hooks_flag,
  118	!,
  119	
  120	phook1_tests(P,N,Tests1),
  121	conjoin(Tests1,TestsA,Tests1A),
  122	
  123	phook2_tests(P,N,Tests2),
  124	conjoin(Tests1A,Tests2,Tests1A2),
  125
  126	phook3_tests(P,N,Tests3),
  127	conjoin(Proc,Tests3,Proc3),
  128
  129	conjoin(Tests1A2,Proc3,ProcP).
  130phook_tests(_,_,TestsA,Proc,ProcP) :-
  131	conjoin(TestsA,Proc,ProcP).
  132
  133phook1_p(P,N) :-
  134	true.
  135phook2_p(P,N) :-
  136	true.
  137phook3_p(P,N) :-
  138	true.
  139
  140%%% COMPILE-TIME predicates PREDICATE hook insertion
  141
  142phook1_tests(P,N,Result) :-
  143	phook1_p(P,N),
  144	!,
  145	head(P,N,Head),
  146	Body=(nl,write(p1:P),nl,fail),
  147	Result = (Head :- Body).
  148phook1_tests(_,_,true).
  149
  150phook2_tests(P,N,Result) :-
  151	phook2_p(P,N),
  152	!,
  153	head(P,N,Head),
  154	Body=(nl,write(p2:P),nl,fail),
  155	Result = (Head :- Body).
  156phook2_tests(_,_,true).
  157
  158phook3_tests(P,N,Result) :-
  159	phook3_p(P,N),
  160	!,
  161	head(P,N,Head),
  162	Body=(nl,write(p3:P),nl,fail),
  163	Result = (Head :- Body).
  164phook3_tests(_,_,true).
  165
  166head(P,N,Head) :-
  167	P == query ->
  168                Head = query;
  169	%true ->
  170		functor(Head,P,N)