1/* Part of LogicMOO Base Logicmoo Path Setups
    2% ===================================================================
    3% File '$FILENAME.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: '$FILENAME.pl' 1.0.0
    8% Revision: $Revision: 1.1 $
    9% Revised At:  $Date: 2002/07/11 21:57:28 $
   10% Licience: LGPL
   11% ===================================================================
   12*/
   13% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/logicmoo_util_body_textstr.pl
   14:- module(logicmoo_util_body_textstr,
   15          [ enable_body_textstr/0,
   16            do_body_textstr/4,
   17            disable_body_textstr/0]).   18
   19:- style_check(+singleton).   20:- style_check(+discontiguous).   21% :- style_check(-atom).
   22% :- style_check(-string).
   23
   24/*
   25delete_eq([],Item,[]):-!,dmsg(warn(delete_eq([],Item,[]))).
   26delete_eq([L|List],Item,List):-Item==L,!.
   27delete_eq([L|List],Item,[L|ListO]):-delete_eq(List,Item,ListO),!.
   28% user:term_expansion(I,O):- current_predicate(logicmoo_bugger_loaded/0),not(t_l:into_form_code),e2c_term_expansion(I,O).
   29*/
   30
   31% :- ensure_loaded(logicmoo_util_body_file_scope).
   32:-meta_predicate(do_body_textstr(+,+,+,-)).   33
   34
   35
   36do_body_textstr(_,_ ,A,A):- ( \+ compound(A) ; is_list(A)),!.
   37do_body_textstr(Head,Vars ,(DECL,BodI),BodO):- compound(DECL),DECL=cycstring(StrVar), !,
   38   do_body_textstr(Head,Vars,stringArg(StrVar,BodI),BodO). 
   39do_body_textstr(_,_ ,call(H),call(H)):-!.
   40do_body_textstr(Head,Vars,stringArg(StrVar,BodI),stringArgUC(StrVar,NewVar,OOO)):- !, vsubst(BodI,StrVar,NewVar,BodO),
   41   do_body_textstr(Head,Vars,BodO,OOO).
   42do_body_textstr(Head,[StrVar|Vars],BodI,BodO):- !, do_body_textstr(Head,Vars,stringArg(StrVar,BodI),BodO). 
   43do_body_textstr(Head,Vars,(A;B),(AA;BB)):- !,do_body_textstr(Head,Vars,A,AA),do_body_textstr(Head,Vars,B,BB).
   44do_body_textstr(Head,Vars,V^(H),V^(HO)):- !,do_body_textstr(Head,Vars,H,HO).
   45do_body_textstr(Head,Vars,(A,B),(AA,BB)):- !,do_body_textstr(Head,Vars,A,AA),do_body_textstr(Head,Vars,B,BB).
   46do_body_textstr(Head,Vars,BodI,BodO):- compound(BodI),
   47   \+ predicate_property(BodI,static),
   48   functor(BodI,F, _),
   49   \+ arg(_,v(!,var,call_body_reorder_compare,call_body_reorder,words_append),F),
   50   ereq(isT(isa(F,'Predicate'))),
   51   ereq(t(argIsa,F,N,StringType)),ereq(ttStringType(StringType)),arg(N,BodI,StrVar),!,
   52   do_body_textstr(Head,Vars,stringArg(StrVar,BodI),BodO). 
   53do_body_textstr(Head,Vars,H,HO):- H=..HL, must_maplist(do_body_textstr(Head,Vars),HL,HOL),HO=..HOL.
   54
   55stringArg(User,CallWithUser):- vsubst(no_repeats(CallWithUser),User,Cyc,CallWithCyc),!, 
   56 (ground(User) -> (ssz(User,Cyc),CallWithCyc)  ; (CallWithCyc, ssz(User,Cyc))).
   57
   58ssz(User,Cyc):-cycStringToString(Cyc,User).
   59
   60stringArgUCTest:-stringArgUCTest('"I"',_).
   61stringArgUCTest:-stringArgUCTest(['"I"','"am"'],_).
   62stringArgUCTest(User,Cyc):- stringArgUC(User,Cyc,dmsg(User->Cyc)),!.
   63
   64stringArgUC(User,Cyc,CallWithCyc):- must_det(var(Cyc)),!,stringArgUC2(User,Cyc,CallWithCyc).
   65
   66stringArgUC2(User,Cyc,CallWithCyc):- var(User),!,CallWithCyc,cycStringToString(Cyc,User).
   67stringArgUC2([User,U2|MORE],Cyc,CallWithCyc):- Cyc=[User,U2|MORE],!,CallWithCyc.
   68stringArgUC2([User],Cyc,CallWithCyc):- Cyc=User,!,CallWithCyc,atom(Cyc).
   69stringArgUC2(User,Cyc,CallWithCyc):- Cyc=User,!,CallWithCyc,atom(Cyc).
   70
   71cycStringToString(Cyc,User):- (atom(Cyc)->User=[Cyc];User=Cyc),!.
   72      
   73
   74
   75
   76enable_body_textstr:- enable_in_file(do_body_textstr).
   77disable_body_textstr:- disable_in_file(do_body_textstr).
   78
   79:- disable_body_textstr.   80
   81
   82:- if(true).   83% some tests
   84
   85:- endif.