1/*  Logicmoo Debug Tools
    2% ===================================================================
    3% File 'logicmoo_util_varnames.pl'
    4% Purpose: An Implementation in SWI-Prolog of certain debugging tools
    5% Maintainer: Douglas Miles
    6% Contact: $Author: dmiles $@users.sourceforge.net ;
    7% Version: 'logicmoo_util_varnames.pl' 1.0.0
    8% Revision: $Revision: 1.1 $
    9% Revised At:  $Date: 2002/07/11 21:57:28 $
   10% ===================================================================
   11*/
   12% NEW
   13:- module(attvar_serializer, [
   14          deserialize_attvars/2,deserialize_attvars/3,
   15          serialize_attvars/2,serialize_attvars_now/2,
   16          put_dyn_attrs/2,
   17          find_or_create_var/3,
   18          verbatum_var/1,
   19          holds_attrs/1,
   20          system_expanded_attvars/4,
   21          is_term_expanding_in_file/2,
   22          system_expanded_attvars/2]).

Utility LOGICMOO ATTVAR SERIALIZER

This module works with Utility LOGICMOO ATTVAR READER to allows us to keep attributed variables and files inside the prolog database.

   30- set_module(class(library)).   31
   32
   33:- module_transparent((deserialize_attvars/2,deserialize_attvars/3,
   34          serialize_attvars_now/2,
   35          put_dyn_attrs/2,
   36          find_or_create_var/3,
   37          system_expanded_attvars/4,
   38          system_expanded_attvars/2)).   39
   40
   41:- multifile(lmcache:use_attvar_expander/1).   42:- dynamic(lmcache:use_attvar_expander/1).   43
   44:- multifile(lmcache:never_use_attvar_expander/1).   45:- dynamic(lmcache:never_use_attvar_expander/1).   46
   47lmcache:never_use_attvar_expander(attvar_serializer).
   48
   49% % % OFF :- system:use_module(library(gvar_lib)).% WAS OFF  :- system:reexport(library(hook_database)).% WAS OFF  :- system:reexport(library(logicmoo/util_varnames)).
   50
   51:- if( \+ prolog_load_context(reload, true)).   52:- multifile(baseKB:mpred_is_impl_file/1).   53:- dynamic(baseKB:mpred_is_impl_file/1).   54:- prolog_load_context(file,F),call(assert,baseKB:mpred_is_impl_file(F)).   55:- endif.   56
   57% use this module to avoid some later conflicts
   58%:- if(exists_source(library(base32))).% WAS OFF  :- system:use_module(library(base32)).
   59%:- endif.
   60
   61find_or_create_var(_Vs,N,V):-var(N),variable_name(N,_Name),N=V.
   62find_or_create_var(Vs,N,V):-var(N),!,find_or_create_named_var(Vs,N,V).
   63find_or_create_var(Vs,L,V):-is_list(L),!,member(VN=N,L),VN=vn,!,find_or_create_named_var(Vs,N,V).
   64find_or_create_var(Vs,'$VAR'(A),V):-
   65   (atom(A)->find_or_create_named_var(Vs,A,V);
   66   (atomic(A)-> (format(atom(N),'~w',[A]),find_or_create_named_var(Vs,N,V));
   67   find_or_create_named_var(Vs,A,V))).
   68find_or_create_var(Vs,N,V):-!,find_or_create_named_var(Vs,N,V).
   69
   70find_named_var(member,Vs,N,V):-member(NN=VV,Vs),V==VV,!,must(NN=N).
   71find_named_var(member,Vs,N,V):-member(NN=VV,Vs),NN==N,!,must(VV=V).
   72find_named_var(variable_name,_Vs,N,V):- var(V),variable_name(V,Name),N==Name.
   73find_named_var(get_varname_list,_Vs,N,V):-get_varname_list(VsE),find_named_var(member,VsE,N,V).
   74% find_named_var(vnn(Name,How),Vs,N,V):- var(N),variable_name(N,Name),!,find_named_var(How,Vs,Name,V).
   75
   76put_into_list(Vs,N,V):- Vs = [_|VT], nb_setarg(2,Vs,[N=V|VT]).
   77
   78find_or_create_named_var(Vs,N,V):-  find_named_var(How,Vs,N,V),
   79   (How==member -> true; put_into_list(Vs,N,V)).
   80   % (member(localvs,Vs)->put_attr(V,vn,N);true),!.
   81find_or_create_named_var(Vs,N,V):- var(N),variable_name(N,Name), put_into_list(Vs,N,V), put_into_list(Vs,Name,V),!.
   82find_or_create_named_var(Vs,N,V):- variable_name(V,Name), put_into_list(Vs,N,V), put_into_list(Vs,Name,V),!.
   83find_or_create_named_var(Vs,N,V):- put_into_list(Vs,N,V),!,(member('$variable_names',Vs)->quietly(add_var_to_env(N,V);true)).
   84
   85
   86deserialize_attvars(V,O):- \+compound(V),!,O=V.
   87deserialize_attvars(V,O):- get_varname_list(Vs),!,loop_check(deserialize_attvars([localvs,'$variable_names'|Vs], V,O)),!.
   88
   89deserialize_attvars(_Vs, V,O):- cyclic_term(V),!,O=V.
   90deserialize_attvars(Vs, V,O):-  var(V), get_var_name(V,N),!,find_or_create_var(Vs,N,V),!,V=O.
   91deserialize_attvars(_Vs, V,O):- \+ compound(V),!,O=V.
   92deserialize_attvars(_ ,(H:-BI),O):- fail, split_attrs(BI,AV,BO),AV\==true,AV\=bad:_,term_attvars((H:-BO),[]),must(call(AV)),!,(BO==true->(O=H);O=(H:-BO)).
   93deserialize_attvars(Vs,Dict,V):- is_dict(Dict,M),!,dict_pairs(Dict,M,Pairs),
   94   (atom(M)->find_or_create_var(Vs,V,M);V=M),
   95   put_dyn_attrs_1(V,Pairs).
   96deserialize_attvars(Vs,'$VAR'(N),V):- !, find_or_create_var(Vs,'$VAR'(N),V),put_dyn_attrs(V,N).
   97deserialize_attvars(Vs,'aVar'(N),V):- !, find_or_create_var(Vs,N,V),put_dyn_attrs(V,N).
   98deserialize_attvars(Vs,'aVar'(N,S),V):- !, find_or_create_var(Vs,N,V),put_dyn_attrs(V,N),put_dyn_attrs(V,S),!.
   99deserialize_attvars(Vs,C,A):- compound_name_arguments(C,F,Args),
  100  maplist(deserialize_attvars(Vs),Args,OArgs),compound_name_arguments(A,F,OArgs).
  101
  102
  103:- meta_predicate put_dyn_attrs(?,*).  104put_dyn_attrs(V,S):- V==S,!.
  105put_dyn_attrs(V,S):- attvar(S),get_attrs(S,SS),!,put_dyn_attrs(V,SS),!.
  106put_dyn_attrs(_,S):- \+ compound(S),!.
  107put_dyn_attrs(V,S):- S=att(_,_,_), \+ attvar(V),!, put_attrs(V,S).
  108put_dyn_attrs(V,S):- put_dyn_attrs_1(V,S),!.
  109put_dyn_attrs(V,S):- trace_or_throw(bad_put_dyn_attrs(V,S)),!.
  110
  111:- meta_predicate put_dyn_attrs_1(?,*).  112put_dyn_attrs_1(_V,NC):- \+ compound(NC),!.
  113put_dyn_attrs_1(V,att(N,V,Rest)):- !, put_attr(V,N,V),put_dyn_attrs_1(V,Rest).
  114put_dyn_attrs_1(V,M=AV):- atom(M), ensure_attr_setup(M),!, must(put_attr(V,M,AV)).
  115put_dyn_attrs_1(V,M-AV):- ensure_attr_setup(M),!, must(put_attr(V,M,AV)).
  116put_dyn_attrs_1(V,M:AV):- atom(M),!, M:put_dyn_attrs_1(V,AV).
  117put_dyn_attrs_1(V,[H|T]):- !, put_dyn_attrs(V,H),put_dyn_attrs_1(V,T),!.
  118put_dyn_attrs_1(V,S):- is_dict(S),dict_keys(S,Keys),!,put_dyn_attrs_1(V,Keys).
  119put_dyn_attrs_1(_V,MAV):- must(MAV),!.
  120
  121ensure_attr_setup(M):- atom(M),current_predicate(attribute_goals,M:attribute_goals(_,_,_)),!.
  122ensure_attr_setup(M):- atom(M),assert_if_new((M:attribute_goals(V,[put_attr(V,M,A)|R],R):- get_attr(V, M,A))).
  123
  124is_term_expanding_in_file(I,_):- var(I),!,fail.
  125is_term_expanding_in_file(I,Type):- source_file(_,_),nb_current('$term',CT),(CT==I->Type=term;((CT=(_:-B),B==I,Type=goal))).
  126
  127system_expanded_attvars(M:goal,P,I,O):- var(P),
  128   \+ is_term_expanding_in_file(I,_),
  129   \+ lmcache:never_use_attvar_expander(M),
  130   prolog_load_context(module,LC),
  131   \+ lmcache:never_use_attvar_expander(LC),
  132   current_prolog_flag(read_attvars,true), 
  133   \+ current_prolog_flag(xref,true), 
  134   system_expanded_attvars(I,O),
  135   dmsg(goal_xform(I --> O)).
  136
  137system_expanded_attvars(M:term,P,I,CO):- nonvar(P), compound(I), I\= (:-(_)),
  138   \+ lmcache:never_use_attvar_expander(M),
  139   current_prolog_flag(read_attvars,true), 
  140   \+ current_prolog_flag(xref,true), 
  141   is_term_expanding_in_file(I,term),
  142   prolog_load_context(module,LC),
  143   \+ lmcache:never_use_attvar_expander(LC),
  144   (prolog_load_context(source,LC1)-> (\+ lmcache:never_use_attvar_expander(LC1)) ; true),
  145   system_expanded_attvars(I,O),
  146   clausify_attributes(O,CO),
  147   dmsg(term_xform(I --> CO)),
  148   % update what we just read 
  149   b_setval('$term',CO).
  150
  151:- user:dynamic(expand_query/4).  152:- user:multifile(expand_query/4).  153   
  154free_of_attvars(Term):- term_attvars(Term,Vs),!,Vs==[].
  155
  156free_of_attrs(Term):- var(Term),!,(get_attrs(Term,Attrs)-> Attrs==[] ; true).
  157free_of_attrs(Term):- term_attvars(Term,Vs),!,(Vs==[]->true;maplist(free_of_attrs,Vs)).
 serialize_attvars(+AttvarTerm, -PrintableTerm) is semidet
serialize attributed variables (this is for printing and term_expansions currently)
  164serialize_attvars(I,O):- serialize_attvars_now(I,O),
  165  sanity(ignore(show_failure(free_of_attvars(O)))),
  166  sanity(show_failure(free_of_attrs(O))).
  167
  168serialize_attvars_now(V,S):- var(V),must(serialize_1v(V,S)),!.
  169serialize_attvars_now(I,O):- \+ compound(I),!,O=I.
  170serialize_attvars_now(C,A):- compound_name_arguments(C,F,Args),maplist(serialize_attvars_now,Args,OArgs),compound_name_arguments(A,F,OArgs).
  171
  172
  173serialize_attvar_term(I,O):- copy_term(I,O), serialize_attvar_term_now(O),
  174   sanity(ignore(show_failure(free_of_attvars(O)))),
  175   sanity(show_failure(free_of_attrs(O))).
  176
  177% ?- 
  178% rtrace(( X = hi(T),put_attr(T,sk,foo),serialize_attvar_term(X,SS), sanity(\+  has_skolem_attrvars(SS)))).
  179
  180
  181serialize_attvar_term_now(V):- attvar(V),trace_or_throw(serialize_attvar_term(V)).
  182serialize_attvar_term_now(I):- \+ compound(I),!.
  183serialize_attvar_term_now(C):- functor(C,_,A),serialize_attvar_term_now(A,C).
  184
  185serialize_attvar_term_now(0,_):-!.
  186serialize_attvar_term_now(A,C):- arg(A,C,E),serialize_attvar_term_now(A,C,E),Am1 is A-1,serialize_attvar_term_now(Am1,C).
  187
  188serialize_attvar_term_now(A,C,E):- attvar(E),!,get_put_attr_serial(E,New),setarg(A,C,New),!.
  189serialize_attvar_term_now(_,C,E):- compound(E)->serialize_attvar_term_now(C);true.
  190
  191get_put_attr_serial(E,New):- get_attr(E,'$$sv$$',New),!.
  192get_put_attr_serial(E,Next):- serialize_3(E,Name,Atts),MyCopy =_, replace_subst4as(Atts,E,MyCopy,NewAtts),Next='aVar'(Name,att('$linkval',MyCopy,NewAtts)),del_attrs(E),put_attr(E,'$$sv$$',Next),!.
  193
  194replace_subst4as( T1, S1, S2, T2 ) :-
  195    segment_subst4as( T1, Pre, S1, Post ),
  196    append_subst4as( S2, Post, S2_plus_Post ),
  197    append_subst4as( Pre, S2_plus_Post, T2 ).
  198segment_subst4as( T, Pre, S, Post ) :-
  199    segment_1_subst4as( S, T, Pre, Post ).
  200segment_1_subst4as( [], L, [], L ) :- !.
  201segment_1_subst4as( [H|T_], [H|T], [], Post ) :-
  202    segment_1_subst4as( T_, T, [], Post ),
  203    !.
  204segment_1_subst4as( S, [H|T], [H|U], Post ) :-
  205    segment_1_subst4as( S, T, U, Post ).
  206append_subst4as( [], L, L ).
  207append_subst4as( [H|T], L, [H|T1] ) :-
  208    append_subst4as( T, L, T1 ).
  209
  210
  211serialize_1v(V,'$VAR'(Name)):- get_attrs(V, att(vn, Name, [])),!.
  212serialize_1v(V,'aVar'('$VAR'(N),SO)):- get_attrs(V, S),variable_name_or_ref(V,N),put_attrs(TEMP,S),
  213   del_attr(TEMP,vn),!,remove_attrs(TEMP, SO),!.
  214serialize_1v(V,'$VAR'(N)):-  variable_name_or_ref(V,N).
  215serialize_1v(V,'aVar'(S)):- remove_attrs(V, S),!.
  216serialize_1v(V,V).
  217
  218
  219serialize_3(V,N,Atts):- (get_var_name(V,N);variable_name_or_ref(V,N)),del_attr(V,vn),(get_attrs(V, Atts)->true;Atts=[]),!.
  220
  221
  222remove_attrs(Var,Attrs):-get_attrs(Var,Attrs),!,remove_all_attrs(Var).
  223remove_attrs(Var,Attrs):-copy_term(Var,Copy,Attrs),Copy=Var,remove_all_attrs(Var).
  224
  225% ?- rtrace(( X = hi(T),put_attr(T,sk,foo),serialize_attvar_term(X,SS), \+  has_skolem_attrvars(SS))).
  226% ?- X = hi(T),put_attr(T,sk,foo),rtrace(serialize_attvars(X,SS)), \+  has_skolem_attrvars(SS).
  227
  228
  229% ?- X = hi(T),put_attr(T,sk,foo),remove_all_attrs(T).
  230
  231remove_all_attrs(Var):- attvar(Var),del_attrs(Var), sanity( \+ attvar(Var)),!.
  232remove_all_attrs(Term):- term_attvars(Term,Vars),maplist(remove_all_attrs,Vars).
 verbatum_term(TermT) is semidet
System Goal Expansion Sd.
  238verbatum_term(I):- attvar(I),!,fail.
  239verbatum_term(I):- \+ compound(I),!. % this is intended to include the non-attrbuted variables
  240verbatum_term('$was_imported_kb_content$'(_,_)).
  241verbatum_term('varname_info'(_,_,_,_)).
  242verbatum_term(V):-verbatum_var(V).
  243
  244holds_attrs(V):-var(V),!.
  245holds_attrs(V):-verbatum_var(V),!.
  246
  247
  248% move to logicmoo_utils_common.pl? 
  249verbatum_var(Var):-var(Var),!,fail.
  250verbatum_var('$VAR'(_)).
  251verbatum_var('aVar'(_)).
  252verbatum_var('aVar'(_,_)).
 system_expanded_attvars(:TermT, :TermARG2) is semidet
System Goal Expansion Sd.
  262system_expanded_attvars(I,O):- (var(I);compound(I)),!,loop_check((deserialize_attvars(I,O))),O\=@=I,!.
  263
  264:- fixup_exports.