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]).

Utility LOGICMOO PORTRAY VARS

Automatically names variables based off how they are used in code.

   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(0)).  262:- meta_predicate(mortvar(0)).  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(2,+)).  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(2,*,*).  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)).  514vnl:attr_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(1,*)).  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%= 	 	 
 i_name_lc(?OType, ?IType) is semidet
Instance Name Not Loop Checked.
  797i_name_lc(OType,IType):-i_name(OType,IOType),!,string_equal_ci(IOType,IType).
  798
  799
  800
  801%= 	 	 
 to_iname(?T, ?T) is semidet
Converted To Iname.
  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%= 	 	 
 toUpperCamelcase(?Type, ?TypeUC) is semidet
Converted To Upper Camelcase.
  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%= 	 	 
 i_name(?OType, ?IType) is semidet
Instance Name.
  830:- export(i_name/2).  831i_name(OType,IType):-i_name('',OType,IOType),!,IOType=IType.
  832
  833%= 	 	 
 i_name(?I, ?OType, ?IType) is semidet
Instance Name.
  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%= 	 	 
 typename_to_iname0(?I, ?OType, ?IType) is semidet
Typename Converted To Iname Primary Helper.

:- 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%= 	 	 
 split_name_type(?Suggest, ?InstName, ?Type) is semidet
Split Name Type.
  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%= 	 	 
 toProperCamelAtom(:TermA, ?O) is semidet
Converted To Camel Atom Primary Helper.
  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%= 	 	 
 to_prefixed(?Prefix, ?I, ?O) is semidet
Converted To Prefixed.
  914to_prefixed(Prefix,I,O):-to_atomic_name(I,i_name(Prefix),O).
  915
  916:- meta_predicate to_atomic_name(?,2,?).  917
  918%= 	 	 
 to_atomic_name(?I, :PRED2Pred, ?O) is semidet
Converted To Atomic Name.
  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)]),!.
 name_variable(+Var, +Name) is det
Assign a name to a variable. Succeeds silently if Var is not a variable (anymore).
  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]).
 project_attributes(?QueryVars, ?ResidualVars) is semidet
Project Attributes.
 1003vn:project_attributes(QueryVars, ResidualVars):- fail,dmsg(vn:proj_attrs(vn,QueryVars, ResidualVars)),fail.
 attribute_goals(@V)// is det
copy_term/3, which also determines the toplevel printing of residual constraints. Hook To [attribute_goals/3] For Module Logicmoo_varnames. Attribute Goals.
 1012vn:attribute_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).
 variable_name(+Var, -Name) is semidet
True if Var has been assigned Name.
 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',[]).