1%:- if((prolog_load_context(source,F),prolog_load_context(file,F))). 2 3:- define_into_module( 4 [debug_var/2,debug_var0/2,maybe_debug_var/2,pretty_numbervars/2,guess_pretty/1, 5 into_symbol_name/2, 6 prologcase_name/2, 7 may_debug_var/2, 8 guess_prettyf/1, 9 guess_pretty/1, 10 pretty1/1, 11 pretty_two/1, 12 pretty_three/1, 13 pretty_final/1, 14 maybe_debug_var/2, 15 guess_varnames/1, 16 %term_varnames/2, 17 guess_varnames/2, 18 name_variable/2, variable_name/2, 19 variable_name_or_ref/2, 20 toProperCamelAtom/2, 21 simpler_textname/2,simpler_textname/3]).
27%:- endif. 28%:- set_module(class(library)). 29%:- use_module(util_varnames,[get_var_name/2]). 30 31:- use_module(library(occurs)). 32:- use_module(library(gensym)). 33:- use_module(library(when)). 34 35 36 37:- use_module(library(backcomp)). 38%:- use_module(library(codesio)). 39:- use_module(library(charsio)). 40:- use_module(library(debug)). 41:- use_module(library(check)). 42 43 44%:- use_module(library(edinburgh)). 45:- use_module(library(debug)). 46:- use_module(library(prolog_stack)). 47:- use_module(library(make)). 48 49 50% :- use_module(library(gui_tracer)). 51:- use_module(library(system)). 52:- use_module(library(socket)). 53:- use_module(library(readutil)). 54:- abolish(system:time/1). 55:- use_module(library(statistics)). 56:- use_module(library(ssl)). 57:- use_module(library(prolog_codewalk)). 58:- use_module(library(prolog_source)). 59:- use_module(library(date)). 60%:- use_module(library(editline)). 61:- use_module(library(listing)). 62 63/* Logicmoo Debug Tools 64% =================================================================== 65% File 'logicmoo_util_varnames.pl' 66% Purpose: An Implementation in SWI-Prolog of certain debugging tools 67% Maintainer: Douglas Miles 68% Contact: $Author: dmiles logicmoo@gmail.com ; 69% Version: 'logicmoo_util_varnames.pl' 1.0.0 70% Revision: $Revision: 1.1 $ 71% Created: $Date: 2002/07/11 21:57:28 $ 72% =================================================================== 73*/ 74 75% debug_var(_A,_Var):-!. 76:- export(debug_var/2). 77:- export(debug_var0/2). 78 79really_no_pretty:- fail, current_prolog_flag(no_pretty,true). 80 81debug_var(_,_):- really_no_pretty,!. 82debug_var(X,Y):- mortvar(debug_var0(X,Y)). 83debug_var(Sufix,X,Y):- quietly((flatten([X,Sufix],XS),debug_var(XS,Y))). 84 85maybe_debug_var(_,_):- really_no_pretty,!. 86maybe_debug_var(X,Y):- mortvar(may_debug_var(X,Y)). 87 88p_n_atom(Cmpd,UPO):- p_n_atom1(Cmpd,UP),toProperCamelAtom(UP,UPO),!. 89 90p_n_atom1(Cmpd,UP):- number(Cmpd),!,format(atom(UP),"_Num~w_",[Cmpd]). 91p_n_atom1(Cmpd,UP):- string(Cmpd),atom_subst(Cmpd," ","_",String),!,p_n_atom1(String,UP). 92p_n_atom1(Cmpd,UP):- Cmpd=='', UP='',!. 93p_n_atom1(Var,UP):- var(Var),get_var_name(Var,UP),!. 94p_n_atom1(Var,UP):- var(Var),term_to_atom(Var,Atom),p_n_atom0(Atom,UP),!. 95p_n_atom1([H|List],UP):- append(L,R,[H|List]),\+ is_list(R),!,p_n_atom1(L,UP). 96p_n_atom1(List,UP):- is_list(List),length(L,6),append(L,R,List), R \==[], !,p_n_atom1(L,UP). 97p_n_atom1(List,UP):- is_list(List),maplist(p_n_atom1,List,UPL),atomic_list_concat(UPL,'_',UP),!. 98p_n_atom1(Cmpd,UP):- \+ compound(Cmpd),!,term_to_atom(Cmpd,Atom),p_n_atom0(Atom,UP),!. 99p_n_atom1(Cmpd,UP):- compound_name_arity(Cmpd,Name,0),!, p_n_atom1(Name,UP). 100p_n_atom1(Cmpd,UP):- compound_name_arguments(Cmpd,Name,Args),Args=[_],!,p_n_atom1([Name|Args],UP). 101p_n_atom1(Cmpd,UP):- findall(St,(sub_term(St,Cmpd),atom(St)),L),L\==[],list_to_set(L,LL),!,p_n_atom1(LL,UP). 102p_n_atom1(Cmpd,UP):- compound_name_arguments(Cmpd,Name,Args),!,p_n_atom1([Name|Args],UP). 103%p_n_atom1(Cmpd,UP):- compound(Cmpd), sub_term(Atom,Cmpd),atomic(Atom), \+ number(Atom), Atom\==[], catch(p_n_atom0(Atom,UP),_,fail), !. 104%p_n_atom1(Cmpd,UP):- compound(Cmpd), compound_name_arity(Cmpd,Atom,_), catch(p_n_atom0(Atom,UP),_,fail), !. 105% p_n_atom1(Cmpd,UP):- compound(Cmpd), sub_term(Atom,Cmpd),nonvar(Atom),\+ number(Atom), Atom\==[], catch(p_n_atom0(Atom,UP),_,fail),!. 106 107filter_var_chars([58|X],[107, 119, 95|Y]):- filter_var_chars_trim_95(X,Y). 108filter_var_chars([95|X],[95|Y]):- !, filter_var_chars_trim_95(X,Y). 109filter_var_chars(X,Y):- filter_var_chars_trim_95(X,Y). 110 111 112 113filter_var_chars_trim_95(X,Y):- filter_var_chars0(X,M),trim_95(M,Y),!. 114 115trim_95([X],[X]). 116trim_95([95|M],Y):-!, trim_95(M,Y). 117trim_95([X|L],[100,X|Y]):- char_type(X,digit), trim_96(L,Y). 118trim_95([X|L],[97,X|Y]):- \+ char_type(X,alpha), trim_96(L,Y). 119trim_95(X,Y):- trim_96(X,Y). 120 121trim_96([95],[]). 122trim_96([],[]). 123trim_96([95,95|M],Y):- trim_96([95|M],Y). 124trim_96([X|M],[X|Y]):- trim_96(M,Y). 125 126 127 128filter_var_chars0([],[]). 129 130 131% WATN WHEN MAKING SYMBOLs... `_` -> `__` 132 133% `-` -> `c45` 134filter_var_chars0(`-`,`c45`):-!. 135% `*` -> `_xx_` 136filter_var_chars0([42|T],[95,120,120,95|Rest]):-!,filter_var_chars0(T,Rest). 137% `%` -> `_pf_` 138filter_var_chars0([37|T],[95,112, 102, 95| Rest]):-!,filter_var_chars0(T,Rest). 139% `'` -> `` 140filter_var_chars0([39|T], Rest):- !,filter_var_chars0(T,Rest). 141% `-` -> `_` 142filter_var_chars0([45|T],[95|Rest]):-!,filter_var_chars0(T,Rest). 143% `:` -> `_` 144filter_var_chars0([42|T],[95,120,95|Rest]):-!,filter_var_chars0(T,Rest). 145filter_var_chars0([H|T],[H|Rest]):- code_type(H, prolog_identifier_continue),!,filter_var_chars0(T,Rest). 146filter_var_chars0([H|T],Rest):- number_codes(H,Codes), filter_var_chars0(T,Mid),append([95, 99|Codes],[95|Mid],Rest). 147 148atom_concat_some_left(L,R,LR):- atom_concat_w_blobs(L,R,LR),atom_length(R,Len),Len>0. 149atom_concat_some_left(L,R,LR):- upcase_atom(L,L0),L\==L0,atom_concat_w_blobs(L0,R,LR),atom_length(R,Len),Len>0. 150atom_concat_some_left(L,R,LR):- downcase_atom(L,L0),L\==L0,atom_concat_w_blobs(L0,R,LR),atom_length(R,Len),Len>0. 151 152 153reduce_atomLR(L,L):- \+ atom(L), !. 154reduce_atomLR(L,R):- reduce_single_letter(L,LL), reduce_atomLR(LL,R). 155reduce_atomLR(L,R):- atom_concat_some_left('v',LL,L),name(LL,[UC,LC|_]),char_type(UC,upper),char_type(LC,lower),reduce_atomLR(LL,R). 156reduce_atomLR(L,R):- atom_concat_some_left('Cl_',LL,L),reduce_atomLR(LL,R). 157reduce_atomLR(L,R):- atom_concat_some_left('U_',LL,L),reduce_atomLR(LL,R). 158reduce_atomLR(L,R):- atom_concat_some_left('F_',LL,L),reduce_atomLR(LL,R). 159reduce_atomLR(L,R):- atom_concat_some_left('Pf_',LL,L),reduce_atomLR(LL,R). 160reduce_atomLR(L,R):- atom_concat_some_left('Kw_',LL,L),reduce_atomLR(LL,R). 161reduce_atomLR(L,R):- atom_concat_some_left('Sys_',LL,L),reduce_atomLR(LL,R). 162reduce_atomLR(L,R):- did_reduce_fname(L,M),reduce_atomLR(M,R). 163reduce_atomLR(L,L). 164 165%p_n_atom0(Atom,UP):- simpler_textname(Atom,M),Atom\==M,!,p_n_atom0(M,UP). 166p_n_atom0(Atom,UP):- atom(Atom),!, reduce_atomLR(Atom,AtomR), p_n_atom_filter_var_chars(AtomR,UP). 167p_n_atom0(String,UP):- string(String),!,string_to_atom(String,Atom),!,p_n_atom0(Atom,UP). 168p_n_atom0([C|S],UP):- !,moretrace(catch(atom_codes_w_blobs(Atom,[C|S]),_,fail)),!,p_n_atom0(Atom,UP). 169 170p_n_atom_filter_var_chars(AtomR,UP):- name(AtomR,Chars),filter_var_chars(Chars,[C|Was]),to_upper(C,U),name(UP,[U|Was]). 171% p_n_atom_filter_var_chars(AtomR,UP):- name(AtomR,[C|Was]),to_upper(C,U),filter_var_chars([U|Was],CS),name(UP,CS). 172 173atom_codes_w_blobs(Atom,Codes):-atom(Atom)->atom_codes(Atom,Codes);format(codes(Codes),"~w",[Atom]). 174 175debug_var0(R,V):- is_dict(V), dict_pairs(V,VV,_), !, debug_var0(R,VV). 176debug_var0(V,R):- is_dict(V), dict_pairs(V,VV,_), !, debug_var0(VV,R). 177debug_var0(V,NonVar):-var(V),nonvar(NonVar),!,debug_var0(NonVar,V). 178%debug_var0(_New,Var):- var(Var),get_attr(Var,vnl,_),!. 179debug_var0(_,NonVar):-nonvar(NonVar),!. 180debug_var0(Var,TwoVars):- var(Var),var(TwoVars),!, ignore((get_var_name(Var,Name),debug_var0(Name,TwoVars))). 181debug_var0(Var,_):- var(Var),!. 182debug_var0([C|S],Var):- \+ ground(C+S),!,afix_varname('List',Var). 183debug_var0([C|S],Var):- moretrace(catch(atom_codes_w_blobs(Atom,[C|S]),_,fail)),!,afix_varname(Atom,Var). 184debug_var0([AtomI|Rest],Var):-!,toProperCamelAtom([AtomI|Rest], NAME),afix_varname(NAME,Var),!. 185debug_var0(Atom,Var):- debug_var1(Atom,Var). 186 187 188debug_var1(Atom,_Var):- unusable_name(Atom),!. 189debug_var1(Atom,Var):- p_n_atom(Atom,UP), debug_var2(UP,Var). 190debug_var2(New, _):- unusable_name(New),!. 191debug_var2(UP,_):- check_varname(UP),fail. 192debug_var2(Atom,Var):- afix_varname(Atom,Var). 193 194 195 196afix_varname(Suffix,Var):- var(Var), get_var_name(Var,Prev),atomic(Prev),afix_varname_w_prev(Prev,Suffix,Var). 197afix_varname(Suffix,Var):- add_var_to_env_trimed(Suffix,Var). 198 199afix_varname_w_prev(Suffix,Prev,Var):- var(Prev),!,add_var_to_env_trimed(Suffix,Var). 200afix_varname_w_prev(Suffix,Prev,Var):- atom_concat_w_blobs('_',NewFix,Suffix),!,afix_varname_w_prev(Prev,NewFix,Var). 201afix_varname_w_prev(Suffix,Prev,Var):- atom_concat_w_blobs(NewFix,'_',Suffix),!,afix_varname_w_prev(NewFix,Prev,Var). 202afix_varname_w_prev(Afix,Prev,Var):- atom_concat_w_blobs('_',NewPreFix,Prev),!,afix_varname_w_prev(Afix,NewPreFix,Var). 203afix_varname_w_prev(Afix,Prev,Var):- atom_concat_w_blobs(NewPreFix,'_',Prev),!,afix_varname_w_prev(NewPreFix,Afix,Var). 204afix_varname_w_prev(Suffix,Prev,Var):- afix_ordered_varname(Prev,Suffix,Var). 205%afix_varname_w_prev(UP,_Prev,Var):- add_var_to_env_trimed(UP,Var). 206 207atom_contains_ci(Left,Right):- downcase_atom(Left,LeftDC),downcase_atom(Right,RightDC),atom_contains(LeftDC,RightDC). 208 209afix_ordered_varname(Left,Right,_Var):- atom_contains_ci(Left,Right),!. 210afix_ordered_varname(Left,Right,_Var):- atom_contains_ci(Right,Left),!. 211afix_ordered_varname(_Left,Right, _Var):- atomic_list_concat(Dashes,'_',Right),length(Dashes,L),L>2,!. 212%afix_ordered_varname(Left,Right, Var):- wdmsg(Left+Right),fail. 213afix_ordered_varname(Left,Right, Var):- atomic_list_concat([Left,'_',Right],New), 214 add_var_to_env_trimed(New,Var). 215 216add_var_to_env_trimed('',_):- !. 217add_var_to_env_trimed(New, _):- unusable_name(New),!. 218add_var_to_env_trimed(New,Var):- did_reduce_fname(New,M),!, add_var_to_env_trimed(M,Var). 219add_var_to_env_trimed(New,Var):- atom_length(New,Len), Len < 2, !, add_var_to_env_now(New,Var). 220add_var_to_env_trimed(New,Var):- atom_concat_w_blobs(NewNew,'_',New),add_var_to_env_trimed(NewNew,Var). 221add_var_to_env_trimed(New,Var):- atom_concat_w_blobs(NewNew,'_v',New),add_var_to_env_trimed(NewNew,Var). 222add_var_to_env_trimed(New,Var):- atom_concat_w_blobs('_',NewNew,New),add_var_to_env_trimed(NewNew,Var). 223add_var_to_env_trimed(New,Var):- atom_concat_w_blobs('?',NewNew,New),add_var_to_env_trimed(NewNew,Var). 224add_var_to_env_trimed(New,Var):- add_var_to_env_now(New,Var). 225%afix_ordered_varname(UP,_Prev,Var):- add_var_to_env_trimed(UP,Var). 226 227 228unusable_name(New):- \+ atom(New), \+ string(New),!. 229unusable_name(New):- atom_number(New,_),!. 230unusable_name(""). 231unusable_name(''). 232 233add_var_to_env_now(New, _):- unusable_name(New),!. 234add_var_to_env_now(New0,Var):- toProperCamelAtom(New0,New),check_varname(New),add_var_to_env_maybe(New,Var). 235 236/*,locally(t_l:dont_append_var,name_one(V,R)),*V='$VAR'(R)*/ 237add_var_to_env_perm(R,V):- atom_concat(R,'_VAR',RR), add_var_to_env(RR,V), nop(put_attr(V,vnl,R)). 238 239add_var_to_env_maybe(_New,Var):- var(Var),get_attr(Var,vnl,_),!. 240add_var_to_env_maybe(New,_Var):- atom_contains(New,'_VAR'),!. 241add_var_to_env_maybe(New,Var):- ignore(add_var_to_env(New,Var)). 242 243check_varname(_):-!. 244check_varname(UP):- name(UP,[C|Rest]), 245 ( 246 ( ( \+ char_type(C,prolog_var_start) ) 247 ; (member(R,Rest), \+ char_type(R, prolog_identifier_continue))) 248 ->bad_varname(UP);true). 249 250bad_varname(UP):- current_prolog_flag(debug,false),!,throw(check_varname(UP)). 251bad_varname(UP):- 252 nl,writeq(check_varname(UP)),nl, 253 dumpST, 254 nl,writeq(check_varname(UP)),nl, 255 break, throw(check_varname(UP)). 256 257% mortvar(G):- must_or_rtrace(G),!. 258 259:- export(mort/1). 260:- export(mortvar/1). 261:- meta_predicate(mort( )). 262:- meta_predicate(mortvar( )). 263mort(G):- mortvar(G). 264 265mortvar((G1,G2)):- !, mortvar(G1),mortvar(G2). 266%mortvar(G):- moretrace(catch(w_o_c(error,G),E,(nl,display(mort_error(E)),nl,fail))),!. 267mortvar(G):- catch(G,E,(nl,display(mort_error(E)),nl,throw(E))),!. 268%mortvar(G):- tracing,display(failed_mort1(G)),!,break,(G). 269%mortvar(G):- nortrace,moretrace,display(failed_mort2(G)),throw(G),trace,rtrace(G),moretrace,trace,break. 270 271to_var_or_name(L,LL):- var(L),!,LL=L. 272to_var_or_name('~','Not'). 273to_var_or_name([],'NList'). 274to_var_or_name(L,LL):- \+ atom(L),!,format(atom(LL),"~w",[L]). 275to_var_or_name(L,LL):- to_var_or_name_2(L,LL),!. 276% to_var_or_name(F,LL):- is_letterless(F), name(F,X),atomic_list_concat([c|X],'c',LL),!. 277% to_var_or_name(F,''):- is_letterless(F),!. 278to_var_or_name(L,L). 279 280is_letterless(F):- (atom(F);string(F)), downcase_atom(F,C),upcase_atom(F,C1),!,C==C1. 281 282to_var_or_name_2('',''). 283to_var_or_name_2('[|]','ListDot'). 284to_var_or_name_2(';','LogOR'). 285to_var_or_name_2('"','Quote'). 286to_var_or_name_2('_','_'). 287to_var_or_name_2('-','_'). 288to_var_or_name_2(' ','_'). 289to_var_or_name_2(',','LogAND'). 290to_var_or_name_2('->','LogTHEN'). 291to_var_or_name_2('*->','LogEACH'). 292to_var_or_name_2('.','ListDot'). 293to_var_or_name_2('`','Tilde'). 294to_var_or_name_2('\\+','Fail'). 295to_var_or_name_2('$','doLLar'). 296to_var_or_name_2('&','AND'). 297 298atom_concat_safety(A,B,C):- term_variables(A+B+C,Vs),Vs\=[_,_|_],!,atom_concat(A,B,C). 299atom_concat_safety(A,B,C):- break, 300 show_call(always,atom_concat(A,B,C)). 301 302atom_concat_w_blobs(L,R,LR):- to_var_or_name(L,LL),to_var_or_name(R,RR),to_var_or_name(LR,LLRR), 303 atom_concat_safety(LL,RR,LLRR). 304 305resolve_char_codes('','_'). 306resolve_char_codes('pf','%'). 307%resolve_char_codes(C48,C):- moretrace(catch((name(C48,[99|Codes]),number_codes(N,Codes),name(C,[N])),_,fail)),!,fail. 308resolve_char_codes(C48,_):- moretrace(catch((name(C48,[99|Codes]),number_codes(_,Codes)),_,fail)),!,fail. 309resolve_char_codes(D1,N):- atom_concat_w_blobs('d',N,D1),moretrace(catch(atom_number(N,_),_,fail)),!. 310resolve_char_codes(C,CC):- atom_concat_w_blobs(C,'-',CC). 311 312into_symbol_name(Atom,UPPER):- atomic(Atom),atomic_list_concat([Pkg|HC],'_',Atom),!,into_symbol_name([Pkg|HC],UPPER). 313into_symbol_name(HC,UPPER):- maplist(resolve_char_codes,HC,RHC),atomics_to_string(RHC,'',STR), 314 atom_trim_suffix(STR,'-',Trimed),string_upper(Trimed,UPPER),!. 315 316% *PACKAGE* becomes xx_package_xx 317% %MAKE-PACKAGE becomes pf_make_package 318 319prologcase_name(I,O):- once(prologcase_name0(I,O)),assertion(O\==''). 320 321prologcase_name0(String,Nonvar):-nonvar(Nonvar),!,prologcase_name(String,ProposedName),!,ProposedName==Nonvar. 322prologcase_name0(String,ProposedName):- 323 string_lower(String,In),string_codes(In,Was),!,filter_var_chars(Was,CS),!,name(ProposedName,CS),!. 324 325:- create_prolog_flag(no_pretty,false,[keep(true)]). 326atom_trim_prefix(Root,Prefix,Result):- atom_concat_w_blobs(Prefix,Result,Root) -> true ; Result=Root. 327atom_trim_suffix(Root,Suffix,Result):- atom_concat_w_blobs(Result,Suffix,Root) -> true ; Result=Root. 328 329pretty_numbervars_g(T,T):- really_no_pretty,!. 330pretty_numbervars_g(Term, TermO):- (ground(Term);really_no_pretty),!,duplicate_term(Term,TermO). 331%pretty_numbervars(Term, TermO):- copy_term(Term,TermO,_),guess_pretty(Term),Term=@=TermO,Term=TermO,!. 332 333:- export(pretty_numbervars/2). 334pretty_numbervars(TermIn, TermOut):- pretty_numbervars_ground(TermIn, TermOut),!. 335 336:- export(pretty_numbervars_ground/2). 337pretty_numbervars_ground(TermIn, TermOut):- pretty_numbervars_g(TermIn, TermOut),!. 338pretty_numbervars_ground(TermIn, TermOut):- % the new 339 quietly(( %fail, 340 copy_term(TermIn,Together,_), 341 term_varnames(TermIn,Vs0,_), 342 replace_variables(Vs0,TermIn,Term), 343 Together=Term, 344 guess_prettyf(Term), 345 term_varnames(Term,Vs,_), 346 copy_term(Term+Vs,TermOut+Vs2, _), 347 moretrace(implode_varnames_pred(to_var_dollar, Vs2)))),!. 348pretty_numbervars_ground(TermIn, TermIn):- set_prolog_flag(no_pretty,true),!. 349 350 351:- export(pretty_numbervars_unground/2). 352pretty_numbervars_unground(TermIn, TermOut):- pretty_numbervars_g(TermIn, TermOut),!. 353pretty_numbervars_unground(TermIn, TermOut):- % the old 354 quietly(( 355 copy_term(TermIn,Together,_), 356 duplicate_term(TermIn,Term), 357 guess_pretty(Term), 358 source_variables_lwv(Term,Vs), 359 Together=Term, 360 copy_term(Term+Vs,TermOut+Vs2, _), 361 moretrace(implode_varnames_pred(to_var_dollar, Vs2)))),!. 362 363replace_variables(_,Term,TermO):- ground(Term),!,duplicate_term(Term,TermO). 364replace_variables(Vs,Term,TermO):- var(Term), !, ignore(( member(N=V,Vs), V==Term, TermO='$VAR'(N))). 365replace_variables(Vs,Term,TermO):- compound_name_arguments(Term,F,Args),maplist(replace_variables(Vs),Args,ArgsO), 366 compound_name_arguments(TermO,F,ArgsO). 367 368 369guess_prettyf(O):- mortvar((copy_term(O,C),guess_pretty1(O),O=@=C)). 370 371 372ground_variables_as_atoms(_Pred,[],_Vars):-!. 373ground_variables_as_atoms(_Pred,_,[]):-!. 374ground_variables_as_atoms(Pred,Vs,[N=V|Vars]):- 375 ground_variables_as_atoms(Pred,Vs,Vars), 376 (member_eq0(V, Vs) -> call(Pred,N,V) ; true). 377 378implode_varnames_as_atoms(Term):- 379 nb_current('$variable_names',Vars), 380 term_variables(Term,Vs),!, 381 ground_variables_as_atoms(to_var_atom,Vs,Vars). 382 383to_var_dollar(Name,V):- ignore(V='$VAR'(Name)). 384to_var_atom(Name,V):- ignore(V=Name). 385print_var_nv(N,V):- wdmsg(N=V). 386 387:- meta_predicate(implode_varnames_pred( , )). 388 389implode_varnames(Term):- implode_varnames_pred(to_var_dollar,Term). 390implode_varnames_pred(P2, V):- var(V),!, ignore((get_var_name(V,Name),call(P2,Name,V))),!. 391implode_varnames_pred(_, G):- ground(G),!. 392implode_varnames_pred(P2, N=V):- atomic(N),!, ignore(call(P2,N,V)),!. 393implode_varnames_pred(P2, [NV|Vars]):- implode_varnames_pred(P2, NV), implode_varnames_pred(P2, Vars). 394implode_varnames_pred(P2, G):- term_variables(G,Vs),maplist(implode_varnames_pred(P2),Vs). 395 396guess_varname_list(Term,NewVs):- guess_pretty(Term), term_variables(Term,Vs), vees_to_varname_list(Vs,NewVs). 397 398vees_to_varname_list([],[]). 399vees_to_varname_list([V|Vs],[N=V|NewVs]):- 400 once(get_var_name(V,N);gensym('_',N)), 401 vees_to_varname_list(Vs,NewVs). 402 403guess_pretty(_):- really_no_pretty,!. 404guess_pretty(O):- guess_prettyf(O). 405 406maybe_xfr_varname(CV,V):- get_var_name(CV,Name),may_debug_var(Name,V). 407 408guess_pretty1(H):- pretty_enough(H), !. 409%guess_pretty1(H):- term_variables(H,Vs),copy_term(H+Vs,CH+CVs),try_get_varname_cache(CH),CVs\=@=Vs,maplist(maybe_xfr_varname,CVs,Vs),!. 410%guess_pretty1(_):- !. % dmiles to undo 411guess_pretty1(O):- mortvar(( ignore(pretty1(O)),ignore(pretty_two(O)),ignore(pretty_three(O)),ignore(pretty_final(O)))),!. 412 413make_pretty(I,O):- pretty_numbervars(I,O),!. 414%make_pretty(I,O):- pv_is_user_output,!,shrink_naut_vars(I,O), pretty1(O),pretty_three(O),pretty_final(O),!. 415make_pretty(I,O):- plvn(Vs),duplicate_term(I+Vs,O+Vs), pretty1(O),pretty_three(O),pretty_final(O),!. 416 417pv_is_user_output:- current_output(O),!, 418 (is_predicate_stream(O)-> true ; (stream_property(O,alias(user_output))-> true ; stream_property(O,alias(user_error)))). 419 420 421plvn(Vs):- nb_current('$variable_names',Vs),!. 422plvn(Vs):- prolog_load_context(variable_names,Vs). 423%:- export(guess_varnames/1). 424 425guess_varnames(I):- guess_pretty1(I). 426 427 428guess_varnames(I,O):- guess_pretty1(I), guess_var2names(I,O). 429 430 431guess_var2names(I,O):-guess_var2names(add_var_to_env_trimed,I,O). 432 433:- meta_predicate guess_var2names( , , ). 434guess_var2names(_Each,G,G):- pretty_enough(G),!. 435guess_var2names(Each, subrelation(V,N), subrelation(V,N)):- var(V), \+ variable_name(V,_), atomic(N),call(Each,N,V),!. 436guess_var2names(Each, isNamed(V,N), isNamed(V,N)):- var(V), \+ variable_name(V,_), atomic(N),call(Each,N,V),!. 437guess_var2names(Each, isNamed(V,H), isNamed(V,H)):- var(V), \+ variable_name(V,_), 438 compound(H),compound_name_arity(H,F,_), atom(F), 439 flag(skolem_count,SKN,SKN+1), 440 toCamelcase(F,UF),atom_concat_w_blobs(UF,SKN,UF1), 441 call(Each,UF1,V),!. 442 443 444guess_var2names(Each,H,H ):- H=..[F,V],var(V), 445 \+ variable_name(V,_), 446 \+ atom_concat_w_blobs('sk',_,F), 447 \+ atom_concat_w_blobs(_,'Of',F), 448 \+ atom_concat_w_blobs(_,'Fn',F), 449 flag(skolem_count,SKN,SKN+1), 450 toCamelcase(F,UF),atom_concat_w_blobs(UF,SKN,UF1), 451 call(Each,UF1,V),!. 452guess_var2names(Each,H,HH ):- H=..[F|ARGS],!,must_maplist_det(guess_var2names(Each),ARGS,ARGSO),!,HH=..[F|ARGSO]. 453guess_var2names(_Each, (G), (G)):- guess_pretty1(G),!. 454 455 456/* 457:- export(print_clause_plain/1). 458print_clause_plain(I):- 459 current_prolog_flag(color_term, Was), 460 make_pretty(I,O), 461 setup_call_cleanup(set_prolog_flag(color_term, false), 462 (nl,lcolormsg1((O))), 463 set_prolog_flag(color_term, Was)). 464*/ 465 466%lcolormsg1(Msg):- mesg_color(Msg,Ctrl),!,ansicall_maybe(Ctrl,fmt9(Msg)). 467lcolormsg1(Msg):- fmt9(Msg). 468 469% print_clause_plain(C):- portray_clause_w_vars(O). 470 471is_good_name(IsGood):- \+ atomic(IsGood),!,fail. 472is_good_name([]):- !,fail. 473is_good_name(IsBad):- atom_contains(IsBad,'_P_'), !, fail. 474is_good_name(IsBad):- atom_contains(IsBad,'_Ret'), !, fail. 475% is_good_name(IsBad):- atomic_list_concat([_,_,_|_],'_',IsBad), !, fail. 476is_good_name(_IsGood). 477 478 479may_debug_var(_,_,V):- nonvar(V),!. 480may_debug_var(L,_,_):- bad_vname(L),!. 481may_debug_var(L,R,V):- atom(L),atom_concat_w_blobs('f_',LL,L), may_debug_var(LL,R,V). 482may_debug_var(L,R,V):- atom(L),atomic_list_concat([_A1,A2,A3|AS],'_',L),atomic_list_concat([A2,A3|AS],'_',LL),may_debug_var(LL,R,V). 483may_debug_var(L,R,V):- debug_var([L,R],V). 484 485may_debug_var_v(R,V):- nonvar(R),var(V),may_debug_var(R,V). 486 487may_debug_var_weak(R,V):- nonvar(V),var(R),!,may_debug_var_weak(V,R). 488may_debug_var_weak(_,V):- var(V), variable_name(V,_),!. 489may_debug_var_weak(_,V):- var(V), get_var_name(V,_),!. 490may_debug_var_weak(R,V):- may_debug_var(R,V),!. 491 492may_debug_var(R,V):- is_dict(V), dict_pairs(V,VV,_), !, may_debug_var(R,VV). 493may_debug_var(V,R):- is_dict(V), dict_pairs(V,VV,_), !, may_debug_var(VV,R). 494may_debug_var(_,V):- var(V), variable_name(V,IsGood),is_good_name(IsGood),!. 495%may_debug_var(R,V):- var(V), variable_name(V,_), atom(R), \+ is_good_name(R). 496may_debug_var(R,V):- debug_var(R,V). 497 498moretrace(G):- once(G). 499 500pretty_enough(H):- moretrace(pretty_enough0(H)),!. 501 502pretty_enough0(H):- \+ compound(H),!. 503pretty_enough0(H):- ground(H), !. 504pretty_enough0('$VAR'(_)):- !. 505pretty_enough0(H):- compound_name_arity(H,_,0), !. 506 507name_one(V,R):- var(V), nonvar(R),!, name_one(R,V). 508name_one(R,V):- is_dict(V), dict_pairs(V,VV,_), !, name_one(R,VV). 509name_one(V,R):- is_dict(V), dict_pairs(V,VV,_), !, name_one(VV,R). 510name_one(R,V):- nonvar(R),var(V),!, name_one_var(R,V). 511name_one(_,_):- fail. 512 513:- if( \+ current_predicate(vnl:attr_unify_hook/2)). 514vnlattr_unify_hook(_,_). 515:- endif. 516 517:- thread_local(t_l:dont_append_var/0). 518 519name_one_var([_|_],V):- debug_var('List',V),!. 520name_one_var(R,V):- nonvar(R),var(V),p_n_atom(R,RN), locally(t_l:dont_append_var,debug_var(RN,V)),!. 521name_one_var(R,V):- locally(t_l:dont_append_var,debug_var(R,V)),!. 522 523pretty_element(NV):- ignore((NV=..[_,N,V],ignore(pretty1(N=V)))). 524 525swizzle_var_names0(V,L):- ignore((var(V),get_var_name(V,UP),atomic(UP),debug_var(UP,L))). 526swizzle_var_names(V,L):- swizzle_var_names0(V,L),swizzle_var_names0(L,V). 527pretty1(H):- pretty_enough(H),!. 528pretty1(ti(R,V)):- name_one(V,R). 529pretty1(ti(R,V)):- may_debug_var(R,V). 530pretty1(tti(R,V)):- name_one(V,R). 531pretty1(tti(R,V)):- may_debug_var(R,V). 532%pretty1(H):- trump_pretty(H),!. 533pretty1(as_rest(Name, Rest, _)):- may_debug_var_v(Name,Rest). 534pretty1(get_var(Env, Name, Val)):- may_debug_var('GEnv',Env),may_debug_var(Name,Val). 535pretty1(deflexical(Env,_Op, Name, Val)):- may_debug_var('SEnv',Env),may_debug_var(Name,Val). 536pretty1(set_var(Env,Name, Val)):- may_debug_var('SEnv',Env),may_debug_var(Name,Val). 537pretty1(Dict):- is_dict(Dict), dict_pairs(Dict,Tag,Pairs), maplist(pretty_element,Pairs), may_debug_var('Dict',Tag). 538pretty1(f_slot_value(_Env, Name, Val)):- may_debug_var(slot,Name,Val),!. 539%pretty1(get_kw(ReplEnv, RestNKeys, test, test, f_eql, true, True) 540pretty1(Env=RIGHT):- compound(RIGHT),RIGHT=[List|_],compound(List),var(Env),List=[H|_],compound(H),H=bv(_,_), may_debug_var('Env',Env), 541 maplist(pretty1,List). 542pretty1(Env=List):- compound(List),var(Env),List=[H|_],compound(H),H=bv(_,_), may_debug_var('Env',Env), 543 maplist_not_tail(pretty1,List). 544%pretty1(P):- compound_name_arguments(P,_,[_|List]),append(_,[Name, Val|_],List),atom(Name),var(Val),may_debug_var(Name,Val). 545pretty1(debug_var(R,V)):- may_debug_var(R,V). 546pretty1(bv(R,V)):- name_one(V,R). 547pretty1(isa(V,R)):- name_one(V,R). 548pretty1(generic_pred(_,_,HP,V1,V2)):- ground(HP), HP=has_prop(_,R),debug_var(R,V1),debug_var(hasProp,V1),debug_var(R,V2). 549pretty1(generic_pred(_,_,HP,V1,V2)):- ground(HP), HP=has_prop(R),debug_var(R,V1),debug_var(hasProp,V1),debug_var(R,V2). 550%pretty1(setOf(V,_,L)):- swizzle_var_names(V,L). 551pretty1(ace_var(V,R)):- atom(R),var(V),!,add_var_to_env_perm(R,V). 552pretty1(bE(_,V,R)):- name_one(V,R). 553pretty1(iza(V,R)):- name_one(V,R). 554pretty1(cg_name(V,R)):- atom(R),var(V),!,add_var_to_env_perm(R,V). 555pretty1(cg_name(V,R)):- name_one(V,R). 556pretty1(cg_type(V,R)):- name_one(V,R). 557pretty1(cg_equal(V,R)):- name_one(V,R). 558pretty1(cg_quantz(V,R)):- name_one(V,R). 559pretty1(frame_var(V,R)):- name_one(V,R). 560pretty1(pred(V,See,_,_)):- debug_var(See,V). 561pretty1(rel(V,_,On,_)):- debug_var([On,'_'],V). 562pretty1(card(V,Num,R)):- ground(Num:R),atomic_list_concat(['_',R,'_',Num],Eq_2),debug_var(Eq_2,V),!. 563pretty1(Cmpd):- Cmpd=..[OP, R, V], is_comparison(OP), name_one(V,R), !. 564pretty1(H):-compound_name_arguments(H,F,ARGS), 565 maplist(pretty_fname_or_var(F),ARGS,Names), 566 pretty1([F],1,Names),!. 567pretty1(_,_,[]):- !. 568pretty1(F,_,[V]):- !, nop(ignore(debug_var(V,F))). 569pretty1(F,A,[Atom,V|ARGS]):- atom(Atom),var(V),debug_var(Atom,V),pretty1(F,A,ARGS). 570pretty1(F,A,[V,Atom|ARGS]):- atom(Atom),var(V),debug_var(Atom,V),pretty1(F,A,ARGS). 571pretty1(F,A,[V|ARGS]):- nonvar(V),!,p_n_atom(V,N),pretty1([F,N],A,ARGS). 572pretty1(F,A,[V|ARGS]):- get_var_name(V,N),!,pretty1([F,N],A,ARGS). 573pretty1(F,A,[V|ARGS]):- 574 ignore(pretty1(F,A,ARGS)), 575 flatten([F],ALL), 576 maplist(p_n_atom,ALL,NewNames), 577 % reverse(NewNames,NewNamesR), 578 atomic_list_concat_goodnames(NewNames,'',Name), 579 may_debug_var_weak(Name,V). 580 581%atomic_list_concat_goodnames([H],Sep,Res):- append_good_name(Sep,H,'',Res). 582atomic_list_concat_goodnames([],_,''). 583atomic_list_concat_goodnames([H|T],Sep,Res):- 584 atomic_list_concat_goodnames(T,Sep,Last), 585 append_good_name(Sep,H,Last,Res). 586 587bad_vname(H):- var(H),!. 588bad_vname(H):- number(H),!. 589bad_vname(H):- string(H),!,atom_string(A,H),!,bad_vname(A). 590bad_vname(H):- \+ atom(H),!. 591bad_vname(H):- is_letterless(H),!. 592bad_vname(exists). 593bad_vname(H):- atom_number(H,_). 594bad_vname(H):- atom_concat_safety('c',N,H),bad_vname(N). 595bad_vname(H):- atom_concat_safety('C',N,H),bad_vname(N). 596bad_vname(H):- atom_concat_safety('Num',_,H). 597 598bad_vname_f(H):- bad_vname(H). 599bad_vname_f(predicate). 600 601append_good_name(_,H,Last,Res):- bad_vname(H),!,Res=Last. 602append_good_name(Sep,H,Last,Res):- atomic_list_concat([H,Sep,Last],Res). 603 604pretty_fname_or_var(_,VAR,Name):- var(VAR),!,Name=VAR. % (get_var_name(VAR,Name); Name=''),!, 605pretty_fname_or_var(F,'$VAR'(V),Name):- !, pretty_fname_or_var(F,V,Name). 606pretty_fname_or_var(F,Cmpd,Name):- 607 compound(Cmpd), 608 ignore(pretty1(Cmpd)), 609 ((compound_name_arity(Cmpd,N,ARGS),flatten([ARGS,N],Choices),member(Use,Choices),atom(Use)) -> pretty_fname_or_var(F,Use,Name) ; Name=''). 610pretty_fname_or_var(_,Else,Name):- !, ignore(p_n_atom(Else,Name)). 611 612 613is_comparison(OP):- \+ atom(OP),!. 614is_comparison(OP):- atom_concat_safety(_,'=',OP). 615is_comparison(OP):- atom_concat_safety('cg_',_,OP). 616is_comparison(OP):- atom_concat_safety('$',_,OP). 617 618 619length_gt0(U2):- atom_length(U2,L),L>0. 620 621get_var_name_for_append(_,''):- t_l:dont_append_var,!. 622get_var_name_for_append(V,N):- get_var_name(V,N),!. 623 624contains_atom_ci(A1,A2):- upcase_atom(A1,U1),upcase_atom(A2,U2),length_gt0(U1),length_gt0(U2),!,contains_atom(U1,U2). 625 626append_varname(R,Var):- ignore((p_n_atom(R,RR),append_varname1(RR,Var))),!. 627 628 629append_varname1(R,Var):- get_var_name_for_append(Var,Prev), contains_atom_ci(Prev,R),!. 630append_varname1(R,Var):- get_var_name_for_append(Var,Prev), contains_atom_ci(R,Prev),!. 631append_varname1(_,Var):- get_var_name_for_append(Var,Prev), contains_atom_ci(Prev,'_'),!. 632append_varname1(R,_Var):- bad_vname(R),!. % ignore 633 634append_varname1(R,Var):- get_var_name_for_append(Var,Prev),!, 635 ignore(( \+ contains_atom_ci(Prev,R), \+ contains_atom_ci(R,Prev), atomic_list_concat([Prev,'_',R],RS), 636 % writeln(add_var_to_env_now(RS,Var)), 637 add_var_to_env_now(RS,Var))),!. 638append_varname1(R,Var):- add_var_to_env_now(R,Var). 639 640trump_pretty(WRT):- \+ compound(WRT), fail. 641%trump_pretty(w(R,T)):- is_list(T), atomic(R), term_variables(T,Vs),Vs\==[],maplist(append_varname(R),Vs),!. 642trump_pretty(isa(V,R)):- var(V), atomic(R), append_varname(R,V). 643 644pretty_two(H):- pretty_enough(H),!. 645pretty_two(H):- is_list(H), !, maplist(pretty_two,H). 646pretty_two(H):- trump_pretty(H),!. 647pretty_two(H):- compound_name_arity(H,F,A),compound_name_arguments(H,_,ARGS), 648 reduce_fname(F,F0), 649 pretty_two(1,F0,A,ARGS), !. 650 651pretty_two(_,_,_,[]). 652pretty_two(N,F,A,[E|ARGS]):- 653 Np1 is N + 1, 654 ignore(maybe_nameable_arg(F,A,N,E)), 655 pretty_two(Np1,F,A,ARGS). 656 657did_reduce_fname(New,M):- reduce_fname(New,M), !, New\==M. 658 659lc_reduceable(LC0,LC1):- char_type(LC0,to_upper(LC0)),char_type(LC1,to_lower(LC1)). 660lc_reduceable(LC0,LC1):- char_type(LC0,to_lower(LC0)),char_type(LC1,to_lower(LC1)). 661 662remove_single_number(L,LL):- name(L,[N|Rest]),code_type(N,digit),name(LL,Rest). 663 664reduce_single_letter(L,LL):- name(L,[LC0,LC1,UC,LC2|Rest]),lc_reduceable(LC0,LC1),char_type(UC,upper),char_type(LC2,lower),!, 665 name(LL,[UC,LC2|Rest]). 666reduce_single_letter(L,LL):- name(L,[LC1,UC,LC2|Rest]),char_type(LC1,lower),char_type(UC,upper),char_type(LC2,lower),!, 667 name(LL,[UC,LC2|Rest]). 668 669reduce_fname(M,N):- atom_concat_w_blobs('$',N0,M),reduce_fname(N0,N). 670reduce_fname(M,N):- \+ atom(M),!,term_to_atom(M,N0),!,reduce_fname(N0,N). 671 672reduce_fname(M,N):- atom_codes(M,[C|R]), \+ code_type(C,alpha), atom_codes(N0,R),reduce_fname(N0,N). 673reduce_fname(M,N):- atom_codes(M,Codes), append(R,[C],Codes), \+ code_type(C,alnum), atom_codes(N0,R),reduce_fname(N0,N). 674 675reduce_fname(L,R):- reduce_single_letter(L,LL), reduce_fname(LL,R). 676reduce_fname(M,N):- atom_concat_safety('trans_',N0,M),reduce_fname(N0,N). 677reduce_fname(M,N):- atom_concat_safety('symmetric_',N0,M),reduce_fname(N0,N). 678reduce_fname(M,N):- atom_concat_safety('predicate_',N0,M),reduce_fname(N0,N). 679reduce_fname(M,N):- atom_concat_safety('generic_',N0,M),!,reduce_fname(N0,N). 680reduce_fname(M,N):- atom_concat_safety('HasProp',N0,M),!,reduce_fname(N0,N). 681reduce_fname(L,R):- atom_concat_some_left('v',LL,L),name(LL,[UC,LC|_]),char_type(UC,upper),char_type(LC,lower),reduce_fname(LL,R). 682reduce_fname(L,R):- atom_concat_some_left('Cl_',LL,L),reduce_fname(LL,R). 683reduce_fname(L,R):- atom_concat_some_left('U_',LL,L),reduce_fname(LL,R). 684reduce_fname(L,R):- atom_concat_some_left('F_',LL,L),reduce_fname(LL,R). 685reduce_fname(L,R):- atom_concat_some_left('T_',LL,L),reduce_fname(LL,R). 686reduce_fname(L,R):- atom_concat_some_left('Pf_',LL,L),reduce_fname(LL,R). 687reduce_fname(L,R):- atom_concat_some_left('Kw_',LL,L),reduce_fname(LL,R). 688reduce_fname(L,R):- atom_concat_some_left('Sys_',LL,L),reduce_fname(LL,R). 689reduce_fname(L,R):- atom_concat_some_left('c',LL,L),remove_single_number(LL,LLL),reduce_fname(LLL,R). 690reduce_fname(L,R):- atom_concat_some_left('C',LL,L),remove_single_number(LL,LLL),reduce_fname(LLL,R). 691reduce_fname(L,R):- atom_concat_some_left('Num',LL,L),remove_single_number(LL,LLL),reduce_fname(LLL,R). 692reduce_fname(L,R):- remove_single_number(L,LLL),reduce_fname(LLL,R). 693reduce_fname(M,N):- atom_concat_w_blobs(N0,'_pred',M),reduce_fname(N0,N). 694reduce_fname(M,N):- atom_concat_w_blobs(N0,'pred',M),reduce_fname(N0,N). 695 696reduce_fname(ti,''). 697reduce_fname(generic,''). 698reduce_fname(has_prop,''). 699reduce_fname(tti,''). 700reduce_fname(card,siize). 701reduce_fname(partOf,''). 702reduce_fname(N,N):-!. 703maybe_nameable_arg(F,A,N,E):- compound(E)-> pretty_two(E) ; 704 ((var(E),arg_type_decl_name(F,A,N,T),\+ bad_vname_f(T))-> afix_varname(T,E) ; true). 705 706ec_timed(EC23):- member(EC23,[holds_at,holds,releasedAt,happens]). 707 708:- multifile(user:argname_hook/4). 709:- dynamic(user:argname_hook/4). 710 711arg_type_decl_name(F,_,_,_):- atomic(F),\+atom(F),!, fail. 712arg_type_decl_name(F,A,N,Use):- clause(user:argname_hook(F,A,N,T),Body),catch(((call(Body),toProperCamelAtom(T,Use))),_,fail). 713arg_type_decl_name(loc_xy,N,N,(y)). 714arg_type_decl_name(loc_xy,2,1,(x)). 715arg_type_decl_name(loc_xy,3,2,(x)). 716 717arg_type_decl_name(vis_hv,N,N,(v)). 718arg_type_decl_name(vis_hv,2,1,(h)). 719arg_type_decl_name(vis_hv,3,2,(h)). 720 721arg_type_decl_name(grid_size,N,N,(v)). 722arg_type_decl_name(grid_size,2,1,(h)). 723arg_type_decl_name(grid_size,3,2,(h)). 724 725arg_type_decl_name((happens),2,2,(when)). 726arg_type_decl_name(EC23,2,2,time_at):- ec_timed(EC23). 727arg_type_decl_name(EC23,3,2,time_from):- ec_timed(EC23). 728arg_type_decl_name(EC23,3,3,time_until):- ec_timed(EC23). 729 730arg_type_decl_name(object,7,1,event). 731arg_type_decl_name(predicate,5,1,event). 732 733arg_type_decl_name(F,A,N,C):- current_predicate(argIsa/3), notrace(on_x_fail(call_u(argIsa(F, N, C)))),A>1. 734 735arg_type_decl_name(at,2,2,tloc). 736arg_type_decl_name(satisfy_each1,2,1,ctx). 737arg_type_decl_name('~',1,1,neg). 738arg_type_decl_name('\\+',1,1,failure). 739arg_type_decl_name(member,2,1,ele). 740arg_type_decl_name(member,2,2,list). 741arg_type_decl_name(phrase,3,2,dcg). 742arg_type_decl_name(phrase,3,3,dcgo). 743arg_type_decl_name(h,4,1,dom). 744arg_type_decl_name(h,4,2,prep). 745arg_type_decl_name(h,4,3,source). 746arg_type_decl_name(h,4,4,target). 747arg_type_decl_name(F,A,A,Use):- atomic_list_concat([_,E2|Rest],'_',F),last([E2|Rest],Use), \+ bad_vname(Use), !. 748arg_type_decl_name(F,A,A,F):- \+ bad_vname_f(F). 749 750 751 752 753:- meta_predicate(maplist_not_tail( , )). 754maplist_not_tail(_,ArgS):- var(ArgS),!. 755maplist_not_tail(G,[X|ArgS]):-call(G,X),maplist_not_tail(G,ArgS). 756 757 758pretty_three(H):- pretty_enough(H),!. 759pretty_three(ti(R,V)):- name_one(V,R). 760pretty_three(tti(R,V)):- name_one(V,R). 761%pretty_three([H|T]):-!,maplist_not_tail(pretty_three,[H|T]). 762pretty_three(_):-!. 763pretty_three(H):- 764 ignore(((compound_name_arity(H,F,_), fail, 765 nop((wl:init_args(N,F),integer(N), 766 A is N + 1, 767 must_be(compound,H),arg(A,H,R),may_debug_var_weak('KeysNRest',R)))), 768 compound_name_arguments(H,F,[P1|ARGS]), 769 must_maplist_det(pretty_three,[P1|ARGS]))),!. 770 771pretty_final(H):- pretty_enough(H),!. 772 773% pretty_final(H):- trump_pretty(H),!. 774%pretty_final([H | B]):- pretty_final(H),pretty_final(B),may_debug_var_weak('CAR',H),may_debug_var_weak('CDR',B). 775pretty_final(H):- compound_name_arity(H,F,A),compound_name_arguments(H,F,[P1|ARGS]), pretty_final(H,F,A,P1,ARGS). 776 777pretty_final(H,F,A,P1,ARGS):- atom_codes_w_blobs(F,[_,49|Rest]),atom_codes_w_blobs(F0,Rest),!,pretty_final(H,F0,A,P1,ARGS). 778pretty_final(H,F,A,P1,ARGS):- atom_codes_w_blobs(F,[T|Rest]),\+ char_type(T, alpha), !,atom_codes_w_blobs(F0,Rest),!,pretty_final(H,F0,A,P1,ARGS). 779pretty_final(_H,'',_A,P1,ARGS):- must_maplist_det(guess_varnames,[P1|ARGS]),!. 780pretty_final(H,F,A,P1,ARGS):- 781 maplist(guess_varnames,[P1|ARGS]), 782 must_be(compound,H),arg(A,H,R),may_debug_var_weak([F,'_'],R), 783 ignore((A>2, may_debug_var_weak([F,'_P_',A,'_v'],P1))), 784 !. 785 786atom_concat_or_rtrace_priv(X,Y,Z):- tracing->atom_concat_w_blobs(X,Y,Z);catch(atom_concat_w_blobs(X,Y,Z),_,(writeq(atom_concat_or_rtrace_priv(X,Y,Z)),break)). 787 788 789:- export(i_name_lc/2). 790 791%=
797i_name_lc(OType,IType):-i_name(OType,IOType),!,string_equal_ci(IOType,IType). 798 799 800 801%=
807to_iname(T,TT):- var(T),!,freeze(T,to_iname(T,TT)). 808to_iname(T,TT):- not(current_predicate(i_name/3)),!,T=TT. 809%to_iname(T,TT):- (not_log_op(T),i_name(t,T,TT))->true;TT=T. 810 811 812 813%=
819toUpperCamelcase(Type,TypeUC):-toCamelcase(Type,TypeUC). % ,toPropercase(TypeC,TypeUC),!. 820 821 822icn_tcn(I,IC):-atom(I),i_name('t',I,IC)->I\==IC. 823 824%=
830:- export(i_name/2). 831i_name(OType,IType):-i_name('',OType,IOType),!,IOType=IType. 832 833%=
839:- export(i_name/3). 840i_name(I,OType,IType):- sanity((nonvar(I),nonvar(OType))),!,to_case_break_atoms(OType,[L|List]),!,i_name_4(I,OType,[L|List],IType). 841%i_name(I,OType,IType):- typename_to_iname0(I,OType,IOType),!,IOType=IType. 842 843switchable_itypes(L,_I):- downcase_atom(L,L),atom_length(L,LL),LL < 4,!. 844i_name_4(I, OType,[L|_List],IType):- I==L,!,OType=IType. 845i_name_4(I, _OType,[L| List],IType):- switchable_itypes(L,I),atomic_list_concat([I|List],IType),!. 846i_name_4(I, _OType,[L| List],IType):- toPropercase(L,U),atomic_list_concat([I,U|List],IType),!. 847 848 849 850 851ti_name(I,OType,IType):- i_name(I,OType,IType). 852:- export(ti_name/3). 853 854%=
:- export(typename_to_iname0/3)
.
typename_to_iname0(I, [], O)
:- trace_or_throw(bad_typename_to_iname0(I, [], O))
.
typename_to_iname0(I,OType,IType)
:- fail, (type_prefix(Prefix,_)
),atom_concat_w_blobs(Prefix,Type,OType)
,capitalized(Type)
,!,typename_to_iname0(I,Type,IType)
.
typename_to_iname0(I,Type,IType)
:-nonvar(Type)
,atom_concat_w_blobs(I,_UType,Type)
,Type=IType.
typename_to_iname0(I,Type,IType)
:-nonvar(Type)
,toUpperCamelcase(Type,UType)
,atom_concat_w_blobs(I,UType,IType)
.
866%=
872split_name_type(Suggest,InstName,Type):- 873 quietly(split_name_type_0(Suggest,NewInstName,NewType)),!, 874 w_o_c(must((NewInstName=InstName,NewType=Type))),!. 875:- export(split_name_type/3). 876:- '$hide'(split_name_type/3). 877 878split_name_type_0(S,P,C):- string(S),!,atom_string(A,S),split_name_type_0(A,P,C),!. 879%split_name_type_0(FT,FT,ttExpressionType):-a(ttExpressionType,FT),!,dmsg(trace_or_throw(ttExpressionType(FT))),fail. 880split_name_type_0(T,T,C):- compound(T),compound_name_arity(T,C,_),!. 881split_name_type_0(T,T,C):- quietly((once(atomic_list_concat_safe([CO,'-'|_],T)),atom_string(C,CO))). 882split_name_type_0(T,T,C):- quietly((atom(T),atom_codes_w_blobs(T,AC),last(AC,LC),is_digit(LC),append(Type,Digits,AC), 883 catch(number_codes(_,Digits),_,fail),atom_codes_w_blobs(CC,Type),!,i_name(t,CC,C))). 884split_name_type_0(C,P,C):- atom(C),var(P),i_name(i,C,I),gensym(I,P),!. 885 886 887 888 889 890%=
896toProperCamelAtom(Atom,UP):- atom(Atom),!, reduce_atomLR(Atom,AtomR), p_n_atom_filter_var_chars(AtomR,UP). 897toProperCamelAtom(Var,Out):- var(Var), !, must((get_var_name(Var,Prev),atomic(Prev))),!,toProperCamelAtom(Prev,Out). 898toProperCamelAtom([AtomI|Rest], NAME):- is_list(Rest),!,maplist(toProperCamelAtom,[AtomI|Rest],UPS), atomic_list_concat(UPS,NAME0),!, toProperCamelAtom(NAME0,NAME). 899toProperCamelAtom([A|List],O):-!,toProperCamelAtom(A,AO),toProperCamelAtom(List,LO),atom_concat_w_blobs(AO,LO,O). 900toProperCamelAtom(String,UP):- string(String),!,string_to_atom(String,Atom),!,p_n_atom0(Atom,UP). 901toProperCamelAtom(-E,NAME):- toProperCamelAtom(E,N1),toProperCamelAtom([N1,'Out'],NAME). 902toProperCamelAtom(+E,NAME):- toProperCamelAtom(E,N1),toProperCamelAtom([N1,'In'],NAME). 903toProperCamelAtom(E,NAME):- compound(E),compound_name_arguments(E,N,Args),toProperCamelAtom([N|Args], NAME). 904toProperCamelAtom(Term,UP):- term_to_atom(Term,Atom),!,toProperCamelAtom(Atom,UP). 905 906 907 908%=
914to_prefixed(Prefix,I,O):-to_atomic_name(I,i_name(Prefix),O). 915 916:- meta_predicate to_atomic_name( , , ). 917 918%=
924to_atomic_name(I,Pred,O):-is_list(I),toProperCamelAtom(I,A),!,to_atomic_name(A,Pred,O). 925to_atomic_name(I,Pred,O):-string(I),!,string_to_atom(I,A),!,to_atomic_name(A,Pred,O). 926%to_atomic_name(Name,Pred,O):-atomic(Name),ereq(mudKeyword(W,KW)),string_equal_ci(Name,KW),!,to_atomic_name(W,Pred,O). 927to_atomic_name(Name,Pred,_):- not(atom(Name)),!,trace_or_throw(todo(not_atom_to_atomic_name(Name,Pred))). 928to_atomic_name(Name,Pred,O):- call(Pred,Name,O). 929 930 931simpler_textname(Name,Text):- simpler_textname(Name,'',Text). 932simpler_textname(Name,Sep,Text):-atomic(Name),to_case_breaks(Name,ListN),to_case_breaks_trimed(Name,ListN,Sep,Text),!. 933 934to_case_breaks_trimed(Name,[xti(TextL,ClassL),xti(TextR,ClassR)|ListN],Sep,Text):- ClassL==ClassR,!, 935 maplist(to_descriptive_name_xti(Name),[xti(TextL,ClassL),xti(TextR,ClassR)|ListN],Desc), 936 (string(Sep) -> atomics_to_string(Desc,Sep,Text) ; atomic_list_concat(Desc,Sep,Text)). 937 938to_case_breaks_trimed(Name,[xti(_,lower),xti(TextR,ClassR)|ListN],Sep,Text):- 939 maplist(to_descriptive_name_xti(Name),[xti(TextR,ClassR)|ListN],Desc), 940 (string(Sep) -> atomics_to_string(Desc,Sep,Text) ; atomic_list_concat(Desc,Sep,Text)). 941 942to_case_breaks_trimed(Name,ListN,Sep,Text):- is_list(ListN),!, 943 maplist(to_descriptive_name_xti(Name),ListN,Desc), 944 (string(Sep) -> atomics_to_string(Desc,Sep,Text) ; atomic_list_concat(Desc,Sep,Text)). 945 946 947 948:- fixup_exports. 949 950%to_descriptive_name_xti(For,Desc,Atom):- type_descriptive_name(Type,Desc,Atom),isa(For,Type),!. 951%to_descriptive_name_xti(_For,Pefix,Desc):- (type_prefix(Pefix,TypeName)), simpler_textname(TypeName,Desc). 952%to_descriptive_name_xti(For,xti(Pefix,lower),Desc):-!,to_descriptive_name_xti(For,Pefix,Desc). 953to_descriptive_name_xti(For,xti(Pefix,_),Desc):-!,to_descriptive_name_xti(For,Pefix,Desc). 954to_descriptive_name_xti(_For,X,X). 955 956%pretty_numbervars_here(Term,Term):- term_variables(Term,Vs),maplist(pretty_numbervars,Vs,Vs2),Vs=Vs2,!. 957pretty_numbervars_here(Term,PrettyVarTerm):- pretty_numbervars(Term,PrettyVarTerm),!. 958 959%portray_pretty_numbervars0(Term):- get_var_name(Term,Name), !, write(Name). 960portray_pretty_numbervars(Term):- 961 moretrace(\+ tracing), % fail, 962 \+ (nb_current('$inprint_message', Messages), Messages\==[]), 963 \+ ground(Term), 964 \+ really_no_pretty, 965 pretty_numbervars_here(Term,PrettyVarTerm), 966 % Term \=@= PrettyVarTerm, 967 locally(set_prolog_flag(no_pretty,true), 968 print(PrettyVarTerm)),!. 969 %prolog_pretty_print:print_term(PrettyVarTerm, [output(current_output)]),!.
978%name_variable(Var,_Name) :- nonvar(Var),!. 979%name_variable(Var,Name) :- !, put_attr(Var,vn,Name). 980 981name_variable(Var, Name1) :- get_attr(Var,vn,Name2), 982 combine_names(Name1,Name2,Name), 983 put_attr(Var, vn, Name). % add_var_to_env(Name,Var),!. 984name_variable(Var, Name) :- var(Var), !, 985 put_attr(Var, vn, Name). 986 987name_variable('$VAR'(Var), Name):- Name==Var, !. 988name_variable('$VAR'(Var), Name):- var(Var),Name=Var,!. 989% name_variable('$VAR'(Var), Name) :- trace_or_throw(numbervars_name_variable(Var, Name)),!. 990name_variable(_, _). 991 992:- nodebug(logicmoo(varnames)). 993 994 995variable_name_or_ref(Var, Name) :- get_var_name(Var, Name),!. 996variable_name_or_ref(Var, Name) :- format(atom(Name),'~q',[Var]).
1003vnproject_attributes(QueryVars, ResidualVars):- fail,dmsg(vn:proj_attrs(vn,QueryVars, ResidualVars)),fail.
1012vnattribute_goals(Var) --> {get_var_name(Var, Name)},!,[name_variable(Var, Name)],!. 1013 1014numbervars_using_vs(T,TT,Vs):- numbervars_using_vs_(Vs,T,TT). 1015 1016numbervars_using_vs_(Vs,T,TT):- var(T),get_var_name(T,VN,Vs),TT='$VAR'(VN),!. 1017numbervars_using_vs_(_Vs,T,TT):- (ground(T); \+ compound(T)),!,TT=T. 1018numbervars_using_vs_(Vs,T,TT):- compound_name_arguments(T,F,A),maplist(numbervars_using_vs_(Vs),A,AA),compound_name_arguments(TT,F,AA),!. 1019 1020get_var_name(T,VN,Vs):- member(N=V,Vs),V==T,!,VN=N. 1021get_var_name(T,VN,_Vs):- get_var_name(T,VN),!. 1022get_var_name(T,VN,_Vs):- term_to_atom(T,VN). 1023 1024 1025 1026 1027grab_vn_varnames(Msg,Vs2):- 1028 term_attvars(Msg,AttVars), 1029 %append(AttVars,Vars,AllVars), 1030 sort(AttVars,AllVarS), 1031 grab_each_vn_varname(AllVarS,Vs2). 1032grab_each_vn_varname([],[]):-!. 1033grab_each_vn_varname([AttV|AttVS],Vs2):- 1034 grab_each_vn_varname(AttVS,VsMid),!, 1035 (get_attr(AttV, vn, Name) -> Vs2 = [Name=AttV|VsMid] ; VsMid= Vs2),!. 1036 1037:- export(get_var_name_or_fake/2). 1038get_var_name_or_fake(T,VN):- get_var_name(T,VN),!. 1039get_var_name_or_fake(T,VN):- term_to_atom(T,VN).
1045variable_name(Var, Name) :- must(var(Var)),(get_attr(Var, vn, Name);var_property(Var,name(Name));get_attr(Var, varnames, Name)),!. 1046 1047:- export(get_varname_list_local/1). 1048get_varname_list_local(Vs):- get_varname_list(Vs). 1049% get_var_name0(Var,Name):- attvar(Var),get_varname_list_local(Vs),format(atom(Name),'~W',[Var, [variable_names(Vs)]]). 1050 1051varname_of(Vs,Var,Name):- compound(Vs), Vs=[NV|VsL], 1052 ((compound(NV) , (NV=(N=V)),atomic(N), V==Var,!,N=Name) ; varname_of(VsL,Var,Name)). 1053 1054:- export(get_var_name/2). 1055get_var_name(V,N):- notrace(get_var_name0(V,N)),!. 1056:- export(get_var_name0/2). 1057get_var_name0(Var,Name):- nonvar(Name),!,must(get_var_name0(Var, NameO)),!,Name=NameO. 1058get_var_name0(Var,Name):- nonvar(Var),!,get_var_name1(Var,Name),!. 1059get_var_name0(Var,Name):- var_property(Var,name(Name)),!. 1060get_var_name0(Var,Name):- get_attr(Var, vn, Name),!. 1061get_var_name0(Var,Name):- nb_current('$variable_names', Vs),varname_of(Vs,Var,Name),!. 1062get_var_name0(Var,Name):- get_attr(Var, varnames, Name),!. 1063get_var_name0(Var,Name):- nb_current('$old_variable_names', Vs),varname_of(Vs,Var,Name),!. 1064get_var_name0(Var,Name):- get_varname_list_local(Vs),varname_of(Vs,Var,Name),!. 1065get_var_name0(Var,Name):- sourceable_variables_lwv(Vs),varname_of(Vs,Var,Name),!. 1066get_var_name0(Var,Name):- execute_goal_vs(Vs),varname_of(Vs,Var,Name). 1067 1068:- export(get_var_name1/2). 1069get_var_name1(Var,Name):- nonvar(Name),!,must(get_var_name1(Var, NameO)),!,Name=NameO. 1070get_var_name1(Var,Name):- var(Var),!,get_var_name0(Var,Name). 1071get_var_name1('$VAR'(Name),Name):- atom(Name),!. 1072get_var_name1('$VAR'(Int),Name):- integer(Int),format(atom(A),"~w",['$VAR'(Int)]),!,A=Name. 1073get_var_name1('$VAR'(Var),Name):- (var(Var)->get_var_name0(Var,Name);Name=Var),!. 1074get_var_name1('$VAR'(Att3),Name):- !, get_var_name1(Att3,Name). 1075get_var_name1('aVar'(Att3),Name):- !, get_var_name1(Att3,Name). 1076get_var_name1('aVar'(Name,Att3),Value):- !, get_var_name1('$VAR'(Name),Value); get_var_name1('aVar'(Att3),Value). 1077get_var_name1(att(vn,Name,_),Name):- !. 1078get_var_name1(att(_,_,Rest),Name):- Rest\==[],get_var_name1(Rest,Name). 1079get_var_name1(Var,Name):- catch(call(call,oo_get_attr(Var, vn, Name)),_,fail),!. % ground(Name),!. 1080 1081 1082term_varnames(Msg,Vs,Unnamed):- 1083 term_attvars(Msg,AttVars),term_variables(Msg,Vars), 1084 append(AttVars,Vars,AllVars), 1085 sort(AllVars,AllVarsS), 1086 grab_each_varname(AllVarsS,Vs,Unnamed). 1087term_varnames(_Term,[],_Ug):- !. 1088term_varnames(_Term,Vs,_Ug):- %term_variables(Term,Vars), 1089 (nb_current('$variable_names',Vs)->true;Vs=[]). 1090grab_each_varname([],[],[]):-!. 1091grab_each_varname([AttV|AttVS],[Name=AttV|Vs],Unnamed):- 1092 get_var_name(AttV, Name),!, 1093 grab_each_varname(AttVS,Vs,Unnamed). 1094grab_each_varname([AttV|AttVS],Vs,[AttV|Unnamed]):- 1095 grab_each_varname(AttVS,Vs,Unnamed). 1096 1097 1098 1099get_var_by_name(N,V):- nb_current('$variable_names',Vs), member_open(NV, Vs), NV=(N=V). 1100get_var_by_name(N,V):- nb_current('$old_variable_names',Vs), member_open(NV, Vs), NV=(N=V). 1101 1102 1103:- fixup_exports. 1104 1105:- multifile(user:portray/1). 1106:- dynamic(user:portray/1). 1107 1108user:portray(Term):- %JUNIT \+ tracing, 1109 % \+ current_prolog_flag(debug, true), 1110 fail, 1111 portray_pretty_numbervars(Term),!. 1112 1113 1114:- nb_setval('$variable_names',[]).
Utility LOGICMOO PORTRAY VARS
Automatically names variables based off how they are used in code.