{-# OPTIONS --safe --without-K #-}
module IS4.Term.Conversion where
open import Data.Product using (Σ ; _,_)
import Data.Sum as Sum
open import Relation.Binary using (Setoid)
open import Relation.Binary.Construct.Closure.Equivalence using (setoid)
import Relation.Binary.Construct.Closure.Equivalence.Properties as EquivalenceProperties
import Relation.Binary.Construct.Closure.ReflexiveTransitive as ReflexiveTransitive
open import Relation.Binary.PropositionalEquality
using (_≡_ ; cong ; cong₂ ; subst ; subst₂ ; module ≡-Reasoning)
renaming (refl to ≡-refl ; sym to ≡-sym ; trans to ≡-trans)
open import PUtil
open import PEUtil
open import IS4.Term.Base
open import IS4.Term.Reduction as Reduction
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-≈ = ≈-reflexive
≈-˘trans : t' ≈ t → t' ≈ t'' → t ≈ t''
≈-˘trans t'≈t t'≈t'' = ≈-trans (≈-sym t'≈t) t'≈t''
≈-trans˘ : t ≈ t' → t'' ≈ t' → t ≈ t''
≈-trans˘ t≈t' t''≈t' = ≈-trans t≈t' (≈-sym t''≈t')
≡-≈-trans˘ : t ≡ t' → t'' ≈ t' → t ≈ t''
≡-≈-trans˘ t≡t' t''≈t' = ≈-trans˘ (≡-to-≈ t≡t') t''≈t'
⟶-to-≈ : t ⟶ t' → t ≈ t'
⟶-to-≈ p = inj₁ p ◅ ε
⟵-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 t u)
exp-fun≈ : (t : Tm Γ (a ⇒ b)) → t ≈ lam (app (wkTm fresh t) (var zero))
exp-fun≈ t = ⟶-to-≈ (Reduction.exp-fun t)
red-box≈ : (t : Tm (ΓL #) a) (e : CExt Γ ΓL ΓR) → unbox (box t) e ≈ substTm (lock idₛ e) t
red-box≈ t e = ⟶-to-≈ (Reduction.red-box t e)
exp-box≈ : (t : Tm Γ (□ a)) → t ≈ box (unbox t new)
exp-box≈ t = ⟶-to-≈ (Reduction.exp-box t)
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 : CExt Γ ΓL ΓR} {e' : CExt Γ ΓL ΓR'} where
cong-unbox2≈ : unbox t e ≈ unbox t e'
cong-unbox2≈ = ≡-to-≈ (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≈′
shift-unbox≈ : ∀ (t : Tm Γ (□ a)) (w : LFExt Γ' Γ ΓR) → unbox t e ≈ unbox (wkTm (LFExtToWk w) t) e'
shift-unbox≈ t w = ≈-trans cong-unbox2≈ (⟶-to-≈ (Reduction.shift-unbox t w _))
----------------------------------------------------------------------
-- Congruence closure of the relation that identifies substitutions up
-- to "built-in" weakenings (see `shift-lock≈ₛ`)
----------------------------------------------------------------------
data _⟶ₛ_ : Sub Δ Γ → Sub Δ Γ → Set where
cong-`,⟶ₛ1 : {s s' : Sub Δ Γ} {t : Tm Δ a}
→ s ⟶ₛ s' → (s `, t) ⟶ₛ (s' `, t)
cong-`,⟶ₛ2 : {s : Sub Δ Γ} {t t' : Tm Δ a}
→ t ≈ t' → (s `, t) ⟶ₛ (s `, t')
cong-lock⟶ₛ : {s s' : Sub ΔL ΓL} {e : CExt Δ ΔL ΔR}
→ s ⟶ₛ s' → lock s e ⟶ₛ lock s' e
shift-lock⟶ₛ : {ΔLL ΔLR : Ctx} {s : Sub ΔLL Γ} (w : LFExt ΔL ΔLL ΔLR) {e : CExt Δ ΔL ΔR}
→ lock s (extRAssoc (upLFExt w) e) ⟶ₛ lock (wkSub (LFExtToWk w) s) e
Sub-setoid : (Δ Γ : Ctx) → Setoid _ _
Sub-setoid Δ Γ = setoid (_⟶ₛ_ {Δ} {Γ})
module _ {Δ Γ : Ctx} where
open Setoid (Sub-setoid Δ Γ) public
using ()
renaming (_≈_ to _≈ₛ_ ; reflexive to ≈ₛ-reflexive ; refl to ≈ₛ-refl ; sym to ≈ₛ-sym ; trans to ≈ₛ-trans)
≈ₛ-reflexive˘ : σ' ≡ σ → σ ≈ₛ σ'
≈ₛ-reflexive˘ σ'≡σ = ≈ₛ-reflexive (≡-sym σ'≡σ)
⟶ₛ-to-≈ₛ : σ ⟶ₛ σ' → σ ≈ₛ σ'
⟶ₛ-to-≈ₛ p = inj₁ p ◅ ε
module _ {σ : Sub Δ Γ → Sub Δ' Γ'} (cong-σ : ∀ {τ τ' : Sub Δ Γ} → (τ⟶τ' : τ ⟶ₛ τ') → σ τ ⟶ₛ σ τ') where
cong-⟶ₛ-to-cong-≈ₛ : ∀ (τ≈τ' : τ ≈ₛ τ') → σ τ ≈ₛ σ τ'
cong-⟶ₛ-to-cong-≈ₛ ε = ε
cong-⟶ₛ-to-cong-≈ₛ (inj₁ τ⟶τ'' ◅ τ''≈τ') = inj₁ (cong-σ τ⟶τ'') ◅ cong-⟶ₛ-to-cong-≈ₛ τ''≈τ'
cong-⟶ₛ-to-cong-≈ₛ (inj₂ τ⟵τ'' ◅ τ''≈τ') = inj₂ (cong-σ τ⟵τ'') ◅ cong-⟶ₛ-to-cong-≈ₛ τ''≈τ'
cong-`,1≈ₛ : (σ≈σ' : σ ≈ₛ σ') → (σ `, t) ≈ₛ (σ' `, t)
cong-`,1≈ₛ = cong-⟶ₛ-to-cong-≈ₛ cong-`,⟶ₛ1
cong-`,2≈ₛ : (t≈t' : t ≈ t') → (σ `, t) ≈ₛ (σ `, t')
cong-`,2≈ₛ t≈t' = ⟶ₛ-to-≈ₛ (cong-`,⟶ₛ2 t≈t')
cong-`,≈ₛ : (σ≈σ' : σ ≈ₛ σ') → (t≈t' : t ≈ t') → (σ `, t) ≈ₛ (σ' `, t')
cong-`,≈ₛ σ≈σ' t≈t' = ≈ₛ-trans (cong-`,1≈ₛ σ≈σ') (cong-`,2≈ₛ t≈t')
cong-lock≈ₛ : ∀ (σ≈σ' : σ ≈ₛ σ') → lock σ e ≈ₛ lock σ' e
cong-lock≈ₛ = cong-⟶ₛ-to-cong-≈ₛ cong-lock⟶ₛ
module _ {σ : Sub ΓL Δ} {e : CExt Γ ΓL ΓR} {e' : CExt Γ ΓL ΓR'} where
cong-lock2≈ₛ : lock σ e ≈ₛ lock σ e'
cong-lock2≈ₛ = ≈ₛ-reflexive (dcong₂ (λ _ΓR → lock σ) (extRUniq e e') (ExtIsProp′ e e'))
cong-lock≈ₛ′ : ∀ (σ≈σ' : σ ≈ₛ σ') → lock σ e ≈ₛ lock σ' e'
cong-lock≈ₛ′ σ≈σ' = ≈ₛ-trans (cong-lock≈ₛ σ≈σ') cong-lock2≈ₛ
cong-lock≈ₛ′′ : ∀ (Γ≡Γ' : Γ ≡ Γ') (σ≈σ' : subst1 Sub Γ≡Γ' σ ≈ₛ σ') → lock σ e ≈ₛ lock σ' e'
cong-lock≈ₛ′′ ≡-refl = cong-lock≈ₛ′
shift-lock≈ₛ : (w : LFExt Δ' Δ ΔR) → lock σ (extRAssoc (upLFExt w) e) ≈ₛ lock (wkSub (LFExtToWk w) σ) e
shift-lock≈ₛ w = ⟶ₛ-to-≈ₛ (shift-lock⟶ₛ w)
--------------------
-- Derived equations
--------------------
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.