Fixpoint addForalls (m n : nat) (f : Formula) {struct n} : Formula :=
match n with
| O => f
| S n' => forallH (n' + m) (addForalls m n' f)
end.

(* Specifications: *)
Lemma freeVarAddForalls1 :
forall (n m v : nat) (A : Formula),
In v (freeVarFormula LNN (addForalls m n A)) -> In v (freeVarFormula LNN A).
Lemma freeVarAddForalls2 :
forall (n m v : nat) (A : Formula),
In v (freeVarFormula LNN (addForalls m n A)) -> n + m <= v \/ v < m.
Lemma reduceAddForalls :
forall (n m : nat) (A B : Formula),
SysPrf NN (iffH A B) ->
SysPrf NN (iffH (addForalls m n A) (addForalls m n B)).
Lemma subAddForallsNice :
forall (n m : nat) (A : Formula) (v : nat) (s : Term),
n + m <= v \/ v < m ->
(forall v : nat, In v (freeVarTerm LNN s) -> n + m <= v \/ v < m) ->
substituteFormula LNN (addForalls m n A) v s =
addForalls m n (substituteFormula LNN A v s).