Fixpoint subAllFormula (f : Formula) (m : (nat -> Term)) {struct f} : Formula :=
match f with
| fol.equal t s => equal (subAllTerm t m) (subAllTerm s m)
| fol.atomic r ts => atomic r (subAllTerms _ ts m)
| fol.impH f g =>
impH (subAllFormula f m) (subAllFormula g m)
| fol.notH f => notH (subAllFormula f m)
| fol.forallH n f =>
let nv :=
newVar
(freeVarFormula L f ++
freeVarMap (freeVarFormula L (forallH n f)) m) in
forallH nv
(subAllFormula f
(fun v : nat =>
match eq_nat_dec v n with
| left _ => var nv
| right _ => m v
end))
end.

Lemma subSubAllFormula :
forall (T : fol.System L) (f : fol.Formula L) (m : nat -> fol.Term L)
(v : nat) (s : fol.Term L),
folProof.SysPrf L T
(fol.iffH L (substituteFormula L (subAllFormula f m) v s)
(subAllFormula f (fun n : nat => substituteTerm L (m n) v s))).