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

(* Specifications: *)
Lemma freeVarAddExists1 : forall (n m v : nat) (A : Formula), In v (freeVarFormula LNN (addExists m n A)) -> In v (freeVarFormula LNN A).
Lemma freeVarAddExists2 : forall (n m v : nat) (A : Formula), In v (freeVarFormula LNN (addExists m n A)) -> n + m <= v \/ v < m.
Lemma reduceAddExistsOneWay : forall (n m : nat) (A B : Formula), SysPrf NN (impH A B) -> SysPrf NN (impH (addExists m n A) (addExists m n B)).
Lemma reduceAddExists : forall (n m : nat) (A B : Formula), SysPrf NN (iffH A B) -> SysPrf NN (iffH (addExists m n A) (addExists m n B)).
Lemma subAddExistsNice : 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 (addExists m n A) v s = addExists m n (substituteFormula LNN A v s).