{-# OPTIONS --without-K --safe #-}
open import Definition.Typed.EqualityRelation
open import Tools.Relation
module Definition.LogicalRelation.Substitution.Conversion {a ℓ} (M′ : Setoid a ℓ)
{{eqrel : EqRelSet M′}} where
open EqRelSet {{...}}
open Setoid M′ using () renaming (Carrier to M)
open import Definition.LogicalRelation.Irrelevance M′
open import Definition.LogicalRelation.Properties M′
open import Definition.LogicalRelation.Substitution M′
open import Definition.Untyped M using (Con ; Term)
open import Tools.Nat
open import Tools.Product
private
variable
n : Nat
Γ : Con Term n
convᵛ : ∀ {t A B l}
([Γ] : ⊩ᵛ Γ)
([A] : Γ ⊩ᵛ⟨ l ⟩ A / [Γ])
([B] : Γ ⊩ᵛ⟨ l ⟩ B / [Γ])
→ Γ ⊩ᵛ⟨ l ⟩ A ≡ B / [Γ] / [A]
→ Γ ⊩ᵛ⟨ l ⟩ t ∷ A / [Γ] / [A]
→ Γ ⊩ᵛ⟨ l ⟩ t ∷ B / [Γ] / [B]
convᵛ [Γ] [A] [B] [A≡B] [t] ⊢Δ [σ] =
let [σA] = proj₁ ([A] ⊢Δ [σ])
[σB] = proj₁ ([B] ⊢Δ [σ])
[σA≡σB] = irrelevanceEq [σA] [σA] ([A≡B] ⊢Δ [σ])
[σt] = proj₁ ([t] ⊢Δ [σ])
[σt≡σ′t] = proj₂ ([t] ⊢Δ [σ])
in convTerm₁ [σA] [σB] [σA≡σB] [σt]
, λ [σ′] [σ≡σ′] → convEqTerm₁ [σA] [σB] [σA≡σB] ([σt≡σ′t] [σ′] [σ≡σ′])
conv₂ᵛ : ∀ {t A B l}
([Γ] : ⊩ᵛ Γ)
([A] : Γ ⊩ᵛ⟨ l ⟩ A / [Γ])
([B] : Γ ⊩ᵛ⟨ l ⟩ B / [Γ])
→ Γ ⊩ᵛ⟨ l ⟩ A ≡ B / [Γ] / [A]
→ Γ ⊩ᵛ⟨ l ⟩ t ∷ B / [Γ] / [B]
→ Γ ⊩ᵛ⟨ l ⟩ t ∷ A / [Γ] / [A]
conv₂ᵛ [Γ] [A] [B] [A≡B] [t] ⊢Δ [σ] =
let [σA] = proj₁ ([A] ⊢Δ [σ])
[σB] = proj₁ ([B] ⊢Δ [σ])
[σA≡σB] = irrelevanceEq [σA] [σA] ([A≡B] ⊢Δ [σ])
[σt] = proj₁ ([t] ⊢Δ [σ])
[σt≡σ′t] = proj₂ ([t] ⊢Δ [σ])
in convTerm₂ [σA] [σB] [σA≡σB] [σt]
, λ [σ′] [σ≡σ′] → convEqTerm₂ [σA] [σB] [σA≡σB] ([σt≡σ′t] [σ′] [σ≡σ′])
convEqᵛ : ∀ {t u A B l}
([Γ] : ⊩ᵛ Γ)
([A] : Γ ⊩ᵛ⟨ l ⟩ A / [Γ])
([B] : Γ ⊩ᵛ⟨ l ⟩ B / [Γ])
→ Γ ⊩ᵛ⟨ l ⟩ A ≡ B / [Γ] / [A]
→ Γ ⊩ᵛ⟨ l ⟩ t ≡ u ∷ A / [Γ] / [A]
→ Γ ⊩ᵛ⟨ l ⟩ t ≡ u ∷ B / [Γ] / [B]
convEqᵛ [Γ] [A] [B] [A≡B] [t≡u] ⊢Δ [σ] =
let [σA] = proj₁ ([A] ⊢Δ [σ])
[σB] = proj₁ ([B] ⊢Δ [σ])
[σA≡σB] = irrelevanceEq [σA] [σA] ([A≡B] ⊢Δ [σ])
in convEqTerm₁ [σA] [σB] [σA≡σB] ([t≡u] ⊢Δ [σ])