1/* Logicmoo Debug Tools 2% =================================================================== 3% File 'listing_vars.pl' 4% Purpose: An Implementation in SWI-Prolog of certain debugging tools 5% Maintainer: Douglas Miles 6% Contact: $Author: dmiles $@users.sourceforge.net ; 7% Version: 'listing_vars.pl' 1.0.0 8% Revision: $Revision: 1.1 $ 9% Revised At: $Date: 2002/07/11 21:57:28 $ 10% =================================================================== 11*/ 12% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/listing_vars.pl 13:- module(listing_vars, 14 [ ain00/1, 15 contains_ftVar/1, 16 count_members_eq/3, 17 all_different_vars/1, 18 all_different_vals/1, 19 all_different_vals/2, 20 all_disjoint_in_sets/3, 21 del_each_attr/2, 22 get_random_headvars/1, 23 get_random_headvars/4, 24 get_1head_arg_var/5, 25 term_slots/2, 26 never_bound/1, 27 dif_matrix/2, 28 term_singletons/2, 29 term_singletons/3, 30 term_singletons/5, 31 set_varname/2, 32 set_varname/3, 33 write_functor/2, 34 atom_subst_frak_0/4, 35 arg_varname/3, 36 variable_name_or_ref/2, 37 renumbervars/3, 38 b_implode_varnames/1, 39 b_implode_varnames0/1, 40 bad_varnamez/1, 41 call_not_not/1, 42 call_return_tf/2, 43 check_varnames/1, 44 clause_ref_file/2, 45 clause_ref_vars/2, 46 contains_badvarnames/1, 47 contains_dvar/1, 48 contains_singletons/1, 49 del_attr_type/2, 50 copy_term_and_varnames/2, 51 mpred_numbervars_with_names/1, 52 ensure_vars_labled/2, 53 ensure_vars_labled_r/2, 54 fix_varcase_name/2, 55 get_clause_vars/1, 56 get_clause_vars/2, 57 get_clause_vars_copy/2, 58 get_clause_vars_hb_int/2, 59 imploded_copyvars/2, 60 locate_clause_ref/5, 61 not_member_eq_local/2, 62 listing_vars_file/0, 63 make_subterm_path/3, 64 maybe_record_scanned_file/0, 65 66 without_varname_scan/1, 67 68 no_varnaming/1, 69 no_vars_needed/1, 70 71 print_numbervars_maybe/1, 72 print_numbervars/1, 73 scan_for_varnames0/0, 74 que_read_source_file_vars/1, 75 read_source_file_vars/1, 76 read_source_file_vars_1/1, 77 read_source_vars/2, 78 replace_in_string_frak_0/4, 79 save_clause_vars/2, 80 save_clause_vars/3, 81 save_clause_vars/6, 82 save_file_source_vars/3, 83 save_to_clause_ref/3, 84 scan_for_varnames/0, 85 dcall_if_verbose/1, 86 dcall_when/3, 87 snumbervars4/4, 88 snumbervars5/4, 89 subterm_path/3, 90 term_expansion_save_vars/1, 91 try_get_body_vars/1, 92 try_get_head_vars/1, 93 try_get_inner_vars/1, 94 set_varname/2, 95 try_save_vars/1, 96 97 v_dif_rest/2, 98 vmust/1, 99 name_variable/2, variable_name/2, 100 init_varname_stores/1, 101 maybe_scan_for_varnames/0 102 103 ]).
109:- multifile 110 prolog:make_hook/2. 111:- meta_predicate 112 ain00( ), 113 call_not_not( ), 114 call_return_tf( , ), 115 contains_singletons( ), 116 get_clause_vars( ), 117 get_clause_vars( , ), 118 no_varnaming( ), 119 without_varname_scan( ), 120 dcall_when( , , ), 121 snumbervars4( , , , ), 122 snumbervars5( , , , ), 123 try_save_vars( ), 124 all_different_vals( , ), 125 all_disjoint_in_sets( , , ), 126 init_varname_stores( ), 127 vmust( ). 128 129:- module_transparent(( 130 all_different_vals/1, 131 all_different_vals/2, 132 set_varname/2, 133 set_varname/3, 134 atom_subst_frak_0/4, 135 b_implode_varnames/1, 136 b_implode_varnames0/1, 137 bad_varnamez/1, 138 call_not_not/1, 139 call_return_tf/2, 140 check_varnames/1, 141 clause_ref_file/2, 142 clause_ref_vars/2, 143 contains_badvarnames/1, 144 contains_singletons/1, 145 del_attr_type/2, 146 ensure_vars_labled/2, 147 ensure_vars_labled_r/2, 148 fix_varcase_name/2, 149 get_clause_vars/1, 150 get_clause_vars/2, 151 get_clause_vars_copy/2, 152 get_clause_vars_hb_int/2, 153 imploded_copyvars/2, 154 locate_clause_ref/5, 155 156 listing_vars_file/0, 157 make_subterm_path/3, 158 maybe_record_scanned_file/0, 159 no_varnaming/1, 160 without_varname_scan/1, 161 no_vars_needed/1, 162 163 print_numbervars_maybe/1, 164 print_numbervars/1, 165 read_source_file_vars/1, 166 read_source_file_vars_1/1, 167 read_source_vars/2, 168 replace_in_string_frak_0/4, 169 save_clause_vars/2, 170 save_clause_vars/3, 171 save_clause_vars/6, 172 save_file_source_vars/3, 173 save_to_clause_ref/3, 174 scan_for_varnames/0, 175 dcall_if_verbose/1, 176 dcall_when/3, 177 snumbervars4/4, 178 snumbervars5/4, 179 subterm_path/3, 180 term_expansion_save_vars/1, 181 try_get_body_vars/1, 182 try_get_head_vars/1, 183 try_get_inner_vars/1, 184 set_varname/2, 185 try_save_vars/1, 186 187 v_dif_rest/2, 188 % name_variable/2, variable_name/2, 189 vmust/1, 190 init_varname_stores/1 191 )). 192:- meta_predicate dcall_if_verbose( ). 193 194:- reexport(library(lockable_vars)).
203name_variable(Var,_Name) :- nonvar(Var),!. 204name_variable(Var,Name) :- !, put_attr(Var,vn,Name). 205 206 207name_variable(Var, Name1) :- get_attr(Var,vn,Name2), 208 combine_names(Name1,Name2,Name), 209 put_attr(Var, vn, Name). % add_var_to_env(Name,Var),!. 210name_variable(Var, Name) :- var(Var), !, 211 put_attr(Var, vn, Name). 212 213name_variable('$VAR'(Var), Name):- Name==Var, !. 214name_variable('$VAR'(Var), Name):- var(Var),Name=Var,!. 215% name_variable('$VAR'(Var), Name) :- trace_or_throw(numbervars_name_variable(Var, Name)),!. 216name_variable(_, _). 217 218:- nodebug(logicmoo(varnames)).
226variable_name(Var, Name) :- must(var(Var)),(get_attr(Var, vn, Name);var_property(Var,name(Name));get_attr(Var, varnames, Name)),!. 227 228variable_name_or_ref(Var, Name) :- var(Var), variable_name(Var, Name),!. 229variable_name_or_ref(Var, Name) :- format(atom(Name),'~q',[Var]).
236vnproject_attributes(QueryVars, ResidualVars):-nop(dmsg(vn:proj_attrs(vn,QueryVars, ResidualVars))).
245vnattribute_goals(Var, B, B) :- cyclic_term(Var),!. 246vnattribute_goals(Var, [name_variable(Var, Name)|B], B) :- get_attr(Var, vn, Name),!. 247vnattribute_goals(_Var, B, B):-!. 248vnattribute_goals(Var, [name_variable(Var, Name)|B], B) :- variable_name(Var, Name). 249% vn:attribute_goals(_Var) --> []. 250 251 252%:- public ((attr_unify_hook/2,attr_portray_hook/2)). 253% :- public portray_attvar/1. 254% :- export(portray_attvar/1). 255%:- export(attr_unify_hook/2). 256%:- export(attr_portray_hook/2). 257%:- export(attribute_goals/3). 258 259 260:- thread_local(t_l:no_kif_var_coroutines/1).
267vnattr_unify_hook(_, Var):- nonvar(Var),!. 268vnattr_unify_hook(_, Var):- cyclic_term(Var),!,fail. 269vnattr_unify_hook(_, Var):- cyclic_term(Var),!. 270% vn:attr_unify_hook(_, Var):- cyclic_break(Var),!,fail. 271vnattr_unify_hook(Name1, Var):- get_attr(Var, vn, Name2),Name1==Name2,!. 272vnattr_unify_hook(Name1, Var):- get_attr(Var, vn, Name2),!,ignore(Name1==Name2),!. 273 274 275vnattr_unify_hook(Name1, Var):- get_attr(Var, vn, Name2),!,combine_names(Name1,Name2,Name),(Name2==Name->true;put_attr(Var,vn,Name)). 276vnattr_unify_hook(Name1, Var):- var(Var),!,put_attr(Var, vn, Name1). 277vnattr_unify_hook(_Form, _OtherValue):- t_l:no_kif_var_coroutines(G),!,call(G). 278vnattr_unify_hook(_Form, _OtherValue):-!. 279 280combine_names(Name1,Name2,Name1):-Name1==Name2,!. 281combine_names(Name1,Name2,Name):- 282 ((atom_concat(_,Name1,Name2);atom_concat(Name1,_,Name2)) -> Name=Name2 ; ( 283 ((atom_concat(Name2,_,Name1);atom_concat(_,Name2,Name1)) -> Name=Name1 ; ( 284 (atomic_list_concat([Name2,'_',Name1],Name)))))). 285 286 287 288%=
294vnattr_portray_hook(Name, _) :- write('???'), write(Name),!. 295 296 297/* 298%% portray_attvar( ?Var) is semidet. 299% 300% Hook To [portray_attvar/1] For Module Logicmoo_varnames. 301% Portray Attribute Variable. 302% 303portray_attvar(Var) :- 304 write('{<'), 305 ((get_attr(Var,vn, VarName))->true;sformat(VarName,'~q',[Var])), 306 get_attrs(Var, Attr), 307 catch(writeq('??'(VarName,Attr)),_,'$attvar':portray_attrs(Attr, Var)), 308 write('>}'). 309*/ 310 311 312 313:- set_module(class(library)). 314 315:- use_module(library(when)). 316 317:- prolog_clause:multifile(( 318 unify_goal/5, % +Read, +Decomp, +M, +Pos, -Pos 319 unify_clause_hook/5, 320 make_varnames_hook/5, 321 open_source/2)). % +Input, -Stream 322 323:- predicate_options(prolog_clause:clause_info/5, 5, 324 [ variable_names(-list) 325 ]). 326 327:- use_module(library(prolog_source)). 328:- use_module(library(prolog_clause)). % read_term_at_line/6 329 330 331:- meta_predicate vmust( ). 332 333%=
339vmust(G):-!,call(G). 340vmust(G):-must(G). 341 342 343%=
349dcall_when(P,In,Out):- must(call(P,In,Out)),ignore((In\=@=Out,dmsg((dcall_when(P) :- (In,Out))))). 350 351:- create_prolog_flag(source_variables, false, [type(boolean)]). 352:- thread_local(t_l:dont_varname/0). 353:- thread_local(t_l:dont_varname_te/0). 354:- thread_local(t_l:try_varname_clause_next/1). 355 356 357%=
364no_varnaming(G):-locally(t_l:dont_varname,G). 365 366 367%=
373all_different_vals(Term):-all_different_vals(dif_matrix,Term).
380all_different_vars(_):- t_l:dont_varname,!. 381all_different_vars(A):-(notrace((all_disjoint_in_sets(dif_matrix,A,A)))),!. 382all_different_vars(A):-must(notrace((all_disjoint_in_sets(dif_matrix,A,A)))),!. 383all_different_vars(A):-all_different_vals(v_dif_rest,A),!.
391all_different_vals(Pred,Term):-
392 must(notrace(( (is_list(Term)-> Slots = Term ; term_slots(Term,Slots)),!,
393 all_disjoint_in_sets(Pred,Slots,Slots)))).
399all_disjoint_in_sets(_,[],_):-!. 400all_disjoint_in_sets(_,[_],_):-!. 401all_disjoint_in_sets(P,[V|Vs],SET):-delete_eq(SET,V,REST),!,call(P,V,REST),all_disjoint_in_sets(P,Vs,SET).
408v_dif_rest(V,REST):- when('?='(V,_),not_member_eq_local(V,REST)).
414not_member_eq_local(_,[]):-!. 415not_member_eq_local(E,REST):- \+ identical_memberchk(E,REST).
421dif_matrix(List,V):- is_list(List),!,list_to_set(List,SET), maplist(dif_matrix(V),SET). 422dif_matrix(V,List):- is_list(List),!,list_to_set(List,SET), maplist(dif_matrix_hopfully(V),SET). 423dif_matrix(A,B):- dif_matrix_hopfully(A,B). 424dif_matrix_hopfully(A,B):-A==B,!. 425dif_matrix_hopfully(A,B):- dif:dif(A,B),!. 426 427 428%=
434make_subterm_path(Sub,Term,PathO):-vmust(subterm_path(Sub,Term,Path)),!,PathO=Path. 435 436 437%=
443subterm_path(Sub,Term,[]):-Sub==Term,!. 444subterm_path(Sub,Term,[arg(N)|Path]):-compound(Term),!,arg(N,Term,TermE),subterm_path(Sub,TermE,Path),!. 445 446 447%=
453get_clause_vars(CV):- notrace(get_clause_vars_nontraced(CV)). 454:- export(get_clause_vars_nontraced/1). 455 456%=
462get_clause_vars_nontraced(_):- t_l:dont_varname,!. 463get_clause_vars_nontraced(V):- var(V),!. 464get_clause_vars_nontraced('$VAR'(_)):- !. 465get_clause_vars_nontraced(_:V):- var(V),!,ignore((get_varname_list(Vs),member(N=V0,Vs),V0==V,set_varname(write_functor,N,V))). 466get_clause_vars_nontraced(MHB):- term_variables(MHB,Vs),must(get_clause_vars(MHB,Vs)). 467 468:- '$set_predicate_attribute'(get_clause_vars(_), trace, 1). 469:- '$set_predicate_attribute'(get_clause_vars(_), hide_childs, 1). 470 471 472%=
478del_attr_type(Type,Var):-ignore(del_attr(Var,Type)). 479 480 481%=
487get_clause_vars(_,[]):-!. 488get_clause_vars(MHB,[V|Vs]):- all_different_vars([V|Vs]),vmust((get_clause_vars_copy(MHB,WVARS),!, 489 vmust(MHB=WVARS),unlock_vars(MHB),nop(sanity(check_varnames(MHB))))),!, 490 maplist(del_attr_type(vl),[V|Vs]). 491get_clause_vars(MHB,Vs):- vmust((get_clause_vars_copy(MHB,WVARS),!,vmust(MHB=WVARS),unlock_vars(MHB),must(check_varnames(Vs)))),!. 492get_clause_vars(_,_):- !. 493 494 495 496%=
502get_clause_vars_copy(HB,HB):- ground(HB),!. 503% get_clause_vars_copy(HH,HH):- sub_term(S,HH),compound(S),S='$VAR'(_),!. % already labled 504get_clause_vars_copy(H0,MHB):- 505 source_variables_lv(AllS), 506 must((copy_term(H0+AllS,MHB+CAllS), 507 term_slots(MHB,Slots), 508 % all_different_vars(Slots), 509 lock_vars(Slots), 510 as_clause_no_m( MHB, H, B), 511 must_maplist(set_varname(write_functor),CAllS), 512 get_clause_vars_hb_int(H,B))),!. 513 514get_clause_vars_copy(H0,MHB):- 515 must((copy_term_and_varnames(H0,MHB),lock_vars(MHB),as_clause_no_m( MHB, H, B), 516 get_clause_vars_hb_int(H,B))),!. 517 518 519 520 521%=
527get_clause_vars_hb_int(H,B):- varname_cache:varname_info(H,B,Vs,_),must_maplist(set_varname(write_functor),Vs),!. 528get_clause_vars_hb_int(H,B):- call_return_tf(try_get_body_vars(B),_TF1),call_return_tf(try_get_head_vars(H),_TF2),!. 529 530 531 532%=
538atom_subst_frak_0(A,F,R,K):-replace_in_string_frak_0(F,R,A,K),!. 539 540%=
546replace_in_string_frak_0(F,R,A,K):-atom(A),!,atom_string(A,S),replace_in_string_frak_0(F,R,S,C),atom_string(K,C). 547replace_in_string_frak_0(SepChars,Repl,A,C):- atomics_to_string(B,SepChars,A),atomics_to_string(B,Repl,C). 548 549 550 551%=
557fix_varcase_name(N,VN):-atom_subst_frak_0(N,'-','_',O),atom_subst_frak_0(O,'?','_',VN). 558 559 560%=
566no_vars_needed(H):- (t_l:dont_varname; ( ground(H) ; \+ compound(H))) ,!. 567no_vars_needed(A:H):-atom(A),!,no_vars_needed(H). 568no_vars_needed(H):-var(H),!. 569no_vars_needed('$VAR'(_)):-!. 570no_vars_needed(H):- compound(H),H=varname_info(_,_,_,_),!. 571 572%=
578try_get_inner_vars(H):- once((functor(H,_,N),arg(N,H,List),member(vars(Vs),List))),is_list(Vs),term_variables(H,VL),must_maplist(set_varname(write_functor),Vs,VL). 579 580 581 582%=
589term_slots(Term,Slots):-term_singletons(Term, [],NS, [],S),append(NS,S,Slots). 590 591 592%=
599term_singletons(A,Vs):- notrace(term_singletons(A,[],_,[],Vs)). 600%= %= :- was_export(term_singletons/3). 601 602%=
609term_singletons(Term,NonSingle,Singles):- notrace(term_singletons(Term,[],NonSingle,[],Singles)). 610%= %= :- was_export(term_singletons/5). 611 612%=
619term_singletons(Fml, NS,NS, S,S):- atomic(Fml),!. 620term_singletons(Fml, NS,NS, S,S):- identical_memberchk(Fml,NS),!. 621term_singletons(Fml, NS, [Fml|NS], S, NSV):- is_ftVar(Fml),identical_memberchk(Fml,S),!,delete_eq(S,Fml,NSV),!. 622term_singletons(Fml, NS, NS, S, [Fml|S]):- is_ftVar(Fml),!. 623term_singletons([H|T],NS,NSO,S,NSV):- !, term_singletons(H,NS,NSM,S,M),term_singletons(T,NSM,NSO,M,NSV). 624term_singletons(Fml, NS,NSO, S,NSV):- compound(Fml),Fml=..[_|T],!, term_singletons(T, NS,NSO, S,NSV). 625 626 627%=
633call_return_tf(Call,TF):- ((-> TF = t ; TF = nil)). 634 635 636 637%=
643try_get_varname_cache(H):- no_vars_needed(H),!. 644try_get_varname_cache(H):- varname_cache:varname_info(H,_,Vs,_),maplist(set_varname(write_functor),Vs),!. 645try_get_varname_cache(H):- varname_cache:varname_info(_,H,Vs,_),maplist(set_varname(write_functor),Vs),!. 646 647%=
653try_get_head_vars(H):- no_vars_needed(H),!. 654try_get_head_vars(H):- varname_cache:varname_info(H,_,Vs,_),maplist(set_varname(write_functor),Vs),!. 655try_get_head_vars(H):- try_get_inner_vars(H). 656try_get_head_vars(H):- varname_cache:varname_info(_,H,Vs,_),maplist(set_varname(write_functor),Vs),!. 657try_get_head_vars(B):- must(get_random_headvars(B)),!. 658 659 660 661%=
667try_varname_infos(H):- varname_cache:varname_info(H,_,Vs,_),maplist(set_varname(write_functor),Vs),!. 668 669 670%=
676get_random_headvars(H):- \+ compound(H),!. 677get_random_headvars(H):- functor(H,F,A),get_random_headvars(H,F,A,A). 678 679 680%=
686get_random_headvars(_H,_F,A,N):- (N < 1 ; N>A),!. 687get_random_headvars( H, F,A,N):- arg(N,H,HA),ignore(get_1head_arg_var(H,F,N,A,HA)),N2 is N-1,get_random_headvars(H,F,A,N2). 688 689 690%=
696get_1head_arg_var(_H,F,N,A,HA):- 697 functor(HH,F,A), 698 (nonvar(HA)->!; 699 (arg(N,HH,COMP), 700 (( arg_varname(HH,N,Name),HA='$VAR'(Name));(try_get_varname_cache(HH),sub_ft_var(HA,COMP))))). 701 702 703%=
709sub_ft_var(HA,COMP):-
710 (is_ftVar(COMP)-> HA=COMP; (compound(COMP),arg(_,COMP,FTVAR),sub_ft_var(HA,FTVAR))).
717arg_varname(P,N,Name):- arg(N,P,Now),varname_cache:varname_info(P,_,List,_),var(Now),member(Nam=V,List),Now==V,must(Nam=Name). 718 719 720%=
726try_get_body_vars(H):- no_vars_needed(H),!. 727try_get_body_vars(H):- varname_cache:varname_info(_,H,Vs,_),maplist(set_varname(write_functor),Vs),!. 728try_get_body_vars(H):- try_get_inner_vars(H),!. 729try_get_body_vars(H):- varname_cache:varname_info(H,_,Vs,_),maplist(set_varname(write_functor),Vs),!. 730try_get_body_vars((A,B)):-!,try_get_head_vars(A),try_get_head_vars(B). 731try_get_body_vars((A;B)):-!,try_get_head_vars(A),try_get_head_vars(B). 732try_get_body_vars(C):- C=..[_,L],maplist(try_get_body_vars,L). 733try_get_body_vars(B):- must(get_random_headvars(B)),!. 734try_get_body_vars(_). 735 736:- multifile(varname_cache:varname_info/4). 737:- dynamic(varname_cache:varname_info/4). 738 739:- meta_predicate renumbervars( , , ). 740 741:- meta_predicate set_varname( , , ). 742:- meta_predicate set_varname( , ). 743% set_varname(How,B):-var(B),!. 744 745%=
751:- meta_predicate set_varname( , , ). 752:- meta_predicate set_varname( , ). 753 754set_varname(How,B):-var(B),writeq(set_varname(How,B)),nl,dtrace,trace_or_throw(var_assign_varname_vars(How,B)). 755set_varname(How,N=V):-must(set_varname(How,N,V)),!. 756 757%set_varname(How,N,V):-var(V),var(N),!,V=N. 758 759%=
765set_varname(How,N,V):- (var(How);var(N)),trace_or_throw(var_var_set_varname(How,N,V)). 766set_varname(_,_,NV):-nonvar(NV),ignore((NV='$VAR'(N),must(number(N);atom(N)))). 767set_varname(How,'$VAR'(Name),V):- !, set_varname(How,Name,V). 768set_varname(_:[How],N,V):- !, set_varname(How,N,V). 769set_varname(_:[How|List],N,V):- !, set_varname(How,N,V),set_varname(List,N,V). 770set_varname(How,N,V):- number(N),!,format(atom(VN),'~w',[N]),set_varname(How,VN,V). 771set_varname(How,N,V):- atom(N),atom_concat('"?',LS,N),atom_concat(NN,'"',LS),fix_varcase_name(NN,VN),!,set_varname(How,VN,V). 772set_varname(_M:write_functor,N,V):- !,ignore('$VAR'(N)=V),!. 773set_varname(_M:write_attribute,N,V):-!,put_attr(V,vn,N). 774set_varname(_M:put_attr,N,V):-!,put_attr(V,vn,N). 775set_varname(Nb_setval,N,V):- get_varname_list(Vs),!,register_var(N,Vs,V,NewVs),call(call,Nb_setval,'$variable_names',NewVs). 776set_varname(Nb_setval,N,V):- call(call,Nb_setval,'$variable_names',[N=V]). 777%set_varname(Nb_setval,N,V):- must(call(call,Nb_setval,N,V)). 778%set_varname(_How,_,_). 779 780 781 782write_functor(N=V):-write_functor(N,V). 783 784%=
790write_functor(N,V):-!,put_attr(V,vn,N). 791write_functor(N,V):-ignore('$VAR'(N)=V),!. 792 793:-export(save_clause_vars/2). 794:-module_transparent(save_clause_vars/2). 795 796%=
save_clause_vars(_,[])
:-!.
803save_clause_vars(MHB,Vs):- ignore(maybe_record_scanned_file),ignore(current_why(Why)), 804 ignore((var(Why),loading_file(Why))),!,save_clause_vars(MHB,Vs,Why). 805 806% ?- clause(pui_help:prolog_help_topic(A),B,ClauseRef), prolog_clause:clause_info(ClauseRef, File, TermPos, NameOffset, Options). 807 808 809:-export(save_clause_vars/3). 810 811%=
817save_clause_vars(_, [],_):-!. 818save_clause_vars(MHB,Vs,Why:_):-atom(Why),!,save_clause_vars(MHB,Vs,Why). 819save_clause_vars(MHB,Vs,Why):- ( \+ \+ (logicmoo_util_term_listing:as_clause_w_m(MHB, M, H, B, MB),save_clause_vars(M,H,MB,B,Vs,Why))). 820 821 822 823%=
829locate_clause_ref(M,H,_MB,_B,_ClauseRef):- ( \+ (predicate_property(M:H,number_of_clauses(_)))),( \+ (predicate_property(_:H,number_of_clauses(_)))),!,fail. 830locate_clause_ref(M,H,MB,B,ClauseRef):-clause_asserted(M:H,MB:B,ClauseRef). 831locate_clause_ref(_M,H,MB,B,ClauseRef):-clause_asserted(H,MB:B,ClauseRef). 832locate_clause_ref(_M,H,MB,B,ClauseRef):-clause_asserted(_:H,MB:B,ClauseRef). 833locate_clause_ref(M,H,_MB,B,ClauseRef):-clause_asserted(M:H,B,ClauseRef). 834locate_clause_ref(_M,H,_MB,B,ClauseRef):-clause_asserted(H,B,ClauseRef). 835locate_clause_ref(_M,H,_MB,B,ClauseRef):-clause_asserted(_:H,B,ClauseRef). 836 837 838%=
844clause_ref_vars(ClauseRef,Was):-prolog_clause:clause_info(ClauseRef, _File, _TermPos, _NameOffset, [variable_names(Was)]). 845 846%=
852clause_ref_file(ClauseRef,File):-prolog_clause:clause_info(ClauseRef, File, _TermPos, _NameOffset, []). 853 854:-export(save_to_clause_ref/3). 855 856%=
862save_to_clause_ref(ClauseRef,Vs,Why):- ain00(names(ClauseRef,Vs)),ain00(names_why(ClauseRef,Why)),!. 863 864:-export(save_clause_vars/6). 865 866%=
872save_clause_vars(M,H,MB,B,Vs,Why:_):-atom(Why),!,save_clause_vars(M,H,MB,B,Vs,Why). 873save_clause_vars(M,H,MB,B,Vs,Why):- fail, locate_clause_ref(M,H,MB,B,ClauseRef),clause_ref_vars(ClauseRef,Was), 874 ((Was=Vs) -> fail ; save_to_clause_ref(ClauseRef,Vs,Why)),!. 875save_clause_vars(_M,H,_MB,B,Vs,Why):- ain00(varname_cache:varname_info(H,B,Vs,Why)). 876 877 878%=
884ain00(A):- logicmoo_util_database:clause_asserted(A),!. 885ain00(A):- assertz(A).
892contains_ftVar(Term):- sub_term(Sub,Term),compound(Sub),Sub='$VAR'(_). 893 894 895 896%=
902ensure_vars_labled_r(I,I):-!. 903ensure_vars_labled_r(I,O):- 904 once((((get_varname_list(Vs),Vs\==[])), 905 copy_term(I:Vs,O:OVs), 906 must_maplist(write_functor,OVs))), 907 (O \=@= I ; ground(O)),!. 908 909ensure_vars_labled_r(I,O):- 910 once((get_clause_vars_copy(I,O),unlock_vars(O))), 911 (O \=@= I ; ground(O)),!. 912 913ensure_vars_labled_r(I,O):- copy_term_and_varnames(I,O),I\=@=O. 914 915:-export(copy_term_and_varnames/2). 916 917%=
923copy_term_and_varnames(Term,Named):- notrace((unnumbervars(Term,UNV),copy_term(UNV,Named))),!. 924copy_term_and_varnames(Term,Named):- 925 notrace((ignore((source_variables_lv(AllS))), copy_term(Term+AllS,Named+CAllS),maplist(set_varname([write_functor,b_setarg]),CAllS))). 926 927 928%=
934renumbervars(How,Term,Named):- 935 notrace((ignore((source_variables_lv(AllS))), 936 copy_term(Term+AllS,Named+CAllS), 937 maplist(set_varname(How),CAllS))). 938 939 940 941 942 943%=
949source_variables_lv(AllS):- 950 (prolog_load_context(variable_names,Vs1);Vs1=[]), 951 (get_varname_list(Vs2);Vs2=[]), 952 % notrace(catch((parent_goal('$toplevel':'$execute_goal2'(_, Vs3),_);Vs3=[]),E,(writeq(E),Vs3=[]))), 953 ignore(Vs3=[]), 954 append(Vs1,Vs2,Vs12),append(Vs12,Vs3,All),!,list_to_set(All,AllS), 955 set_varname_list( AllS). 956 957 958 959%=
965contain_numbervars(Term):- sub_term(Sub,Term),compound(Sub),Sub='$VAR'(_),!. 966 967 968 969 970%=
976contains_singletons(Term):-contains_singletons(Term,N),N>0. 977 978 979%=
985contains_singletons(Term,N):-
986 % sanity(\+contain_numbervars(Term)),
987 \+ ground(Term),
988 copy_term_nat(Term,Nat),
989 term_variables(Nat,Vs),
990 numbervars(Nat,0,_,[attvar(bind),singletons(true)]),!,
991 count_members_eq('$VAR'('_'),Vs,N).
999count_members_eq(_,[],0):-!. 1000count_members_eq(Find,[E|List],N):- 1001 count_members_eq(Find,List,NN),!, (E == Find -> N is NN+1 ; NN=N).
1009call_not_not(Goal):- \+ \+ . 1010 1011 1012%=
1018contains_badvarnames(Term):- notrace((sub_term(SubV,Term),compound(SubV),SubV='$VAR'(Sub),bad_varnamez(Sub))),!. 1019 1020contains_dvar(Term):-notrace((sub_term(SubV,Term),compound(SubV),SubV='$VAR'(_),!)). 1021 1022%=
1028bad_varnamez(Sub):- atom(Sub),!,sub_string(Sub,_,_,_,'.'). 1029bad_varnamez(Sub):- var(Sub),!. 1030bad_varnamez(Sub):- integer(Sub),!, (Sub < 0 ; Sub > 991000). 1031bad_varnamez(Sub):- number(Sub). 1032bad_varnamez(Sub):- string(Sub),!. 1033bad_varnamez(Sub):- format(atom(A),'~w',['$VAR'(Sub)]),sub_string(A,_,_,_,'$'). 1034 1035 1036%=
1042mpred_numbervars_with_names(Term):- term_variables(Term,Vars),mpred_name_variables(Vars),!,numbervars(Vars,91,_,[attvar(skip),singletons(true)]),!. 1043 1044 1045%=
1051mpred_name_variables([]). 1052mpred_name_variables([Var|Vars]):- 1053 (var_property(Var, name(Name)) -> Var = '$VAR'(Name) ; true), 1054 mpred_name_variables(Vars). 1055 1056 1057%========================================= 1058% unnumbervars 1059%========================================= 1060 1061 1062%=
1068b_implode_varnames(_):-!. 1069 1070%=
1076b_implode_varnames0([]):-!. 1077b_implode_varnames0([N=V|Vs]):- ignore((V='$VAR'(N);V=N)),b_implode_varnames0(Vs),!. 1078 1079 1080%=
1086imploded_copyvars(C,CT):-vmust((source_variables(Vs),copy_term(C-Vs,CT-VVs),b_implode_varnames(VVs))),!.
1092source_variables(Vs):- (((prolog_load_context(variable_names,Vs),Vs\==[]); 1093 (get_varname_list(Vs),Vs\==[]))),!. 1094source_variables(Vars):-var(Vars),parent_goal('$toplevel':'$execute_goal2'(_, Vars),_),!. 1095source_variables([]). 1096 1097 1098 1099% snumbervars(Term,Functor,Start,End,List):-vmust(( vmust(var(End);number(End)),snumbervars4(Term,Start,End,[functor_name(Functor)|List]))),check_varnames(Term). 1100 1101 1102 1103%=
1109check_varnames(Vs):-var(Vs),!. 1110check_varnames([]):-!. 1111check_varnames([N=V|Vs]):-atom(N),var(V),!,check_varnames(Vs). 1112check_varnames(Term):- contains_badvarnames(Term),!,dumpST0,dtrace,nortrace,dtrace,!,dtrace(contains_badvarnames(Term)). 1113check_varnames(_). 1114 1115:-meta_predicate(snumbervars4( , , , )). 1116 1117%=
1123snumbervars4(Term,Start,End,List):- \+ member(attvar(_),List),!,snumbervars5(Term,Start,End,[attvar(skip)|List]). 1124snumbervars4(Term,Start,End,List):- snumbervars5(Term,Start,End,List). 1125 1126:-meta_predicate(snumbervars5( , , , )). 1127 1128%=
1134snumbervars5(Term,Start,End,List):-must_det_l((integer(Start),is_list(List), numbervars(Term,Start,End,List),check_varnames(Term))). 1135 1136:-export(try_save_vars/1). 1137 1138%=
1144try_save_vars(_):- t_l:dont_varname,!. 1145try_save_vars(HB):-ignore((get_varname_list(Vs),Vs\==[],save_clause_vars(HB,Vs))),!. 1146 1147:-export(maybe_scan_for_varnames/0). 1148 1149%=
1155maybe_scan_for_varnames:- current_prolog_flag(source_variables, true)->scan_for_varnames;true. 1156 1157:-export(scan_for_varnames/0). 1158 1159:- dynamic(thglobal:scanning_for_varnames_already/0). 1160 1161%=
1167scan_for_varnames:- thglobal:scanning_for_varnames_already,!. 1168scan_for_varnames:- swc, 1169 setup_call_cleanup( 1170 asserta(thglobal:scanning_for_varnames_already), 1171 scan_for_varnames0, 1172 retractall(thglobal:scanning_for_varnames_already)). 1173 1174scan_for_varnames0:- 1175 set_prolog_flag(source_variables, true), 1176 ensure_loaded(library(make)), 1177 doall((make:modified_file(F),retractall(varname_cache:varname_info_file(F)))), 1178 doall((filematch(swi('boot/*.pl'),F),que_read_source_file_vars(F))), 1179 doall((source_file(F),que_read_source_file_vars(F))),!, 1180 ignore(( 1181 ( \+ \+ varname_cache:queued_read_source_file_vars(_)), 1182 dmsg("Begining grovel for vars..."), 1183 gripe_time(1.0,doall((retract(varname_cache:queued_read_source_file_vars(F)), 1184 read_source_file_vars(F)))))). 1185 1186que_read_source_file_vars(F):-varname_cache:varname_info_file(F),!. 1187que_read_source_file_vars(F):-ain00(varname_cache:queued_read_source_file_vars(F)). 1188 1189%=
1195dcall_if_verbose(G):-!, notrace(G). 1196dcall_if_verbose(G):-show_call(why,G). 1197 1198% list_undefined([module_class([user,system,library,test,temporary,development])]). 1199:- dynamic(varname_cache:varname_info_file/1). 1200:- dynamic(varname_cache:queued_read_source_file_vars/1). 1201 1202%=
1208read_source_file_vars(_):- ( \+ current_prolog_flag(source_variables, true)),!. 1209read_source_file_vars(F):- \+ ((atom(F),exists_file(F))),!, forall(filematch(F,E),read_source_file_vars(E)). 1210read_source_file_vars(F):- clause_asserted(varname_cache:varname_info_file(F)),!. 1211read_source_file_vars(F):- asserta(varname_cache:varname_info_file(F),Ref), catch((read_source_file_vars_1(F)),E,(dmsg(E),erase(Ref))). 1212 1213 1214%=
1220save_file_source_vars(_F,end_of_file,_Vs):-!. 1221save_file_source_vars(_F,_T,[]):-!. 1222save_file_source_vars(F,T,Vs):- put_variable_names(Vs),!,locally(t_l:current_why_source(F),save_clause_vars(T,Vs)),!. 1223 1224 1225 1226%=
1233read_source_vars(File,In):- 1234 Module = module(_), 1235 repeat, 1236 catch(prolog_read_source_term(In, Term, Expanded, [ variable_names(Vs), syntax_errors(error) , term_position(TermPos) ]), 1237 E,(nop((dmsg(E))),fail)), 1238 arg(1,Module,M), 1239 (Term = module(MM,_) -> (nb_setarg(1,Module,MM),fail); 1240 ((stream_position_data(line_count, TermPos, LineNo), 1241 1242 ignore(save_file_source_vars(mfl(M,File,LineNo),Term,Vs)), 1243 ( is_list(Expanded) 1244 -> member(T, Expanded) 1245 ; T = Expanded 1246 ), 1247 ( T == end_of_file 1248 -> ! ; 1249 ( T\==Term, save_file_source_vars(mfl(M,File,LineNo),T,Vs), 1250 fail))))). 1251 1252 1253% new method 1254 1255%=
1261read_source_file_vars_1('/usr/lib/swi-prolog/library/sandbox.pl'):-!. 1262read_source_file_vars_1(File):- 1263 once(current_prolog_flag(xref, Was);Was=false), 1264 locally(set_prolog_flag(xref, true), 1265 setup_call_cleanup( 1266 prolog_open_source(File, In), 1267 read_source_vars(File,In), 1268 (prolog_close_source(In), 1269 current_prolog_flag(xref, Was)))),!. 1270 1271 1272 1273 1274 1275:-export(ensure_vars_labled/2). 1276 1277 1278mfreeattr_unify_hook(This,That):-get_attr(That,eq,Thats),Thats==This,!. 1279mfreeattr_unify_hook(This,That):-get_attrs(That,Thats),get_attrs(This,Value),Thats==Value,!. 1280never_bound(V):- var(V),!,put_attr(V,eq,_). 1281never_bound(_). 1282 1283starattr_unify_hook(This,That):-This==That. 1284starattr_unify_hook(_,That):-compound(That),That='$VAR'(Atom),nonvar(Atom). 1285only_stars(V):- var(V),!,put_attr(V,star,V). 1286only_stars(_). 1287 1288del_each_attr(M,V):-del_attr(V,M). 1289 1290%=
1296ensure_vars_labled(I,O):-nonvar(O),!,must(ensure_vars_labled(I,M)),!,M=O. 1297ensure_vars_labled(I,I):- (t_l:dont_varname;no_vars_needed(I)),!. 1298% ensure_vars_labled(I,I):- term_variables(I,Vs),maplist(never_bound,Vs),!. 1299% ensure_vars_labled(I,I):- !. 1300ensure_vars_labled(I,OO):- acyclic_term(O),term_variables(I,Vs),all_different_vals(Vs),ensure_vars_labled_r(I,O),vmust(acyclic_term(O)),!,OO=O. 1301ensure_vars_labled(I,OO):- vmust(acyclic_term(I)),term_variables(I,Vs),all_different_vars(Vs),ensure_vars_labled_r(I,O),vmust(acyclic_term(O)),!,OO=O. 1302ensure_vars_labled(I,I). 1303 1304 1305:- multifile(user:portray/1). 1306 1307%=
1314user:portray(A) :- \+ tracing, 1315 catch(notrace(((compound(A);var(A)), current_prolog_flag(source_variables, true), set_prolog_flag(source_variables, false), 1316 call_cleanup((((user:portray(A) -> ! ; print_numbervars_maybe(A)))),set_prolog_flag(source_variables, true)))),E,(writeq(E),nl,fail)). 1317 1318 1319%=
1325print_numbervars(H):- (tlbugger:no_slow_io; tracing),!, writeq(H),!. 1326print_numbervars(H):- must( \+ \+ ((on_x_log_fail(print_numbervars_maybe(H));on_x_log_fail(print_numbervars_1(H))))),!. 1327 1328 1329 1330%=
1336print_numbervars_maybe(H):-(compound(H);var(H)), copy_term(H,HC), \+ \+ ((get_clause_vars(H), HC\=@=H, print_numbervars_1(H))),!. 1337 1338 1339%=
1345print_numbervars_1(H):- loop_check(print_numbervars_2(H),format('~N~q.~n',[H])). 1346 1347% print_numbervars_2(H):- dtrace,baseKB:portray_one_line_hook(H),!. 1348 1349%=
1355print_numbervars_2(H):- current_output(S),prolog_listing:portray_clause(S,H,[portrayed(true),singletons(false)]),!. 1356print_numbervars_2(H):- write_term(H,[portrayed(false)]),nl,!. 1357 1358:- multifile(t_l:disable_px/0). 1359:- thread_local(t_l:disable_px/0). 1360 1361 1362%=
1368term_expansion_save_vars(HB):- \+ ground(HB), \+ t_l:dont_varname_te,\+ t_l:dont_varname, % \+ current_prolog_flag(xref, true), 1369 current_predicate(listing_vars_file/0), current_prolog_flag(source_variables,true), 1370 source_context_module(M),init_varname_stores(M),logicmoo_util_with_assertions:locally([t_l:dont_varname_te,t_l:disable_px],try_save_vars(M:HB)),!,fail. 1371 1372 1373without_varname_scan(Goal):- 1374 locally(current_prolog_flag(source_variables,false), 1375 locally([ - t_l:dont_varname_te,- t_l:dont_varname],Goal)). 1376 1377%=
1383maybe_record_scanned_file:-ignore(( source_location(F,_), \+ varname_cache:varname_info_file(F), asserta(varname_cache:varname_info_file(F)))). 1384 1385 1386%=
1392init_varname_stores(_):- !. 1393% init_varname_stores(M):- M:ensure_loaded(logicmoo_util_with_assertions), M:ensure_loaded(listing_vars). 1394 1395 1396:- initialization(maybe_scan_for_varnames). 1397% :- maybe_scan_for_varnames. 1398 1399 1400%=
1406listing_vars_file. 1407 1408 1409%=
1416prologmake_hook(before, Files):-forall(member(File,Files),retractall(varname_cache:varname_info_file(File))). 1417% prolog:make_hook(after, Files):- forall(member(File,Files),show_call(why,ain00(varname_cache:varname_info_file(File)))). 1418 1419%=
1426userterm_expansion(HB,_):- current_prolog_flag(source_variables,true),term_expansion_save_vars(HB),fail
Name Prolog variables (debugging)
*/