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).