16
17:- dynamic(body_hooks_flag/0). 18:- dynamic(pred_hooks_flag/0). 19
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
37
38no_hook_handling :- no_body_hooks, no_pred_hooks.
39
42
43body_hooks :- 44 retract(body_hooks_flag),
45 fail.
46body_hooks :-
47 assert(body_hooks_flag).
48
49no_body_hooks :- 50 retract(body_hooks_flag),
51 fail.
52no_body_hooks.
53
56
57pred_hooks :- 58 retract(pred_hooks_flag),
59 fail.
60pred_hooks :-
61 assert(pred_hooks_flag).
62
63no_pred_hooks :- 64 retract(pred_hooks_flag),
65 fail.
66no_pred_hooks.
67
70
71:- compile(hooks_config). 72
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 82 Body1=Body),
83 (bhook2_p(Head :- Body) ->
84 conjoin(Body1,(bhook2(Head :- Body)),Body2);
85 86 Body2=Body1).
87add_body_hooks((Head :- Body),(Head :- Body)).
88
90
91bhook1_p(Head :- Body) :-
92 true.
93bhook2_p(Head :- Body) :-
94 true.
95
97
98bhook1(Head :- Body) :-
99 (Head = _) ->
100 Head =.. [P|_],
101 nl,write(b1:(P)),nl,nl;
102 103 true.
104bhook2(Head :- Body) :-
105 (Head = _) ->
106 Head =.. [P|_],
107 nl,write(b2:(P)),nl,nl;
108 109 true.
110
113
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
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 170 functor(Head,P,N)