1/* Part of LogicMOO Base logicmoo_util_bb_env
    2% Provides a prolog database *env*
    3% ===================================================================
    4% File '$FILENAME.pl'
    5% Purpose: An Implementation in SWI-Prolog of certain debugging tools
    6% Maintainer: Douglas Miles
    7% Contact: $Author: dmiles logicmoo@gmail.com ;
    8% Version: '$FILENAME.pl' 1.0.0
    9% Revision: $Revision: 1.1 $
   10% Revised At:  $Date: 2021/07/11 21:57:28 $
   11% License: LGPL
   12% ===================================================================
   13*/
   14
   15% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/logicmoo_util_structs.pl
   16:- module(virtualize_source,
   17   [%cnas/3,
   18    nb_current_or_nil/2,
   19    safe_virtualize/3,          
   20    %skipped_dirs/1,
   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]).

Utility LOGICMOO VIRTUALIZE SOURCE

Source code transformation - Uses Hook Database and Hook Hybrid to rewrite source code to better interact with hybrid database.

   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    %skipped_dirs/1,
   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((
   74%cnas/3,
   75nb_current_or_nil/2,
   76safe_virtualize/3,
   77same_terms/2,          
   78%decl_wrapped/4,
   79sd_goal_expansion/4,
   80%skipped_dirs/1,
   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)).% WAS OFF  :- system:reexport(library(must_sanity)).% WAS OFF  :- system:reexport(library(loop_check)).
   91:- module_transparent((virtualize_ereq_source/0)).% WAS OFF  :- system:use_module(predicate_inheritance).% WAS OFF  :- system:use_module(retry_undefined).
   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
  103% % % OFF :- system:reexport(library(hook_database)).
  104
  105nb_current_or_nil(N,V):- quietly((nb_current(N,V)->true;V=[])).
  106
  107/*
  108:- multifile(baseKB:col_as_isa/1).
  109:- multifile(baseKB:col_as_unary/1).
  110:- multifile(baseKB:col_as_static/1).
  111:- dynamic(baseKB:col_as_isa/1).
  112:- dynamic(baseKB:col_as_unary/1).
  113:- dynamic(baseKB:col_as_static/1).
  114*/
  115
  116
  117:- dynamic(baseKB:how_virtualize_file/3).  118% stream_position_data
  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
  122%guess_file_language(File, Lang):- file_content_type(File,Lang).
  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
  207% check_how_virtualize_file(heads,File):- prolog_load_context(file,File),t_l:current_lang(pfc).
  208% check_how_virtualize_file(heads,File):- prolog_load_context(source,File),t_l:current_lang(pfc),source_location(SFile,_W), \+ check_how_virtualize_file(false,SFile),!.
  209
  210% file late late joiners
  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))).  220%:- doall((source_file(File),(set_how_virtualize_file(false,File)))).
  221%base_kb_dynamic(F,A):- ain(mpred_prop(M,F,A,prologHybrid)),kb_shared(F/A).
  222%:- doall((virtualize_ereq(F,A),base_kb_dynamic(F,A))).
  223:- endif.  224
  225
  226
  227% if_defined(G,Else) = if G is defined then call G.. else call Else
  228%ignore_mpreds_in_file:- if_defined(t_l:disable_px,fail),!.
  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
  255%check_how_virtualize_file(false,File):- module_property(M,file(File)),module_property(M,class(library)),(set_how_virtualize_file(false,File)),!.
  256% check_how_virtualize_file(false,File):- check_how_virtualize_file(false,File),!.
  257% check_how_virtualize_file(false,File):- (set_how_virtualize_file(heads,File)),!,fail.
  258
  259
  260%:- asserta((check_how_virtualize_file(false,M):- skipped_dirs(M))).
  261
  262%skipped_dirs(Dir):-skipped_dirs0(M),exists_directory(M),absolute_file_name(M,Dir).
  263%skipped_dirs0(M):-expand_file_search_path(pack(logicmoo_util),M).
  264%skipped_dirs0(M):-expand_file_search_path(pack('swish/..'),M).
  265%skipped_dirs0(M):-expand_file_search_path(pack('wam_common_lisp/..'),M).
  266% skipped_dirs(M):-expand_file_search_path(pack(pfc),M),nonvar(M).
  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')).
 declared_to_wrap(M, ?Functor, ?Arity, ?Wrapper) is semidet
Virtualizer Shared Code.
  322get_virtualizer_mode(ge,F,A,HowIn):- suggest_m(M), declared_to_wrap(M,F,A,HowOut),!,must(HowIn=HowOut),HowOut\==never.
  323
  324/*
  325:- dynamic baseKB:t/2.
  326:- multifile baseKB:t/2.
  327:- public baseKB:t/2.
  328:- module_transparent baseKB:t/2.
  329:- dynamic baseKB:t/1.
  330:- multifile baseKB:t/1.
  331:- public baseKB:t/1.
  332:- module_transparent baseKB:t/1.
  333*/
  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   % member(M,[baseKB,lmcache,lmconf]),
  354   baseKB = M,
  355   predicate_property(M:Goal,defined),
  356   \+ predicate_property(M:Goal,static),!.
  357   % \+ predicate_property(M:Goal,imported_from(_)),!.
  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
  380% virtualize_dbreq_source :- prolog_load_context(module,M), (atom_concat('common_logic_',_,F);atom_concat('logicmoo_',_,F);atom_concat('mpred_',_,F)),!.
  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).
  384% virtualize_dbreq_source.
  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.
  391%bad_functor_check(/):- !,dumpST,dtrace.
  392%bad_functor_check(//):- !,dumpST,dtrace.
  393
  394
  395% Preds that we''d like to know a little more than "instanciation exception"s
  396virtualize_safety(O,_):- bad_functor_check(O),!,fail.
  397
  398virtualize_safety((=..),2).
  399virtualize_safety(functor,3).
  400virtualize_safety(arg,3).
  401virtualize_safety(is,2).
  402/*
  403
  404*/
  405
  406% Preds that we assume indicate we''d already passed over it
  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). % prevents query
  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  % dmsg(never_virtualize('@'(F/A,M),SF)),
  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)). % @todo not yet created
  465%never_virtualize_atom(F):- show_success(plz_never_virtualize(F)).
  466
  467never_virtualize_atom(Atom):- never_virtualize2(Atom).
  468never_virtualize_atom(Atom):- atom(Atom),!,atom_concat('mpred_',_,Atom). % mpred_* are pfc builtins
  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
  480% operations to transactionalize
  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
  508%virtualize_ereq(lmcache:loaded_external_kbs,1).
  509
  510%virtualize_ereq(COL,A):- clause_b(col_as_isa(COL)),sanity(A==1).
  511%virtualize_ereq(COL,A):- clause_b(col_as_unary(COL)),sanity(A==1).
  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
  568% TODO BEGIN These need to be assigned the correct files
  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
  603% END These need to be assigned the correct files
 virtualize_code(X, :TermT, :TermARG2) is semidet
System Goal Expansion Sd.f$
  610%virtualize_code(X,Goal,_):- functor(Goal,F,_),arg(_,v(call_u,call,(/),(',')),F),!,fail.
  611%virtualize_code(X,M:Goal,(call_u(genlMt(abox,GMt)),with_umt(GMt,Goal))):- M==tbox.
  612/*
  613virtualize_args_as(Goal,Args):- sanity((arg(1,Goal,Var),var(Var))), predicate_property(Goal,meta_predicate(Args)).
  614virtualize_args_as(Goal,_):-predicate_property(Goal,built_in),!,fail.
  615virtualize_args_as(Goal,Goal):-predicate_property(Goal,transparent),!.
  616virtualize_args_as(Which,Args):- descend_ge(Which),Args=Which.
  617*/
  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)).
  623%virtualize_args_as(Goal,Goal):-predicate_property(Goal,transparent),!.
  624% virtualize_args_as(Goal,_):-predicate_property(Goal,built_in),!,fail.
  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.
  653%xform(isa(C,P),mpred_prop(M,F,A,P)):-nonvar(P),!,is_reltype(P),xform_arity(C,F,A).
  654%xform(isa(C,P),(ttRelationType(P),mpred_prop(M,F,A,P))):-nonvar(C),xform_arity(C,F,A),is_reltype(P),!.
  655% xform(mpred_isa(C,P),mpred_prop(M,F,A,P)):- xform_arity(C,F,A),!.
  656xform(hybrid_support(F,A),mpred_prop(_M,F,A,prologHybrid)):-!.
  657% xform(arity(F,A),mpred_prop(M,F,A,arity)):-!.
  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
  665%:-multifile(baseKB:ttRelationType/1).
  666%:-dynamic(baseKB:ttRelationType/1).
  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 /* ;cwc==SWC */),!. % never goal expand
  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))):-!.
  685% virtualize_code(X,(G1:-G2),(G1:-O2)):- !,virtualize_code(X,G2,O2),!.
  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
  705/*
  706virtualize_code(ge,M:In,M:In):- atom(M),callable(In),(predicate_property(M:In,volatile);predicate_property(M:In,thread_local)),!.
  707virtualize_code(X,M:In,M:Out):- atom(M),
  708  '$current_source_module'(SM),atom(SM),'$set_source_module'(M),
  709  must(call_cleanup(virtualize_code(X,In,Out),'$set_source_module'(SM))).
  710
  711virtualize_code(X,M:In,M:Out):- !, must(virtualize_code(X,In,Out)),!.
  712*/
  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),!.
  716%virtualize_code(X,In,PART):- must(map_compound_args(virtualize_code(X),In,PART)),!.
  717% virtualize_code(ge,In,In).
  718% virtualize_code(_,In,In).
  719% virtualize_code(X,In,PART):- wdmsg(bad_virtualize_code(X,In,PART)), dtrace.
  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),!. % ,fail. % wdmsg(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
  729% virtualize_code(X,In,Out):- compound(In), virtualize_special_outside(X,In),!,Out=ereq(In).
  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
  746%virtualize_source(X,In,Out):- (ground(In);true;current_prolog_flag(unsafe_speedups,true)),!,virtualize_code(X,In,Out).
  747%virtualize_source(X,In,Out):- ground(In),!,virtualize_code(X,In,Out).
  748%virtualize_source(X,In,Out):- callable(In),term_variables(In,List),with_vars_locked(throw,List,virtualize_code(X,In,Out)).
  749virtualize_source(X,In,Out):- virtualize_code(X,In,Out),!.
 safe_virtualize(Term, +How, -Wrapped) is semidet
Safely Paying Attention To Corner Cases Wrap.
  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
  779% Skip Virtualizing
  780swc.
  781
  782% Virtualize
  783vwc :- throw('Code was missed by virtualizer!').
  784
  785% always goal expand (and remove it so it wont throw)
  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)), % TODO puts this in Local Mt
  805 assert_if_new(baseKB:safe_wrap(M,F,A,How)).
  806 % once((M==baseKB->true;assert_if_new(baseKB:predicateConventionMt(F,M)))).
  807:- export(decl_wrapped/4).  808
  809%= 	 	 
 same_terms(?A, :TermB) is semidet
Same Terms.
  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).  841% % % OFF :- system:use_module(system:library(subclause_expansion)).
  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.