GhostTT.autosubst.GAST

From GhostTT.autosubst Require Import core unscoped.
From GhostTT Require Import BasicAST.
From Coq Require Import Setoid Morphisms Relation_Definitions.

Module Core.

Inductive term : Type :=
  | var : nat term
  | Sort : mode level term
  | Pi : level level mode mode term term term
  | lam : mode term term term
  | app : term term term
  | Erased : term term
  | hide : term term
  | reveal : term term term term
  | Reveal : term term term
  | toRev : term term term term
  | fromRev : term term term term
  | gheq : term term term term
  | ghrefl : term term term
  | ghcast : term term term term term term term
  | tbool : term
  | ttrue : term
  | tfalse : term
  | tif : mode term term term term term
  | tnat : term
  | tzero : term
  | tsucc : term term
  | tnat_elim : mode term term term term term
  | tvec : term term term
  | tvnil : term term
  | tvcons : term term term term
  | tvec_elim : mode term term term term term term term
  | bot : term
  | bot_elim : mode term term term.

Lemma congr_Sort {s0 : mode} {s1 : level} {t0 : mode} {t1 : level}
  (H0 : s0 = t0) (H1 : s1 = t1) : Sort s0 s1 = Sort t0 t1.
Proof.
exact (eq_trans (eq_trans eq_refl (ap (fun xSort x s1) H0))
         (ap (fun xSort t0 x) H1)).
Qed.

Lemma congr_Pi {s0 : level} {s1 : level} {s2 : mode} {s3 : mode} {s4 : term}
  {s5 : term} {t0 : level} {t1 : level} {t2 : mode} {t3 : mode} {t4 : term}
  {t5 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) (H3 : s3 = t3)
  (H4 : s4 = t4) (H5 : s5 = t5) : Pi s0 s1 s2 s3 s4 s5 = Pi t0 t1 t2 t3 t4 t5.
Proof.
exact (eq_trans
         (eq_trans
            (eq_trans
               (eq_trans
                  (eq_trans
                     (eq_trans eq_refl (ap (fun xPi x s1 s2 s3 s4 s5) H0))
                     (ap (fun xPi t0 x s2 s3 s4 s5) H1))
                  (ap (fun xPi t0 t1 x s3 s4 s5) H2))
               (ap (fun xPi t0 t1 t2 x s4 s5) H3))
            (ap (fun xPi t0 t1 t2 t3 x s5) H4))
         (ap (fun xPi t0 t1 t2 t3 t4 x) H5)).
Qed.

Lemma congr_lam {s0 : mode} {s1 : term} {s2 : term} {t0 : mode} {t1 : term}
  {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  lam s0 s1 s2 = lam t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xlam x s1 s2) H0))
            (ap (fun xlam t0 x s2) H1)) (ap (fun xlam t0 t1 x) H2)).
Qed.

Lemma congr_app {s0 : term} {s1 : term} {t0 : term} {t1 : term}
  (H0 : s0 = t0) (H1 : s1 = t1) : app s0 s1 = app t0 t1.
Proof.
exact (eq_trans (eq_trans eq_refl (ap (fun xapp x s1) H0))
         (ap (fun xapp t0 x) H1)).
Qed.

Lemma congr_Erased {s0 : term} {t0 : term} (H0 : s0 = t0) :
  Erased s0 = Erased t0.
Proof.
exact (eq_trans eq_refl (ap (fun xErased x) H0)).
Qed.

Lemma congr_hide {s0 : term} {t0 : term} (H0 : s0 = t0) : hide s0 = hide t0.
Proof.
exact (eq_trans eq_refl (ap (fun xhide x) H0)).
Qed.

Lemma congr_reveal {s0 : term} {s1 : term} {s2 : term} {t0 : term}
  {t1 : term} {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  reveal s0 s1 s2 = reveal t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xreveal x s1 s2) H0))
            (ap (fun xreveal t0 x s2) H1))
         (ap (fun xreveal t0 t1 x) H2)).
Qed.

Lemma congr_Reveal {s0 : term} {s1 : term} {t0 : term} {t1 : term}
  (H0 : s0 = t0) (H1 : s1 = t1) : Reveal s0 s1 = Reveal t0 t1.
Proof.
exact (eq_trans (eq_trans eq_refl (ap (fun xReveal x s1) H0))
         (ap (fun xReveal t0 x) H1)).
Qed.

Lemma congr_toRev {s0 : term} {s1 : term} {s2 : term} {t0 : term} {t1 : term}
  {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  toRev s0 s1 s2 = toRev t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xtoRev x s1 s2) H0))
            (ap (fun xtoRev t0 x s2) H1))
         (ap (fun xtoRev t0 t1 x) H2)).
Qed.

Lemma congr_fromRev {s0 : term} {s1 : term} {s2 : term} {t0 : term}
  {t1 : term} {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  fromRev s0 s1 s2 = fromRev t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xfromRev x s1 s2) H0))
            (ap (fun xfromRev t0 x s2) H1))
         (ap (fun xfromRev t0 t1 x) H2)).
Qed.

Lemma congr_gheq {s0 : term} {s1 : term} {s2 : term} {t0 : term} {t1 : term}
  {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  gheq s0 s1 s2 = gheq t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xgheq x s1 s2) H0))
            (ap (fun xgheq t0 x s2) H1)) (ap (fun xgheq t0 t1 x) H2)).
Qed.

Lemma congr_ghrefl {s0 : term} {s1 : term} {t0 : term} {t1 : term}
  (H0 : s0 = t0) (H1 : s1 = t1) : ghrefl s0 s1 = ghrefl t0 t1.
Proof.
exact (eq_trans (eq_trans eq_refl (ap (fun xghrefl x s1) H0))
         (ap (fun xghrefl t0 x) H1)).
Qed.

Lemma congr_ghcast {s0 : term} {s1 : term} {s2 : term} {s3 : term}
  {s4 : term} {s5 : term} {t0 : term} {t1 : term} {t2 : term} {t3 : term}
  {t4 : term} {t5 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2)
  (H3 : s3 = t3) (H4 : s4 = t4) (H5 : s5 = t5) :
  ghcast s0 s1 s2 s3 s4 s5 = ghcast t0 t1 t2 t3 t4 t5.
Proof.
exact (eq_trans
         (eq_trans
            (eq_trans
               (eq_trans
                  (eq_trans
                     (eq_trans eq_refl
                        (ap (fun xghcast x s1 s2 s3 s4 s5) H0))
                     (ap (fun xghcast t0 x s2 s3 s4 s5) H1))
                  (ap (fun xghcast t0 t1 x s3 s4 s5) H2))
               (ap (fun xghcast t0 t1 t2 x s4 s5) H3))
            (ap (fun xghcast t0 t1 t2 t3 x s5) H4))
         (ap (fun xghcast t0 t1 t2 t3 t4 x) H5)).
Qed.

Lemma congr_tbool : tbool = tbool.
Proof.
exact (eq_refl).
Qed.

Lemma congr_ttrue : ttrue = ttrue.
Proof.
exact (eq_refl).
Qed.

Lemma congr_tfalse : tfalse = tfalse.
Proof.
exact (eq_refl).
Qed.

Lemma congr_tif {s0 : mode} {s1 : term} {s2 : term} {s3 : term} {s4 : term}
  {t0 : mode} {t1 : term} {t2 : term} {t3 : term} {t4 : term} (H0 : s0 = t0)
  (H1 : s1 = t1) (H2 : s2 = t2) (H3 : s3 = t3) (H4 : s4 = t4) :
  tif s0 s1 s2 s3 s4 = tif t0 t1 t2 t3 t4.
Proof.
exact (eq_trans
         (eq_trans
            (eq_trans
               (eq_trans
                  (eq_trans eq_refl (ap (fun xtif x s1 s2 s3 s4) H0))
                  (ap (fun xtif t0 x s2 s3 s4) H1))
               (ap (fun xtif t0 t1 x s3 s4) H2))
            (ap (fun xtif t0 t1 t2 x s4) H3))
         (ap (fun xtif t0 t1 t2 t3 x) H4)).
Qed.

Lemma congr_tnat : tnat = tnat.
Proof.
exact (eq_refl).
Qed.

Lemma congr_tzero : tzero = tzero.
Proof.
exact (eq_refl).
Qed.

Lemma congr_tsucc {s0 : term} {t0 : term} (H0 : s0 = t0) :
  tsucc s0 = tsucc t0.
Proof.
exact (eq_trans eq_refl (ap (fun xtsucc x) H0)).
Qed.

Lemma congr_tnat_elim {s0 : mode} {s1 : term} {s2 : term} {s3 : term}
  {s4 : term} {t0 : mode} {t1 : term} {t2 : term} {t3 : term} {t4 : term}
  (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) (H3 : s3 = t3) (H4 : s4 = t4)
  : tnat_elim s0 s1 s2 s3 s4 = tnat_elim t0 t1 t2 t3 t4.
Proof.
exact (eq_trans
         (eq_trans
            (eq_trans
               (eq_trans
                  (eq_trans eq_refl
                     (ap (fun xtnat_elim x s1 s2 s3 s4) H0))
                  (ap (fun xtnat_elim t0 x s2 s3 s4) H1))
               (ap (fun xtnat_elim t0 t1 x s3 s4) H2))
            (ap (fun xtnat_elim t0 t1 t2 x s4) H3))
         (ap (fun xtnat_elim t0 t1 t2 t3 x) H4)).
Qed.

Lemma congr_tvec {s0 : term} {s1 : term} {t0 : term} {t1 : term}
  (H0 : s0 = t0) (H1 : s1 = t1) : tvec s0 s1 = tvec t0 t1.
Proof.
exact (eq_trans (eq_trans eq_refl (ap (fun xtvec x s1) H0))
         (ap (fun xtvec t0 x) H1)).
Qed.

Lemma congr_tvnil {s0 : term} {t0 : term} (H0 : s0 = t0) :
  tvnil s0 = tvnil t0.
Proof.
exact (eq_trans eq_refl (ap (fun xtvnil x) H0)).
Qed.

Lemma congr_tvcons {s0 : term} {s1 : term} {s2 : term} {t0 : term}
  {t1 : term} {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  tvcons s0 s1 s2 = tvcons t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xtvcons x s1 s2) H0))
            (ap (fun xtvcons t0 x s2) H1))
         (ap (fun xtvcons t0 t1 x) H2)).
Qed.

Lemma congr_tvec_elim {s0 : mode} {s1 : term} {s2 : term} {s3 : term}
  {s4 : term} {s5 : term} {s6 : term} {t0 : mode} {t1 : term} {t2 : term}
  {t3 : term} {t4 : term} {t5 : term} {t6 : term} (H0 : s0 = t0)
  (H1 : s1 = t1) (H2 : s2 = t2) (H3 : s3 = t3) (H4 : s4 = t4) (H5 : s5 = t5)
  (H6 : s6 = t6) :
  tvec_elim s0 s1 s2 s3 s4 s5 s6 = tvec_elim t0 t1 t2 t3 t4 t5 t6.
Proof.
exact (eq_trans
         (eq_trans
            (eq_trans
               (eq_trans
                  (eq_trans
                     (eq_trans
                        (eq_trans eq_refl
                           (ap (fun xtvec_elim x s1 s2 s3 s4 s5 s6) H0))
                        (ap (fun xtvec_elim t0 x s2 s3 s4 s5 s6) H1))
                     (ap (fun xtvec_elim t0 t1 x s3 s4 s5 s6) H2))
                  (ap (fun xtvec_elim t0 t1 t2 x s4 s5 s6) H3))
               (ap (fun xtvec_elim t0 t1 t2 t3 x s5 s6) H4))
            (ap (fun xtvec_elim t0 t1 t2 t3 t4 x s6) H5))
         (ap (fun xtvec_elim t0 t1 t2 t3 t4 t5 x) H6)).
Qed.

Lemma congr_bot : bot = bot.
Proof.
exact (eq_refl).
Qed.

Lemma congr_bot_elim {s0 : mode} {s1 : term} {s2 : term} {t0 : mode}
  {t1 : term} {t2 : term} (H0 : s0 = t0) (H1 : s1 = t1) (H2 : s2 = t2) :
  bot_elim s0 s1 s2 = bot_elim t0 t1 t2.
Proof.
exact (eq_trans
         (eq_trans (eq_trans eq_refl (ap (fun xbot_elim x s1 s2) H0))
            (ap (fun xbot_elim t0 x s2) H1))
         (ap (fun xbot_elim t0 t1 x) H2)).
Qed.

Lemma upRen_term_term (xi : nat nat) : nat nat.
Proof.
exact (up_ren xi).
Defined.

Fixpoint ren_term (xi_term : nat nat) (s : term) {struct s} : term :=
  match s with
  | var s0var (xi_term s0)
  | Sort s0 s1Sort s0 s1
  | Pi s0 s1 s2 s3 s4 s5
      Pi s0 s1 s2 s3 (ren_term xi_term s4)
        (ren_term (upRen_term_term xi_term) s5)
  | lam s0 s1 s2
      lam s0 (ren_term xi_term s1) (ren_term (upRen_term_term xi_term) s2)
  | app s0 s1app (ren_term xi_term s0) (ren_term xi_term s1)
  | Erased s0Erased (ren_term xi_term s0)
  | hide s0hide (ren_term xi_term s0)
  | reveal s0 s1 s2
      reveal (ren_term xi_term s0) (ren_term xi_term s1)
        (ren_term xi_term s2)
  | Reveal s0 s1Reveal (ren_term xi_term s0) (ren_term xi_term s1)
  | toRev s0 s1 s2
      toRev (ren_term xi_term s0) (ren_term xi_term s1) (ren_term xi_term s2)
  | fromRev s0 s1 s2
      fromRev (ren_term xi_term s0) (ren_term xi_term s1)
        (ren_term xi_term s2)
  | gheq s0 s1 s2
      gheq (ren_term xi_term s0) (ren_term xi_term s1) (ren_term xi_term s2)
  | ghrefl s0 s1ghrefl (ren_term xi_term s0) (ren_term xi_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      ghcast (ren_term xi_term s0) (ren_term xi_term s1)
        (ren_term xi_term s2) (ren_term xi_term s3) (ren_term xi_term s4)
        (ren_term xi_term s5)
  | tbooltbool
  | ttruettrue
  | tfalsetfalse
  | tif s0 s1 s2 s3 s4
      tif s0 (ren_term xi_term s1) (ren_term xi_term s2)
        (ren_term xi_term s3) (ren_term xi_term s4)
  | tnattnat
  | tzerotzero
  | tsucc s0tsucc (ren_term xi_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      tnat_elim s0 (ren_term xi_term s1) (ren_term xi_term s2)
        (ren_term xi_term s3) (ren_term xi_term s4)
  | tvec s0 s1tvec (ren_term xi_term s0) (ren_term xi_term s1)
  | tvnil s0tvnil (ren_term xi_term s0)
  | tvcons s0 s1 s2
      tvcons (ren_term xi_term s0) (ren_term xi_term s1)
        (ren_term xi_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      tvec_elim s0 (ren_term xi_term s1) (ren_term xi_term s2)
        (ren_term xi_term s3) (ren_term xi_term s4) (ren_term xi_term s5)
        (ren_term xi_term s6)
  | botbot
  | bot_elim s0 s1 s2
      bot_elim s0 (ren_term xi_term s1) (ren_term xi_term s2)
  end.

Lemma up_term_term (sigma : nat term) : nat term.
Proof.
exact (scons (var var_zero) (funcomp (ren_term shift) sigma)).
Defined.

Fixpoint subst_term (sigma_term : nat term) (s : term) {struct s} :
term :=
  match s with
  | var s0sigma_term s0
  | Sort s0 s1Sort s0 s1
  | Pi s0 s1 s2 s3 s4 s5
      Pi s0 s1 s2 s3 (subst_term sigma_term s4)
        (subst_term (up_term_term sigma_term) s5)
  | lam s0 s1 s2
      lam s0 (subst_term sigma_term s1)
        (subst_term (up_term_term sigma_term) s2)
  | app s0 s1app (subst_term sigma_term s0) (subst_term sigma_term s1)
  | Erased s0Erased (subst_term sigma_term s0)
  | hide s0hide (subst_term sigma_term s0)
  | reveal s0 s1 s2
      reveal (subst_term sigma_term s0) (subst_term sigma_term s1)
        (subst_term sigma_term s2)
  | Reveal s0 s1
      Reveal (subst_term sigma_term s0) (subst_term sigma_term s1)
  | toRev s0 s1 s2
      toRev (subst_term sigma_term s0) (subst_term sigma_term s1)
        (subst_term sigma_term s2)
  | fromRev s0 s1 s2
      fromRev (subst_term sigma_term s0) (subst_term sigma_term s1)
        (subst_term sigma_term s2)
  | gheq s0 s1 s2
      gheq (subst_term sigma_term s0) (subst_term sigma_term s1)
        (subst_term sigma_term s2)
  | ghrefl s0 s1
      ghrefl (subst_term sigma_term s0) (subst_term sigma_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      ghcast (subst_term sigma_term s0) (subst_term sigma_term s1)
        (subst_term sigma_term s2) (subst_term sigma_term s3)
        (subst_term sigma_term s4) (subst_term sigma_term s5)
  | tbooltbool
  | ttruettrue
  | tfalsetfalse
  | tif s0 s1 s2 s3 s4
      tif s0 (subst_term sigma_term s1) (subst_term sigma_term s2)
        (subst_term sigma_term s3) (subst_term sigma_term s4)
  | tnattnat
  | tzerotzero
  | tsucc s0tsucc (subst_term sigma_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      tnat_elim s0 (subst_term sigma_term s1) (subst_term sigma_term s2)
        (subst_term sigma_term s3) (subst_term sigma_term s4)
  | tvec s0 s1tvec (subst_term sigma_term s0) (subst_term sigma_term s1)
  | tvnil s0tvnil (subst_term sigma_term s0)
  | tvcons s0 s1 s2
      tvcons (subst_term sigma_term s0) (subst_term sigma_term s1)
        (subst_term sigma_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      tvec_elim s0 (subst_term sigma_term s1) (subst_term sigma_term s2)
        (subst_term sigma_term s3) (subst_term sigma_term s4)
        (subst_term sigma_term s5) (subst_term sigma_term s6)
  | botbot
  | bot_elim s0 s1 s2
      bot_elim s0 (subst_term sigma_term s1) (subst_term sigma_term s2)
  end.

Lemma upId_term_term (sigma : nat term) (Eq : x, sigma x = var x) :
   x, up_term_term sigma x = var x.
Proof.
exact (fun n
       match n with
       | S n'ap (ren_term shift) (Eq n')
       | Oeq_refl
       end).
Qed.

Fixpoint idSubst_term (sigma_term : nat term)
(Eq_term : x, sigma_term x = var x) (s : term) {struct s} :
subst_term sigma_term s = s :=
  match s with
  | var s0Eq_term s0
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (idSubst_term sigma_term Eq_term s4)
        (idSubst_term (up_term_term sigma_term) (upId_term_term _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0) (idSubst_term sigma_term Eq_term s1)
        (idSubst_term (up_term_term sigma_term) (upId_term_term _ Eq_term) s2)
  | app s0 s1
      congr_app (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
  | Erased s0congr_Erased (idSubst_term sigma_term Eq_term s0)
  | hide s0congr_hide (idSubst_term sigma_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
        (idSubst_term sigma_term Eq_term s3)
        (idSubst_term sigma_term Eq_term s4)
        (idSubst_term sigma_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0) (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
        (idSubst_term sigma_term Eq_term s3)
        (idSubst_term sigma_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0congr_tsucc (idSubst_term sigma_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0) (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
        (idSubst_term sigma_term Eq_term s3)
        (idSubst_term sigma_term Eq_term s4)
  | tvec s0 s1
      congr_tvec (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
  | tvnil s0congr_tvnil (idSubst_term sigma_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons (idSubst_term sigma_term Eq_term s0)
        (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0) (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
        (idSubst_term sigma_term Eq_term s3)
        (idSubst_term sigma_term Eq_term s4)
        (idSubst_term sigma_term Eq_term s5)
        (idSubst_term sigma_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0) (idSubst_term sigma_term Eq_term s1)
        (idSubst_term sigma_term Eq_term s2)
  end.

Lemma upExtRen_term_term (xi : nat nat) (zeta : nat nat)
  (Eq : x, xi x = zeta x) :
   x, upRen_term_term xi x = upRen_term_term zeta x.
Proof.
exact (fun nmatch n with
                | S n'ap shift (Eq n')
                | Oeq_refl
                end).
Qed.

Fixpoint extRen_term (xi_term : nat nat) (zeta_term : nat nat)
(Eq_term : x, xi_term x = zeta_term x) (s : term) {struct s} :
ren_term xi_term s = ren_term zeta_term s :=
  match s with
  | var s0ap (var) (Eq_term s0)
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (extRen_term xi_term zeta_term Eq_term s4)
        (extRen_term (upRen_term_term xi_term) (upRen_term_term zeta_term)
           (upExtRen_term_term _ _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0) (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term (upRen_term_term xi_term) (upRen_term_term zeta_term)
           (upExtRen_term_term _ _ Eq_term) s2)
  | app s0 s1
      congr_app (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
  | Erased s0congr_Erased (extRen_term xi_term zeta_term Eq_term s0)
  | hide s0congr_hide (extRen_term xi_term zeta_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
        (extRen_term xi_term zeta_term Eq_term s3)
        (extRen_term xi_term zeta_term Eq_term s4)
        (extRen_term xi_term zeta_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0) (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
        (extRen_term xi_term zeta_term Eq_term s3)
        (extRen_term xi_term zeta_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0congr_tsucc (extRen_term xi_term zeta_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0) (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
        (extRen_term xi_term zeta_term Eq_term s3)
        (extRen_term xi_term zeta_term Eq_term s4)
  | tvec s0 s1
      congr_tvec (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
  | tvnil s0congr_tvnil (extRen_term xi_term zeta_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons (extRen_term xi_term zeta_term Eq_term s0)
        (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0) (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
        (extRen_term xi_term zeta_term Eq_term s3)
        (extRen_term xi_term zeta_term Eq_term s4)
        (extRen_term xi_term zeta_term Eq_term s5)
        (extRen_term xi_term zeta_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0) (extRen_term xi_term zeta_term Eq_term s1)
        (extRen_term xi_term zeta_term Eq_term s2)
  end.

Lemma upExt_term_term (sigma : nat term) (tau : nat term)
  (Eq : x, sigma x = tau x) :
   x, up_term_term sigma x = up_term_term tau x.
Proof.
exact (fun n
       match n with
       | S n'ap (ren_term shift) (Eq n')
       | Oeq_refl
       end).
Qed.

Fixpoint ext_term (sigma_term : nat term) (tau_term : nat term)
(Eq_term : x, sigma_term x = tau_term x) (s : term) {struct s} :
subst_term sigma_term s = subst_term tau_term s :=
  match s with
  | var s0Eq_term s0
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (ext_term sigma_term tau_term Eq_term s4)
        (ext_term (up_term_term sigma_term) (up_term_term tau_term)
           (upExt_term_term _ _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0) (ext_term sigma_term tau_term Eq_term s1)
        (ext_term (up_term_term sigma_term) (up_term_term tau_term)
           (upExt_term_term _ _ Eq_term) s2)
  | app s0 s1
      congr_app (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
  | Erased s0congr_Erased (ext_term sigma_term tau_term Eq_term s0)
  | hide s0congr_hide (ext_term sigma_term tau_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
        (ext_term sigma_term tau_term Eq_term s3)
        (ext_term sigma_term tau_term Eq_term s4)
        (ext_term sigma_term tau_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0) (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
        (ext_term sigma_term tau_term Eq_term s3)
        (ext_term sigma_term tau_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0congr_tsucc (ext_term sigma_term tau_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0) (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
        (ext_term sigma_term tau_term Eq_term s3)
        (ext_term sigma_term tau_term Eq_term s4)
  | tvec s0 s1
      congr_tvec (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
  | tvnil s0congr_tvnil (ext_term sigma_term tau_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons (ext_term sigma_term tau_term Eq_term s0)
        (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0) (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
        (ext_term sigma_term tau_term Eq_term s3)
        (ext_term sigma_term tau_term Eq_term s4)
        (ext_term sigma_term tau_term Eq_term s5)
        (ext_term sigma_term tau_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0) (ext_term sigma_term tau_term Eq_term s1)
        (ext_term sigma_term tau_term Eq_term s2)
  end.

Lemma up_ren_ren_term_term (xi : nat nat) (zeta : nat nat)
  (rho : nat nat) (Eq : x, funcomp zeta xi x = rho x) :
   x,
  funcomp (upRen_term_term zeta) (upRen_term_term xi) x =
  upRen_term_term rho x.
Proof.
exact (up_ren_ren xi zeta rho Eq).
Qed.

Fixpoint compRenRen_term (xi_term : nat nat) (zeta_term : nat nat)
(rho_term : nat nat)
(Eq_term : x, funcomp zeta_term xi_term x = rho_term x) (s : term)
{struct s} : ren_term zeta_term (ren_term xi_term s) = ren_term rho_term s :=
  match s with
  | var s0ap (var) (Eq_term s0)
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s4)
        (compRenRen_term (upRen_term_term xi_term)
           (upRen_term_term zeta_term) (upRen_term_term rho_term)
           (up_ren_ren _ _ _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term (upRen_term_term xi_term)
           (upRen_term_term zeta_term) (upRen_term_term rho_term)
           (up_ren_ren _ _ _ Eq_term) s2)
  | app s0 s1
      congr_app (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
  | Erased s0
      congr_Erased (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
  | hide s0
      congr_hide (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s3)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s4)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s3)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0
      congr_tsucc (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s3)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s4)
  | tvec s0 s1
      congr_tvec (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
  | tvnil s0
      congr_tvnil (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons (compRenRen_term xi_term zeta_term rho_term Eq_term s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s3)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s4)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s5)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s1)
        (compRenRen_term xi_term zeta_term rho_term Eq_term s2)
  end.

Lemma up_ren_subst_term_term (xi : nat nat) (tau : nat term)
  (theta : nat term) (Eq : x, funcomp tau xi x = theta x) :
   x,
  funcomp (up_term_term tau) (upRen_term_term xi) x = up_term_term theta x.
Proof.
exact (fun n
       match n with
       | S n'ap (ren_term shift) (Eq n')
       | Oeq_refl
       end).
Qed.

Fixpoint compRenSubst_term (xi_term : nat nat) (tau_term : nat term)
(theta_term : nat term)
(Eq_term : x, funcomp tau_term xi_term x = theta_term x) (s : term)
{struct s} :
subst_term tau_term (ren_term xi_term s) = subst_term theta_term s :=
  match s with
  | var s0Eq_term s0
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s4)
        (compRenSubst_term (upRen_term_term xi_term) (up_term_term tau_term)
           (up_term_term theta_term) (up_ren_subst_term_term _ _ _ Eq_term)
           s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term (upRen_term_term xi_term) (up_term_term tau_term)
           (up_term_term theta_term) (up_ren_subst_term_term _ _ _ Eq_term)
           s2)
  | app s0 s1
      congr_app (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
  | Erased s0
      congr_Erased (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
  | hide s0
      congr_hide (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev
        (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s3)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s4)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s3)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0
      congr_tsucc (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s3)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s4)
  | tvec s0 s1
      congr_tvec (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
  | tvnil s0
      congr_tvnil (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons (compRenSubst_term xi_term tau_term theta_term Eq_term s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s3)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s4)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s5)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s1)
        (compRenSubst_term xi_term tau_term theta_term Eq_term s2)
  end.

Lemma up_subst_ren_term_term (sigma : nat term) (zeta_term : nat nat)
  (theta : nat term)
  (Eq : x, funcomp (ren_term zeta_term) sigma x = theta x) :
   x,
  funcomp (ren_term (upRen_term_term zeta_term)) (up_term_term sigma) x =
  up_term_term theta x.
Proof.
exact (fun n
       match n with
       | S n'
           eq_trans
             (compRenRen_term shift (upRen_term_term zeta_term)
                (funcomp shift zeta_term) (fun xeq_refl) (sigma n'))
             (eq_trans
                (eq_sym
                   (compRenRen_term zeta_term shift (funcomp shift zeta_term)
                      (fun xeq_refl) (sigma n')))
                (ap (ren_term shift) (Eq n')))
       | Oeq_refl
       end).
Qed.

Fixpoint compSubstRen_term (sigma_term : nat term)
(zeta_term : nat nat) (theta_term : nat term)
(Eq_term : x, funcomp (ren_term zeta_term) sigma_term x = theta_term x)
(s : term) {struct s} :
ren_term zeta_term (subst_term sigma_term s) = subst_term theta_term s :=
  match s with
  | var s0Eq_term s0
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s4)
        (compSubstRen_term (up_term_term sigma_term)
           (upRen_term_term zeta_term) (up_term_term theta_term)
           (up_subst_ren_term_term _ _ _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term (up_term_term sigma_term)
           (upRen_term_term zeta_term) (up_term_term theta_term)
           (up_subst_ren_term_term _ _ _ Eq_term) s2)
  | app s0 s1
      congr_app
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
  | Erased s0
      congr_Erased
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
  | hide s0
      congr_hide
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s3)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s4)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s3)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0
      congr_tsucc
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s3)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s4)
  | tvec s0 s1
      congr_tvec
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
  | tvnil s0
      congr_tvnil
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s3)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s4)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s5)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s1)
        (compSubstRen_term sigma_term zeta_term theta_term Eq_term s2)
  end.

Lemma up_subst_subst_term_term (sigma : nat term) (tau_term : nat term)
  (theta : nat term)
  (Eq : x, funcomp (subst_term tau_term) sigma x = theta x) :
   x,
  funcomp (subst_term (up_term_term tau_term)) (up_term_term sigma) x =
  up_term_term theta x.
Proof.
exact (fun n
       match n with
       | S n'
           eq_trans
             (compRenSubst_term shift (up_term_term tau_term)
                (funcomp (up_term_term tau_term) shift) (fun xeq_refl)
                (sigma n'))
             (eq_trans
                (eq_sym
                   (compSubstRen_term tau_term shift
                      (funcomp (ren_term shift) tau_term) (fun xeq_refl)
                      (sigma n'))) (ap (ren_term shift) (Eq n')))
       | Oeq_refl
       end).
Qed.

Fixpoint compSubstSubst_term (sigma_term : nat term)
(tau_term : nat term) (theta_term : nat term)
(Eq_term : x,
           funcomp (subst_term tau_term) sigma_term x = theta_term x)
(s : term) {struct s} :
subst_term tau_term (subst_term sigma_term s) = subst_term theta_term s :=
  match s with
  | var s0Eq_term s0
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s4)
        (compSubstSubst_term (up_term_term sigma_term)
           (up_term_term tau_term) (up_term_term theta_term)
           (up_subst_subst_term_term _ _ _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term (up_term_term sigma_term)
           (up_term_term tau_term) (up_term_term theta_term)
           (up_subst_subst_term_term _ _ _ Eq_term) s2)
  | app s0 s1
      congr_app
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
  | Erased s0
      congr_Erased
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
  | hide s0
      congr_hide
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s3)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s4)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s3)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0
      congr_tsucc
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s3)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s4)
  | tvec s0 s1
      congr_tvec
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
  | tvnil s0
      congr_tvnil
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s3)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s4)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s5)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s1)
        (compSubstSubst_term sigma_term tau_term theta_term Eq_term s2)
  end.

Lemma renRen_term (xi_term : nat nat) (zeta_term : nat nat) (s : term)
  :
  ren_term zeta_term (ren_term xi_term s) =
  ren_term (funcomp zeta_term xi_term) s.
Proof.
exact (compRenRen_term xi_term zeta_term _ (fun neq_refl) s).
Qed.

Lemma renRen'_term_pointwise (xi_term : nat nat) (zeta_term : nat nat)
  :
  pointwise_relation _ eq (funcomp (ren_term zeta_term) (ren_term xi_term))
    (ren_term (funcomp zeta_term xi_term)).
Proof.
exact (fun scompRenRen_term xi_term zeta_term _ (fun neq_refl) s).
Qed.

Lemma renSubst_term (xi_term : nat nat) (tau_term : nat term)
  (s : term) :
  subst_term tau_term (ren_term xi_term s) =
  subst_term (funcomp tau_term xi_term) s.
Proof.
exact (compRenSubst_term xi_term tau_term _ (fun neq_refl) s).
Qed.

Lemma renSubst_term_pointwise (xi_term : nat nat) (tau_term : nat term)
  :
  pointwise_relation _ eq (funcomp (subst_term tau_term) (ren_term xi_term))
    (subst_term (funcomp tau_term xi_term)).
Proof.
exact (fun scompRenSubst_term xi_term tau_term _ (fun neq_refl) s).
Qed.

Lemma substRen_term (sigma_term : nat term) (zeta_term : nat nat)
  (s : term) :
  ren_term zeta_term (subst_term sigma_term s) =
  subst_term (funcomp (ren_term zeta_term) sigma_term) s.
Proof.
exact (compSubstRen_term sigma_term zeta_term _ (fun neq_refl) s).
Qed.

Lemma substRen_term_pointwise (sigma_term : nat term)
  (zeta_term : nat nat) :
  pointwise_relation _ eq
    (funcomp (ren_term zeta_term) (subst_term sigma_term))
    (subst_term (funcomp (ren_term zeta_term) sigma_term)).
Proof.
exact (fun scompSubstRen_term sigma_term zeta_term _ (fun neq_refl) s).
Qed.

Lemma substSubst_term (sigma_term : nat term) (tau_term : nat term)
  (s : term) :
  subst_term tau_term (subst_term sigma_term s) =
  subst_term (funcomp (subst_term tau_term) sigma_term) s.
Proof.
exact (compSubstSubst_term sigma_term tau_term _ (fun neq_refl) s).
Qed.

Lemma substSubst_term_pointwise (sigma_term : nat term)
  (tau_term : nat term) :
  pointwise_relation _ eq
    (funcomp (subst_term tau_term) (subst_term sigma_term))
    (subst_term (funcomp (subst_term tau_term) sigma_term)).
Proof.
exact (fun s
       compSubstSubst_term sigma_term tau_term _ (fun neq_refl) s).
Qed.

Lemma rinstInst_up_term_term (xi : nat nat) (sigma : nat term)
  (Eq : x, funcomp (var) xi x = sigma x) :
   x, funcomp (var) (upRen_term_term xi) x = up_term_term sigma x.
Proof.
exact (fun n
       match n with
       | S n'ap (ren_term shift) (Eq n')
       | Oeq_refl
       end).
Qed.

Fixpoint rinst_inst_term (xi_term : nat nat) (sigma_term : nat term)
(Eq_term : x, funcomp (var) xi_term x = sigma_term x) (s : term)
{struct s} : ren_term xi_term s = subst_term sigma_term s :=
  match s with
  | var s0Eq_term s0
  | Sort s0 s1congr_Sort (eq_refl s0) (eq_refl s1)
  | Pi s0 s1 s2 s3 s4 s5
      congr_Pi (eq_refl s0) (eq_refl s1) (eq_refl s2) (eq_refl s3)
        (rinst_inst_term xi_term sigma_term Eq_term s4)
        (rinst_inst_term (upRen_term_term xi_term) (up_term_term sigma_term)
           (rinstInst_up_term_term _ _ Eq_term) s5)
  | lam s0 s1 s2
      congr_lam (eq_refl s0) (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term (upRen_term_term xi_term) (up_term_term sigma_term)
           (rinstInst_up_term_term _ _ Eq_term) s2)
  | app s0 s1
      congr_app (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
  | Erased s0congr_Erased (rinst_inst_term xi_term sigma_term Eq_term s0)
  | hide s0congr_hide (rinst_inst_term xi_term sigma_term Eq_term s0)
  | reveal s0 s1 s2
      congr_reveal (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
  | Reveal s0 s1
      congr_Reveal (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
  | toRev s0 s1 s2
      congr_toRev (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
  | fromRev s0 s1 s2
      congr_fromRev (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
  | gheq s0 s1 s2
      congr_gheq (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
  | ghrefl s0 s1
      congr_ghrefl (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
  | ghcast s0 s1 s2 s3 s4 s5
      congr_ghcast (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
        (rinst_inst_term xi_term sigma_term Eq_term s3)
        (rinst_inst_term xi_term sigma_term Eq_term s4)
        (rinst_inst_term xi_term sigma_term Eq_term s5)
  | tboolcongr_tbool
  | ttruecongr_ttrue
  | tfalsecongr_tfalse
  | tif s0 s1 s2 s3 s4
      congr_tif (eq_refl s0) (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
        (rinst_inst_term xi_term sigma_term Eq_term s3)
        (rinst_inst_term xi_term sigma_term Eq_term s4)
  | tnatcongr_tnat
  | tzerocongr_tzero
  | tsucc s0congr_tsucc (rinst_inst_term xi_term sigma_term Eq_term s0)
  | tnat_elim s0 s1 s2 s3 s4
      congr_tnat_elim (eq_refl s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
        (rinst_inst_term xi_term sigma_term Eq_term s3)
        (rinst_inst_term xi_term sigma_term Eq_term s4)
  | tvec s0 s1
      congr_tvec (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
  | tvnil s0congr_tvnil (rinst_inst_term xi_term sigma_term Eq_term s0)
  | tvcons s0 s1 s2
      congr_tvcons (rinst_inst_term xi_term sigma_term Eq_term s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      congr_tvec_elim (eq_refl s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
        (rinst_inst_term xi_term sigma_term Eq_term s3)
        (rinst_inst_term xi_term sigma_term Eq_term s4)
        (rinst_inst_term xi_term sigma_term Eq_term s5)
        (rinst_inst_term xi_term sigma_term Eq_term s6)
  | botcongr_bot
  | bot_elim s0 s1 s2
      congr_bot_elim (eq_refl s0)
        (rinst_inst_term xi_term sigma_term Eq_term s1)
        (rinst_inst_term xi_term sigma_term Eq_term s2)
  end.

Lemma rinstInst'_term (xi_term : nat nat) (s : term) :
  ren_term xi_term s = subst_term (funcomp (var) xi_term) s.
Proof.
exact (rinst_inst_term xi_term _ (fun neq_refl) s).
Qed.

Lemma rinstInst'_term_pointwise (xi_term : nat nat) :
  pointwise_relation _ eq (ren_term xi_term)
    (subst_term (funcomp (var) xi_term)).
Proof.
exact (fun srinst_inst_term xi_term _ (fun neq_refl) s).
Qed.

Lemma instId'_term (s : term) : subst_term (var) s = s.
Proof.
exact (idSubst_term (var) (fun neq_refl) s).
Qed.

Lemma instId'_term_pointwise : pointwise_relation _ eq (subst_term (var)) id.
Proof.
exact (fun sidSubst_term (var) (fun neq_refl) s).
Qed.

Lemma rinstId'_term (s : term) : ren_term id s = s.
Proof.
exact (eq_ind_r (fun tt = s) (instId'_term s) (rinstInst'_term id s)).
Qed.

Lemma rinstId'_term_pointwise : pointwise_relation _ eq (@ren_term id) id.
Proof.
exact (fun s
       eq_ind_r (fun tt = s) (instId'_term s) (rinstInst'_term id s)).
Qed.

Lemma varL'_term (sigma_term : nat term) (x : nat) :
  subst_term sigma_term (var x) = sigma_term x.
Proof.
exact (eq_refl).
Qed.

Lemma varL'_term_pointwise (sigma_term : nat term) :
  pointwise_relation _ eq (funcomp (subst_term sigma_term) (var)) sigma_term.
Proof.
exact (fun xeq_refl).
Qed.

Lemma varLRen'_term (xi_term : nat nat) (x : nat) :
  ren_term xi_term (var x) = var (xi_term x).
Proof.
exact (eq_refl).
Qed.

Lemma varLRen'_term_pointwise (xi_term : nat nat) :
  pointwise_relation _ eq (funcomp (ren_term xi_term) (var))
    (funcomp (var) xi_term).
Proof.
exact (fun xeq_refl).
Qed.

Class Up_term X Y :=
    up_term : X Y.

#[global]Instance Subst_term : (Subst1 _ _ _) := @subst_term.

#[global]Instance Up_term_term : (Up_term _ _) := @up_term_term.

#[global]Instance Ren_term : (Ren1 _ _ _) := @ren_term.

#[global]
Instance VarInstance_term : (Var _ _) := @var.

Notation "[ sigma_term ]" := (subst_term sigma_term)
( at level 1, left associativity, only printing) : fscope.

Notation "s [ sigma_term ]" := (subst_term sigma_term s)
( at level 7, left associativity, only printing) : subst_scope.

Notation "↑__term" := up_term (only printing) : subst_scope.

Notation "↑__term" := up_term_term (only printing) : subst_scope.

Notation "⟨ xi_term ⟩" := (ren_term xi_term)
( at level 1, left associativity, only printing) : fscope.

Notation "s ⟨ xi_term ⟩" := (ren_term xi_term s)
( at level 7, left associativity, only printing) : subst_scope.

Notation "'var'" := var ( at level 1, only printing) : subst_scope.

Notation "x '__term'" := (@ids _ _ VarInstance_term x)
( at level 5, format "x __term", only printing) : subst_scope.

Notation "x '__term'" := (var x) ( at level 5, format "x __term") :
subst_scope.

#[global]
Instance subst_term_morphism :
 (Proper (respectful (pointwise_relation _ eq) (respectful eq eq))
    (@subst_term)).
Proof.
exact (fun f_term g_term Eq_term s t Eq_st
       eq_ind s (fun t'subst_term f_term s = subst_term g_term t')
         (ext_term f_term g_term Eq_term s) t Eq_st).
Qed.

#[global]
Instance subst_term_morphism2 :
 (Proper (respectful (pointwise_relation _ eq) (pointwise_relation _ eq))
    (@subst_term)).
Proof.
exact (fun f_term g_term Eq_term sext_term f_term g_term Eq_term s).
Qed.

#[global]
Instance ren_term_morphism :
 (Proper (respectful (pointwise_relation _ eq) (respectful eq eq))
    (@ren_term)).
Proof.
exact (fun f_term g_term Eq_term s t Eq_st
       eq_ind s (fun t'ren_term f_term s = ren_term g_term t')
         (extRen_term f_term g_term Eq_term s) t Eq_st).
Qed.

#[global]
Instance ren_term_morphism2 :
 (Proper (respectful (pointwise_relation _ eq) (pointwise_relation _ eq))
    (@ren_term)).
Proof.
exact (fun f_term g_term Eq_term sextRen_term f_term g_term Eq_term s).
Qed.

Ltac auto_unfold := repeat
                     unfold VarInstance_term, Var, ids, Ren_term, Ren1, ren1,
                      Up_term_term, Up_term, up_term, Subst_term, Subst1,
                      subst1.

Tactic Notation "auto_unfold" "in" "*" := repeat
                                           unfold VarInstance_term, Var, ids,
                                            Ren_term, Ren1, ren1,
                                            Up_term_term, Up_term, up_term,
                                            Subst_term, Subst1, subst1
                                            in ×.

Ltac asimpl' := repeat (first
                 [ progress setoid_rewrite substSubst_term_pointwise
                 | progress setoid_rewrite substSubst_term
                 | progress setoid_rewrite substRen_term_pointwise
                 | progress setoid_rewrite substRen_term
                 | progress setoid_rewrite renSubst_term_pointwise
                 | progress setoid_rewrite renSubst_term
                 | progress setoid_rewrite renRen'_term_pointwise
                 | progress setoid_rewrite renRen_term
                 | progress setoid_rewrite varLRen'_term_pointwise
                 | progress setoid_rewrite varLRen'_term
                 | progress setoid_rewrite varL'_term_pointwise
                 | progress setoid_rewrite varL'_term
                 | progress setoid_rewrite rinstId'_term_pointwise
                 | progress setoid_rewrite rinstId'_term
                 | progress setoid_rewrite instId'_term_pointwise
                 | progress setoid_rewrite instId'_term
                 | progress unfold up_term_term, upRen_term_term, up_ren
                 | progress cbn[subst_term ren_term]
                 | progress fsimpl ]).

Ltac asimpl := check_no_evars;
                repeat
                 unfold VarInstance_term, Var, ids, Ren_term, Ren1, ren1,
                  Up_term_term, Up_term, up_term, Subst_term, Subst1, subst1
                  in *; asimpl'; minimize.

Tactic Notation "asimpl" "in" hyp(J) := revert J; asimpl; intros J.

Tactic Notation "auto_case" := auto_case ltac:(asimpl; cbn; eauto).

Ltac substify := auto_unfold; try setoid_rewrite rinstInst'_term_pointwise;
                  try setoid_rewrite rinstInst'_term.

Ltac renamify := auto_unfold;
                  try setoid_rewrite_left rinstInst'_term_pointwise;
                  try setoid_rewrite_left rinstInst'_term.

End Core.

Module Allfv.

Import
Core.

Lemma upAllfv_term_term (p : nat Prop) : nat Prop.
Proof.
exact (up_allfv p).
Defined.

Fixpoint allfv_term (p_term : nat Prop) (s : term) {struct s} : Prop :=
  match s with
  | var s0p_term s0
  | Sort s0 s1and True (and True True)
  | Pi s0 s1 s2 s3 s4 s5
      and True
        (and True
           (and True
              (and True
                 (and (allfv_term p_term s4)
                    (and (allfv_term (upAllfv_term_term p_term) s5) True)))))
  | lam s0 s1 s2
      and True
        (and (allfv_term p_term s1)
           (and (allfv_term (upAllfv_term_term p_term) s2) True))
  | app s0 s1and (allfv_term p_term s0) (and (allfv_term p_term s1) True)
  | Erased s0and (allfv_term p_term s0) True
  | hide s0and (allfv_term p_term s0) True
  | reveal s0 s1 s2
      and (allfv_term p_term s0)
        (and (allfv_term p_term s1) (and (allfv_term p_term s2) True))
  | Reveal s0 s1
      and (allfv_term p_term s0) (and (allfv_term p_term s1) True)
  | toRev s0 s1 s2
      and (allfv_term p_term s0)
        (and (allfv_term p_term s1) (and (allfv_term p_term s2) True))
  | fromRev s0 s1 s2
      and (allfv_term p_term s0)
        (and (allfv_term p_term s1) (and (allfv_term p_term s2) True))
  | gheq s0 s1 s2
      and (allfv_term p_term s0)
        (and (allfv_term p_term s1) (and (allfv_term p_term s2) True))
  | ghrefl s0 s1
      and (allfv_term p_term s0) (and (allfv_term p_term s1) True)
  | ghcast s0 s1 s2 s3 s4 s5
      and (allfv_term p_term s0)
        (and (allfv_term p_term s1)
           (and (allfv_term p_term s2)
              (and (allfv_term p_term s3)
                 (and (allfv_term p_term s4)
                    (and (allfv_term p_term s5) True)))))
  | tboolTrue
  | ttrueTrue
  | tfalseTrue
  | tif s0 s1 s2 s3 s4
      and True
        (and (allfv_term p_term s1)
           (and (allfv_term p_term s2)
              (and (allfv_term p_term s3) (and (allfv_term p_term s4) True))))
  | tnatTrue
  | tzeroTrue
  | tsucc s0and (allfv_term p_term s0) True
  | tnat_elim s0 s1 s2 s3 s4
      and True
        (and (allfv_term p_term s1)
           (and (allfv_term p_term s2)
              (and (allfv_term p_term s3) (and (allfv_term p_term s4) True))))
  | tvec s0 s1
      and (allfv_term p_term s0) (and (allfv_term p_term s1) True)
  | tvnil s0and (allfv_term p_term s0) True
  | tvcons s0 s1 s2
      and (allfv_term p_term s0)
        (and (allfv_term p_term s1) (and (allfv_term p_term s2) True))
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      and True
        (and (allfv_term p_term s1)
           (and (allfv_term p_term s2)
              (and (allfv_term p_term s3)
                 (and (allfv_term p_term s4)
                    (and (allfv_term p_term s5)
                       (and (allfv_term p_term s6) True))))))
  | botTrue
  | bot_elim s0 s1 s2
      and True (and (allfv_term p_term s1) (and (allfv_term p_term s2) True))
  end.

Lemma upAllfvTriv_term_term {p : nat Prop} (H : x, p x) :
   x, upAllfv_term_term p x.
Proof.
exact (fun xmatch x with
                | S n'H n'
                | OI
                end).
Qed.

Fixpoint allfvTriv_term (p_term : nat Prop) (H_term : x, p_term x)
(s : term) {struct s} : allfv_term p_term s :=
  match s with
  | var s0H_term s0
  | Sort s0 s1conj I (conj I I)
  | Pi s0 s1 s2 s3 s4 s5
      conj I
        (conj I
           (conj I
              (conj I
                 (conj (allfvTriv_term p_term H_term s4)
                    (conj
                       (allfvTriv_term (upAllfv_term_term p_term)
                          (upAllfvTriv_term_term H_term) s5) I)))))
  | lam s0 s1 s2
      conj I
        (conj (allfvTriv_term p_term H_term s1)
           (conj
              (allfvTriv_term (upAllfv_term_term p_term)
                 (upAllfvTriv_term_term H_term) s2) I))
  | app s0 s1
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1) I)
  | Erased s0conj (allfvTriv_term p_term H_term s0) I
  | hide s0conj (allfvTriv_term p_term H_term s0) I
  | reveal s0 s1 s2
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2) I))
  | Reveal s0 s1
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1) I)
  | toRev s0 s1 s2
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2) I))
  | fromRev s0 s1 s2
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2) I))
  | gheq s0 s1 s2
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2) I))
  | ghrefl s0 s1
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1) I)
  | ghcast s0 s1 s2 s3 s4 s5
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2)
              (conj (allfvTriv_term p_term H_term s3)
                 (conj (allfvTriv_term p_term H_term s4)
                    (conj (allfvTriv_term p_term H_term s5) I)))))
  | tboolI
  | ttrueI
  | tfalseI
  | tif s0 s1 s2 s3 s4
      conj I
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2)
              (conj (allfvTriv_term p_term H_term s3)
                 (conj (allfvTriv_term p_term H_term s4) I))))
  | tnatI
  | tzeroI
  | tsucc s0conj (allfvTriv_term p_term H_term s0) I
  | tnat_elim s0 s1 s2 s3 s4
      conj I
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2)
              (conj (allfvTriv_term p_term H_term s3)
                 (conj (allfvTriv_term p_term H_term s4) I))))
  | tvec s0 s1
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1) I)
  | tvnil s0conj (allfvTriv_term p_term H_term s0) I
  | tvcons s0 s1 s2
      conj (allfvTriv_term p_term H_term s0)
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2) I))
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      conj I
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2)
              (conj (allfvTriv_term p_term H_term s3)
                 (conj (allfvTriv_term p_term H_term s4)
                    (conj (allfvTriv_term p_term H_term s5)
                       (conj (allfvTriv_term p_term H_term s6) I))))))
  | botI
  | bot_elim s0 s1 s2
      conj I
        (conj (allfvTriv_term p_term H_term s1)
           (conj (allfvTriv_term p_term H_term s2) I))
  end.

Lemma upAllfvImpl_term_term {p : nat Prop} {q : nat Prop}
  (H : x, p x q x) :
   x, upAllfv_term_term p x upAllfv_term_term q x.
Proof.
exact (fun xmatch x with
                | S n'H n'
                | Ofun HpHp
                end).
Qed.

Fixpoint allfvImpl_term (p_term : nat Prop) (q_term : nat Prop)
(H_term : x, p_term x q_term x) (s : term) {struct s} :
allfv_term p_term s allfv_term q_term s :=
  match s with
  | var s0fun HPH_term s0 HP
  | Sort s0 s1fun HPconj I (conj I I)
  | Pi s0 s1 s2 s3 s4 s5
      fun HP
      conj I
        (conj I
           (conj I
              (conj I
                 (conj
                    (allfvImpl_term p_term q_term H_term s4
                       match HP with
                       | conj _ HP
                           match HP with
                           | conj _ HP
                               match HP with
                               | conj _ HP
                                   match HP with
                                   | conj _ HP
                                       match HP with
                                       | conj HP _HP
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvImpl_term (upAllfv_term_term p_term)
                          (upAllfv_term_term q_term)
                          (upAllfvImpl_term_term H_term) s5
                          match HP with
                          | conj _ HP
                              match HP with
                              | conj _ HP
                                  match HP with
                                  | conj _ HP
                                      match HP with
                                      | conj _ HP
                                          match HP with
                                          | conj _ HP
                                              match HP with
                                              | conj HP _HP
                                              end
                                          end
                                      end
                                  end
                              end
                          end) I)))))
  | lam s0 s1 s2
      fun HP
      conj I
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term (upAllfv_term_term p_term)
                 (upAllfv_term_term q_term) (upAllfvImpl_term_term H_term) s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  | app s0 s1
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end) I)
  | Erased s0
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end) I
  | hide s0
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end) I
  | reveal s0 s1 s2
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  | Reveal s0 s1
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end) I)
  | toRev s0 s1 s2
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  | fromRev s0 s1 s2
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  | gheq s0 s1 s2
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  | ghrefl s0 s1
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end) I)
  | ghcast s0 s1 s2 s3 s4 s5
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end)
              (conj
                 (allfvImpl_term p_term q_term H_term s3
                    match HP with
                    | conj _ HP
                        match HP with
                        | conj _ HP
                            match HP with
                            | conj _ HP
                                match HP with
                                | conj HP _HP
                                end
                            end
                        end
                    end)
                 (conj
                    (allfvImpl_term p_term q_term H_term s4
                       match HP with
                       | conj _ HP
                           match HP with
                           | conj _ HP
                               match HP with
                               | conj _ HP
                                   match HP with
                                   | conj _ HP
                                       match HP with
                                       | conj HP _HP
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvImpl_term p_term q_term H_term s5
                          match HP with
                          | conj _ HP
                              match HP with
                              | conj _ HP
                                  match HP with
                                  | conj _ HP
                                      match HP with
                                      | conj _ HP
                                          match HP with
                                          | conj _ HP
                                              match HP with
                                              | conj HP _HP
                                              end
                                          end
                                      end
                                  end
                              end
                          end) I)))))
  | tboolfun HPI
  | ttruefun HPI
  | tfalsefun HPI
  | tif s0 s1 s2 s3 s4
      fun HP
      conj I
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end)
              (conj
                 (allfvImpl_term p_term q_term H_term s3
                    match HP with
                    | conj _ HP
                        match HP with
                        | conj _ HP
                            match HP with
                            | conj _ HP
                                match HP with
                                | conj HP _HP
                                end
                            end
                        end
                    end)
                 (conj
                    (allfvImpl_term p_term q_term H_term s4
                       match HP with
                       | conj _ HP
                           match HP with
                           | conj _ HP
                               match HP with
                               | conj _ HP
                                   match HP with
                                   | conj _ HP
                                       match HP with
                                       | conj HP _HP
                                       end
                                   end
                               end
                           end
                       end) I))))
  | tnatfun HPI
  | tzerofun HPI
  | tsucc s0
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end) I
  | tnat_elim s0 s1 s2 s3 s4
      fun HP
      conj I
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end)
              (conj
                 (allfvImpl_term p_term q_term H_term s3
                    match HP with
                    | conj _ HP
                        match HP with
                        | conj _ HP
                            match HP with
                            | conj _ HP
                                match HP with
                                | conj HP _HP
                                end
                            end
                        end
                    end)
                 (conj
                    (allfvImpl_term p_term q_term H_term s4
                       match HP with
                       | conj _ HP
                           match HP with
                           | conj _ HP
                               match HP with
                               | conj _ HP
                                   match HP with
                                   | conj _ HP
                                       match HP with
                                       | conj HP _HP
                                       end
                                   end
                               end
                           end
                       end) I))))
  | tvec s0 s1
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end) I)
  | tvnil s0
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end) I
  | tvcons s0 s1 s2
      fun HP
      conj
        (allfvImpl_term p_term q_term H_term s0
           match HP with
           | conj HP _HP
           end)
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      fun HP
      conj I
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end)
              (conj
                 (allfvImpl_term p_term q_term H_term s3
                    match HP with
                    | conj _ HP
                        match HP with
                        | conj _ HP
                            match HP with
                            | conj _ HP
                                match HP with
                                | conj HP _HP
                                end
                            end
                        end
                    end)
                 (conj
                    (allfvImpl_term p_term q_term H_term s4
                       match HP with
                       | conj _ HP
                           match HP with
                           | conj _ HP
                               match HP with
                               | conj _ HP
                                   match HP with
                                   | conj _ HP
                                       match HP with
                                       | conj HP _HP
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvImpl_term p_term q_term H_term s5
                          match HP with
                          | conj _ HP
                              match HP with
                              | conj _ HP
                                  match HP with
                                  | conj _ HP
                                      match HP with
                                      | conj _ HP
                                          match HP with
                                          | conj _ HP
                                              match HP with
                                              | conj HP _HP
                                              end
                                          end
                                      end
                                  end
                              end
                          end)
                       (conj
                          (allfvImpl_term p_term q_term H_term s6
                             match HP with
                             | conj _ HP
                                 match HP with
                                 | conj _ HP
                                     match HP with
                                     | conj _ HP
                                         match HP with
                                         | conj _ HP
                                             match HP with
                                             | conj _ HP
                                                 match HP with
                                                 | conj _ HP
                                                     match HP with
                                                     | conj HP _HP
                                                     end
                                                 end
                                             end
                                         end
                                     end
                                 end
                             end) I))))))
  | botfun HPI
  | bot_elim s0 s1 s2
      fun HP
      conj I
        (conj
           (allfvImpl_term p_term q_term H_term s1
              match HP with
              | conj _ HPmatch HP with
                             | conj HP _HP
                             end
              end)
           (conj
              (allfvImpl_term p_term q_term H_term s2
                 match HP with
                 | conj _ HP
                     match HP with
                     | conj _ HPmatch HP with
                                    | conj HP _HP
                                    end
                     end
                 end) I))
  end.

Lemma upAllfvRenL_term_term (p : nat Prop) (xi : nat nat) :
   x,
  upAllfv_term_term p (upRen_term_term xi x)
  upAllfv_term_term (funcomp p xi) x.
Proof.
exact (fun xmatch x with
                | S n'fun ii
                | Ofun HH
                end).
Qed.

Fixpoint allfvRenL_term (p_term : nat Prop) (xi_term : nat nat)
(s : term) {struct s} :
allfv_term p_term (ren_term xi_term s)
allfv_term (funcomp p_term xi_term) s :=
  match s with
  | var s0fun HH
  | Sort s0 s1fun Hconj I (conj I I)
  | Pi s0 s1 s2 s3 s4 s5
      fun H
      conj I
        (conj I
           (conj I
              (conj I
                 (conj
                    (allfvRenL_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvImpl_term _ _
                          (upAllfvRenL_term_term p_term xi_term) s5
                          (allfvRenL_term (upAllfv_term_term p_term)
                             (upRen_term_term xi_term) s5
                             match H with
                             | conj _ H
                                 match H with
                                 | conj _ H
                                     match H with
                                     | conj _ H
                                         match H with
                                         | conj _ H
                                             match H with
                                             | conj _ H
                                                 match H with
                                                 | conj H _H
                                                 end
                                             end
                                         end
                                     end
                                 end
                             end)) I)))))
  | lam s0 s1 s2
      fun H
      conj I
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvImpl_term _ _ (upAllfvRenL_term_term p_term xi_term) s2
                 (allfvRenL_term (upAllfv_term_term p_term)
                    (upRen_term_term xi_term) s2
                    match H with
                    | conj _ H
                        match H with
                        | conj _ Hmatch H with
                                      | conj H _H
                                      end
                        end
                    end)) I))
  | app s0 s1
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | Erased s0
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | hide s0
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | reveal s0 s1 s2
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | Reveal s0 s1
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | toRev s0 s1 s2
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | fromRev s0 s1 s2
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | gheq s0 s1 s2
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | ghrefl s0 s1
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | ghcast s0 s1 s2 s3 s4 s5
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenL_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenL_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvRenL_term p_term xi_term s5
                          match H with
                          | conj _ H
                              match H with
                              | conj _ H
                                  match H with
                                  | conj _ H
                                      match H with
                                      | conj _ H
                                          match H with
                                          | conj _ H
                                              match H with
                                              | conj H _H
                                              end
                                          end
                                      end
                                  end
                              end
                          end) I)))))
  | tboolfun HI
  | ttruefun HI
  | tfalsefun HI
  | tif s0 s1 s2 s3 s4
      fun H
      conj I
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenL_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenL_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end) I))))
  | tnatfun HI
  | tzerofun HI
  | tsucc s0
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | tnat_elim s0 s1 s2 s3 s4
      fun H
      conj I
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenL_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenL_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end) I))))
  | tvec s0 s1
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | tvnil s0
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | tvcons s0 s1 s2
      fun H
      conj
        (allfvRenL_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      fun H
      conj I
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenL_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenL_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvRenL_term p_term xi_term s5
                          match H with
                          | conj _ H
                              match H with
                              | conj _ H
                                  match H with
                                  | conj _ H
                                      match H with
                                      | conj _ H
                                          match H with
                                          | conj _ H
                                              match H with
                                              | conj H _H
                                              end
                                          end
                                      end
                                  end
                              end
                          end)
                       (conj
                          (allfvRenL_term p_term xi_term s6
                             match H with
                             | conj _ H
                                 match H with
                                 | conj _ H
                                     match H with
                                     | conj _ H
                                         match H with
                                         | conj _ H
                                             match H with
                                             | conj _ H
                                                 match H with
                                                 | conj _ H
                                                     match H with
                                                     | conj H _H
                                                     end
                                                 end
                                             end
                                         end
                                     end
                                 end
                             end) I))))))
  | botfun HI
  | bot_elim s0 s1 s2
      fun H
      conj I
        (conj
           (allfvRenL_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenL_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  end.

Lemma upAllfvRenR_term_term (p : nat Prop) (xi : nat nat) :
   x,
  upAllfv_term_term (funcomp p xi) x
  upAllfv_term_term p (upRen_term_term xi x).
Proof.
exact (fun xmatch x with
                | S n'fun ii
                | Ofun HH
                end).
Qed.

Fixpoint allfvRenR_term (p_term : nat Prop) (xi_term : nat nat)
(s : term) {struct s} :
allfv_term (funcomp p_term xi_term) s
allfv_term p_term (ren_term xi_term s) :=
  match s with
  | var s0fun HH
  | Sort s0 s1fun Hconj I (conj I I)
  | Pi s0 s1 s2 s3 s4 s5
      fun H
      conj I
        (conj I
           (conj I
              (conj I
                 (conj
                    (allfvRenR_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvRenR_term (upAllfv_term_term p_term)
                          (upRen_term_term xi_term) s5
                          (allfvImpl_term _ _
                             (upAllfvRenR_term_term p_term xi_term) s5
                             match H with
                             | conj _ H
                                 match H with
                                 | conj _ H
                                     match H with
                                     | conj _ H
                                         match H with
                                         | conj _ H
                                             match H with
                                             | conj _ H
                                                 match H with
                                                 | conj H _H
                                                 end
                                             end
                                         end
                                     end
                                 end
                             end)) I)))))
  | lam s0 s1 s2
      fun H
      conj I
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term (upAllfv_term_term p_term)
                 (upRen_term_term xi_term) s2
                 (allfvImpl_term _ _ (upAllfvRenR_term_term p_term xi_term)
                    s2
                    match H with
                    | conj _ H
                        match H with
                        | conj _ Hmatch H with
                                      | conj H _H
                                      end
                        end
                    end)) I))
  | app s0 s1
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | Erased s0
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | hide s0
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | reveal s0 s1 s2
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | Reveal s0 s1
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | toRev s0 s1 s2
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | fromRev s0 s1 s2
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | gheq s0 s1 s2
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | ghrefl s0 s1
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | ghcast s0 s1 s2 s3 s4 s5
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenR_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenR_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvRenR_term p_term xi_term s5
                          match H with
                          | conj _ H
                              match H with
                              | conj _ H
                                  match H with
                                  | conj _ H
                                      match H with
                                      | conj _ H
                                          match H with
                                          | conj _ H
                                              match H with
                                              | conj H _H
                                              end
                                          end
                                      end
                                  end
                              end
                          end) I)))))
  | tboolfun HI
  | ttruefun HI
  | tfalsefun HI
  | tif s0 s1 s2 s3 s4
      fun H
      conj I
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenR_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenR_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end) I))))
  | tnatfun HI
  | tzerofun HI
  | tsucc s0
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | tnat_elim s0 s1 s2 s3 s4
      fun H
      conj I
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenR_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenR_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end) I))))
  | tvec s0 s1
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end) I)
  | tvnil s0
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end) I
  | tvcons s0 s1 s2
      fun H
      conj
        (allfvRenR_term p_term xi_term s0 match H with
                                          | conj H _H
                                          end)
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  | tvec_elim s0 s1 s2 s3 s4 s5 s6
      fun H
      conj I
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end)
              (conj
                 (allfvRenR_term p_term xi_term s3
                    match H with
                    | conj _ H
                        match H with
                        | conj _ H
                            match H with
                            | conj _ Hmatch H with
                                          | conj H _H
                                          end
                            end
                        end
                    end)
                 (conj
                    (allfvRenR_term p_term xi_term s4
                       match H with
                       | conj _ H
                           match H with
                           | conj _ H
                               match H with
                               | conj _ H
                                   match H with
                                   | conj _ H
                                       match H with
                                       | conj H _H
                                       end
                                   end
                               end
                           end
                       end)
                    (conj
                       (allfvRenR_term p_term xi_term s5
                          match H with
                          | conj _ H
                              match H with
                              | conj _ H
                                  match H with
                                  | conj _ H
                                      match H with
                                      | conj _ H
                                          match H with
                                          | conj _ H
                                              match H with
                                              | conj H _H
                                              end
                                          end
                                      end
                                  end
                              end
                          end)
                       (conj
                          (allfvRenR_term p_term xi_term s6
                             match H with
                             | conj _ H
                                 match H with
                                 | conj _ H
                                     match H with
                                     | conj _ H
                                         match H with
                                         | conj _ H
                                             match H with
                                             | conj _ H
                                                 match H with
                                                 | conj _ H
                                                     match H with
                                                     | conj H _H
                                                     end
                                                 end
                                             end
                                         end
                                     end
                                 end
                             end) I))))))
  | botfun HI
  | bot_elim s0 s1 s2
      fun H
      conj I
        (conj
           (allfvRenR_term p_term xi_term s1
              match H with
              | conj _ Hmatch H with
                            | conj H _H
                            end
              end)
           (conj
              (allfvRenR_term p_term xi_term s2
                 match H with
                 | conj _ H
                     match H with
                     | conj _ Hmatch H with
                                   | conj H _H
                                   end
                     end
                 end) I))
  end.

End Allfv.

Module Extra.

Import Core.

#[global]Hint Opaque subst_term: rewrite.

#[global]Hint Opaque ren_term: rewrite.

End Extra.

Module interface.

Export Core.

Export Allfv.

Export Extra.

End interface.

Export interface.