Definition Formula_depth_rec2rec (P : Formula -> Set)
(f1 : forall t t0 : Term, P (equal t t0))
(f2 : forall (r : Relations L) (t : Terms (arity L (inl (Functions L) r))),
P (atomic r t))
(f3 : forall f : Formula, P f -> forall f0 : Formula, P f0 -> P (impH f f0))
(f4 : forall f : Formula, P f -> P (notH f))
(f5 : forall (v : nat) (a : Formula),
(forall b : Formula, lt_depth b (forallH v a) -> P b) ->
P (forallH v a)) (a : Formula) :
(forall b : Formula, lt_depth b a -> P b) -> P a :=
match a return ((forall b : Formula, lt_depth b a -> P b) -> P a) with
| equal t s => fun _ => f1 t s
| atomic r t => fun _ => f2 r t
| impH f g =>
fun hyp => f3 f (hyp f (depthImp1 f g)) g (hyp g (depthImp2 f g))
| notH f => fun hyp => f4 f (hyp f (depthNot f))
| forallH n f => fun hyp => f5 n f hyp
end.
Definition Formula_depth_rec2 (P : Formula -> Set)
(f1 : forall t t0 : Term, P (equal t t0))
(f2 : forall (r : Relations L) (t : Terms (arity L (inl (Functions L) r))),
P (atomic r t))
(f3 : forall f : Formula, P f -> forall f0 : Formula, P f0 -> P (impH f f0))
(f4 : forall f : Formula, P f -> P (notH f))
(f5 : forall (v : nat) (a : Formula),
(forall b : Formula, lt_depth b (forallH v a) -> P b) ->
P (forallH v a)) (a : Formula) : P a :=
Formula_depth_rec P (Formula_depth_rec2rec P f1 f2 f3 f4 f5) a.
Remark Formula_depth_rec2rec_nice :
forall (Q P : Formula -> Set)
(f1 : forall t t0 : Term, Q (equal t t0) -> P (equal t t0))
(f2 : forall (r : Relations L) (t : Terms (arity L (inl (Functions L) r))),
Q (atomic r t) -> P (atomic r t))
(f3 : forall f : Formula,
(Q f -> P f) ->
forall f0 : Formula,
(Q f0 -> P f0) -> Q (impH f f0) -> P (impH f f0)),
(forall (f g : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall z3 z4 : Q g -> P g,
(forall q : Q g, z3 q = z4 q) ->
forall q : Q (impH f g), f3 f z1 g z3 q = f3 f z2 g z4 q) ->
forall f4 : forall f : Formula, (Q f -> P f) -> Q (notH f) -> P (notH f),
(forall (f : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall q : Q (notH f), f4 f z1 q = f4 f z2 q) ->
forall
f5 : forall (v : nat) (a : Formula),
(forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b) ->
Q (forallH v a) -> P (forallH v a),
(forall (v : nat) (a : Formula)
(z1 z2 : forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b),
(forall (b : Formula) (q : lt_depth b (forallH v a)) (r : Q b),
z1 b q r = z2 b q r) ->
forall q : Q (forallH v a), f5 v a z1 q = f5 v a z2 q) ->
forall (a : Formula)
(z1 z2 : forall b : Formula, lt_depth b a -> Q b -> P b),
(forall (b : Formula) (p : lt_depth b a) (q : Q b), z1 b p q = z2 b p q) ->
forall q : Q a,
Formula_depth_rec2rec (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 a z1 q =
Formula_depth_rec2rec (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 a z2 q.

(* Specifications: *)
Lemma Formula_depth_rec2_imp :
forall (Q P : Formula -> Set)
(f1 : forall t t0 : Term, Q (equal t t0) -> P (equal t t0))
(f2 : forall (r : Relations L) (t : Terms (arity L (inl (Functions L) r))),
Q (atomic r t) -> P (atomic r t))
(f3 : forall f : Formula,
(Q f -> P f) ->
forall f0 : Formula,
(Q f0 -> P f0) -> Q (impH f f0) -> P (impH f f0)),
(forall (f g : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall z3 z4 : Q g -> P g,
(forall q : Q g, z3 q = z4 q) ->
forall q : Q (impH f g), f3 f z1 g z3 q = f3 f z2 g z4 q) ->
forall f4 : forall f : Formula, (Q f -> P f) -> Q (notH f) -> P (notH f),
(forall (f : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall q : Q (notH f), f4 f z1 q = f4 f z2 q) ->
forall
f5 : forall (v : nat) (a : Formula),
(forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b) ->
Q (forallH v a) -> P (forallH v a),
(forall (v : nat) (a : Formula)
(z1 z2 : forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b),
(forall (b : Formula) (q : lt_depth b (forallH v a)) (r : Q b),
z1 b q r = z2 b q r) ->
forall q : Q (forallH v a), f5 v a z1 q = f5 v a z2 q) ->
forall (a b : Formula) (q : Q (impH a b)),
Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5
(impH a b) q =
f3 a (Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 a) b
(Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 b) q.
Lemma Formula_depth_rec2_not :
forall (Q P : Formula -> Set)
(f1 : forall t t0 : Term, Q (equal t t0) -> P (equal t t0))
(f2 : forall (r : Relations L) (t : Terms (arity L (inl (Functions L) r))),
Q (atomic r t) -> P (atomic r t))
(f3 : forall f : Formula,
(Q f -> P f) ->
forall f0 : Formula,
(Q f0 -> P f0) -> Q (impH f f0) -> P (impH f f0)),
(forall (f g : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall z3 z4 : Q g -> P g,
(forall q : Q g, z3 q = z4 q) ->
forall q : Q (impH f g), f3 f z1 g z3 q = f3 f z2 g z4 q) ->
forall f4 : forall f : Formula, (Q f -> P f) -> Q (notH f) -> P (notH f),
(forall (f : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall q : Q (notH f), f4 f z1 q = f4 f z2 q) ->
forall
f5 : forall (v : nat) (a : Formula),
(forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b) ->
Q (forallH v a) -> P (forallH v a),
(forall (v : nat) (a : Formula)
(z1 z2 : forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b),
(forall (b : Formula) (q : lt_depth b (forallH v a)) (r : Q b),
z1 b q r = z2 b q r) ->
forall q : Q (forallH v a), f5 v a z1 q = f5 v a z2 q) ->
forall (a : Formula) (q : Q (notH a)),
Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 (notH a) q =
f4 a (Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 a) q.
Lemma Formula_depth_rec2_forall :
forall (Q P : Formula -> Set)
(f1 : forall t t0 : Term, Q (equal t t0) -> P (equal t t0))
(f2 : forall (r : Relations L) (t : Terms (arity L (inl (Functions L) r))),
Q (atomic r t) -> P (atomic r t))
(f3 : forall f : Formula,
(Q f -> P f) ->
forall f0 : Formula,
(Q f0 -> P f0) -> Q (impH f f0) -> P (impH f f0)),
(forall (f g : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall z3 z4 : Q g -> P g,
(forall q : Q g, z3 q = z4 q) ->
forall q : Q (impH f g), f3 f z1 g z3 q = f3 f z2 g z4 q) ->
forall f4 : forall f : Formula, (Q f -> P f) -> Q (notH f) -> P (notH f),
(forall (f : Formula) (z1 z2 : Q f -> P f),
(forall q : Q f, z1 q = z2 q) ->
forall q : Q (notH f), f4 f z1 q = f4 f z2 q) ->
forall
f5 : forall (v : nat) (a : Formula),
(forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b) ->
Q (forallH v a) -> P (forallH v a),
(forall (v : nat) (a : Formula)
(z1 z2 : forall b : Formula, lt_depth b (forallH v a) -> Q b -> P b),
(forall (b : Formula) (q : lt_depth b (forallH v a)) (r : Q b),
z1 b q r = z2 b q r) ->
forall q : Q (forallH v a), f5 v a z1 q = f5 v a z2 q) ->
forall (v : nat) (a : Formula) (q : Q (forallH v a)),
Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5
(forallH v a) q =
f5 v a
(fun (b : Formula) _ (q : Q b) =>
Formula_depth_rec2 (fun x : Formula => Q x -> P x) f1 f2 f3 f4 f5 b q) q.