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 $@users.sourceforge.net ;
    8% Version: '$FILENAME.pl' 1.0.0
    9% Revision: $Revision: 1.1 $
   10% Revised At:  $Date: 2002/07/11 21:57:28 $
   11% Licience: LGPL
   12% ===================================================================
   13*/
   14
   15% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/logicmoo_util_structs.pl
   16:- module(virtualize_source,
   17          [
   18cnas/3,
   19nb_current_or_nil/2,
   20safe_virtualize/3,
   21same_terms/2,          
   22decl_wrapped/4,
   23sd_goal_expansion/3,
   24skipped_dirs/1,
   25swc/0,
   26virtualize_code/3,
   27virtualize_code_each/4,
   28virtualize_code_fa/5,
   29virtualize_ereq/2,
   30virtualize_source/3,
   31virtualize_source_file/0,
   32virtualize_source_file/1,
   33virtualize_source_file/2,
   34could_safe_virtualize/0,
   35vwc/0
   36]).   37
   38:- set_module(class(library)).   39:- reexport(library(must_trace)).   40:- reexport(library(loop_check)).   41
   42
   43:- module_transparent((
   44cnas/3,
   45nb_current_or_nil/2,
   46safe_virtualize/3,
   47same_terms/2,          
   48decl_wrapped/4,
   49sd_goal_expansion/3,
   50skipped_dirs/1,
   51swc/0,
   52virtualize_code/3,
   53virtualize_code_each/4,
   54virtualize_code_fa/5,
   55virtualize_ereq/2,
   56virtualize_source/3,
   57virtualize_source_file/0,
   58virtualize_source_file/1,
   59virtualize_source_file/2,
   60vwc/0
   61          )).   62
   63:- module_transparent((virtualize_ereq_source/0)).   64:- use_module(predicate_inheritance).
   65:- use_module(retry_undefined).
   66
   67
   68
   69:- meta_predicate map_compound_args(3,*,*,*).   70:- meta_predicate map_compound_args(2,*,*).   71
   72:- module_transparent(declared_to_wrap/3).   73
   74
   75:- thread_local(t_l:disable_px/0).   76
   77:- reexport(library(hook_database)).   78
   79nb_current_or_nil(N,V):- quietly((nb_current(N,V)->true;V=[])).
   80
   81/*
   82:- multifile(baseKB:col_as_isa/1).
   83:- multifile(baseKB:col_as_unary/1).
   84:- multifile(baseKB:col_as_static/1).
   85:- dynamic(baseKB:col_as_isa/1).
   86:- dynamic(baseKB:col_as_unary/1).
   87:- dynamic(baseKB:col_as_static/1).
   88*/
   89
   90:- multifile(baseKB:ignore_file_mpreds/1).   91:- dynamic(baseKB:ignore_file_mpreds/1).   92
   93:- asserta((baseKB:ignore_file_mpreds(M):- skipped_dirs(M))).   94
   95skipped_dirs(Dir):-skipped_dirs0(M),exists_directory(M),absolute_file_name(M,Dir).
   96skipped_dirs0(M):-expand_file_search_path(swi(''),M).
   97skipped_dirs0(M):-expand_file_search_path(pack(logicmoo_util),M).
   98skipped_dirs0(M):-expand_file_search_path(pack('swish/..'),M).
   99skipped_dirs0(M):-expand_file_search_path(pack('wam_common_lisp/..'),M).
  100% skipped_dirs(M):-expand_file_search_path(pack(pfc),M),nonvar(M).
  101
  102:- dynamic(lmconf:should_virtualize_source_file/2).  103
  104% if_defined(G,Else) = if G is defined then call G.. else call Else
  105ignore_mpreds_in_file:-if_defined(t_l:disable_px,fail),!.
  106ignore_mpreds_in_file:-prolog_load_context(file,F),ignore_mpreds_in_file(F),!.
  107ignore_mpreds_in_file:-prolog_load_context(source,F),\+prolog_load_context(file,F),ignore_mpreds_in_file(F),!.
  108
  109ignore_mpreds_in_file(F):-nonvar(F),if_defined(baseKB:registered_mpred_file(F),fail),!,fail.
  110ignore_mpreds_in_file(S):- lmconf:should_virtualize_source_file(S,true),!,fail.
  111ignore_mpreds_in_file(F):-use_file_filter_cached(baseKB:ignore_file_mpreds(F)).
  112
  113use_file_filter_cached(Module:Check):- 
  114 Check =..[Include,F],
  115 (Module:Check *-> true ;
  116  ((call(Module:Include,Base), 
  117   (Base=F -> true ;
  118     (atom(F),atom(Base),    
  119      (atom_concat(Base,_,F);atom_concat(_,Base,F)),
  120       asserta(Module:Check)))))).
  121
  122:- asserta(baseKB:ignore_file_mpreds('.data')).
 declared_to_wrap(M, ?Functor, ?Arity, ?Wrapper) is semidet
Virtualizer Shared Code.
  128get_virtualizer_mode(ge,F,A,HowIn):- suggest_m(M), declared_to_wrap(M,F,A,HowOut),!,must(HowIn=HowOut),HowOut\==never.
  129
  130/*
  131:- dynamic baseKB:t/2.
  132:- multifile baseKB:t/2.
  133:- public baseKB:t/2.
  134:- module_transparent baseKB:t/2.
  135:- dynamic baseKB:t/1.
  136:- multifile baseKB:t/1.
  137:- public baseKB:t/1.
  138:- module_transparent baseKB:t/1.
  139*/
  140
  141:- multifile(baseKB:safe_wrap/4).  142:- module_transparent(baseKB:safe_wrap/4).  143:- dynamic(baseKB:safe_wrap/4).  144
  145declared_to_wrap(_M,O,_,_):- bad_functor_check(O),!,trace_or_throw(bad_functor_check(O)),fail.
  146declared_to_wrap(_M,mtHybrid,1,clause_b).
  147declared_to_wrap(_M,F,A,on_x_debug):- integer(A),virtualize_safety(F,A).
  148declared_to_wrap(M,F,A,HowIn):- clause_b(safe_wrap(M,F,A,HowIn)),!.
  149declared_to_wrap(_,F,A,HowIn):- clause_b(safe_wrap(_,F,A,HowIn)),!.
  150declared_to_wrap(_M,F,A,dbreq):- virtualize_dbreq(F,A), virtualize_dbreq_source.
  151declared_to_wrap(M,F,A,ereq):- clause_b(mpred_prop(M,F,A,prologHybrid)),!.
  152declared_to_wrap(M,F,A,ereq):- virtualize_m_ereq(M,F,A), virtualize_ereq_source.
  153declared_to_wrap(M,F,A,_):- prolog_load_context(module,M),never_virtualize(M:F/A),!,fail.
  154declared_to_wrap(M,F,A,_):-      clause_b(mpred_prop(M,F,A,prologBuiltin)),!,fail.
  155declared_to_wrap(M,F,A,call_u):- clause_b(mpred_prop(M,F,A,_)),!.
  156
  157declared_to_wrap(M,F,A,ereq):- atom(F),integer(A),
  158   functor(Goal,F,A),
  159   % member(M,[baseKB,lmcache,lmconf]),
  160   baseKB = M,
  161   predicate_property(M:Goal,defined),
  162   \+ predicate_property(M:Goal,static),!.
  163   % \+ predicate_property(M:Goal,imported_from(_)),!.
  164
  165
  166
  167
  168is_dynamic_module(user).
  169is_dynamic_module(baseKB).
  170is_dynamic_module(lmcache).
  171is_dynamic_module(lmconf).
  172is_dynamic_module(tlbugger).
  173is_dynamic_module(t_l).
  174is_dynamic_module(prolog).
  175is_dynamic_module(eggdrop).
  176is_dynamic_module(M):- clause_b(mtHybrid(M)).
  177
  178is_static_module(system).
  179is_static_module(file_scope).
  180is_static_module(mpred_core).
  181is_static_module(M):- is_dynamic_module(M),!,fail.
  182is_static_module(M):- module_property(M,class(development)),!,fail.
  183is_static_module(M):- module_property(M,class(library)),!.
  184is_static_module(M):- module_property(M,class(system)),!.
  185
  186% virtualize_dbreq_source :- prolog_load_context(module,M), (atom_concat('common_logic_',_,F);atom_concat('logicmoo_',_,F);atom_concat('mpred_',_,F)),!.
  187virtualize_dbreq_source :- prolog_load_context(source,F), 
  188  (atom_concat('common_logic_',_,F);atom_concat('logicmoo_',_,F);atom_concat('mpred_',_,F)),!.
  189virtualize_dbreq_source :- prolog_load_context(module,M), \+ is_static_module(M).
  190% virtualize_dbreq_source.
  191
  192virtualize_ereq_source :- prolog_load_context(module,M), member(M,['mpred_core','mpred_expansion']),!,fail.
  193virtualize_ereq_source.
  194
  195bad_functor_check(O):-var(O).
  196bad_functor_check(:):- !,dumpST,dtrace.
  197%bad_functor_check(/):- !,dumpST,dtrace.
  198%bad_functor_check(//):- !,dumpST,dtrace.
  199
  200
  201% Preds that we''d like to know a little more than "instanciation exception"s
  202virtualize_safety(O,_):- bad_functor_check(O),!,fail.
  203
  204virtualize_safety((=..),2).
  205virtualize_safety(functor,3).
  206virtualize_safety(arg,3).
  207virtualize_safety(is,2).
  208/*
  209
  210*/
  211
  212% Preds that we assume indicate we''d already passed over it
  213
  214
  215never_virtualize(O):- bad_functor_check(O),!,fail.
  216never_virtualize(_:','/2):-!,fail.
  217never_virtualize(_:F/_):- !, never_virtualize_atom(F),!.
  218never_virtualize(thread_util:_/A):-integer(A). % prevents query
  219never_virtualize(M:F/A):- clause_b(mpred_prop(M,F,A,prologBuiltin)),!.
  220never_virtualize(_M:F/A):- current_predicate(mpred_core:F/A),!.
  221never_virtualize(M:F/A):- functor(P,F,A),source_file(M:P,_SF), 
  222   \+ predicate_property(M:P,meta_predicate(_)), 
  223   \+ predicate_property(M:P,transparent),  
  224  % dmsg(never_virtualize('@'(F/A,M),SF)),
  225  ain(baseKB:mpred_prop(M,F,A,prologBuiltin)). 
  226never_virtualize(M:F/A):- functor(P,F,A),source_file(M:P,SF),
  227   \+ predicate_property(M:P,meta_predicate(_)), 
  228   \+ predicate_property(M:P,transparent), !,
  229  dmsg(never_virtualize(M:F/A,SF)),
  230  aina(baseKB:mpred_prop(M,F,A,prologBuiltin)).
  231never_virtualize(_:F/_):- never_virtualize_atom(F),!.
  232never_virtualize(_:FA):- !,never_virtualize(FA),!.
  233
  234never_virtualize_atom(Atom):- \+ atom(Atom),!,fail.
  235never_virtualize_atom(F):- functor(C,F,1),predicate_property(system:C,static), 
  236     \+ predicate_property(system:C,transparent).
  237never_virtualize_atom(ereq).
  238never_virtualize_atom(dbreq).
  239never_virtualize_atom(call_u).
  240never_virtualize_atom(on_x_debug).
  241never_virtualize_atom(clause_u).
  242never_virtualize_atom(lookup_u).
  243never_virtualize_atom(clause_b).
  244never_virtualize_atom(('.')).
  245never_virtualize_atom(('[]')).
  246never_virtualize_atom(('[|]')).
  247never_virtualize_atom(add).
  248never_virtualize_atom(dmsg).
  249never_virtualize_atom(member).
  250never_virtualize_atom(fully_expand).
  251never_virtualize_atom(wdmsg).
  252never_virtualize_atom(trace_or_throw).
  253
  254
  255never_virtualize_atom(padd).
  256never_virtualize_atom(del).
  257never_virtualize_atom(ain_expanded).
  258never_virtualize_atom(meta_predicate).
  259never_virtualize_atom(dynamic).
  260never_virtualize_atom(clr).
  261never_virtualize_atom(ain).
  262never_virtualize_atom(props).
  263never_virtualize_atom(=).
  264never_virtualize_atom(==).
  265never_virtualize_atom(iprop).
  266never_virtualize_atom(aina).
  267never_virtualize_atom(decl_as).
  268never_virtualize_atom(ainz).
  269never_virtualize_atom((':-')).
  270never_virtualize_atom(F):- suggest_m(M), clause_b(mpred_prop(M,F,_,pfcBuiltin)). % @todo not yet created
  271%never_virtualize_atom(F):- show_success(plz_never_virtualize(F)).
  272
  273never_virtualize_atom(Atom):- never_virtualize2(Atom).
  274never_virtualize_atom(Atom):- atom(Atom),!,atom_concat('mpred_',_,Atom). % mpred_* are pfc builtins
  275
  276
  277never_virtualize2((/)).
  278never_virtualize2((//)).
  279never_virtualize2(call).
  280never_virtualize2(fix_mp).
  281never_virtualize2(apply).
  282
  283plz_never_virtualize(on_x_debug).
  284
  285
  286% operations to transactionalize
  287virtualize_dbreq(O,_):- bad_functor_check(O),!,fail.
  288virtualize_dbreq(abolish,1).
  289virtualize_dbreq(abolish,2).
  290virtualize_dbreq(assert,1).
  291virtualize_dbreq(assert,2).
  292virtualize_dbreq(asserta,1).
  293virtualize_dbreq(asserta,2).
  294virtualize_dbreq(assertz,1).
  295virtualize_dbreq(assertz,2).
  296virtualize_dbreq(nth_clause,3).
  297virtualize_dbreq(clause,2).
  298virtualize_dbreq(clause,3).
  299virtualize_dbreq(retract,1).
  300virtualize_dbreq(listing,1).
  301virtualize_dbreq(clause_property,2).
  302virtualize_dbreq(retractall,1).
  303virtualize_dbreq(recorda,_).
  304virtualize_dbreq(recordz,_).
  305virtualize_dbreq(recorded,_).
  306virtualize_dbreq(erase,1).
  307
  308
  309
  310
  311virtualize_m_ereq(_M,F,A):- virtualize_ereq(F,A).
  312virtualize_ereq(O,_):- bad_functor_check(O),!,fail.
  313
  314%virtualize_ereq(lmcache:loaded_external_kbs,1).
  315
  316%virtualize_ereq(COL,A):- clause_b(col_as_isa(COL)),sanity(A==1).
  317%virtualize_ereq(COL,A):- clause_b(col_as_unary(COL)),sanity(A==1).
  318
  319virtualize_ereq(t,_).
  320virtualize_ereq(t,2).
  321virtualize_ereq(t,3).
  322
  323virtualize_ereq(functorDeclares,1).
  324
  325virtualize_ereq(mtCore,1).
  326virtualize_ereq(mtProlog,1).
  327virtualize_ereq(mtHybrid,1).
  328virtualize_ereq(mtExact,1).
  329virtualize_ereq(mtGlobal,1).
  330virtualize_ereq(arity,2).
  331
  332
  333virtualize_ereq(lambda,5).
  334
  335virtualize_ereq(mpred_f,_).
  336virtualize_ereq(mpred_f,4).
  337virtualize_ereq(mpred_f,5).
  338virtualize_ereq(mpred_f,6).
  339virtualize_ereq(mpred_f,7).
  340virtualize_ereq(props,2).
  341
  342
  343
  344
  345virtualize_ereq(mpred_prop,4).
  346
  347virtualize_ereq(pfcControlled,1).
  348virtualize_ereq(pfcRHS,1).
  349virtualize_ereq(predicateConventionMt,2).
  350virtualize_ereq(prologBuiltin,1).
  351virtualize_ereq(prologDynamic,1).
  352virtualize_ereq(prologHybrid,1).
  353virtualize_ereq(functorIsMacro,1).
  354virtualize_ereq(prologSideEffects,1).
  355
  356virtualize_ereq(singleValuedInArg,2).
  357virtualize_ereq(singleValuedInArgAX,3).
  358virtualize_ereq(support_hilog,2).
  359virtualize_ereq(rtNotForUnboundPredicates,1).
  360
  361virtualize_ereq(ttExpressionType,1).
  362virtualize_ereq(ttRelationType,1).
  363
  364
  365
  366virtualize_ereq(spft,3).
  367virtualize_ereq(==>,_).
  368virtualize_ereq(<==>,_).
  369virtualize_ereq((<--),2).
  370
  371
  372virtualize_ereq(F,A):-virtualize_ereq_plz_move_dmiles(F,A).
  373
  374% TODO BEGIN These need to be assigned the correct files
  375
  376virtualize_ereq_plz_move_dmiles(call_OnEachLoad,1).
  377
  378virtualize_ereq_plz_move_dmiles(prologKIF,1).
  379virtualize_ereq_plz_move_dmiles(prologPTTP,1).
  380
  381virtualize_ereq_plz_move_dmiles(use_ideep_swi,0).
  382virtualize_ereq_plz_move_dmiles(meta_argtypes,1).
  383virtualize_ereq_plz_move_dmiles(coerce_hook,_).
  384virtualize_ereq_plz_move_dmiles(agent_text_command,_).
  385virtualize_ereq_plz_move_dmiles(agent_command,_).
  386virtualize_ereq_plz_move_dmiles(isa,2).
  387virtualize_ereq_plz_move_dmiles(genls,2).
  388virtualize_ereq_plz_move_dmiles(nameString,2).
  389virtualize_ereq_plz_move_dmiles(argIsa,3).
  390virtualize_ereq_plz_move_dmiles(argQuotedIsa,3).
  391virtualize_ereq_plz_move_dmiles(cyckb_t_e2c,3).
  392virtualize_ereq_plz_move_dmiles(cyckb_t_e2c,4).
  393virtualize_ereq_plz_move_dmiles(cyckb_t_e2c,_).
  394virtualize_ereq_plz_move_dmiles(completeExtentEnumerable,1).
  395virtualize_ereq_plz_move_dmiles(completelyAssertedCollection,1).
  396virtualize_ereq_plz_move_dmiles(constrain_args_pttp,2).
  397virtualize_ereq_plz_move_dmiles(cycPlus2,2).
  398virtualize_ereq_plz_move_dmiles(cycPred,2).
  399virtualize_ereq_plz_move_dmiles(decided_not_was_isa,2).
  400virtualize_ereq_plz_move_dmiles(mudKeyword,2).
  401virtualize_ereq_plz_move_dmiles(resultIsa,2).
  402virtualize_ereq_plz_move_dmiles(tCol,1).
  403virtualize_ereq_plz_move_dmiles(tPred,1).
  404virtualize_ereq_plz_move_dmiles(tRelation,1).
  405virtualize_ereq_plz_move_dmiles(tAgent,1).
  406virtualize_ereq_plz_move_dmiles(tCol,1).
  407virtualize_ereq_plz_move_dmiles(ttTemporalType,1).
  408
  409% END These need to be assigned the correct files
 virtualize_code(X, :TermT, :TermARG2) is semidet
System Goal Expansion Sd.f$
  416%virtualize_code(X,Goal,_):- functor(Goal,F,_),arg(_,v(call_u,call,(/),(',')),F),!,fail.
  417%virtualize_code(X,M:Goal,(call_u(genlMt(abox,GMt)),with_umt(GMt,Goal))):- M==tbox.
  418/*
  419virtualize_args_as(Goal,Args):- sanity((arg(1,Goal,Var),var(Var))), predicate_property(Goal,meta_predicate(Args)).
  420virtualize_args_as(Goal,_):-predicate_property(Goal,built_in),!,fail.
  421virtualize_args_as(Goal,Goal):-predicate_property(Goal,transparent),!.
  422virtualize_args_as(Which,Args):- descend_ge(Which),Args=Which.
  423*/
  424
  425
  426
  427virtualize_args_as(Which,Args):- descend_ge(Which),Args=Which.
  428virtualize_args_as(Goal,Args):- sanity((arg(1,Goal,Var),var(Var))), predicate_property(Goal,meta_predicate(Args)).
  429%virtualize_args_as(Goal,Goal):-predicate_property(Goal,transparent),!.
  430% virtualize_args_as(Goal,_):-predicate_property(Goal,built_in),!,fail.
  431
  432descend_ge(':-'((:),0)).
  433descend_ge(':-'((-),0)).
  434descend_ge(( :- 0)).
  435descend_ge('{}'(0)).
  436descend_ge('must'(0)).
  437descend_ge('quietly'(0)).
  438descend_ge('sanity'(0)).
  439descend_ge('->'(0,0)).
  440descend_ge(';'(0,0)).
  441descend_ge('==>'(-,-)).
  442descend_ge('==>'(-)).
  443descend_ge('<--'(-,-)).
  444descend_ge(z(if)).
  445descend_ge(z(_)):-!,fail.
  446descend_ge(Which):-functor(Which,F,_),!,descend_ge(z(F)),!.
  447
  448:- nb_linkval('$xform_arity',xform_arity(_C,_F,_A)).  449
  450xform_arity(C,F,A):-var(C),!,sanity(var(F)),must(var(A)), nb_getval('$xform_arity',xform_arity(C,F,A)),!.
  451xform_arity(C,F,A):-atom(C),!,C=F,ignore(clause_b(arity(F,A))).
  452xform_arity(F/A,F,A):-atom(F),!.
  453xform_arity(F//Am2,F,A):- integer(Am2),!, A is Am2+2.
  454xform_arity(C,F,A):- compound(C), functor(C,F,A).
  455
  456xform(_,_):-!,fail.
  457xform(Var,Out):- \+compound(Var),!,Out=Var.
  458xform(Nonvar,Out):- \+ current_prolog_flag(subclause_expansion,true),!,Nonvar=Out.
  459%xform(isa(C,P),mpred_prop(M,F,A,P)):-nonvar(P),!,is_reltype(P),xform_arity(C,F,A).
  460%xform(isa(C,P),(ttRelationType(P),mpred_prop(M,F,A,P))):-nonvar(C),xform_arity(C,F,A),is_reltype(P),!.
  461% xform(mpred_isa(C,P),mpred_prop(M,F,A,P)):- xform_arity(C,F,A),!.
  462xform(hybrid_support(F,A),mpred_prop(_M,F,A,prologHybrid)):-!.
  463% xform(arity(F,A),mpred_prop(M,F,A,arity)):-!.
  464xform(mpred_prop(M,F,A,P),mpred_prop(M,F,A,P)):-!.
  465
  466
  467xform(PC,mpred_prop(M,F,A,P)):- current_assertion_module(M), PC=..[P,C],is_reltype(P),!,xform_arity(C,F,A).
  468xform(PFA,mpred_prop(M,F,A,P)):- defaultAssertMt(M),PFA=..[P,F,A],is_reltype(P),!.
  469xform(In,PART):- map_compound_args(xform,In,PART),!.
  470
  471%:-multifile(baseKB:ttRelationType/1).
  472%:-dynamic(baseKB:ttRelationType/1).
  473is_reltype(Var):-var(Var),!,fail.
  474is_reltype(pfcControlled).
  475is_reltype(prologHybrid).
  476is_reltype(prologBuiltin).
  477is_reltype(P):-clause_b(ttRelationType(P)).
  478
  479
  480cannot_descend_expansion(_,In):- \+ compound(In),!.
  481cannot_descend_expansion(ge,In):- strip_module(In,M,FA),functor(FA,F,A),!,never_virtualize(M:F/A).
  482
  483
  484virtualize_code(_,In,Out):- \+ compound(In),!,In=Out.
  485virtualize_code(_,functor(P,F,A),cfunctor(P,F,A)):-!.
  486virtualize_code(_,(SWC,REST),(SWC,REST)):- (swc==SWC /* ;cwc==SWC */),!. % never goal expand
  487virtualize_code(X,(VWC,In),(Out)):- vwc==VWC,!,virtualize_code(X,In,Out).
  488virtualize_code(_,P=..In,cnas(P,H,T)):- nonvar(In),In=[H|T],!.
  489virtualize_code(_,P=..In,on_x_debug(P=..In)):-!.
  490virtualize_code(_,functor(P,F,A),on_x_debug(functor(P,F,A))):-!.
  491% virtualize_code(X,(G1:-G2),(G1:-O2)):- !,virtualize_code(X,G2,O2),!.
  492virtualize_code(X,(G1,G2),(O1,O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
  493virtualize_code(X,\+ G1,call_u(\+ G1)):- virtualize_code(X,G1,O1), \+ same_terms(G1,O1),!.
  494virtualize_code(X, \+ (G1), \+ (O1)):- !, virtualize_code(X,G1,O1),!.
  495virtualize_code(X,must(G1),must(O1)):- !, virtualize_code(X,G1,O1),!.
  496virtualize_code(X,sanity(G1),sanity(O1)):- !, virtualize_code(X,G1,O1),!.
  497virtualize_code(X,setof(In,G1,Out),setof(In,O1,Out)):- virtualize_code(X,G1,O1),!.
  498virtualize_code(X,catch(G1,E,G2),catch(O1,E,O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
  499virtualize_code(_,(G1 \= G2),(G1 \= G2)):-!.
  500virtualize_code(_,(G1 == G2),(G1 == G2)):-!.
  501virtualize_code(_,(G1 \== G2),(G1 \== G2)):-!.
  502virtualize_code(_,(G1 = G2),(G1 = G2)):-!.
  503virtualize_code(X,(G1;G2),(O1;O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
  504virtualize_code(X,(G1->G2),(O1->O2)):- !,virtualize_code(X,G1,O1),!,virtualize_code(X,G2,O2),!.
  505virtualize_code(ge,M:In,ereq(In)):- M==abox,!.
  506virtualize_code(ge,M:In,M:In):- M==dif,!.
  507virtualize_code(ge,M:mtProlog(C),M:mtProlog(C)):- M==baseKB,!.
  508
  509virtualize_code(_,M:In,M:PART):- \+ compound(In),!,In=PART.
  510
  511/*
  512virtualize_code(ge,M:In,M:In):- atom(M),callable(In),(predicate_property(M:In,volatile);predicate_property(M:In,thread_local)),!.
  513virtualize_code(X,M:In,M:Out):- atom(M),
  514  '$current_source_module'(SM),atom(SM),'$set_source_module'(M),
  515  must(call_cleanup(virtualize_code(X,In,Out),'$set_source_module'(SM))).
  516
  517virtualize_code(X,M:In,M:Out):- !, must(virtualize_code(X,In,Out)),!.
  518*/
  519
  520virtualize_code(X,M:In,PART):- !, ((functor(In,F,A),virtualize_code_fa(X,M:In,F,A,PART))->true;(M:In=PART)),!.
  521virtualize_code(X,In,PART):- !, ((functor(In,F,A),virtualize_code_fa(X,In,F,A,PART))->true;In=PART),!.
  522%virtualize_code(X,In,PART):- must(map_compound_args(virtualize_code(X),In,PART)),!.
  523% virtualize_code(ge,In,In).
  524% virtualize_code(_,In,In).
  525% virtualize_code(X,In,PART):- wdmsg(bad_virtualize_code(X,In,PART)), dtrace.
  526
  527virtualize_code_fa(X,M:In,F,A,M:PART):-!,virtualize_code_fa(X,In,F,A,PART).
  528virtualize_code_fa(X,In,_,_,In):- cannot_descend_expansion(X,In),!. % ,fail. % wdmsg(cannot_descend_expansion(X,In))
  529virtualize_code_fa(X,In,F,A,PART):- get_virtualizer_mode(X,F,A,How),!,must(safe_virtualize(In,How,PART)).
  530virtualize_code_fa(X,In,F,A,PART):- X==ge, functor(ArgModes,F,A),
  531  Args=ArgModes,
  532  virtualize_args_as(Args,ArgModes),!, 
  533  map_compound_args(virtualize_code_each(X),ArgModes,In,PART),!.
  534
  535% virtualize_code(X,In,Out):- compound(In), virtualize_special_outside(X,In),!,Out=ereq(In).
  536
  537virtualize_special_outside(X,In):- functor(In,F,A),get_virtualizer_mode(X,F,A,_How),!.
  538virtualize_special_outside(X,In):- arg(_,In,Arg), \+cannot_descend_expansion(X,Arg),virtualize_special_outside(X,In).
  539
  540virtualize_code_each(X,Arg,In,Out):- var(Arg),!,virtualize_code_each(X,(+),In,Out).
  541virtualize_code_each(X,Arg,In,Out):- (integer(Arg); Arg == +; Arg == * ) -> virtualize_code(X,In,Out),!.
  542virtualize_code_each(X,-,In,Out):- current_predicate(mpred_expansion_file/0), if_defined(fully_expand_head(X,In,Out)),!.
  543virtualize_code_each(_,_,In,Out):- must(Out=In).
  544
  545
  546
  547map_compound_args(Pred,In,Out):- must(( compound(In), In=..[F|InL],maplist(Pred,InL,OutL),Out=..[F|OutL])).
  548
  549map_compound_args(Pred,Args,In,Out):- must(( compound(Args), compound(In), Args=..[_|ArgsL],In=..[F|InL],maplist(Pred,ArgsL,InL,OutL),Out=..[F|OutL])).
  550
  551could_safe_virtualize:- 
  552     is_file_virtualize_allowed,
  553     prolog_load_context(module,M),
  554     \+ clause_b(mtHybrid(M)),
  555     \+ ((current_prolog_flag(dialect_pfc,fwc); 
  556       (source_location(F,_W),( atom_concat(_,'.pfc.pl',F);atom_concat(_,'.plmoo',F);atom_concat(_,'.clif',F);atom_concat(_,'.pfc',F))))).
  557
  558%virtualize_source(X,In,Out):- (ground(In);true;current_prolog_flag(unsafe_speedups,true)),!,virtualize_code(X,In,Out).
  559%virtualize_source(X,In,Out):- ground(In),!,virtualize_code(X,In,Out).
  560%virtualize_source(X,In,Out):- callable(In),term_variables(In,List),with_vars_locked(throw,List,virtualize_code(X,In,Out)).
  561virtualize_source(X,In,Out):- virtualize_code(X,In,Out),!.
 safe_virtualize(Term, +How, -Wrapped) is semidet
Safely Paying Attention To Corner Cases Wrap.
  570safe_virtualize(Goal,How,Out):- must(safe_virtualize_0(Goal,How,call(MHow,MGoal))),!, 
  571   safe_univ(Out,[MHow,MGoal]).
  572
  573safe_virtualize_0(M:Goal,M:How,call(How,M:Goal)).
  574safe_virtualize_0(M:Goal,How,call(How,M:Goal)).
  575safe_virtualize_0(Goal,baseKB:How,call(How,Goal)).
  576safe_virtualize_0(Goal,M:How,call(How,M:Goal)).
  577safe_virtualize_0(Goal,How,call(How,Goal)).
  578
  579
  580
  581virtualize_source_file:- 
  582 prolog_load_context(source,F),virtualize_source_file(F),
  583 prolog_load_context(file,F1),virtualize_source_file(F1).
  584
  585virtualize_source_file(F1):- virtualize_source_file(F1,true).
  586
  587virtualize_source_file(F1,Value):- 
  588  absolute_file_name(F1,F,[file_type(prolog),access(read),file_errors(error)]),
  589  retractall(lmconf:should_virtualize_source_file(F,_)),
  590  asserta(lmconf:should_virtualize_source_file(F,Value)).
  591
  592
  593virtualized_goal_expansion(Head, In,Out):-
  594  strip_module(In,_,In0),compound(In0), 
  595  (sd_goal_expansion(In,In0,Out)-> 
  596    nop((( \+ same_terms(In,Out), \+ same_terms(In0,Out)) -> 
  597      ((
  598        dmsg( virtualized_goal_expansion(Head,In,_)),
  599        dmsg( be4 :- In),
  600        dmsg( out :- Out)))))).
  601
  602is_file_virtualize_allowed:- prolog_load_context(file,F),lmconf:should_virtualize_source_file(F,false),!,fail.
  603is_file_virtualize_allowed:- prolog_load_context(source,F),lmconf:should_virtualize_source_file(F,false),!,fail.
  604is_file_virtualize_allowed:-  
  605  prolog_load_context(source,S),
  606  (is_file_virtualize_allowed(S)-> true ;
  607   (prolog_load_context(file,F),F\==S,is_file_virtualize_allowed(F))).
  608
  609
  610is_file_virtualize_allowed(S):- lmconf:should_virtualize_source_file(S,TF),!,TF==true.
  611is_file_virtualize_allowed(S):- atom_concat(_,'.plv',S).
  612%is_file_virtualize_allowed(S):- ignore_mpreds_in_file(S),!,fail.
  613
  614decl_wrapped(M,F,A,How):-
  615 assert_if_new(rdf_rewrite:arity(F,A)), % TODO puts this in Local Mt
  616 assert_if_new(baseKB:safe_wrap(M,F,A,How)).
  617 % once((M==baseKB->true;assert_if_new(baseKB:predicateConventionMt(F,M)))).
  618
  619% Skip Virtualizing
  620swc.
  621
  622% Virtualize
  623vwc :- throw('Code was missed by virtualizer!').
  624
  625% always goal expand (and remove it so it wont throw)
  626sd_goal_expansion(_,(VWC,In),Out):- vwc==VWC,!,must((callable(In),virtualize_source(ge,In,Out))).
  627sd_goal_expansion(In,_,Out):- compound(In),virtualize_source(ge,In,Out).
  628
  629%= 	 	 
 same_terms(?A, :TermB) is semidet
Same Terms.
  635same_terms(A,B):-A==B,!.
  636same_terms(A,B):-A=@=B,!.
  637same_terms(A,B):-A=@=B,!,A=B.
  638same_terms(A,B):- \+ \+ A = B,!,fail.
  639same_terms(A,B):- ( \+ compound(A) ; \+ compound(B)),!,fail.
  640same_terms(M:A,B):-atom(M),!,same_terms(A,B).
  641same_terms(A,M:B):-atom(M),!,same_terms(A,B).
  642same_terms(In,on_x_debug(Out)):- !, same_terms(In,Out).
  643same_terms(on_x_debug(Out),In):- !, same_terms(In,Out).
  644same_terms(In,dbreq(Out)):- !, same_terms(In,Out).
  645same_terms(A=..[P|AA],cnas(B,P,BB)):-!,same_terms(A,B),same_terms(AA,BB).
  646same_terms((A,AA),(B,BB)):-!,same_terms(A,B),same_terms(AA,BB).
  647same_terms([A|AA],[B|BB]):-!,same_terms(A,B),same_terms(AA,BB).
  648same_terms((A;AA),(B;BB)):-!,same_terms(A,B),same_terms(AA,BB).
  649same_terms((A:-AA),(B:-BB)):-!,same_terms(A,B),same_terms(AA,BB).
  650same_terms(AAA,BBB):-  AAA=..[F|AA],BBB=..[F|BB],!,same_terms(AA,BB).
  651
  652
  653
  654
  655:- fixup_exports.  656
  657:- if(false).  658
  659:- multifile(system:file_body_expansion/2).  660:-   dynamic(system:file_body_expansion/2).  661:- use_module(system:library(subclause_expansion)).  662system:file_body_expansion(Head,In,Out):- compound(In), 
  663  is_file_virtualize_allowed,   
  664  virtualized_goal_expansion(Head, In,Out).
  665  
  666
  667
  668:- else.  669
  670:- multifile(system:goal_expansion/4).  671:- dynamic(system:goal_expansion/4).  672:- module_transparent(system:goal_expansion/4).  673system:goal_expansion(In,P,Out,PO):- 
  674   notrace((compound(In), nonvar(P))),   
  675   notrace((nb_current('$term', Head :- FileTerm),In == FileTerm)),   
  676   notrace(is_file_virtualize_allowed)->
  677   virtualized_goal_expansion(Head,In,Out)-> PO=P.
  678
  679:- endif.