Documentation

GroupoidModel.Syntax.Substitution

Universe level bounds #

theorem le_univMax_all {χ : Type u_1} {E : Axioms χ} :
(∀ {Γ : Ctx χ}, WfCtx E Γ∀ {A : Expr χ} {i l : }, Lookup Γ i A ll univMax) (∀ {Γ : Ctx χ} {l : } {A : Expr χ}, E Γ ⊢[l] Al univMax) (∀ {Γ : Ctx χ} {l : } {A B : Expr χ}, E Γ ⊢[l] A Bl univMax) (∀ {Γ : Ctx χ} {l : } {A t : Expr χ}, E Γ ⊢[l] t : Al univMax) ∀ {Γ : Ctx χ} {l : } {A t u : Expr χ}, E Γ ⊢[l] t u : Al univMax
theorem WfCtx.le_univMax_of_lookup {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A : Expr χ} {i l : } :
WfCtx E ΓLookup Γ i A ll univMax
theorem EqTp.le_univMax {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A B : Expr χ} {l : } :
E Γ ⊢[l] A Bl univMax
theorem WfTp.le_univMax {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A : Expr χ} {l : } :
E Γ ⊢[l] Al univMax
theorem WfTm.le_univMax {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A t : Expr χ} {l : } :
E Γ ⊢[l] t : Al univMax
theorem EqTm.le_univMax {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A t u : Expr χ} {l : } :
E Γ ⊢[l] t u : Al univMax

Admissibility of renaming #

@[irreducible]
def WfRen {χ : Type u_1} (Δ : Ctx χ) (ξ : ) (Γ : Ctx χ) :

The renaming ξ : Δ ⟶ Γ is well-formed.

This notion is only useful as an intermediate step in establishing admissibility of substitution. After that, use WfSb and EqSb.

Equations
Instances For
    theorem WfRen.lookup {χ : Type u_1} {Δ Γ : Ctx χ} {A : Expr χ} {ξ : } {i l : } :
    WfRen Δ ξ ΓLookup Γ i A lLookup Δ (ξ i) (Expr.rename ξ A) l
    theorem WfRen.id {χ : Type u_1} (Γ : Ctx χ) :
    theorem WfRen.wk {χ : Type u_1} (Γ : Ctx χ) (A : Expr χ) (l : ) :
    WfRen ((A, l) :: Γ) Nat.succ Γ
    theorem WfRen.comp {χ : Type u_1} {Θ Δ Γ : Ctx χ} {ξ ξ' : } :
    WfRen Θ ξ ΔWfRen Δ ξ' ΓWfRen Θ (ξ ξ') Γ
    theorem WfRen.upr {χ : Type u_1} {Δ Γ : Ctx χ} {A : Expr χ} {ξ : } {l : } :
    WfRen Δ ξ ΓWfRen ((Expr.rename ξ A, l) :: Δ) (Expr.upr ξ) ((A, l) :: Γ)
    theorem rename_all {χ : Type u_1} {E : Axioms χ} :
    (∀ {Γ : Ctx χ} {l : } {A : Expr χ}, E Γ ⊢[l] A∀ {Δ : Ctx χ} {ξ : }, WfCtx E ΔWfRen Δ ξ ΓE Δ ⊢[l] Expr.rename ξ A) (∀ {Γ : Ctx χ} {l : } {A B : Expr χ}, E Γ ⊢[l] A B∀ {Δ : Ctx χ} {ξ : }, WfCtx E ΔWfRen Δ ξ ΓE Δ ⊢[l] Expr.rename ξ A Expr.rename ξ B) (∀ {Γ : Ctx χ} {l : } {A t : Expr χ}, E Γ ⊢[l] t : A∀ {Δ : Ctx χ} {ξ : }, WfCtx E ΔWfRen Δ ξ ΓE Δ ⊢[l] Expr.rename ξ t : Expr.rename ξ A) ∀ {Γ : Ctx χ} {l : } {A t u : Expr χ}, E Γ ⊢[l] t u : A∀ {Δ : Ctx χ} {ξ : }, WfCtx E ΔWfRen Δ ξ ΓE Δ ⊢[l] Expr.rename ξ t Expr.rename ξ u : Expr.rename ξ A

    Lookup well-formedness #

    theorem WfCtx.lookup_wf {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A : Expr χ} {i l : } :
    WfCtx E ΓLookup Γ i A lE Γ ⊢[l] A

    Admissibility of substitution #

    @[irreducible]
    def EqSb {χ : Type u_1} (E : Axioms χ) (Δ : Ctx χ) (σ σ' : Expr χ) (Γ : Ctx χ) :

    The substitutions σ σ' : Δ ⟶ Γ are judgmentally equal.

    This is a functional definition similar to that in the Autosubst paper, but with a lot of preservation data added so that we can use this before proving admissibility of substitution and inversion.

    The additional data is an implementation detail; EqSb should not be unfolded outside of this module.

    A common alternative is to use an inductive characterization.

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      @[irreducible]
      def WfSb {χ : Type u_1} (E : Axioms χ) (Δ : Ctx χ) (σ : Expr χ) (Γ : Ctx χ) :

      The substitution σ : Δ ⟶ Γ is well-formed.

      Equations
      Instances For
        theorem EqSb.refl {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ : Expr χ} :
        WfSb E Δ σ ΓEqSb E Δ σ σ Γ
        theorem EqSb.symm {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ σ' : Expr χ} :
        EqSb E Δ σ σ' ΓEqSb E Δ σ' σ Γ
        theorem EqSb.trans {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ σ' σ'' : Expr χ} :
        EqSb E Δ σ σ' ΓEqSb E Δ σ' σ'' ΓEqSb E Δ σ σ'' Γ
        theorem EqSb.lookup {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ σ' : Expr χ} {i l : } :
        EqSb E Δ σ σ' ΓLookup Γ i A lE Δ ⊢[l] σ i σ' i : Expr.subst σ A
        theorem EqSb.wf_dom {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ σ' : Expr χ} :
        EqSb E Δ σ σ' ΓWfCtx E Δ
        theorem EqSb.wf_cod {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ σ' : Expr χ} :
        EqSb E Δ σ σ' ΓWfCtx E Γ
        theorem EqSb.wf_left {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ σ' : Expr χ} :
        EqSb E Δ σ σ' ΓWfSb E Δ σ Γ
        theorem EqSb.wf_right {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ σ' : Expr χ} :
        EqSb E Δ σ σ' ΓWfSb E Δ σ' Γ
        theorem WfSb.eq_self {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ : Expr χ} :
        WfSb E Δ σ ΓEqSb E Δ σ σ Γ
        theorem WfSb.ofRen {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {ξ : } :
        WfCtx E ΔWfCtx E ΓWfRen Δ ξ ΓWfSb E Δ (Expr.ofRen χ ξ) Γ
        theorem WfSb.id {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} :
        WfCtx E ΓWfSb E Γ Expr.bvar Γ
        theorem WfSb.lookup {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ : Expr χ} {i l : } :
        WfSb E Δ σ ΓLookup Γ i A lE Δ ⊢[l] σ i : Expr.subst σ A
        theorem WfSb.wf_dom {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ : Expr χ} :
        WfSb E Δ σ ΓWfCtx E Δ
        theorem WfSb.wf_cod {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {σ : Expr χ} :
        WfSb E Δ σ ΓWfCtx E Γ
        theorem SubstProof.tp_wk {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A B : Expr χ} {l l' : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l'] BE (A, l) :: Γ ⊢[l'] Expr.subst Expr.wk B
        theorem SubstProof.eqTp_wk {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A B B' : Expr χ} {l l' : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l'] B B'E (A, l) :: Γ ⊢[l'] Expr.subst Expr.wk B Expr.subst Expr.wk B'
        theorem SubstProof.tm_wk {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A B b : Expr χ} {l l' : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l'] b : BE (A, l) :: Γ ⊢[l'] Expr.subst Expr.wk b : Expr.subst Expr.wk B
        theorem SubstProof.eqTm_wk {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A B b b' : Expr χ} {l l' : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l'] b b' : BE (A, l) :: Γ ⊢[l'] Expr.subst Expr.wk b Expr.subst Expr.wk b' : Expr.subst Expr.wk B
        theorem SubstProof.eqSb_snoc {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t t' : Expr χ} {σ σ' : Expr χ} {l : } :
        EqSb E Δ σ σ' ΓE Γ ⊢[l] AE Δ ⊢[l] Expr.subst σ AE Δ ⊢[l] Expr.subst σ' AE Δ ⊢[l] Expr.subst σ A Expr.subst σ' AE Δ ⊢[l] t : Expr.subst σ AE Δ ⊢[l] t' : Expr.subst σ' AE Δ ⊢[l] t t' : Expr.subst σ AEqSb E Δ (Expr.snoc σ t) (Expr.snoc σ' t') ((A, l) :: Γ)
        theorem SubstProof.eqSb_toSb {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A t t' : Expr χ} {l : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l] t : AE Γ ⊢[l] t' : AE Γ ⊢[l] t t' : AEqSb E Γ t.toSb t'.toSb ((A, l) :: Γ)
        theorem SubstProof.wfSb_snoc {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t : Expr χ} {σ : Expr χ} {l : } :
        WfSb E Δ σ ΓE Γ ⊢[l] AE Δ ⊢[l] Expr.subst σ AE Δ ⊢[l] t : Expr.subst σ AWfSb E Δ (Expr.snoc σ t) ((A, l) :: Γ)
        theorem SubstProof.wfSb_toSb {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A t : Expr χ} {l : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l] t : AWfSb E Γ t.toSb ((A, l) :: Γ)
        theorem SubstProof.eqSb_up {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ σ' : Expr χ} {l : } :
        EqSb E Δ σ σ' ΓE Γ ⊢[l] AE Δ ⊢[l] Expr.subst σ AE Δ ⊢[l] Expr.subst σ' AE Δ ⊢[l] Expr.subst σ A Expr.subst σ' AEqSb E ((Expr.subst σ A, l) :: Δ) (Expr.up σ) (Expr.up σ') ((A, l) :: Γ)
        theorem SubstProof.wfSb_wk {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A : Expr χ} {l : } :
        WfCtx E ΓE Γ ⊢[l] AWfSb E ((A, l) :: Γ) Expr.wk Γ
        theorem SubstProof.wfSb_up {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ : Expr χ} {l : } :
        WfSb E Δ σ ΓE Γ ⊢[l] AE Δ ⊢[l] Expr.subst σ AWfSb E ((Expr.subst σ A, l) :: Δ) (Expr.up σ) ((A, l) :: Γ)
        theorem SubstProof.Id_bvar {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {A t : Expr χ} {l : } :
        WfCtx E ΓE Γ ⊢[l] AE Γ ⊢[l] t : AE (A, l) :: Γ ⊢[l] Expr.Id l (Expr.subst Expr.wk A) (Expr.subst Expr.wk t) (Expr.bvar 0)
        theorem SubstProof.subst_all {χ : Type u_1} {E : Axioms χ} :
        (∀ {Γ : Ctx χ} {l : } {A : Expr χ}, E Γ ⊢[l] A(∀ {Δ : Ctx χ} {σ : Expr χ}, WfSb E Δ σ ΓE Δ ⊢[l] Expr.subst σ A) ∀ {Δ : Ctx χ} {σ σ' : Expr χ}, EqSb E Δ σ σ' ΓE Δ ⊢[l] Expr.subst σ A Expr.subst σ' A) (∀ {Γ : Ctx χ} {l : } {A B : Expr χ}, E Γ ⊢[l] A B∀ {Δ : Ctx χ} {σ σ' : Expr χ}, EqSb E Δ σ σ' ΓE Δ ⊢[l] Expr.subst σ A Expr.subst σ' B) (∀ {Γ : Ctx χ} {l : } {A t : Expr χ}, E Γ ⊢[l] t : A(∀ {Δ : Ctx χ} {σ : Expr χ}, WfSb E Δ σ ΓE Δ ⊢[l] Expr.subst σ t : Expr.subst σ A) ∀ {Δ : Ctx χ} {σ σ' : Expr χ}, EqSb E Δ σ σ' ΓE Δ ⊢[l] Expr.subst σ t Expr.subst σ' t : Expr.subst σ A) ∀ {Γ : Ctx χ} {l : } {A t u : Expr χ}, E Γ ⊢[l] t u : A∀ {Δ : Ctx χ} {σ σ' : Expr χ}, EqSb E Δ σ σ' ΓE Δ ⊢[l] Expr.subst σ t Expr.subst σ' u : Expr.subst σ A

        Substitution helper lemmas #

        theorem WfTp.subst_eq {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ σ' : Expr χ} {l : } (h : E Γ ⊢[l] A) (hσσ' : EqSb E Δ σ σ' Γ) :
        E Δ ⊢[l] Expr.subst σ A Expr.subst σ' A
        theorem EqTp.subst_eq {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A B : Expr χ} {σ σ' : Expr χ} {l : } (h : E Γ ⊢[l] A B) (hσσ' : EqSb E Δ σ σ' Γ) :
        E Δ ⊢[l] Expr.subst σ A Expr.subst σ' B
        theorem WfTm.subst_eq {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t : Expr χ} {σ σ' : Expr χ} {l : } (h : E Γ ⊢[l] t : A) (hσσ' : EqSb E Δ σ σ' Γ) :
        E Δ ⊢[l] Expr.subst σ t Expr.subst σ' t : Expr.subst σ A
        theorem EqTm.subst_eq {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t u : Expr χ} {σ σ' : Expr χ} {l : } (h : E Γ ⊢[l] t u : A) (hσσ' : EqSb E Δ σ σ' Γ) :
        E Δ ⊢[l] Expr.subst σ t Expr.subst σ' u : Expr.subst σ A
        theorem WfTp.subst {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ : Expr χ} {l : } (h : E Γ ⊢[l] A) ( : WfSb E Δ σ Γ) :
        E Δ ⊢[l] Expr.subst σ A
        theorem EqTp.subst {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A B : Expr χ} {σ : Expr χ} {l : } (h : E Γ ⊢[l] A B) ( : WfSb E Δ σ Γ) :
        theorem WfTm.subst {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t : Expr χ} {σ : Expr χ} {l : } (h : E Γ ⊢[l] t : A) ( : WfSb E Δ σ Γ) :
        E Δ ⊢[l] Expr.subst σ t : Expr.subst σ A
        theorem EqTm.subst {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t u : Expr χ} {σ : Expr χ} {l : } (h : E Γ ⊢[l] t u : A) ( : WfSb E Δ σ Γ) :

        Consequences of substitution #

        theorem WfSb.snoc {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A t : Expr χ} {σ : Expr χ} {l : } :
        WfSb E Δ σ ΓE Γ ⊢[l] AE Δ ⊢[l] t : Expr.subst σ AWfSb E Δ (Expr.snoc σ t) ((A, l) :: Γ)
        theorem WfSb.up {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ : Expr χ} {l : } :
        WfSb E Δ σ ΓE Γ ⊢[l] AWfSb E ((Expr.subst σ A, l) :: Δ) (Expr.up σ) ((A, l) :: Γ)
        theorem EqSb.up {χ : Type u_1} {E : Axioms χ} {Δ Γ : Ctx χ} {A : Expr χ} {σ σ' : Expr χ} {l : } :
        EqSb E Δ σ σ' ΓE Γ ⊢[l] AEqSb E ((Expr.subst σ A, l) :: Δ) (Expr.up σ) (Expr.up σ') ((A, l) :: Γ)
        theorem Axioms.Wf.atCtx {χ : Type u_1} {E : Axioms χ} {Γ : Ctx χ} {c : χ} {Al : { Al : Expr χ × // Expr.isClosed 0 Al.fst = true Al.snd univMax }} :
        E.WfWfCtx E ΓE c = some AlE Γ ⊢[Al.val.snd] Al.val.fst

        The type of any axiom is closed, so can be used in any context without weakening.