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( ), 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( ), 110 on_xf_cont( ), 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%=
192alldiscontiguous:-!. 193 194 195%=
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).
216on_x_fail(Goal):- catchv(Goal,_,fail). 217 218 219%================================================================ 220% pred tracing 221%================================================================ 222 223% = :- meta_predicate('match_predicates'(:,-)). 224 225 226%=
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%=
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%=
258if_may_hide(G):-. 259 260:- meta_predicate with_unlocked_pred( , ). 261 262%=
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) -> ; 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%=
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%=
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%=
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).
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%=
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).
360oncely_clean(Goal):- 361 '$sig_atomic'((Goal,assertion(deterministic(true)))) 362 ->true; 363 throw(failed_oncely_clean(Goal)). 364 365 366 367%=
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( ). 380 381%=
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).
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%=
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 , 443 (notrace(DET == true) -> ! ; (true;(,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%=
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*/
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%=
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%=
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%=
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%=
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%=
612renumbervars1(X,Y):-renumbervars1(X,[],Y,_). 613 614 615%=
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%=
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%=
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%=
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%=
687register_var(N=V,IN,OUT):- (var(N)->true;register_var(N,IN,V,OUT)),!. 688 689 690%=
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%=
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%=
735samify(V,V0):-var(V),var(V0),!,mustvv(V=V0). 736samify(V,V0):-mustvv(V=@=V0),V=V0. 737 738 739%=
745var_to_name(V,[N=V0|T],N):- 746 V==V0 -> true ; % same variables 747 var_to_name(V,T,N). 748 749 750%=
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%=
782snumbervars(Term):-snumbervars(Term,0,_). 783 784:- export(snumbervars/3). 785 786%=
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%=
806snumbervars(Term,Start,End,List):-numbervars(Term,Start,End,List). 807 808 809 810 811 812 813 814 815%=
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%=
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%=
845user_use_module(What):- '@'(use_module(What),'user'). 846 847 848 849 850 851%=
857export_all_preds:-source_location(File,_Line),module_property(M,file(File)),!,export_all_preds(M). 858 859 860%=
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%=
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%=
895module_predicates_are_exported:- source_context_module(CM),module_predicates_are_exported(CM). 896 897 898%=
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%=
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%=
:- 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%=
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%=
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%=
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%=
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%=
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]))))))))).