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(0),
114 call_return_tf(0, ?),
115 contains_singletons(*),
116 get_clause_vars(:),
117 get_clause_vars(:, ?),
118 no_varnaming(0),
119 without_varname_scan(0),
120 dcall_when(2, ?, ?),
121 snumbervars4(*, ?, ?, ?),
122 snumbervars5(*, ?, ?, ?),
123 try_save_vars(:),
124 all_different_vals(2,*),
125 all_disjoint_in_sets(2,*,*),
126 init_varname_stores(?),
127 vmust(0).
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
189 vmust/1,
190 init_varname_stores/1
191 )).
192:- meta_predicate dcall_if_verbose(0).
193
194:- reexport(library(lockable_vars)).
201
202
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).
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,!.
216name_variable(_, _).
217
218:- nodebug(logicmoo(varnames)).
225
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]).
236vn:project_attributes(QueryVars, ResidualVars):-nop(dmsg(vn:proj_attrs(vn,QueryVars, ResidualVars))).
245vn:attribute_goals(Var, B, B) :- cyclic_term(Var),!.
246vn:attribute_goals(Var, [name_variable(Var, Name)|B], B) :- get_attr(Var, vn, Name),!.
247vn:attribute_goals(_Var, B, B):-!.
248vn:attribute_goals(Var, [name_variable(Var, Name)|B], B) :- variable_name(Var, Name).
250
251
258
259
260:- thread_local(t_l:no_kif_var_coroutines/1).
267vn:attr_unify_hook(_, Var):- nonvar(Var),!.
268vn:attr_unify_hook(_, Var):- cyclic_term(Var),!,fail.
269vn:attr_unify_hook(_, Var):- cyclic_term(Var),!.
271vn:attr_unify_hook(Name1, Var):- get_attr(Var, vn, Name2),Name1==Name2,!.
272vn:attr_unify_hook(Name1, Var):- get_attr(Var, vn, Name2),!,ignore(Name1==Name2),!.
273
274
275vn:attr_unify_hook(Name1, Var):- get_attr(Var, vn, Name2),!,combine_names(Name1,Name2,Name),(Name2==Name->true;put_attr(Var,vn,Name)).
276vn:attr_unify_hook(Name1, Var):- var(Var),!,put_attr(Var, vn, Name1).
277vn:attr_unify_hook(_Form, _OtherValue):- t_l:no_kif_var_coroutines(G),!,call(G).
278vn:attr_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
294vn:attr_portray_hook(Name, _) :- write('???'), write(Name),!.
295
296
310
311
312
313:- set_module(class(library)).
314
315:- use_module(library(when)).
316
317:- prolog_clause:multifile((
318 unify_goal/5,
319 unify_clause_hook/5,
320 make_varnames_hook/5,
321 open_source/2)).
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)).
329
330
331:- meta_predicate vmust(0).
332
339vmust(G):-!,call(G).
340vmust(G):-must(G).
341
342
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
363
364no_varnaming(G):-locally(t_l:dont_varname,G).
365
366
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
434make_subterm_path(Sub,Term,PathO):-vmust(subterm_path(Sub,Term,Path)),!,PathO=Path.
435
436
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
453get_clause_vars(CV):- notrace(get_clause_vars_nontraced(CV)).
454:- export(get_clause_vars_nontraced/1).
455
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
478del_attr_type(Type,Var):-ignore(del_attr(Var,Type)).
479
480
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
502get_clause_vars_copy(HB,HB):- ground(HB),!.
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
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
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
538atom_subst_frak_0(A,F,R,K):-replace_in_string_frak_0(F,R,A,K),!.
539
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
557fix_varcase_name(N,VN):-atom_subst_frak_0(N,'-','_',O),atom_subst_frak_0(O,'?','_',VN).
558
559
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
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
589term_slots(Term,Slots):-term_singletons(Term, [],NS, [],S),append(NS,S,Slots).
590
591
599term_singletons(A,Vs):- notrace(term_singletons(A,[],_,[],Vs)).
601
609term_singletons(Term,NonSingle,Singles):- notrace(term_singletons(Term,[],NonSingle,[],Singles)).
611
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
633call_return_tf(Call,TF):- ((Call-> TF = t ; TF = nil)).
634
635
636
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
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
667try_varname_infos(H):- varname_cache:varname_info(H,_,Vs,_),maplist(set_varname(write_functor),Vs),!.
668
669
676get_random_headvars(H):- \+ compound(H),!.
677get_random_headvars(H):- functor(H,F,A),get_random_headvars(H,F,A,A).
678
679
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
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
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
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(+,*).
744
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
758
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]).
779
780
781
782write_functor(N=V):-write_functor(N,V).
783
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
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
807
808
809:-export(save_clause_vars/3).
810
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
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
844clause_ref_vars(ClauseRef,Was):-prolog_clause:clause_info(ClauseRef, _File, _TermPos, _NameOffset, [variable_names(Was)]).
845
852clause_ref_file(ClauseRef,File):-prolog_clause:clause_info(ClauseRef, File, _TermPos, _NameOffset, []).
853
854:-export(save_to_clause_ref/3).
855
862save_to_clause_ref(ClauseRef,Vs,Why):- ain00(names(ClauseRef,Vs)),ain00(names_why(ClauseRef,Why)),!.
863
864:-export(save_clause_vars/6).
865
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
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
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
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
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
949source_variables_lv(AllS):-
950 (prolog_load_context(variable_names,Vs1);Vs1=[]),
951 (get_varname_list(Vs2);Vs2=[]),
952
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
965contain_numbervars(Term):- sub_term(Sub,Term),compound(Sub),Sub='$VAR'(_),!.
966
967
968
969
976contains_singletons(Term):-contains_singletons(Term,N),N>0.
977
978
985contains_singletons(Term,N):-
986
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):- \+ \+ Goal.
1010
1011
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
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
1042mpred_numbervars_with_names(Term):- term_variables(Term,Vars),mpred_name_variables(Vars),!,numbervars(Vars,91,_,[attvar(skip),singletons(true)]),!.
1043
1044
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
1060
1061
1068b_implode_varnames(_):-!.
1069
1076b_implode_varnames0([]):-!.
1077b_implode_varnames0([N=V|Vs]):- ignore((V='$VAR'(N);V=N)),b_implode_varnames0(Vs),!.
1078
1079
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
1100
1101
1102
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(0,?,?,?)).
1116
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(0,?,?,?)).
1127
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
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
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
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
1195dcall_if_verbose(G):-!, notrace(G).
1196dcall_if_verbose(G):-show_call(why,G).
1197
1199:- dynamic(varname_cache:varname_info_file/1).
1200:- dynamic(varname_cache:queued_read_source_file_vars/1).
1201
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
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
1232
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
1254
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
1278mfree:attr_unify_hook(This,That):-get_attr(That,eq,Thats),Thats==This,!.
1279mfree:attr_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
1283star:attr_unify_hook(This,That):-This==That.
1284star:attr_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
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)),!.
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
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
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
1336print_numbervars_maybe(H):-(compound(H);var(H)), copy_term(H,HC), \+ \+ ((get_clause_vars(H), HC\=@=H, print_numbervars_1(H))),!.
1337
1338
1345print_numbervars_1(H):- loop_check(print_numbervars_2(H),format('~N~q.~n',[H])).
1346
1348
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
1368term_expansion_save_vars(HB):- \+ ground(HB), \+ t_l:dont_varname_te,\+ t_l:dont_varname,
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
1383maybe_record_scanned_file:-ignore(( source_location(F,_), \+ varname_cache:varname_info_file(F), asserta(varname_cache:varname_info_file(F)))).
1384
1385
1392init_varname_stores(_):- !.
1394
1395
1396:- initialization(maybe_scan_for_varnames).
1398
1399
1406listing_vars_file.
1407
1408
1416prolog:make_hook(before, Files):-forall(member(File,Files),retractall(varname_cache:varname_info_file(File))).
1418
1426user:term_expansion(HB,_):- current_prolog_flag(source_variables,true),term_expansion_save_vars(HB),fail
Name Prolog variables (debugging)