{-# OPTIONS --safe --without-K #-} module IK.Term.Conversion where open import PEUtil open import IK.Term.Base open import IK.Term.Reduction as Reduction import Data.Sum as Sum open import Relation.Nullary using (¬_) open import Relation.Binary using (Setoid) open import Relation.Binary.Construct.Closure.Equivalence using (setoid) import Relation.Binary.Construct.Closure.Equivalence.Properties as EquivalenceProperties open import Relation.Binary.Construct.Closure.ReflexiveTransitive as ReflexiveTransitive using (Star) open import Relation.Binary.PropositionalEquality using (_≡_ ; cong ; cong₂) renaming (refl to ≡-refl ; sym to ≡-sym ; trans to ≡-trans) open Sum public using (inj₁ ; inj₂) open ReflexiveTransitive public using (ε ; _◅_) open EquivalenceProperties public using () renaming (a—↠b⇒a↔b to ⟶*-to-≈) -- Convertibility is defined by taking the equivalence closure of the -- reduction relation `_⟶_`, i.e. two terms `t` and `u` are -- convertible (written `t ≈ u`) if and only if there is a sequence of -- terms `sᵢ` for i = 0,…,n such that 1. `s₀ = t`, 2. `sₙ = u`, and -- 3. `sᵢ ⟶ sᵢ₊₁` or `sᵢ₊₁ ⟶ sᵢ` for all i. -- -- Note that `_⟶_` is already a congruence, i.e. `u ⟶ v` implies `t[u] -- ⟶ t[v]`, and being a congruence preserved by closing under -- reflexivity, symmetry and transitivity. Tm-setoid : (Γ : Ctx) → (a : Ty) → Setoid _ _ Tm-setoid Γ a = setoid (_⟶_ {Γ} {a}) module _ {Γ : Ctx} {a : Ty} where open Setoid (Tm-setoid Γ a) public using (_≈_) renaming (refl to ≈-refl ; reflexive to ≈-reflexive ; sym to ≈-sym ; trans to ≈-trans ; isEquivalence to ≈-equiv) ≈-reflexive˘ : t' ≡ t → t ≈ t' ≈-reflexive˘ t'≡t = ≈-reflexive (≡-sym t'≡t) ⟶-to-≈ : t ⟶ t' → t ≈ t' ⟶-to-≈ p = inj₁ p ◅ ε module _ {t : Tm Γ a → Tm Δ b} (cong-t : ∀ {u u' : Tm Γ a} → (u⟶u' : u ⟶ u') → t u ⟶ t u') where cong-⟶-to-cong-≈ : ∀ (u≈u' : u ≈ u') → t u ≈ t u' cong-⟶-to-cong-≈ ε = ε cong-⟶-to-cong-≈ (inj₁ u⟶u'' ◅ u''≈u') = inj₁ (cong-t u⟶u'') ◅ cong-⟶-to-cong-≈ u''≈u' cong-⟶-to-cong-≈ (inj₂ u⟵u'' ◅ u''≈u') = inj₂ (cong-t u⟵u'') ◅ cong-⟶-to-cong-≈ u''≈u' red-fun≈ : (t : Tm (Γ `, a) b) (u : Tm Γ a) → (app (lam t) u) ≈ substTm (idₛ `, u) t red-fun≈ t u = ⟶-to-≈ Reduction.red-fun exp-fun≈ : (t : Tm Γ (a ⇒ b)) → t ≈ lam (app (wkTm fresh t) (var zero)) exp-fun≈ t = ⟶-to-≈ Reduction.exp-fun red-box≈ : (t : Tm (ΓL #) a) (e : LFExt Γ (ΓL #) ΓR) → unbox (box t) e ≈ wkTm (LFExtToWk e) t red-box≈ t e = ⟶-to-≈ Reduction.red-box exp-box≈ : (t : Tm Γ (□ a)) → t ≈ box (unbox t new) exp-box≈ t = ⟶-to-≈ Reduction.exp-box cong-lam≈ : ∀ (t≈t' : t ≈ t') → lam t ≈ lam t' cong-lam≈ = cong-⟶-to-cong-≈ Reduction.cong-lam cong-app≈≡ : ∀ (t≈t' : t ≈ t') (u≡u' : u ≡ u') → app t u ≈ app t' u cong-app≈≡ t≈t' ≡-refl = cong-⟶-to-cong-≈ Reduction.cong-app1 t≈t' cong-app1≈ : ∀ (t≈t' : t ≈ t') → app t u ≈ app t' u cong-app1≈ t≈t' = cong-app≈≡ t≈t' ≡-refl cong-app≡≈ : ∀ (t≡t' : t ≡ t') (u≈u' : u ≈ u') → app t u ≈ app t' u' cong-app≡≈ ≡-refl u≈u' = cong-⟶-to-cong-≈ Reduction.cong-app2 u≈u' cong-app2≈ : ∀ (u≈u' : u ≈ u') → app t u ≈ app t u' cong-app2≈ u≈u' = cong-app≡≈ ≡-refl u≈u' cong-app≈ : ∀ (t≈t' : t ≈ t') (u≈u' : u ≈ u') → app t u ≈ app t' u' cong-app≈ t≈t' u≈u' = ≈-trans (cong-app1≈ t≈t') (cong-app2≈ u≈u') cong-box≈ : ∀ (t≈t' : t ≈ t') → box t ≈ box t' cong-box≈ = cong-⟶-to-cong-≈ Reduction.cong-box cong-unbox≈ : ∀ (t≈t' : t ≈ t') → unbox t e ≈ unbox t' e cong-unbox≈ = cong-⟶-to-cong-≈ Reduction.cong-unbox module _ {t : Tm ΓL (□ a)} {e : LFExt Γ (ΓL #) ΓR} {e' : LFExt Γ (ΓL #) ΓR'} where cong-unbox2≈ : unbox t e ≈ unbox t e' cong-unbox2≈ = ≈-reflexive (dcong₂ (λ _ΓR → unbox t) (extRUniq e e') (ExtIsProp′ e e')) cong-unbox≈′ : ∀ (t≈t' : t ≈ t') → unbox t e ≈ unbox t' e' cong-unbox≈′ t≈t' = ≈-trans (cong-unbox≈ t≈t') cong-unbox2≈ cong-unbox≈′′ : ∀ (Γ≡Γ' : Γ ≡ Γ') (t≈t' : subst1 Tm Γ≡Γ' t ≈ t') → unbox t e ≈ unbox t' e' cong-unbox≈′′ ≡-refl = cong-unbox≈′ -------------------- -- Derived equations --------------------
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.