1% ===================================================================
    2% File 'logicmoo_util_strings.pl'
    3% Purpose: Common Logicmoo library Functions for Strings
    4% Maintainers: Douglas Miles/Annie Ogborn/Kino Coursey
    5% Contact: $Author: dmiles $@users.sourceforge.net ;
    6% Version: 'logicmoo_util_strings.pl' 1.0.0
    7% Revision:  $Revision: 1.7 $
    8% Revised At:   $Date: 2002/07/11 21:57:28 $
    9% ===================================================================
   10:-module(logicmoo_util_terms,[
   11         weak_nd_subst/4,
   12         subst/4
   13         /*
   14
   15         %% transparent defaultAssertMt/1,
   16         assertIfNew/1,
   17         list_to_conj/2,
   18
   19         */
   20   ]).   21
   22:-ensure_loaded('../logicmoo/logicmoo_util_library.pl').   23:-use_module(library('logicmoo/logicmoo_util_library.pl')).   24:-ensure_loaded(library('logicmoo/logicmoo_util_bugger.pl')).   25
   26% ===================================================================
   27% Substitution based on ==
   28% ===================================================================
   29
   30% Usage: subst(+Fml,+X,+Sk,?FmlSk)
   31
   32subst(A,B,C,D):- 
   33      catch(notrace(nd_subst(A,B,C,D)),_,fail),!.
   34subst(A,_B,_C,A).
   35
   36nd_subst(  Var, VarS,SUB,SUB ) :- Var==VarS,!.
   37nd_subst(  P, X,Sk, P1 ) :- functor(P,_,N),nd_subst1( X, Sk, P, N, P1 ).
   38
   39nd_subst1( _,  _, P, 0, P  ).
   40nd_subst1( X, Sk, P, N, P1 ) :- N > 0, P =.. [F|Args], 
   41            nd_subst2( X, Sk, Args, ArgS ),
   42            nd_subst2( X, Sk, [F], [FS] ),  
   43            P1 =.. [FS|ArgS].
   44
   45nd_subst2( _,  _, [], [] ).
   46nd_subst2( X, Sk, [A|As], [Sk|AS] ) :- X == A, !, nd_subst2( X, Sk, As, AS).
   47nd_subst2( X, Sk, [A|As], [A|AS]  ) :- var(A), !, nd_subst2( X, Sk, As, AS).
   48nd_subst2( X, Sk, [A|As], [Ap|AS] ) :- nd_subst( A,X,Sk,Ap ),nd_subst2( X, Sk, As, AS).
   49nd_subst2( _X, _Sk, L, L ).
   50
   51
   52
   53
   54weak_nd_subst(  Var, VarS,SUB,SUB ) :- Var=VarS,!.
   55weak_nd_subst(        P, X,Sk,        P1 ) :- functor(P,_,N),weak_nd_subst1( X, Sk, P, N, P1 ).
   56
   57weak_nd_subst1( _,  _, P, 0, P  ).
   58
   59weak_nd_subst1( X, Sk, P, N, P1 ) :- N > 0, P =.. [F|Args], weak_nd_subst2( X, Sk, Args, ArgS ),
   60            weak_nd_subst2( X, Sk, [F], [FS] ),
   61            P1 =.. [FS|ArgS].
   62
   63weak_nd_subst2( _,  _, [], [] ).
   64weak_nd_subst2( X, Sk, [A|As], [Sk|AS] ) :- X = A, !, weak_nd_subst2( X, Sk, As, AS).
   65weak_nd_subst2( X, Sk, [A|As], [A|AS]  ) :- var(A), !, weak_nd_subst2( X, Sk, As, AS).
   66weak_nd_subst2( X, Sk, [A|As], [Ap|AS] ) :- weak_nd_subst( A,X,Sk,Ap ),weak_nd_subst2( X, Sk, As, AS).
   67weak_nd_subst2( _X, _Sk, L, L )