/* subst, repris de Sterling & Shapiro p. 140
   
   subst(Old, New, Ancien, Moderne) == 
   Moderne est le terme dans lequel on a substitué New à toutes les occurrences de Old
*/

subst(Old, New, Old, New). % le terme lui-même
subst(Old, New, Term, Term) :- atomic(Term), Term \= Old. 
      %the backslash (\) is normally used to indicate negation in Prolog.
subst(Old, New, Term, Autre) :- 
	compound(Term), 
	functor(Term, F, N), 
	functor(Autre, F, N),
	subst(N, Old, New, Term, Autre). % arité 4 !
	
subst(N, Old, New, Term, Autre) :- 
	N > 0,
	arg(N, Term, ArgOld),
	subst(Old, New, ArgOld, ArgNew),
	arg(N, Autre, ArgNew),
	M is N-1,
	subst(M, Old, New, Term, Autre).
subst(0, Old, New, Terme, Autre).

/* 
?- subst(julie, marie, la_mere(la_mere(julie)), X).
X = la_mere(la_mere(marie)) ;
false.

?- subst(julie, marie, X, la_mere(la_mere(marie))).
false.

?- subst(julie, X, la_mere(la_mere(julie)), la_mere(la_mere(marie))).
X = marie ;
false.

?- subst(X, Y, la_mere(la_mere(julie)), la_mere(la_mere(marie))).
X = la_mere(la_mere(julie)),
Y = la_mere(la_mere(marie)) ;
X = la_mere(julie),
Y = la_mere(marie) ;
X = julie,
Y = marie ;
false.

*/