1% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/logicmoo_util_first.pl
    2:- module(first,
    3          [ 
    4            safe_numbervars/1,
    5            safe_numbervars/2,
    6            put_variable_names/1,
    7            nput_variable_names/1,
    8            check_variable_names/2,
    9            unnumbervars4/4,
   10            get_varname_list/1,
   11            set_varname_list/1,
   12            on_xf_cont/1,
   13            user_ensure_loaded/1,
   14            user_use_module/1,
   15            alldiscontiguous/0,
   16            arg_is_transparent/1,
   17            all_module_predicates_are_transparent/1,
   18            alldiscontiguous/0,
   19            arg_is_transparent/1,
   20            module_meta_predicates_are_transparent/1,
   21            module_predicate/3,
   22            module_predicate/4,
   23            module_predicates_are_exported/0,
   24            module_predicates_are_exported/1,
   25            module_predicates_are_exported0/1,
   26            module_predicates_are_not_exported_list/2,
   27            quiet_all_module_predicates_are_transparent/1,
   28            export_all_preds/0,
   29            export_all_preds/1,
   30            
   31            
   32            if_may_hide/1,
   33            match_predicates/2,
   34            match_predicates/5,
   35            mpred_trace_childs/1,
   36            mpred_trace_less/1,
   37            mpred_trace_nochilds/1,
   38            mpred_trace_none/1,
   39            
   40            add_newvar/2,
   41            add_newvars/1,
   42            
   43            %lbl_vars/6,
   44            
   45            mustvv/1,
   46            name_to_var/3,
   47            source_context_module/1,
   48            
   49            
   50            % tlbugger:ifHideTrace/0,
   51            register_var/3,
   52            register_var/4,
   53            register_var_0/4,
   54            remove_grounds/2,
   55            renumbervars_prev/2,
   56            renumbervars1/2,
   57            renumbervars1/4,
   58            add_var_to_env/2,
   59            
   60            samify/2,
   61            snumbervars/1,
   62            snumbervars/3,
   63            snumbervars/4,
   64            term_to_string/2,
   65            unnumbervars/2,
   66            unnumbervars_and_save/2,
   67            qdmsg/1,
   68            getenv_safe/3,
   69            var_to_name/3
   70
   71          ]).   72
   73
   74:- set_module(class(library)).   75:- thread_local(tlbugger:ifHideTrace/0).   76%:- reexport(library(listing_vars)).
   77:- use_module(library(lists)).   78
   79
   80:- export(cnas/3).   81
   82% cnas(A,B,C):- compound_name_args_safe(A,B,C).
   83cnas(A,B,C):- compound(A)-> compound_name_arguments(A,B,C);( A=..[B|C]).
   84cfunctor(A,B,C):- compound(A)->compound_name_arity(A,B,C);functor(A,B,C).
   85
   86:- system:import(cnas/3).   87:- system:import(cfunctor/3).   88
   89
   90% :- abolish(system:nop/1),asserta(system:nop(_)).
   91
   92getenv_safe(Name,ValueO,Default):-
   93   (getenv(Name,RV)->Value=RV;Value=Default),
   94    (number(Default)->( \+ number(Value) -> atom_number(Value,ValueO); Value=ValueO);(Value=ValueO)).
   95
   96qdmsg(M):-compound(M),functor(M,F,_),!,debug(logicmoo(F),'~q',[M]).
   97qdmsg(M):-debug(logicmoo(M),'QMSG: ~q',[M]).
   98
   99:- meta_predicate
  100
  101  if_may_hide(0),
  102   match_predicates(:, -),
  103   match_predicates(:,-,-,-,-),
  104   mpred_trace_none(:),
  105   mpred_trace_less(:),
  106   mpred_trace_childs(:),
  107   mpred_trace_nochilds(:),
  108
  109        mustvv(0),
  110        on_xf_cont(0),
  111        renumbervars_prev(?, ?),
  112        snumbervars(?),
  113        snumbervars(*, ?, ?),
  114        snumbervars(*, ?, ?, ?).  115:- module_transparent
  116source_context_module/1,
  117
  118user_ensure_loaded/1,
  119on_xf_cont/1,
  120user_use_module/1,
  121alldiscontiguous/0,
  122arg_is_transparent/1,
  123all_module_predicates_are_transparent/1,
  124alldiscontiguous/0,
  125arg_is_transparent/1,
  126module_meta_predicates_are_transparent/1,
  127module_predicate/3,
  128module_predicate/4,
  129module_predicates_are_exported/0,
  130module_predicates_are_exported/1,
  131module_predicates_are_exported0/1,
  132module_predicates_are_not_exported_list/2,
  133quiet_all_module_predicates_are_transparent/1,
  134
  135          match_predicates/2,
  136          match_predicates/5,
  137          if_may_hide/1,
  138          mpred_trace_less/1,
  139          mpred_trace_none/1,
  140          mpred_trace_nochilds/1,
  141          mpred_trace_childs/1,
  142        add_newvar/2,
  143        add_newvars/1,
  144        %lbl_vars/6,
  145        name_to_var/3,
  146        register_var/3,
  147        register_var/4,
  148        register_var_0/4,
  149        remove_grounds/2,
  150        renumbervars1/2,
  151        renumbervars1/4,
  152        samify/2,
  153        
  154        term_to_string/2,
  155        unnumbervars/2,
  156        add_var_to_env/2,
  157   safe_numbervars/1,
  158   safe_numbervars/2,
  159        unnumbervars_and_save/2,
  160        var_to_name/3.  161
  162
  163:- meta_predicate snumbervars(?,?,?,?).  164:- meta_predicate snumbervars(?,?,?).  165:- meta_predicate safe_numbervars(?).  166/*
  167        module_meta_transparent(:),
  168   some_flocation/3,
  169
  170:- meta_predicate contains_singletons(?).
  171% Restarting analysis ...
  172% Found new meta-predicates in iteration 2 (0.206 sec)
  173:- meta_predicate renumbervars_prev(?,?).
  174:- meta_predicate randomVars(?).
  175:- meta_predicate snumbervars(?).
  176% Restarting analysis ...
  177% Found new meta-predicates in iteration 3 (0.121 sec)
  178:- meta_predicate programmer_error(0).
  179:- meta_predicate safe_numbervars(*,?).
  180        export_file_preds/1,
  181        export_file_preds/6,
  182   export_file_preds/0,
  183some_location/3,
  184*/
  185
  186%= 	 	 
 alldiscontiguous is semidet
Alldiscontiguous.
  192alldiscontiguous:-!.
  193
  194
  195%= 	 	 
 source_context_module(?CM) is semidet
Source Context Module.
  201source_context_module(M):- source_context_module0(M),M\==user, \+ '$current_typein_module'(M),!.
  202source_context_module(M):- source_context_module0(M),M\==user,!.
  203source_context_module(M):- source_context_module0(M).
  204
  205source_context_module0(M):- context_module(M).
  206source_context_module0(M):- prolog_load_context(module, M).
  207source_context_module0(M):- '$current_typein_module'(M).
  208
  209
  210
  211:-export(on_x_fail/1).
 on_x_fail(:Goal) is semidet
If there If Is an exception in :Goal just fail
  216on_x_fail(Goal):- catchv(Goal,_,fail).
  217
  218
  219%================================================================
  220% pred tracing 
  221%================================================================
  222
  223% = :- meta_predicate('match_predicates'(:,-)).
  224
  225
  226%= 	 	 
 match_predicates(?MSpec, -MatchesO) is semidet
Match Predicates.
  232match_predicates(M:Spec,Preds):- catch('$find_predicate'(M:Spec, Preds),_,catch('$find_predicate'(Spec, Preds),_,catch('$find_predicate'(baseKB:Spec, Preds),_,fail))),!.
  233match_predicates(MSpec,MatchesO):- catch('$dwim':'$find_predicate'(MSpec,Matches),_,Matches=[]),!,MatchesO=Matches.
  234
  235
  236%= 	 	 
 match_predicates(?Spec, -M, -P, -F, -A) is semidet
Match Predicates.
  242match_predicates(_:[],_M,_P,_F,_A):-!,fail.
  243match_predicates(IM:(ASpec,BSpec),M,P,F,A):-!, (match_predicates(IM:(ASpec),M,P,F,A);match_predicates(IM:(BSpec),M,P,F,A)).
  244match_predicates(IM:[ASpec|BSpec],M,P,F,A):-!, (match_predicates(IM:(ASpec),M,P,F,A);match_predicates(IM:(BSpec),M,P,F,A)).
  245match_predicates(IM:IF/IA,M,P,F,A):- '$find_predicate'(IM:P,Matches),member(CM:F/A,Matches),functor(P,F,A),(predicate_property(CM:P,imported_from(M))->true;CM=M),IF=F,IA=A.
  246match_predicates(Spec,M,P,F,A):- '$find_predicate'(Spec,Matches),member(CM:F/A,Matches),functor(P,F,A),(predicate_property(CM:P,imported_from(M))->true;CM=M).
  247
  248:- module_transparent(if_may_hide/1).  249% = :- meta_predicate(if_may_hide(0)).
  250%if_may_hide(_G):-!.
  251
  252%= 	 	 
 if_may_hide(:GoalG) is semidet
If May Hide.
  258if_may_hide(G):-G.
  259
  260:- meta_predicate with_unlocked_pred(:,0).  261
  262%= 	 	 
 with_unlocked_pred(?Pred, :Goal) is semidet
Using Unlocked Predicate.
  268with_unlocked_pred(MP,Goal):- strip_module(MP,M,P),Pred=M:P,
  269   (predicate_property(Pred,foreign)-> true ;
  270  (
  271 ('$get_predicate_attribute'(Pred, system, 0) -> Goal ;
  272 setup_call_cleanup('$set_predicate_attribute'(Pred, system, 0),
  273   catch(Goal,E,throw(E)),'$set_predicate_attribute'(Pred, system, 1))))).
  274
  275
  276on_xf_cont(Goal):- ignore(catch(Goal,_,true)).
  277
  278:- export(mpred_trace_less/1).  279
  280%= 	 	 
 mpred_trace_less(?W) is semidet
Managed Predicate Trace less.
  286mpred_trace_less(W):- if_may_hide(forall(match_predicates(W,M,Pred,_,_),(
  287with_unlocked_pred(M:Pred,(
  288  '$set_predicate_attribute'(M:Pred, noprofile, 1),
  289  (A==0 -> '$set_predicate_attribute'(M:Pred, hide_childs, 1);'$set_predicate_attribute'(M:Pred, hide_childs, 1)),
  290  (A==0 -> '$set_predicate_attribute'(M:Pred, trace, 0);'$set_predicate_attribute'(M:Pred, trace, 1))))))).
  291
  292:- export(mpred_trace_none/1).  293
  294%= 	 	 
 mpred_trace_none(?W) is semidet
Managed Predicate Trace none.
  300mpred_trace_none(W):- (forall(match_predicates(W,M,Pred,F,A),
  301  with_unlocked_pred(M:Pred,(('$hide'(M:F/A),'$set_predicate_attribute'(M:Pred, hide_childs, 1),noprofile(M:F/A),nop(nospy(M:Pred))))))).
  302
  303:- export(mpred_trace_nochilds/1).  304
  305%= 	 	 
 mpred_trace_nochilds(?W) is semidet
Managed Predicate Trace nochilds.
  311mpred_trace_nochilds(W):- if_may_hide(forall(match_predicates(W,M,Pred,_,_),(
  312with_unlocked_pred(M:Pred,(
  313'$set_predicate_attribute'(M:Pred, trace, 1),
  314%'$set_predicate_attribute'(M:Pred, noprofile, 0),
  315'$set_predicate_attribute'(M:Pred, hide_childs, 1)))))).
  316
  317:- export(mpred_trace_childs/1).
 mpred_trace_childs(?W) is semidet
Managed Predicate Trace childs.
  325mpred_trace_childs(W) :- if_may_hide(forall(match_predicates(W,M,Pred,_,_),(
  326   with_unlocked_pred(M:Pred,(
  327   '$set_predicate_attribute'(M:Pred, trace, 0),
  328   %'$set_predicate_attribute'(M:Pred, noprofile, 0),
  329   '$set_predicate_attribute'(M:Pred, hide_childs, 0)))))).   
  330
  331
  332%= 	 	 
 mpred_trace_all(?W) is semidet
Managed Predicate Trace all.
  338mpred_trace_all(W) :- forall(match_predicates(W,M,Pred,_,A),( 
  339 with_unlocked_pred(M:Pred,(
  340 (A==0 -> '$set_predicate_attribute'(M:Pred, trace, 0);'$set_predicate_attribute'(M:Pred, trace, 1)),
  341 % '$set_predicate_attribute'(M:Pred, noprofile, 0),
  342'$set_predicate_attribute'(M:Pred, hide_childs, 0))))).
  343
  344%:-mpred_trace_all(prolog:_).
  345%:-mpred_trace_all('$apply':_).
  346%:-mpred_trace_all(system:_).
  347
  348%:- set_module(class(library)).
  349
  350
  351%:- thread_local(tlbugger:ifHideTrace/0).
  352%:- export(tlbugger:ifHideTrace/0).
 oncely_clean(Goal)
throws an exception if Goal leaves choicepoints or if goal fails
  360oncely_clean(Goal):- 
  361 '$sig_atomic'((Goal,assertion(deterministic(true))))
  362  ->true;
  363   throw(failed_oncely_clean(Goal)).
  364
  365
  366
  367%= 	 	 
 term_to_string(?IS, ?I) is semidet
Hook To [pldoc_html:term_to_string/2] For Module Logicmoo_util_first. Term Converted To String.
  374term_to_string(IS,I):- on_x_fail(term_string(IS,I)),!.
  375term_to_string(I,IS):- on_x_fail(string_to_atom(IS,I)),!.
  376term_to_string(I,IS):- rtrace(term_to_atom(I,A)),string_to_atom(IS,A),!.
  377
  378
  379:- meta_predicate mustvv(0).  380
  381%= 	 	 
 mustvv(:GoalG) is semidet
Mustvv.
  387mustvv(G):-must(G).
  388
  389%:- export(unnumbervars/2).
  390% unnumbervars(X,YY):- lbl_vars(_,_,X,[],Y,_Vs),!, mustvv(YY=Y).
  391% TODO compare the speed
  392% unnumbervars(X,YY):- mustvv(unnumbervars0(X,Y)),!,mustvv(Y=YY).
  393
  394
  395dupe_term(E,EE):- duplicate_term(E,EE),E=EE.
  396
  397get_varname_list(VsOut):- nb_current('$variable_names',Vs),!,check_variable_names(Vs,VsOut),!.
  398get_varname_list([]).
  399set_varname_list(VsIn):- check_variable_names(VsIn,Vs),
  400  b_setval('$variable_names',[]),
  401  dupe_term(Vs,VsD),
  402  nb_linkval('$variable_names',VsD).
  403
  404add_var_to_env(NameS,Var):-
  405   ((is_list(NameS);string(NameS))->name(Name,NameS);NameS=Name),
  406   get_varname_list(VsIn),
  407   add_var_to_list(Name,Var,VsIn,NewName,NewVar,NewVs),
  408   (NewName\==Name -> put_attr(Var, vn, NewName) ; true),
  409   (NewVar \==Var  -> put_attr(NewVar, vn, Name) ; true),
  410   (NewVs  \==VsIn -> put_variable_names(NewVs) ; true).
 add_var_to_list(Name, Var, Vs, NewName, NewVar, NewVs) is det
  414add_var_to_list(Name,Var,Vs,NewName,NewVar,NewVs):- member(N0=V0,Vs), Var==V0,!,
  415            (Name==N0 -> ( NewName=Name,NewVar=Var, NewVs=Vs ) ;  ( NewName=N0,NewVar=Var,NewVs=[Name=Var|Vs])),!.
  416% a current name but points to a diffentrt var
  417add_var_to_list(Name,Var,Vs,NewName,NewVar,NewVs):- member(Name=_,Vs),
  418              length(Vs,Len),atom_concat(Name,Len,NameAgain0),( \+ member(NameAgain0=_,Vs)-> NameAgain0=NameAgain ; gensym(Name,NameAgain)),
  419              NewName=NameAgain,NewVar=Var, 
  420              NewVs=[NewName=NewVar|Vs],!.
  421add_var_to_list(Name,Var,Vs,NewName,NewVar,NewVs):-  
  422  NewName=Name,NewVar=Var,NewVs=[Name=Var|Vs],!.
  423
  424
  425%= 	 	 
 unnumbervars(?X, ?Y) is semidet
Unnumbervars.
  431unnumbervars(X,Y):- must(zotrace(unnumbervars_and_save(X,Y))).
  432
  433zotrace(G):- notrace(tracing)->notrace(G);call(G).
  434:- '$hide'(zotrace/1).  435:- '$set_predicate_attribute'(zotrace/1, hide_childs, true).  436
  437first_scce_orig(Setup0,Goal,Cleanup0):-
  438  notrace((Cleanup = notrace('$sig_atomic'(Cleanup0)),Setup = notrace('$sig_atomic'(Setup0)))),
  439    notrace(Setup), !,
  440   (catch(Goal, E,(Cleanup,throw(E)))
  441      *-> (notrace(tracing)->(notrace,deterministic(DET),trace);deterministic(DET)); notrace((Cleanup,!,fail))),
  442     Cleanup,
  443     (notrace(DET == true) -> ! ; (true;(Setup,notrace(fail)))).
  444
  445zzotrace(G):- notrace(\+ tracing)->call(G) ; first_scce_orig(notrace,G,trace).
  446:- '$hide'(zzotrace/1).  447
  448put_variable_names(NewVs):-  check_variable_names(NewVs,Checked),call(b_setval,'$variable_names',Checked).
  449nput_variable_names(NewVs):- check_variable_names(NewVs,Checked),call(nb_setval,'$variable_names',Checked).
  450
  451check_variable_names(I,O):- (\+ (member(N=_,I),var(N)) -> O=I ; 
  452   (set_prolog_flag(variable_names_bad,true),trace_or_throw(bad_check_variable_names))).
  453
  454%= 	 	 
 unnumbervars_and_save(?X, ?YO) is semidet
Unnumbervars And Save.
  461unnumbervars_and_save(X,YO):- must(zotrace(unnumbervars4(X,[],_,YO))),!.
  462% unnumbervars_and_save(X,YO):- \+ ((sub_term(V,X),compound(V),'$VAR'(_)=V)),!,YO=X.
  463
  464/*
  465unnumbervars_and_save(X,YO):- (get_varname_list(Vs)->true;Vs=[]),unnumbervars4(X,Vs,NewVs,YO),!,
  466   (NewVs  \==Vs   -> put_variable_names(NewVs) ; true).
  467unnumbervars_and_save(X,YO):-
  468 term_variables(X,TV),
  469 mustvv((source_variables_l(Vs),
  470   with_output_to(string(A),write_term(X,[numbervars(true),variable_names(Vs),character_escapes(true),ignore_ops(true),quoted(true)])))),
  471   mustvv(atom_to_term(A,Y,NewVs)),
  472   (NewVs==[]-> YO=X ; (length(TV,TVL),length(NewVs,NewVarsL),(NewVarsL==TVL-> (YO=X) ; (add_newvars(NewVs),YO=Y)))).
  473*/
 unnumbervars4(TermIn, VsIn, NewVs, TermOut) is det
Unnumbervars And Save.
  479unnumbervars4(Var,Vs,Vs,Var):- \+ compound(Var),!.
  480unnumbervars4((I,TermIn),VsIn,NewVs,(O,TermOut)):- !,unnumbervars4(I,VsIn,VsM,O),unnumbervars4(TermIn,VsM,NewVs,TermOut).
  481unnumbervars4((I:TermIn),VsIn,NewVs,(O:TermOut)):- !,unnumbervars4(I,VsIn,VsM,O),unnumbervars4(TermIn,VsM,NewVs,TermOut).
  482unnumbervars4([I|TermIn],VsIn,NewVs,[O|TermOut]):- !,unnumbervars4(I,VsIn,VsM,O),unnumbervars4(TermIn,VsM,NewVs,TermOut).
  483unnumbervars4('$VAR'(Name),VsIn,NewVs,Var):- nonvar(Name),!, (member(Name=Var,VsIn)->NewVs=VsIn;NewVs=[Name=Var|VsIn]),!,put_attr(Var,vn,Name).
  484unnumbervars4(PTermIn,VsIn,NewVs,PTermOut):- compound_name_arguments(PTermIn,F,TermIn),unnumbervars4(TermIn,VsIn,NewVs,TermOut),compound_name_arguments(PTermOut,F,TermOut).
  485   
  486
  487 
  488
  489/*
  490
  491unnumbervars_and_save(X,YO):-
  492 term_variables(X,TV),
  493 mustvv((source_variables_l(Vs),
  494   with_output_to(string(A),write_term(X,[numbervars(true),variable_names(Vs),character_escapes(true),ignore_ops(true),quoted(true)])))),
  495   mustvv(atom_to_term(A,Y,NewVs)),
  496   (NewVs==[]-> YO=X ; (length(TV,TVL),length(NewVs,NewVarsL),(NewVarsL==TVL-> (YO=X) ; (dtrace,add_newvars(NewVs),Y=X)))).
  497
  498
  499:- export(unnumbervars_and_save/2).
  500unnumbervars_and_save(X,YY):-
  501   lbl_vars(_,_,X,[],Y,Vs),
  502    (Vs==[]->mustvv(X=YY);
  503    ( % writeq((lbl_vars(N,NN,X,Y,Vs))),nl,
  504     save_clause_vars(Y,Vs),mustvv(Y=YY))).
  505
  506% todo this slows the system!
  507unnumbervars0(X,clause(UH,UB,Ref)):- sanity(nonvar(X)),
  508  X = clause(H,B,Ref),!,
  509  mustvv(unnumbervars0((H:-B),(UH:-UB))),!.
  510
  511unnumbervars0(X,YY):-lbl_vars(N,NN,X,YY,_Vs).
  512
  513lbl_vars(N,NN,X,YY):-
  514   must_det_l((with_output_to(string(A),write_term(X,[snumbervars(true),character_escapes(true),ignore_ops(true),quoted(true)])),
  515   atom_to_term(A,Y,_NewVars),!,mustvv(YY=Y))),check_varnames(YY).
  516lbl_vars(N,NN,X,YY,Vs):-!,lbl_vars(N,NN,X,[],YY,Vs).
  517
  518lbl_vars(S1,S1,A,OVs,A,OVs):- atomic(A),!.
  519lbl_vars(S1,S1,Var,IVs,Var,OVs):- attvar(Var),get_attr(Var,logicmoo_varnames,Nm), (memberchk(Nm=PreV,IVs)->(OVs=IVs,mustvv(PreV==Var));OVs=[Nm=Var|IVs]).
  520lbl_vars(S1,S2,Var,IVs,Var,OVs):- var(Var),!,(\+number(S1)->true;(((member(Nm=PreV,IVs),Var==PreV)->(OVs=IVs,put_attr(Var,logicmoo_varnames,Nm));
  521  (format(atom(Nm),'~q',['$VAR'(S1)]),S2 is S1+1,(memberchk(Nm=Var,IVs)->OVs=IVs;OVs=[Nm=Var|IVs]))))).
  522
  523lbl_vars(S1,S1,NC,OVs,NC,OVs):- ( \+ compound(NC)),!.
  524lbl_vars(S1,S1,'$VAR'(Nm),IVs,PreV,OVs):-  atom(Nm), !, must(memberchk(Nm=PreV,IVs)->OVs=IVs;OVs=[Nm=PreV|IVs]).
  525lbl_vars(S1,S1,'$VAR'(N0),IVs,PreV,OVs):- (number(N0)->format(atom(Nm),'~q',['$VAR'(N0)]);Nm=N0), (memberchk(Nm=PreV,IVs)->OVs=IVs;OVs=[Nm=PreV|IVs]).
  526lbl_vars(S1,S3,[X|XM],IVs,[Y|YM],OVs):-!,lbl_vars(S1,S2,X,IVs,Y,VsM),lbl_vars(S2,S3,XM,VsM,YM,OVs).
  527lbl_vars(S1,S2,XXM,VsM,YYM,OVs):- XXM=..[F|XM],lbl_vars(S1,S2,XM,VsM,YM,OVs),!,YYM=..[F|YM].
  528
  529*/
  530
  531/*
  532lbl_vars(N,NN,X,YY,Vs):-
  533 must_det_l((
  534   with_output_to(codes(A),write_term(X,[numbervars(true),character_escapes(true),ignore_ops(true),quoted(true)])),   
  535   read_term_from_codes(A,Y,[variable_names(Vs),character_escapes(true),ignore_ops(true)]),!,mustvv(YY=Y),check_varnames(YY))).
  536
  537
  538
  539
  540unnumbervars_and_copy(X,YO):-
  541 term_variables(X,TV),
  542 mustvv((source_variables(Vs),
  543   with_output_to(string(A),write_term(X,[numbervars(true),variable_names(Vs),character_escapes(true),ignore_ops(true),quoted(true)])))),
  544   mustvv(atom_to_term(A,Y,NewVs)),
  545   (NewVs==[]-> YO=X ; (length(TV,TVL),length(NewVs,NewVarsL),(NewVarsL==TVL-> (YO=X) ; (dtrace,add_newvars(NewVs),Y=X)))).
  546*/
  547
  548%add_newvars(_):-!.
  549
  550%= 	 	 
 add_newvars(:TermVs) is semidet
Add Newvars.
  556add_newvars(Vs):- (var(Vs);Vs=[]),!.
  557add_newvars([N=V|Vs]):- add_newvar(N,V), (var(V)->put_attr(V,vn,N);true), !,add_newvars(Vs).
  558
  559
  560
  561%= 	 	 
 add_newvar(?VALUE1, ?V) is semidet
Add Newvar.
  567add_newvar(_,V):-nonvar(V),!.
  568add_newvar(N,_):-var(N),!.
  569add_newvar('A',_):-!.
  570add_newvar('B',_):-!.
  571add_newvar(N,_):- atom(N),atom_concat('_',_,N),!.
  572add_newvar(N,V):- 
  573  (get_varname_list(V0s)->true;V0s=[]),
  574  remove_grounds(V0s,Vs),
  575 once((member(NN=Was,Vs),N==NN,var(Was),var(V),(Was=V))-> (V0s==Vs->true;set_varname_list(Vs)); set_varname_list([N=V|Vs])).
  576
  577
  578%= 	 	 
 remove_grounds(:TermVs, :TermVs) is semidet
Remove Grounds.
  584remove_grounds(Vs,Vs):-var(Vs),!.
  585remove_grounds([],[]):-!.
  586remove_grounds([N=V|NewCNamedVarsS],NewCNamedVarsSG):-
  587   (N==V;ground(V)),remove_grounds(NewCNamedVarsS,NewCNamedVarsSG).
  588remove_grounds([N=V|V0s],[N=NV|Vs]):-
  589   (var(V) -> NV=V ; NV=_ ),
  590   remove_grounds(V0s,Vs).
  591
  592% renumbervars_prev(X,X):-ground(X),!.
  593
  594%= 	 	 
 renumbervars_prev(?X, ?Y) is semidet
Renumbervars Prev.
  600renumbervars_prev(X,Y):-renumbervars1(X,[],Y,_),!.
  601renumbervars_prev(X,Z):-unnumbervars(X,Y),safe_numbervars(Y,Z),!.
  602renumbervars_prev(Y,Z):-safe_numbervars(Y,Z),!.
  603
  604
  605
  606%= 	 	 
 renumbervars1(?X, ?Y) is semidet
Renumbervars Secondary Helper.
  612renumbervars1(X,Y):-renumbervars1(X,[],Y,_).
  613
  614
  615%= 	 	 
 renumbervars1(:TermV, ?IVs, :TermX, ?Vs) is semidet
Renumbervars Secondary Helper.
  621renumbervars1(V,IVs,'$VAR'(X),Vs):- var(V), sformat(atom(X),'~w_RNV',[V]), !, (memberchk(X=V,IVs)->Vs=IVs;Vs=[X=V|IVs]).
  622renumbervars1(X,Vs,X,Vs):- ( \+ compound(X)),!.
  623renumbervars1('$VAR'(V),IVs,Y,Vs):- sformat(atom(X),'~w_VAR',[V]), !, (memberchk(X=Y,IVs)->Vs=IVs;Vs=[X=Y|IVs]).
  624renumbervars1([X|XM],IVs,[Y|YM],Vs):-!,
  625  renumbervars1(X,IVs,Y,VsM),
  626  renumbervars1(XM,VsM,YM,Vs).
  627renumbervars1(XXM,IVs,YYM,Vs):-
  628  univ_safe_2(XXM,[F,X|XM]),
  629  renumbervars1(X,IVs,Y,VsM),
  630  renumbervars1(XM,VsM,YM,Vs),
  631  univ_safe_2(YYM,[F,Y|YM]).
  632
  633
  634
  635  
  636% ========================================================================================
  637% safe_numbervars/1 (just simpler safe_numbervars.. will use a random start point so if a partially numbered getPrologVars wont get dup getPrologVars)
  638% Each prolog has a specific way it could unnumber the result of a safe_numbervars
  639% ========================================================================================
  640% 7676767
  641
  642%= 	 	 
 safe_numbervars(?E, ?EE) is semidet
Safely Paying Attention To Corner Cases Numbervars.
  648safe_numbervars(E,EE):-duplicate_term(E,EE),
  649  get_gtime(G),numbervars(EE,G,End,[attvar(skip),functor_name('$VAR'),singletons(true)]),
  650  term_variables(EE,AttVars),
  651  numbervars(EE,End,_,[attvar(skip),functor_name('$VAR'),singletons(true)]),
  652  forall(member(V,AttVars),(copy_term(V,VC,Gs),V='$VAR'(VC=Gs))),check_varnames(EE).
  653
  654
  655%= 	 	 
 get_gtime(?GG) is semidet
Get Gtime.
  661get_gtime(GG):- get_time(T),convert_time(T,_A,_B,_C,_D,_E,_F,G),GG is (floor(G) rem 500).
  662
  663
  664%= 	 	 
 safe_numbervars(?EE) is semidet
Safely Paying Attention To Corner Cases Numbervars.
  670safe_numbervars(EE):-get_gtime(G),numbervars(EE,G,_End,[attvar(skip),functor_name('$VAR'),singletons(true)]),check_varnames(EE).
  671
  672
  673
  674
  675% register_var(?, ?, ?)
  676%
  677%   During copying one has to remeber copies of variables which can be used further during copying.
  678%   Therefore the register of variable copies is maintained.
  679%
  680
  681%= 	 	 
 register_var(:TermN, ?IN, ?OUT) is semidet
Register Variable.
  687register_var(N=V,IN,OUT):- (var(N)->true;register_var(N,IN,V,OUT)),!.
  688
  689
  690%= 	 	 
 register_var(?N, ?T, ?V, ?OUTO) is semidet
Register Variable.
  696register_var(N,T,V,OUTO):-register_var_0(N,T,V,OUT),mustvv(OUT=OUTO),!.
  697register_var(N,T,V,O):-append(T,[N=V],O),!.
  698
  699
  700%= 	 	 
 register_var_0(?N, ?T, ?V, ?OUT) is semidet
register Variable Primary Helper.
  706register_var_0(N,T,V,OUT):- atom(N),is_list(T),member(NI=VI,T),atom(NI),N=NI,V=@=VI,samify(V,VI),!,OUT=T.
  707register_var_0(N,T,V,OUT):- atom(N),is_list(T),member(NI=VI,T),atom(NI),N=NI,V=VI,!,OUT=T.
  708
  709register_var_0(N,T,V,OUT):- mustvv(nonvar(N)),
  710   ((name_to_var(N,T,VOther)-> mustvv((OUT=T,samify(V,VOther)));
  711     ((get_varname_list(Before)->true;Before=[]),
  712      (name_to_var(N,Before,VOther)  -> mustvv((samify(V,VOther),OUT= [N=V|T]));
  713         (var_to_name(V,T,_OtherName)                  -> OUT= [N=V|T];
  714           (var_to_name(V,Before,_OtherName)              -> OUT= [N=V|T];fail)))))),!.
  715
  716
  717register_var_0(N,T,V,OUT):- var(N),
  718   (var_to_name(V,T,N)                -> OUT=T;
  719     ((get_varname_list(Before)->true;Before=[]),
  720          (var_to_name(V,Before,N)   -> OUT= [N=V|T];
  721               OUT= [N=V|T]))),!.
  722
  723
  724
  725
  726
  727% different variables (now merged)
  728
  729%= 	 	 
 samify(?V, ?V0) is semidet
Samify.
  735samify(V,V0):-var(V),var(V0),!,mustvv(V=V0).
  736samify(V,V0):-mustvv(V=@=V0),V=V0. 
  737
  738
  739%= 	 	 
 var_to_name(?V, :TermN, ?N) is semidet
Variable Converted To Name.
  745var_to_name(V,[N=V0|T],N):-
  746    V==V0 -> true ;          % same variables
  747    var_to_name(V,T,N).
  748
  749
  750%= 	 	 
 name_to_var(?N, :TermT, ?V) is semidet
Name Converted To Variable.
  756name_to_var(N,T,V):- var(N),!,var_to_name(N,T,V).
  757name_to_var(N,[N0=V0|T],V):- 
  758   N0==N -> samify(V,V0) ; name_to_var(N,T,V).
  759
  760
  761/*
  762% ===================================================================
  763% Safely number vars
  764% ===================================================================
  765bugger_numbervars_with_names(Term):-
  766   term_variables(Term,Vars),bugger_name_variables(Vars),!,snumbervars(Vars,91,_,[attvar(skip),singletons(true)]),!,
  767
  768bugger_name_variables([]).
  769bugger_name_variables([Var|Vars]):-
  770   (var_property(Var, name(Name)) -> Var = '$VAR'(Name) ; true),
  771   bugger_name_variables(Vars).
  772
  773*/
  774:- export(snumbervars/1).  775
  776%= 	 	 
 snumbervars(?Term) is semidet
Snumbervars.
  782snumbervars(Term):-snumbervars(Term,0,_).
  783
  784:- export(snumbervars/3).  785
  786%= 	 	 
 snumbervars(?Term, ?Start, ?End) is semidet
Snumbervars.
  792snumbervars(Term,Start,End):- integer(Start),var(End),!,snumbervars(Term,Start,End,[]).
  793snumbervars(Term,Start,List):- integer(Start),is_list(List),!,snumbervars(Term,Start,_,List).
  794snumbervars(Term,Functor,Start):- integer(Start),atom(Functor),!,snumbervars(Term,Start,_End,[functor_name(Functor)]).
  795snumbervars(Term,Functor,List):- is_list(List),atom(Functor),!,snumbervars(Term,0,_End,[functor_name(Functor)]).
  796
  797
  798:- export(snumbervars/4).  799
  800%= 	 	 
 snumbervars(?Term, ?Start, ?End, ?List) is semidet
Snumbervars.
  806snumbervars(Term,Start,End,List):-numbervars(Term,Start,End,List).
  807
  808
  809
  810
  811
  812
  813
  814
  815%= 	 	 
 module_predicate(?ModuleName, ?P, ?F, ?A) is semidet
Module Predicate.
  821module_predicate(ModuleName,P,F,A):-current_predicate(ModuleName:F/A),functor_catch(P,F,A), not((( predicate_property(ModuleName:P,imported_from(IM)),IM\==ModuleName ))).
  822
  823
  824:- export((user_ensure_loaded/1)).  825:- module_transparent user_ensure_loaded/1.  826
  827%= 	 	 
 user_ensure_loaded(?What) is semidet
User Ensure Loaded.
  833user_ensure_loaded(What):- !, '@'(ensure_loaded(What),'user').
  834
  835:- module_transparent user_use_module/1.  836% user_ensure_loaded(logicmoo(What)):- !, '@'(ensure_loaded(logicmoo(What)),'user').
  837% user_use_module(library(What)):- !, use_module(library(What)).
  838
  839%= 	 	 
 user_use_module(?What) is semidet
User Use Module.
  845user_use_module(What):- '@'(use_module(What),'user').
  846
  847
  848
  849
  850
  851%= 	 	 
 export_all_preds is semidet
Export All Predicates.
  857export_all_preds:-source_location(File,_Line),module_property(M,file(File)),!,export_all_preds(M).
  858
  859
  860%= 	 	 
 export_all_preds(?ModuleName) is semidet
Export All Predicates.
  866export_all_preds(ModuleName):-forall(current_predicate(ModuleName:F/A),
  867                   ((export(F/A),functor_safe(P,F,A),mpred_trace_nochilds(ModuleName:P)))).
  868
  869
  870
  871
  872
  873
  874
  875%= 	 	 
 module_predicate(?ModuleName, ?F, ?A) is semidet
Module Predicate.
  881module_predicate(ModuleName,F,A):-current_predicate(ModuleName:F/A),functor_safe(P,F,A),
  882   \+ ((( predicate_property(ModuleName:P,imported_from(IM)),IM\==ModuleName ))).
  883
  884:- module_transparent(module_predicates_are_exported/0).  885:- module_transparent(module_predicates_are_exported/1).  886:- module_transparent(module_predicates_are_exported0/1).  887
  888
  889%= 	 	 
 module_predicates_are_exported is semidet
Module Predicates Are Exported.
  895module_predicates_are_exported:- source_context_module(CM),module_predicates_are_exported(CM).
  896
  897
  898%= 	 	  
 module_predicates_are_exported(?Ctx) is semidet
Module Predicates Are Exported.
  904module_predicates_are_exported(user):-!,source_context_module(CM),module_predicates_are_exported0(CM).
  905module_predicates_are_exported(Ctx):- module_predicates_are_exported0(Ctx).
  906
  907
  908%= 	 	 
 module_predicates_are_exported0(?ModuleName) is semidet
Module Predicates Are Exported Primary Helper.
  914module_predicates_are_exported0(user):- !. % dmsg(warn(module_predicates_are_exported(user))).
  915module_predicates_are_exported0(ModuleName):-
  916   module_property(ModuleName, exports(List)),
  917    findall(F/A,
  918    (module_predicate(ModuleName,F,A),
  919      not(member(F/A,List))), Private),
  920   module_predicates_are_not_exported_list(ModuleName,Private).
  921
  922:- export(export_if_noconflict_mfa/2).  923:- export(export_if_noconflict_mfa/3).  924:- module_transparent(export_if_noconflict_mfa/2).  925:- module_transparent(export_if_noconflict_mfa/3).  926
  927%= 	 	 
 export_if_noconflict(?M, :TermF) is semidet
Export If Noconflict.

:- redefine_system_predicate(system:export_if_noconflict/2),abolish(system:export_if_noconflict/2).

  934:- module_transparent(export_if_noconflict/2).  935:- export(export_if_noconflict/2).  936export_if_noconflict(M,FA):- export_if_noconflict_mfa(M,FA).
  937:- system:import(export_if_noconflict/2).  938
  939:- module_transparent(export_if_noconflict_mfa/2).  940export_if_noconflict_mfa(SM,Var):- var(Var),throw(var(export_if_noconflict_mfa(SM,Var))).
  941export_if_noconflict_mfa(_,  M:FA):-!,export_if_noconflict_mfa(M,FA).
  942export_if_noconflict_mfa(SM,(A,B)):-!,export_if_noconflict_mfa(SM,A),export_if_noconflict_mfa(SM,B).
  943export_if_noconflict_mfa(SM,[A]):-  !,export_if_noconflict_mfa(SM,A).
  944export_if_noconflict_mfa(SM,[A|B]):-!,export_if_noconflict_mfa(SM,A),export_if_noconflict_mfa(SM,B).
  945export_if_noconflict_mfa(SM,F/A):- !,export_if_noconflict_mfa(SM,F,A).
  946export_if_noconflict_mfa(SM,F//A):- A2 is A + 2, !,export_if_noconflict_mfa(SM,F,A2).
  947export_if_noconflict_mfa(_,SM:F//A):- A2 is A + 2, !,export_if_noconflict_mfa(SM,F,A2).
  948export_if_noconflict_mfa(SM,P):-functor(P,F,A),export_if_noconflict_mfa(SM,F,A).
  949
  950:- module_transparent(export_if_noconflict_mfa/3).  951export_if_noconflict_mfa(M,F,A):- functor(P,F,A),
  952   predicate_property(M:P,imported_from(Other)),
  953   (Other==system->unlock_predicate(Other:P);true),
  954   Other:export(Other:F/A),
  955   (Other==system->lock_predicate(Other:P);true),
  956   M:import(Other:F/A),!,
  957   M:export(Other:F/A), writeln(rexporting(M=Other:F/A)).
  958export_if_noconflict_mfa(M,F,A):- 
  959  functor(P,F,A),
  960 findall(import(Real:F/A),
  961  (current_module(M2),module_property(M2,exports(X)),member(F/A,X),
  962    (predicate_property(M2:P,imported_from(Real))->true;Real=M2),
  963    Real\=M,
  964    writeln(should_be_skipping_export(M:Real=M2:F/A)),
  965    Real:export(Real:F/A),
  966    Real\==M),List),
  967 (List==[]->(M:export(M:F/A));
  968  (maplist(call,List)),(M:export(M:F/A))).
  969/*
  970export_if_noconflict_mfa(M,F,A):- current_module(M2),M2\=M,module_property(M2,exports(X)),
  971   member(F/A,X),ddmsg(skipping_export(M2=M:F/A)),!,
  972   must(M:export(M:F/A)),
  973   ((M2==system;M==baseKB)->true;must(M2:import(M:F/A))).
  974export_if_noconflict_mfa(M,F,A):-M:export(F/A).
  975*/
  976% module_predicates_are_not_exported_list(ModuleName,Private):- once((length(Private,Len),dmsg(module_predicates_are_not_exported_list(ModuleName,Len)))),fail.
  977
  978%= 	 	 
 module_predicates_are_not_exported_list(?ModuleName, ?Private) is semidet
Module Predicates Are Not Exported List.
  984module_predicates_are_not_exported_list(ModuleName,Private):- forall(member(F/A,Private),export_if_noconflict(ModuleName,F/A)).
  985
  986
  987
  988
  989
  990
  991%= 	 	 
 arg_is_transparent(:GoalArg) is semidet
Argument If Is A Transparent.
  997arg_is_transparent(Arg):- member(Arg,[':','^']).
  998arg_is_transparent(0).
  999arg_is_transparent(Arg):- number(Arg).
 1000
 1001% make meta_predicate's module_transparent
 1002
 1003%= 	 	 
 module_meta_predicates_are_transparent(?ModuleName) is semidet
Module Meta Predicates Are Transparent.
 1009module_meta_predicates_are_transparent(_):-!.
 1010module_meta_predicates_are_transparent(ModuleName):-
 1011    forall((module_predicate(ModuleName,F,A),functor_safe(P,F,A)),
 1012      ignore(((predicate_property(ModuleName:P,(meta_predicate( P ))),
 1013            not(predicate_property(ModuleName:P,(transparent))), (compound(P),arg(_,P,Arg),arg_is_transparent(Arg))),
 1014                   (nop(dmsg(todo(module_transparent(ModuleName:F/A)))),
 1015                   (module_transparent(ModuleName:F/A)))))).
 1016
 1017:- export(all_module_predicates_are_transparent/1). 1018% all_module_predicates_are_transparent(_):-!.
 1019
 1020%= 	 	 
 all_module_predicates_are_transparent(?ModuleName) is semidet
All Module Predicates Are Transparent.
 1026all_module_predicates_are_transparent(ModuleName):-
 1027    forall((module_predicate(ModuleName,F,A),functor_safe(P,F,A)),
 1028      ignore((
 1029            not(predicate_property(ModuleName:P,(transparent))),
 1030                   ( nop(dmsg(todo(module_transparent(ModuleName:F/A))))),
 1031                   (module_transparent(ModuleName:F/A))))).
 1032
 1033
 1034%= 	 	 
 quiet_all_module_predicates_are_transparent(?ModuleName) is semidet
Quiet All Module Predicates Are Transparent.
 1040quiet_all_module_predicates_are_transparent(_):-!.
 1041quiet_all_module_predicates_are_transparent(ModuleName):-
 1042    forall((module_predicate(ModuleName,F,A),functor_safe(P,F,A)),
 1043      ignore((
 1044            not(predicate_property(ModuleName:P,(transparent))),
 1045                   nop(dmsg(todo(module_transparent(ModuleName:F/A)))),
 1046                   (module_transparent(ModuleName:F/A))))).
 1047
 1048
 1049:- multifile(user:term_expansion/2). 1050:- dynamic(user:term_expansion/2). 1051:- module_transparent(user:term_expansion/2). 1052% user:term_expansion( (:-export(FA) ),(:- export_if_noconflict(M,FA))):-  current_prolog_flag(subclause_expansion,true),prolog_load_context(module,M).
 1053
 1054
 1055:- ignore((source_location(S,_),prolog_load_context(module,M),module_property(M,class(library)),
 1056 forall(source_file(M:H,S),
 1057 ignore((functor(H,F,A),
 1058  ignore(((\+ atom_concat('$',_,F),(export(F/A) , current_predicate(system:F/A)->true; system:import(M:F/A))))),
 1059  ignore(((\+ predicate_property(M:H,transparent), module_transparent(M:F/A), \+ atom_concat('__aux',_,F),debug(modules,'~N:- module_transparent((~q)/~q).~n',[F,A]))))))))).