10:-module(logicmoo_util_terms,[
11 weak_nd_subst/4,
12 subst/4
13 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
29
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 )