14
16:- module(ru,
17[ 18 uses_undefined_hook/0,
19 install_retry_undefined/2,
20 21 22 is_parent_goal/1,
23 is_parent_goal/2,
24 is_parent_goal/1,
25 is_parent_goal/2
26]).
27
28:- thread_local(was_prolog_flag/1).
29:- current_prolog_flag(retry_undefined,Was)->asserta(was_prolog_flag(retry_undefined,Was));asserta(was_prolog_flag(retry_undefined,none)).
31:- use_module(library(bugger)).
32:- use_module(library(hook_database)).
33
34:- create_prolog_flag(retry_undefined, none,[type(term),keep(false)]).
35
36:- module_transparent((
37 uses_predicate/2,
38 uses_undefined_hook/0,
39 uses_predicate/5,
40 retry_undefined/3,
41 is_parent_goal/1,
42 install_retry_undefined/2,
43 is_parent_goal/2,
44 is_parent_goal/1,
45 get_retry_undefined_hook/2,
46 is_parent_goal/2)).
47
48:- dynamic(ru:retry_undefined_hook/2).
49
50get_retry_undefined_hook(X,Y):- ru:retry_undefined_hook(X,Y).
51get_retry_undefined_hook(_M,Was):- current_prolog_flag(retry_undefined, Was), Was\==module.
52
53install_retry_undefined(Module,Setting):- asserta((ru:retry_undefined_hook(Module,Was):-!,Was=Setting)).
54
55:- install_retry_undefined('$toplevel',error).
56:- install_retry_undefined('user',error).
57
58uses_undefined_hook.
59
60
61
62 :- meta_predicate uses_predicate(*,*,*,*,*,*).
63 :- meta_predicate uses_predicate(*,*,*,*,*,*).
64 :- meta_predicate uses_predicate(1,*,*,*,*,*).
65
66
67dumpST_dbreak:- dumpST,break.
68
71
95
97uses_predicate(_DEF,_,_,_,_,Error):-
98 prolog_current_frame(F), (is_parent_goal(F,'$define_predicate'(_));
99 (is_parent_goal(F,_:'assert_u'(_)));is_parent_goal(F,'$syspreds':property_predicate(_,_))),!,
100 error = Error.
101
102uses_predicate(_Was,_CM,_M,_F,_A,Error):- is_parent_goal(check:check),!,Error=error.
103uses_predicate(_Was,_CM,_M,_F,_A,Error):- is_parent_goal(check:check),!,Error=error.
104uses_predicate(_Was,_CM,_M,_F,_A,Error):- show_success(is_parent_goal('$define_predicate')),!,Error=error.
105
106uses_predicate(_Was,_CM,'$toplevel',_F,_A,Error):- !,Error=error.
107
108uses_predicate(_DEF,_, _, ~, 1, error) :- !.
109uses_predicate(_DEF,_,CallerMt,'$pldoc',4,retry):- make_as_dynamic(uses_predicate,CallerMt,'$pldoc',4),!.
110uses_predicate(_DEF,User, User, module, 2, error):-!.
111uses_predicate(_DEF,_,_, (:-), _, error) :- !, fail.
112uses_predicate(_DEF,_,_, (/), _, error) :- !.
113uses_predicate(_DEF,_,_, ( '//' ), _, error) :- !.
114uses_predicate(_DEF,_,_, F, _, error) :- atom_concat('__',_,F),!.
115uses_predicate(_DEF,_,_, F, _, error) :- atom_concat('$',_,F),!.
116
117uses_predicate(_DEF,_,_, (:), _, error) :- !. 121
124uses_predicate(_DEF,_,Module,Name,Arity,Action) :-
125 current_prolog_flag(autoload, true),
126 '$autoload'(Module, Name, Arity), !,
127 Action = retry.
128
129
130uses_predicate(E,_,_,_,_,Error):- E=error, !,Error=error.
131uses_predicate(fail,_,_,_,_,_):- !,fail.
132uses_predicate(break,_,_,_,_,Error):- !,dumpST_dbreak,Error=error.
133
134
135uses_predicate(_DEF,_,System, _,_, error):- module_property(System,class(system)),!.
136uses_predicate(_DEF,_,System, _,_, error):- module_property(System,class(library)),!.
137
138uses_predicate(Setting,SM,M,F,A,Act):- Setting\==kb_shared, SM\==user, M\==baseKB,
139 (dmsg(uses_predicate(Setting,SM,M,F,A,Act))),fail.
140
141uses_predicate(kb_shared,System, M, F,A, retry):-
142 show_failure(uses_undefined_hook(M)),
143 create_predicate_inheritance(kb_shared(M:F/A),M,F,A),
144 nop(System:import(M:F/A)),!.
145
147
148uses_predicate(_,_, M,F,A, Retry):- retry_undefined(M,F,A),!,Retry=retry.
149
150uses_predicate(DEF,_, M, F,A, Retry):- call(DEF, M:F/A),!,Retry=retry.
151
152:- if(\+ current_predicate(autoload_library_index/4)).
153in_autoload_library_index(F,A,_PredMt,File):- '$in_library'(F,A,File).
154:- else.
155in_autoload_library_index(F,A,PredMt,File):- autoload_library_index(F,A,PredMt,File).
156:- endif.
157
158:- meta_predicate with_no_retry_undefined(:).
159with_no_retry_undefined(Goal):- locally(set_prolog_flag(retry_undefined, none),
160 locally(set_prolog_flag(runtime_debug,0),Goal)).
161
162
164retry_undefined(CallerMt,'$pldoc',4):- multifile(CallerMt:'$pldoc'/4),discontiguous(CallerMt:'$pldoc'/4),dynamic(CallerMt:'$pldoc'/4),!.
166retry_undefined(CallerMt,debug,1):- use_module(CallerMt:library(debug)),!.
167retry_undefined(CallerMt,debugging,1):- use_module(CallerMt:library(debug)),!.
168retry_undefined(CallerMt,member,2):- use_module(CallerMt:library(lists)),!.
169retry_undefined(CallerMt,directory_file_path,3):- use_module(CallerMt:library(filesex)),!.
173retry_undefined(lmcache,F,A):- volatile(lmcache:F/A),make_as_dynamic(retry_undefined(lmcache),lmcache,F,A),!.
174retry_undefined(t_l,F,A):- thread_local(t_l:F/A),!,make_as_dynamic(retry_undefined(t_l),t_l,F,A),!.
175
176
177:- if(false).
178
180retry_undefined_falsed_out(Mt, F, A):- clause_b(mtCycLBroad(Mt)), clause_b(hybrid_support(F,A)),
181 make_as_dynamic(mtCycLBroad(Mt),Mt,F,A).
182
184retry_undefined_falsed_out(CallerMt,F,A):- clause_b(mtGlobal(CallerMt)), clause_b(hybrid_support(F,A)),
185 186 create_predicate_inheritance(retry_undefined_falsed_out(CallerMt:F/A),CallerMt,F,A).
187
189retry_undefined_falsed_out(CallerMt,F,A):- current_predicate(system:F/A), current_module(M),M\=system,
190 current_predicate(M:F/A),functor(P,F,A),predicate_property(M:P,defined),\+predicate_property(M:P,imported_from(_)),
191 CallerMt:import(M:F/A).
192
194retry_undefined_falsed_out(CallerMt,F,A):-
195 in_autoload_library_index(F,A,_PredMt,File),
196 use_module(CallerMt:File),!.
197
199retry_undefined_falsed_out(CallerMt,F,A):- fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,
200 in_autoload_library_index(F,A,PredMt,File),
201 asserta(lmcache:how_registered_pred(PredMt:use_module(CallerMt:File),CallerMt,F,A)),
202 use_module(system:File),!.
203 204
205
206retry_undefined_falsed_out(CallerMt,F,A):- fail,
207 in_autoload_library_index(F,A,_,File),
208 load_files(CallerMt:File,[if(true),imports([F/A]),register(false),silent(false)]),!.
209
211retry_undefined_falsed_out(CallerMt,F,A):- fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,
212 in_autoload_library_index(F,A,PredMt,File),
213 asserta(lmcache:how_registered_pred(PredMt:use_module(CallerMt:File),CallerMt,F,A)),
214 use_module(CallerMt:File),!.
215
223
224retry_undefined_falsed_out(CallerMt,F,A):- fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,fail,
225 functor(P,F,A),find_module(P,M),show_call(CallerMt:import(M:F/A)),!.
226
227
228
231
232:- endif.
233
234
235
237uses_undefined_hook(CM):- nonvar(CM),clause(mtNoInheritance(CM),true),!,fail.
238uses_undefined_hook(CM):- clause_b(genlMt(CM,_)),!.
240uses_undefined_hook(baseKB).
242
243
244user_exception_undefined_predicate(CM,M,F,A,ActionO):-
245 \+ prolog_load_context(reloading,true),
246 current_prolog_flag(retry_undefined, Was), Was \== false, Was \== none,
247 get_retry_undefined_hook(M,Setting),!, Setting\==error,
248 CM:setup_call_cleanup(set_prolog_flag(retry_undefined, false),
249 (uses_predicate(Setting,CM,M,F,A, ActionO), ActionO \== error),
250 set_prolog_flag(retry_undefined, Was)),!.
251
252
253:- fixup_exports.
254
255:- multifile(prolog:make_hook/2).
256:- dynamic(prolog:make_hook/2).
257:- multifile(lmcache:was_retry_undefined/2).
258:- dynamic(lmcache:was_retry_undefined/2).
259:- dynamic(prolog:make_hook/2).
260prolog:make_hook(before, C):- current_prolog_flag(retry_undefined, WAS),asserta(lmcache:was_retry_undefined(WAS,C)),set_prolog_flag(retry_undefined, false),fail.
261
262prolog:make_hook(after, C):- retract(lmcache:was_retry_undefined(WAS,C)),set_prolog_flag(retry_undefined, WAS),fail.
263
264:- multifile(user:exception/3).
265:- module_transparent(user:exception/3).
266:- dynamic(user:exception/3).