End Free_Variables.
Section Substitution.
Fixpoint substituteTerm (s : fol.Term L) (x : nat)
(t : fol.Term L) {struct s} : fol.Term L :=
match s with
| fol.var v =>
match eq_nat_dec x v with
| left _ => t
| right _ => var v
end
| fol.apply f ts => apply f (substituteTerms _ ts x t)
end
with substituteTerms (n : nat) (ss : fol.Terms L n)
(x : nat) (t : fol.Term L) {struct ss} : fol.Terms L n :=
match ss in (fol.Terms _ n0) return (fol.Terms L n0) with
| Tnil => Tnil L
| Tcons m s ts =>
Tcons L m (substituteTerm s x t) (substituteTerms m ts x t)
end.

(* Specifications: *)
Lemma subTermVar1 :
forall (v : nat) (s : fol.Term L), substituteTerm (var v) v s = s.
Lemma subTermVar2 :
forall (v x : nat) (s : fol.Term L),
v <> x -> substituteTerm (var x) v s = var x.
Lemma subTermFunction :
forall (f : Functions L) (ts : fol.Terms L (arity L (inr _ f)))
(v : nat) (s : fol.Term L),
substituteTerm (apply f ts) v s = apply f (substituteTerms _ ts v s).