14
16:- module(virtualize_source,
17 [ 18 nb_current_or_nil/2,
19 safe_virtualize/3,
20 21 check_how_virtualize_file/2,
22 could_safe_virtualize/0,
23 decl_wrapped/4,
24 get_how_virtualize_file/2,
25 same_terms/2,
26 sd_goal_expansion/4,
27 set_how_virtualize_file/1,
28 set_how_virtualize_file/2,
29 set_how_virtualize_file/3,
30 swc/0,
31 is_file_virtualize_allowed/0,
32 virtualize_code/3,
33 virtualize_code_each/4,
34 virtualize_code_fa/5,
35 virtualize_ereq/2,
36 virtualize_source/3,
37 virtualize_source_file/0,
38 vwc/0]).
46:- autoload(library(apply),[maplist/2]). 47:- autoload(library(lists),[member/2,append/3]). 48:- autoload(library(occurs),[sub_term/2]). 49
50:- define_into_module(
51 [nb_current_or_nil/2,
52 safe_virtualize/3,
53 54 check_how_virtualize_file/2,
55 could_safe_virtualize/0,
56 decl_wrapped/4,
57 get_how_virtualize_file/2,
58 same_terms/2,
59 sd_goal_expansion/4,
60 set_how_virtualize_file/1,
61 set_how_virtualize_file/2,
62 set_how_virtualize_file/3,
63 swc/0,
64 is_file_virtualize_allowed/0,
65 virtualize_code/3,
66 virtualize_code_each/4,
67 virtualize_code_fa/5,
68 virtualize_ereq/2,
69 virtualize_source/3,
70 virtualize_source_file/0,
71 vwc/0]). 72
73:- module_transparent((
75nb_current_or_nil/2,
76safe_virtualize/3,
77same_terms/2,
79sd_goal_expansion/4,
81swc/0,
82virtualize_code/3,
83virtualize_code_each/4,
84virtualize_code_fa/5,
85virtualize_ereq/2,
86virtualize_source/3,
87vwc/0
88 )). 89
90:- set_module(class(library)). 91:- module_transparent((virtualize_ereq_source/0)). 92
93
94
95:- meta_predicate map_compound_args(3,*,*,*). 96:- meta_predicate map_compound_args(2,*,*). 97
98:- module_transparent(declared_to_wrap/3). 99
100
101:- thread_local(t_l:disable_px/0). 102
104
105nb_current_or_nil(N,V):- quietly((nb_current(N,V)->true;V=[])).
106
115
116
117:- dynamic(baseKB:how_virtualize_file/3). 119get_source_location(File,Pos):- (current_source_location(File,Pos); (prolog_load_context(file,File),prolog_load_context(term_position,Pos))),!.
120get_source_location(_File,0).
121
123
124get_current_clause(MI):- prolog_load_context(term,Was), Was \== [], !, Was = MI.
125get_current_clause(MI):-
126 arg(_,v('$term','$term_user','$term_exp_skip','$orig_term''$source_term','$goal_term','$query_term'),Var),
127 nb_current(Var,Was),Was\==[], !, Was = MI.
128get_current_clause(_).
129
130
131
132virtualize_alias(pfc,heads).
133virtualize_alias(full,heads).
134
135virtualize_alias(part,bodies).
136virtualize_alias(plmoo,bodies).
137virtualize_alias(true,bodies).
138
139virtualize_alias(none,false).
140virtualize_alias(prolog,false).
141
142
143is_pfcname(F) :- atom(F), \+ \+ (((atom_concat(_,'.pfc.pl',F);atom_concat(_,'_pfc.pl',F);atom_concat(_,'.clif',F);atom_concat(_,'.pfc',F)))).
144
145virtualize_source_file :- set_how_virtualize_file(bodies).
146virtualize_source_file(How) :- set_how_virtualize_file(How).
147
148set_how_virtualize_file(How):- get_source_location(File,Pos), set_how_virtualize_file(How,File,Pos).
149set_how_virtualize_file(How,F):- set_how_virtualize_file(How,F,0).
150set_how_virtualize_file(How,F1,Pos):- virtualize_alias(How,NewHow),How\==NewHow, !, set_how_virtualize_file(NewHow,F1,Pos).
151set_how_virtualize_file(How,F1,Pos):-
152 resolve_file_pathname(F1,F),
153 forall((clause(baseKB:how_virtualize_file(_PrevHow,F,PrevPos),true,Ref),
154 PrevPos>=Pos),erase(Ref)),
155 asserta_new(baseKB:how_virtualize_file(How,F,Pos)).
156
157
158resolve_file_pathname(F1,F):- absolute_file_name(F1,F,[access(read),file_errors(fail)]),!.
159resolve_file_pathname(F1,F):- absolute_file_name(F1,F,[file_type(prolog),access(read),file_errors(fail)]),!.
160resolve_file_pathname(F1,F):- absolute_file_name(F1,F,[file_type(directory),access(read),file_errors(fail)]),!.
161resolve_file_pathname(F,F):-!.
162
163get_how_virtualize_file(Lang):- must(get_source_location(File,Pos)),get_how_virtualize_file(Lang, File, Pos).
164get_how_virtualize_file(Lang, File):- get_source_location(File,Pos),!,get_how_virtualize_file(Lang, File, Pos).
165get_how_virtualize_file(Lang, File):- get_how_virtualize_file(Lang, File, 0).
166get_how_virtualize_file(Lang, File, Pos):-
167 findall(sfl(Pos,Lang),baseKB:how_virtualize_file(Lang, File, Pos),List),
168 sort(List,Sort),member(sfl(Pos2,Lang),Sort),Pos>=Pos2,!.
169get_how_virtualize_file(Lang, File, _Pos):- baseKB:how_virtualize_file(Lang, File, 0),!.
170get_how_virtualize_file(Lang, File, _):- guess_file_language(File, Lang),set_how_virtualize_file(Lang, File, 0).
171
172
173
174
175guess_file_language(File, heads):- is_pfcname(File), !.
176guess_file_language(File, How):- baseKB:how_virtualize_dir(Was,Stem), atom_concat(Stem,_,File),!,
177 set_how_virtualize_file(Was, File, 0), !, How = Was.
178guess_file_language(File, false):- atom_concat(_,'.pl',File).
179guess_file_language(File, body):- atom_concat(_,'.plmoo',File).
180guess_file_language(_File, false).
181
182
183
184:- dynamic(baseKB:how_virtualize_file/3). 185
186
187set_how_virtualize_dir(How,F1):-
188 resolve_file_pathname(F1,F),
189 retractall(baseKB:how_virtualize_dir(_,F)),
190 asserta_new(baseKB:how_virtualize_dir(How,F)).
191
192:- dynamic(baseKB:how_virtualize_dir/2). 193baseKB:how_virtualize_dir(false,'/opt/logicmoo_workspace/packs_xtra/logicmoo_nlu/ext/').
194:- expand_file_search_path(swi(''),M),(set_how_virtualize_dir(false,M)). 195:- expand_file_search_path(pack(logicmoo_util),M),(set_how_virtualize_dir(false,M)). 196
197
198srcfilew(File):- prolog_load_context(file,File)-> true; source_location(File,_W).
199
200
201could_safe_virtualize:- srcfilew(File),could_safe_virtualize(File).
202could_safe_virtualize(File):- is_file_virtualize_allowed(File),!.
203could_safe_virtualize(File):- prolog_load_context(module,M), \+ clause_b(mtHybrid(M)),
204 \+ ((current_prolog_flag(dialect_pfc,fwc); is_pfcname(File))).
205
206
209
211:- if( \+ prolog_load_context(reload,true)). 212
213:- source_location(File, Line)-> (((set_how_virtualize_file(false,File, Line)))). 214
215:- doall((module_property(M,file(File)),
216 \+ baseKB:how_virtualize_file(_,File, _),
217 module_property(M,class(CT)),
218 memberchk(CT,[library,system]),
219 set_how_virtualize_file(false,File,0))). 223:- endif. 224
225
226
229ignore_mpreds_in_file:- prolog_load_context(file,F),check_how_virtualize_file(false,F),!.
230ignore_mpreds_in_file:- prolog_load_context(source,F), \+ prolog_load_context(file,F), check_how_virtualize_file(false,F),!.
231
232is_file_virtualize_allowed(F):- check_how_virtualize_file(bodies,F).
233
234is_file_virtualize_allowed:- fail,
235 prolog_load_context(source,S), (is_file_virtualize_allowed(S)-> true ;
236 (prolog_load_context(file,F),F\==S, is_file_virtualize_allowed(F))).
237
238
239
240
241
242check_how_virtualize_file(How,F):- get_how_virtualize_file(How2,F), How2 == How,!.
243check_how_virtualize_file(bodies,F):- atom_concat(_,'.plv',F).
244check_how_virtualize_file(bodies,F):- is_pfcname(F),!,fail.
245check_how_virtualize_file(bodies,F):- \+ get_how_virtualize_file(_,F),!, is_file_virtualize_allowed.
246check_how_virtualize_file(bodies,F):- get_how_virtualize_file(TF,F), !, TF \== false.
247check_how_virtualize_file(heads,F):- get_how_virtualize_file(How,F),!, How==heads.
248check_how_virtualize_file(heads,F):- \+ get_how_virtualize_file(_,F),!, is_pfcname(F), !, set_how_virtualize_file(heads,F),!.
249check_how_virtualize_file(false,F):- is_pfcname(F),set_how_virtualize_file(heads,F),!, fail.
250check_how_virtualize_file(false,F):- get_how_virtualize_file(heads,F),!,fail.
251check_how_virtualize_file(How,F):- get_how_virtualize_file(How2,F),!, How2 == How.
252
253
254
258
259
261
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307use_file_filter_cached(Module:Check):-
308 Check =..[Include,F],
309 (Module:Check *-> true ;
310 ((call(Module:Include,Base),
311 (Base=F -> true ;
312 (atom(F),atom(Base),
313 (atom_concat(Base,_,F);atom_concat(_,Base,F)),
314 asserta(Module:Check)))))).
315
316:- (set_how_virtualize_file(false,'.data')).
322get_virtualizer_mode(ge,F,A,HowIn):- suggest_m(M), declared_to_wrap(M,F,A,HowOut),!,must(HowIn=HowOut),HowOut\==never.
323
334
335:- multifile(baseKB:safe_wrap/4). 336:- module_transparent(baseKB:safe_wrap/4). 337:- dynamic(baseKB:safe_wrap/4). 338
339declared_to_wrap(_M,O,_,_):- bad_functor_check(O),!,trace_or_throw(bad_functor_check(O)),fail.
340declared_to_wrap(_M,mtHybrid,1,clause_b).
341declared_to_wrap(_M,F,A,on_x_debug):- integer(A),virtualize_safety(F,A).
342declared_to_wrap(M,F,A,HowIn):- clause_b(safe_wrap(M,F,A,HowIn)),!.
343declared_to_wrap(_,F,A,HowIn):- clause_b(safe_wrap(_,F,A,HowIn)),!.
344declared_to_wrap(_M,F,A,dbreq):- virtualize_dbreq(F,A), virtualize_dbreq_source.
345declared_to_wrap(M,F,A,ereq):- clause_b(mpred_prop(M,F,A,prologHybrid)),!.
346declared_to_wrap(M,F,A,ereq):- virtualize_m_ereq(M,F,A), virtualize_ereq_source.
347declared_to_wrap(M,F,A,_):- prolog_load_context(module,M),never_virtualize(M:F/A),!,fail.
348declared_to_wrap(M,F,A,_):- clause_b(mpred_prop(M,F,A,prologBuiltin)),!,fail.
349declared_to_wrap(M,F,A,call_u):- clause_b(mpred_prop(M,F,A,_)),!.
350
351declared_to_wrap(M,F,A,ereq):- atom(F),integer(A),
352 functor(Goal,F,A),
353 354 baseKB = M,
355 predicate_property(M:Goal,defined),
356 \+ predicate_property(M:Goal,static),!.
357 358
359
360
361
362is_dynamic_module(user).
363is_dynamic_module(baseKB).
364is_dynamic_module(lmcache).
365is_dynamic_module(lmconf).
366is_dynamic_module(tlbugger).
367is_dynamic_module(t_l).
368is_dynamic_module(prolog).
369is_dynamic_module(eggdrop).
370is_dynamic_module(M):- clause_b(mtHybrid(M)).
371
372is_static_module(system).
373is_static_module(file_scope).
374is_static_module(pfc_lib).
375is_static_module(M):- is_dynamic_module(M),!,fail.
376is_static_module(M):- module_property(M,class(development)),!,fail.
377is_static_module(M):- module_property(M,class(library)),!.
378is_static_module(M):- module_property(M,class(system)),!.
379
381virtualize_dbreq_source :- prolog_load_context(source,F),
382 (atom_concat('common_logic_',_,F);atom_concat('logicmoo_',_,F);atom_concat('mpred_',_,F)),!.
383virtualize_dbreq_source :- prolog_load_context(module,M), \+ is_static_module(M).
385
386virtualize_ereq_source :- prolog_load_context(module,M), member(M,['pfc_lib','mpred_expansion']),!,fail.
387virtualize_ereq_source.
388
389bad_functor_check(O):-var(O).
390bad_functor_check(':'):- !,dumpST,dtrace.
393
394
396virtualize_safety(O,_):- bad_functor_check(O),!,fail.
397
398virtualize_safety((=..),2).
399virtualize_safety(functor,3).
400virtualize_safety(arg,3).
401virtualize_safety(is,2).
405
407
408
409never_virtualize(O):- bad_functor_check(O),!,fail.
410never_virtualize(_:','/2):-!,fail.
411never_virtualize(_:F/_):- !, never_virtualize_atom(F),!.
412never_virtualize(thread_util:_/A):-integer(A). 413never_virtualize(M:F/A):- clause_b(mpred_prop(M,F,A,prologBuiltin)),!.
414never_virtualize(_M:F/A):- current_predicate(pfc_lib:F/A),!.
415never_virtualize(M:F/A):- functor(P,F,A),source_file(M:P,_SF),
416 \+ predicate_property(M:P,meta_predicate(_)),
417 \+ predicate_property(M:P,transparent),
418 419 ain(baseKB:mpred_prop(M,F,A,prologBuiltin)).
420never_virtualize(M:F/A):- functor(P,F,A),source_file(M:P,SF),
421 \+ predicate_property(M:P,meta_predicate(_)),
422 \+ predicate_property(M:P,transparent), !,
423 dmsg(never_virtualize(M:F/A,SF)),
424 aina(baseKB:mpred_prop(M,F,A,prologBuiltin)).
425never_virtualize(_:F/_):- never_virtualize_atom(F),!.
426never_virtualize(_:FA):- !,never_virtualize(FA),!.
427
428never_virtualize_atom(Atom):- \+ atom(Atom),!,fail.
429never_virtualize_atom(F):- functor(C,F,1),predicate_property(system:C,static),
430 \+ predicate_property(system:C,transparent).
431never_virtualize_atom(ereq).
432never_virtualize_atom(dbreq).
433never_virtualize_atom(call_u).
434never_virtualize_atom(on_x_debug).
435never_virtualize_atom(clause_u).
436never_virtualize_atom(lookup_u).
437never_virtualize_atom(clause_b).
438never_virtualize_atom(('.')).
439never_virtualize_atom(('[]')).
440never_virtualize_atom(('[|]')).
441never_virtualize_atom(add).
442never_virtualize_atom(dmsg).
443never_virtualize_atom(member).
444never_virtualize_atom(fully_expand).
445never_virtualize_atom(wdmsg).
446never_virtualize_atom(trace_or_throw).
447
448
449never_virtualize_atom(padd).
450never_virtualize_atom(del).
451never_virtualize_atom(ain_expanded).
452never_virtualize_atom(meta_predicate).
453never_virtualize_atom(dynamic).
454never_virtualize_atom(clr).
455never_virtualize_atom(ain).
456never_virtualize_atom(props).
457never_virtualize_atom(=).
458never_virtualize_atom(==).
459never_virtualize_atom(iprop).
460never_virtualize_atom(aina).
461never_virtualize_atom(decl_as).
462never_virtualize_atom(ainz).
463never_virtualize_atom((':-')).
464never_virtualize_atom(F):- suggest_m(M), clause_b(mpred_prop(M,F,_,pfcBuiltin)). 466
467never_virtualize_atom(Atom):- never_virtualize2(Atom).
468never_virtualize_atom(Atom):- atom(Atom),!,atom_concat('mpred_',_,Atom). 469
470
471never_virtualize2((/)).
472never_virtualize2((//)).
473never_virtualize2(call).
474never_virtualize2(fix_mp).
475never_virtualize2(apply).
476
477plz_never_virtualize(on_x_debug).
478
479
481virtualize_dbreq(O,_):- bad_functor_check(O),!,fail.
482virtualize_dbreq(abolish,1).
483virtualize_dbreq(abolish,2).
484virtualize_dbreq(assert,1).
485virtualize_dbreq(assert,2).
486virtualize_dbreq(asserta,1).
487virtualize_dbreq(asserta,2).
488virtualize_dbreq(assertz,1).
489virtualize_dbreq(assertz,2).
490virtualize_dbreq(nth_clause,3).
491virtualize_dbreq(clause,2).
492virtualize_dbreq(clause,3).
493virtualize_dbreq(retract,1).
494virtualize_dbreq(listing,1).
495virtualize_dbreq(clause_property,2).
496virtualize_dbreq(retractall,1).
497virtualize_dbreq(recorda,_).
498virtualize_dbreq(recordz,_).
499virtualize_dbreq(recorded,_).
500virtualize_dbreq(erase,1).
501
502
503
504
505virtualize_m_ereq(_M,F,A):- virtualize_ereq(F,A).
506virtualize_ereq(O,_):- bad_functor_check(O),!,fail.
507
509
512
513virtualize_ereq(t,_).
514virtualize_ereq(t,2).
515virtualize_ereq(t,3).
516
517virtualize_ereq(functorDeclares,1).
518
519virtualize_ereq(mtCore,1).
520virtualize_ereq(mtProlog,1).
521virtualize_ereq(mtHybrid,1).
522virtualize_ereq(mtExact,1).
523virtualize_ereq(mtGlobal,1).
524virtualize_ereq(arity,2).
525
526
527virtualize_ereq(lambda,5).
528
529virtualize_ereq(mpred_f,_).
530virtualize_ereq(mpred_f,4).
531virtualize_ereq(mpred_f,5).
532virtualize_ereq(mpred_f,6).
533virtualize_ereq(mpred_f,7).
534virtualize_ereq(props,2).
535
536
537
538
539virtualize_ereq(mpred_prop,4).
540
541virtualize_ereq(pfcControlled,1).
542virtualize_ereq(pfcRHS,1).
543virtualize_ereq(predicateConventionMt,2).
544virtualize_ereq(prologBuiltin,1).
545virtualize_ereq(prologDynamic,1).
546virtualize_ereq(prologHybrid,1).
547virtualize_ereq(functorIsMacro,1).
548virtualize_ereq(prologSideEffects,1).
549
550virtualize_ereq(singleValuedInArg,2).
551virtualize_ereq(singleValuedInArgAX,3).
552virtualize_ereq(support_hilog,2).
553virtualize_ereq(rtNotForUnboundPredicates,1).
554
555virtualize_ereq(ttExpressionType,1).
556virtualize_ereq(ttRelationType,1).
557
558
559
560virtualize_ereq('$spft',4).
561virtualize_ereq(==>,_).
562virtualize_ereq(<==>,_).
563virtualize_ereq((<--),2).
564
565
566virtualize_ereq(F,A):-virtualize_ereq_plz_move_dmiles(F,A).
567
569
570virtualize_ereq_plz_move_dmiles(call_OnEachLoad,1).
571
572virtualize_ereq_plz_move_dmiles(prologKIF,1).
573virtualize_ereq_plz_move_dmiles(prologPTTP,1).
574
575virtualize_ereq_plz_move_dmiles(use_ideep_swi,0).
576virtualize_ereq_plz_move_dmiles(meta_argtypes,1).
577virtualize_ereq_plz_move_dmiles(coerce_hook,_).
578virtualize_ereq_plz_move_dmiles(baseKB:agent_text_command,_).
579virtualize_ereq_plz_move_dmiles(baseKB:agent_command,_).
580virtualize_ereq_plz_move_dmiles(isa,2).
581virtualize_ereq_plz_move_dmiles(genls,2).
582virtualize_ereq_plz_move_dmiles(nameString,2).
583virtualize_ereq_plz_move_dmiles(argIsa,3).
584virtualize_ereq_plz_move_dmiles(argQuotedIsa,3).
585virtualize_ereq_plz_move_dmiles(cyckb_t_e2c,3).
586virtualize_ereq_plz_move_dmiles(cyckb_t_e2c,4).
587virtualize_ereq_plz_move_dmiles(cyckb_t_e2c,_).
588virtualize_ereq_plz_move_dmiles(completeExtentEnumerable,1).
589virtualize_ereq_plz_move_dmiles(completelyAssertedCollection,1).
590virtualize_ereq_plz_move_dmiles(constrain_args_pttp,2).
591virtualize_ereq_plz_move_dmiles(cycPlus2,2).
592virtualize_ereq_plz_move_dmiles(cycPred,2).
593virtualize_ereq_plz_move_dmiles(decided_not_was_isa,2).
594virtualize_ereq_plz_move_dmiles(mudKeyword,2).
595virtualize_ereq_plz_move_dmiles(resultIsa,2).
596virtualize_ereq_plz_move_dmiles(tCol,1).
597virtualize_ereq_plz_move_dmiles(tPred,1).
598virtualize_ereq_plz_move_dmiles(tRelation,1).
599virtualize_ereq_plz_move_dmiles(tAgent,1).
600virtualize_ereq_plz_move_dmiles(tCol,1).
601virtualize_ereq_plz_move_dmiles(ttTemporalType,1).
602
618
619
620
621virtualize_args_as(Which,Args):- descend_ge(Which),Args=Which.
622virtualize_args_as(Goal,Args):- sanity((arg(1,Goal,Var),var(Var))), predicate_property(Goal,meta_predicate(Args)).
625
626descend_ge(':-'((:),0)).
627descend_ge(':-'((-),0)).
628descend_ge(( :- 0)).
629descend_ge('{}'(0)).
630descend_ge('must'(0)).
631descend_ge('quietly'(0)).
632descend_ge('sanity'(0)).
633descend_ge('->'(0,0)).
634descend_ge(';'(0,0)).
635descend_ge('==>'(-,-)).
636descend_ge('==>'(-)).
637descend_ge('<--'(-,-)).
638descend_ge(z(if)).
639descend_ge(z(_)):-!,fail.
640descend_ge(Which):-functor(Which,F,_),!,descend_ge(z(F)),!.
641
642:- nb_linkval('$xform_arity',xform_arity(_C,_F,_A)). 643
644xform_arity(C,F,A):-var(C),!,sanity(var(F)),must(var(A)), nb_getval('$xform_arity',xform_arity(C,F,A)),!.
645xform_arity(C,F,A):-atom(C),!,C=F,ignore(clause_b(arity(F,A))).
646xform_arity(F/A,F,A):-atom(F),!.
647xform_arity(F//Am2,F,A):- integer(Am2),!, A is Am2+2.
648xform_arity(C,F,A):- compound(C), functor(C,F,A).
649
650xform(_,_):-!,fail.
651xform(Var,Out):- \+compound(Var),!,Out=Var.
652xform(Nonvar,Out):- \+ current_prolog_flag(subclause_expansion,true),!,Nonvar=Out.
656xform(hybrid_support(F,A),mpred_prop(_M,F,A,prologHybrid)):-!.
658xform(mpred_prop(M,F,A,P),mpred_prop(M,F,A,P)):-!.
659
660
661xform(PC,mpred_prop(M,F,A,P)):- current_assertion_module(M), PC=..[P,C],is_reltype(P),!,xform_arity(C,F,A).
662xform(PFA,mpred_prop(M,F,A,P)):- if_defined(defaultAssertMt(M),fail),PFA=..[P,F,A],is_reltype(P),!.
663xform(In,PART):- map_compound_args(xform,In,PART),!.
664
667is_reltype(Var):-var(Var),!,fail.
668is_reltype(pfcControlled).
669is_reltype(prologHybrid).
670is_reltype(prologBuiltin).
671is_reltype(P):-clause_b(ttRelationType(P)).
672
673
674cannot_descend_expansion(_,In):- \+ compound(In),!.
675cannot_descend_expansion(ge,In):- strip_module(In,M,FA),functor(FA,F,A),!,never_virtualize(M:F/A).
676
677
678virtualize_code(_,In,Out):- \+ compound(In),!,In=Out.
679virtualize_code(_,functor(P,F,A),cfunctor(P,F,A)):-!.
680virtualize_code(_,(SWC,REST),(SWC,REST)):- (swc==SWC ,!. 681virtualize_code(X,(VWC,In),(Out)):- vwc==VWC,!,virtualize_code(X,In,Out).
682virtualize_code(_,P=..In,cnas(P,H,T)):- nonvar(In),In=[H|T],!.
683virtualize_code(_,P=..In,on_x_debug(P=..In)):-!.
684virtualize_code(_,functor(P,F,A),on_x_debug(functor(P,F,A))):-!.
686virtualize_code(X,(G1,G2),(O1,O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
687virtualize_code(X,\+ G1,call_u(\+ G1)):- virtualize_code(X,G1,O1), \+ same_terms(G1,O1),!.
688virtualize_code(X, \+ (G1), \+ (O1)):- !, virtualize_code(X,G1,O1),!.
689virtualize_code(X,must(G1),must(O1)):- !, virtualize_code(X,G1,O1),!.
690virtualize_code(X,sanity(G1),sanity(O1)):- !, virtualize_code(X,G1,O1),!.
691virtualize_code(X,setof(In,G1,Out),setof(In,O1,Out)):- virtualize_code(X,G1,O1),!.
692virtualize_code(X,catch(G1,E,G2),catch(O1,E,O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
693virtualize_code(_,(G1 \= G2),(G1 \= G2)):-!.
694virtualize_code(_,(G1 == G2),(G1 == G2)):-!.
695virtualize_code(_,(G1 \== G2),(G1 \== G2)):-!.
696virtualize_code(_,(G1 = G2),(G1 = G2)):-!.
697virtualize_code(X,(G1;G2),(O1;O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
698virtualize_code(X,(G1->G2),(O1->O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
699virtualize_code(ge,M:In,ereq(In)):- M==abox,!.
700virtualize_code(ge,M:In,M:In):- M==dif,!.
701virtualize_code(ge,M:mtProlog(C),M:mtProlog(C)):- M==baseKB,!.
702
703virtualize_code(_,M:In,M:PART):- \+ compound(In),!,In=PART.
704
713
714virtualize_code(X,M:In,PART):- !, ((functor(In,F,A),virtualize_code_fa(X,M:In,F,A,PART))->true;(M:In=PART)),!.
715virtualize_code(X,In,PART):- !, ((functor(In,F,A),virtualize_code_fa(X,In,F,A,PART))->true;In=PART),!.
720
721virtualize_code_fa(X,M:In,F,A,M:PART):-!,virtualize_code_fa(X,In,F,A,PART).
722virtualize_code_fa(X,In,_,_,In):- cannot_descend_expansion(X,In),!. 723virtualize_code_fa(X,In,F,A,PART):- get_virtualizer_mode(X,F,A,How),!,must(safe_virtualize(In,How,PART)).
724virtualize_code_fa(X,In,F,A,PART):- X==ge, functor(ArgModes,F,A),
725 Args=ArgModes,
726 virtualize_args_as(Args,ArgModes),!,
727 map_compound_args(virtualize_code_each(X),ArgModes,In,PART),!.
728
730
731virtualize_special_outside(X,In):- functor(In,F,A),get_virtualizer_mode(X,F,A,_How),!.
732virtualize_special_outside(X,In):- arg(_,In,Arg), \+cannot_descend_expansion(X,Arg),virtualize_special_outside(X,In).
733
734virtualize_code_each(X,Arg,In,Out):- var(Arg),!,virtualize_code_each(X,(+),In,Out).
735virtualize_code_each(X,Arg,In,Out):- (integer(Arg); Arg == +; Arg == * ) -> virtualize_code(X,In,Out),!.
736virtualize_code_each(X,-,In,Out):- current_predicate(mpred_expansion_file/0), if_defined(fully_expand_head(X,In,Out)),!.
737virtualize_code_each(_,_,In,Out):- must(Out=In).
738
739
740
741map_compound_args(Pred,In,Out):- must(( compound(In), In=..[F|InL],maplist(Pred,InL,OutL),Out=..[F|OutL])).
742
743map_compound_args(Pred,Args,In,Out):- must(( compound(Args), compound(In), Args=..[_|ArgsL],In=..[F|InL],maplist(Pred,ArgsL,InL,OutL),Out=..[F|OutL])).
744
745
749virtualize_source(X,In,Out):- virtualize_code(X,In,Out),!.
758safe_virtualize(Goal,How,Out):- must(safe_virtualize_0(Goal,How,call(MHow,MGoal))),!,
759 safe_univ(Out,[MHow,MGoal]).
760
761safe_virtualize_0(M:Goal,M:How,call(How,M:Goal)).
762safe_virtualize_0(M:Goal,How,call(How,M:Goal)).
763safe_virtualize_0(Goal,baseKB:How,call(How,Goal)).
764safe_virtualize_0(Goal,M:How,call(How,M:Goal)).
765safe_virtualize_0(Goal,How,call(How,Goal)).
766
767
768
769
770is_this_file_virtualize_allowed:- prolog_load_context(file,F), is_this_file_virtualize_allowed(F).
771is_this_file_virtualize_allowed(F):- get_how_virtualize_file(How, F), !, How \== false.
772is_this_file_virtualize_allowed(F):- prolog_load_context(source,S), S\==F, !, is_this_source_virtualize_allowed(S).
773is_this_source_virtualize_allowed(S):-
774 \+ baseKB:how_virtualize_file(heads, S, _),
775 \+ baseKB:how_virtualize_file(false, S, _),
776 nop(baseKB:how_virtualize_file(bodies, S)).
777
778
780swc.
781
783vwc :- throw('Code was missed by virtualizer!').
784
786:- module_transparent(sd_goal_expansion/4). 787sd_goal_expansion(_Head, _, (VWC,In),Out):- vwc==VWC, !, must((callable(In),virtualize_source(ge,In,Out))).
788sd_goal_expansion(_Head, In, _In0 ,Out):- compound(In),
789 notrace(is_this_file_virtualize_allowed),
790 virtualize_source(ge,In,Out).
791
792:- module_transparent(virtualized_goal_expansion/3). 793virtualized_goal_expansion(Head, In, Out):-
794 strip_module(In,_,In0),compound(In0),
795 (sd_goal_expansion(Head,In,In0,Out)->
796 nop((( \+ same_terms(In,Out), \+ same_terms(In0,Out)) ->
797 ((
798 dmsg( virtualized_goal_expansion(Head,In,_)),
799 dmsg( be4 :- In),
800 dmsg( out :- Out)))))).
801
802
803decl_wrapped(M,F,A,How):-
804 assert_if_new(rdf_rewrite:arity(F,A)), 805 assert_if_new(baseKB:safe_wrap(M,F,A,How)).
806 807:- export(decl_wrapped/4). 808
815same_terms(A,B):-same_term(A,B),!.
816same_terms(A,B):-A==B,!.
817same_terms(A,B):-A=@=B,!.
818same_terms(A,B):-A=@=B,!,A=B.
819same_terms(A,B):- \+ \+ A = B,!,fail.
820same_terms(A,B):- ( \+ compound(A) ; \+ compound(B)),!,fail.
821same_terms(M:A,B):-atom(M),!,same_terms(A,B).
822same_terms(A,M:B):-atom(M),!,same_terms(A,B).
823same_terms(In,on_x_debug(Out)):- !, same_terms(In,Out).
824same_terms(on_x_debug(Out),In):- !, same_terms(In,Out).
825same_terms(In,dbreq(Out)):- !, same_terms(In,Out).
826same_terms(A=..[P|AA],cnas(B,P,BB)):-!,same_terms(A,B),same_terms(AA,BB).
827same_terms((A,AA),(B,BB)):-!,same_terms(A,B),same_terms(AA,BB).
828same_terms([A|AA],[B|BB]):-!,same_terms(A,B),same_terms(AA,BB).
829same_terms((A;AA),(B;BB)):-!,same_terms(A,B),same_terms(AA,BB).
830same_terms((A:-AA),(B:-BB)):-!,same_terms(A,B),same_terms(AA,BB).
831same_terms(AAA,BBB):- AAA=..[F|AA],BBB=..[F|BB],!,same_terms(AA,BB).
832
833
834
835:- fixup_exports. 836
837:- if(false). 838
839:- multifile(system:file_body_expansion/2). 840:- dynamic(system:file_body_expansion/2). 842system:file_body_expansion(Head,In,Out):- compound(In),
843 is_file_virtualize_allowed,
844 virtualized_goal_expansion(Head,In,Out).
845
846:- else. 847
848:- multifile(system:goal_expansion/4). 849:- dynamic(system:goal_expansion/4). 850:- module_transparent(system:goal_expansion/4). 851
852system:goal_expansion(In,P,Out,PO):-
853 notrace((compound(In), nonvar(P))),
854 notrace((get_current_clause(Head :- FileTerm),In == FileTerm)),
855 virtualized_goal_expansion(Head,In,Out) -> PO=P.
856
857:- endif.
Utility LOGICMOO VIRTUALIZE SOURCE
Source code transformation - Uses Hook Database and Hook Hybrid to rewrite source code to better interact with hybrid database.