open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.Typed.Substitution.Primitive
{a} {M : Set a}
{π : Modality M}
(R : Type-restrictions π)
where
open import Definition.Typed R
open import Definition.Typed.Inversion.Primitive R
open import Definition.Typed.Properties.Admissible.Var R
open import Definition.Typed.Properties.Well-formed R
import Definition.Typed.Substitution.Primitive.Primitive R as P
open import Definition.Typed.Weakening R
open import Definition.Typed.Well-formed R
open import Definition.Untyped M as U hiding (wk)
open import Definition.Untyped.Properties M
open import Tools.Fin
open import Tools.Function
open import Tools.Nat
open import Tools.Product
import Tools.PropositionalEquality as PE
open P public
hiding (lam-cong; lift-cong; β’Λ’Κ·β‘β·-β; β’Λ’Κ·β‘β·-sgSubst; β’Λ’Κ·β‘β·-[][]β)
private variable
β : DCon (Term 0) _
k n : Nat
Ξ Ξ Ξ¦ : Con Term _
Ξ : Cons _ _
π : Judgement _
A B Bβ Bβ C Cβ Cβ D E t tβ tβ u uβ uβ v vβ vβ : Term _
Ο Οβ Οββ Οββ Οβ Οββ Οββ Οβ : Subst _ _
s : Strength
p q : M
opaque
β’Λ’Κ·β‘β·ββ² :
β Β»β’ Ξ β β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β (β Β»β’ Ξ Γ β Β» Ξ β’Λ’ Οβ β‘ Οβ β· Ξ)
β’Λ’Κ·β‘β·ββ² {β} {Ξ} {Ξ} {Οβ} {Οβ} β’Ξ =
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ ββ¨ β’Λ’Κ·β‘β·β β©
β Β»β’ Ξ Γ β Β» Ξ β’Λ’ Οβ β· Ξ Γ β Β» Ξ β’Λ’ Οβ β· Ξ Γ β Β» Ξ β’Λ’ Οβ β‘ Οβ β· Ξ ββ¨ (Ξ» (β’Ξ , _ , _ , Οββ‘Οβ) β β’Ξ , Οββ‘Οβ)
, (Ξ» (β’Ξ , Οββ‘Οβ) β
let β’Οβ , β’Οβ = wf-β’Λ’β‘β· β’Ξ Οββ‘Οβ in
β’Ξ , β’Οβ , β’Οβ , Οββ‘Οβ)
β©
β Β»β’ Ξ Γ β Β» Ξ β’Λ’ Οβ β‘ Οβ β· Ξ β‘β
opaque
β’Λ’Κ·β‘β·βββ² :
β Β» Ξ β’ A β
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β A β
(β Β» Ξ β’Λ’Κ· tail Οβ β‘ tail Οβ β· Ξ Γ
β Β» Ξ β’ head Οβ β‘ head Οβ β· A [ tail Οβ ])
β’Λ’Κ·β‘β·βββ² {β} {Ξ} {A} {Ξ} {Οβ} {Οβ} β’A =
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β A ββ¨ β’Λ’Κ·β‘β·ββ β©
β Β» Ξ β’Λ’Κ· tail Οβ β‘ tail Οβ β· Ξ Γ
β Β» Ξ β’ head Οβ β· A [ tail Οβ ] Γ
β Β» Ξ β’ head Οβ β· A [ tail Οβ ] Γ
β Β» Ξ β’ head Οβ β‘ head Οβ β· A [ tail Οβ ] ββ¨ (Ξ» (Οβββ‘Οββ , _ , _ , Οβββ‘Οββ) β
Οβββ‘Οββ , Οβββ‘Οββ)
, (Ξ» (Οβββ‘Οββ , Οβββ‘Οββ) β
let _ , β’Οββ , β’Οββ = wf-β’ Οβββ‘Οββ in
Οβββ‘Οββ , β’Οββ , conv β’Οββ (subst-β’β‘ (refl β’A) Οβββ‘Οββ) , Οβββ‘Οββ)
β©
β Β» Ξ β’Λ’Κ· tail Οβ β‘ tail Οβ β· Ξ Γ
β Β» Ξ β’ head Οβ β‘ head Οβ β· A [ tail Οβ ] β‘β
opaque
ββ’Λ’Κ·β‘β·β :
β Β» Ξ β’ A β
β Β» Ξ β’Λ’Κ· tail Οβ β‘ tail Οβ β· Ξ β
β Β» Ξ β’ head Οβ β‘ head Οβ β· A [ tail Οβ ] β
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β A
ββ’Λ’Κ·β‘β·β β’A Οβββ‘Οββ Οβββ‘Οββ =
β’Λ’Κ·β‘β·βββ² β’A .projβ (Οβββ‘Οββ , Οβββ‘Οββ)
opaque
trans-β’Λ’Κ· :
β Β»β’ Ξ β
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ
trans-β’Λ’Κ· (Ξ΅ Β»β) Οββ‘Οβ _ =
β’Λ’Κ·β‘β·Ξ΅β .projβ (β’Λ’Κ·β‘β·Ξ΅β .projβ Οββ‘Οβ)
trans-β’Λ’Κ· (β β’A) Οββ‘Οβ Οββ‘Οβ =
let β’Ξ = wf β’A
Οβββ‘Οββ , Οβββ‘Οββ = β’Λ’Κ·β‘β·βββ² β’A .projβ Οββ‘Οβ
Οβββ‘Οββ , Οβββ‘Οββ = β’Λ’Κ·β‘β·βββ² β’A .projβ Οββ‘Οβ
in
ββ’Λ’Κ·β‘β·β β’A (trans-β’Λ’Κ· β’Ξ Οβββ‘Οββ Οβββ‘Οββ)
(trans Οβββ‘Οββ
(conv Οβββ‘Οββ (subst-β’β‘ (refl β’A) (sym-β’Λ’Κ·β‘β· β’Ξ Οβββ‘Οββ))))
opaque
β’Λ’Κ·β‘β·-β :
β Β» Ξ β’ A [ Οβ ] β‘ A [ Οβ ] β
β Β» Ξ β’Λ’Κ· Οβ β‘ Οβ β· Ξ β
β Β» Ξ β A [ Οβ ] β’Λ’Κ· Οβ β β‘ Οβ β β· Ξ β A
β’Λ’Κ·β‘β·-β A[Οβ]β‘A[Οβ] =
P.β’Λ’Κ·β‘β·-β (wf-β’ A[Οβ]β‘A[Οβ] .projβ) A[Οβ]β‘A[Οβ]
opaque
β’Λ’Κ·β‘β·-sgSubst :
β Β» Ξ β’ tβ β‘ tβ β· A β
β Β» Ξ β’Λ’Κ· sgSubst tβ β‘ sgSubst tβ β· Ξ β A
β’Λ’Κ·β‘β·-sgSubst tββ‘tβ =
let _ , β’tβ , β’tβ = wf-β’ tββ‘tβ in
P.β’Λ’Κ·β‘β·-sgSubst β’tβ β’tβ tββ‘tβ
opaque
β’Λ’β‘β·-ββ’β :
β Β» Ξ¦ β’Λ’Κ· Οββ β‘ Οββ β· Ξ β
β Β» Ξ β’Λ’Κ· Οββ β‘ Οββ β· Ξ β
β Β» Ξ¦ β’Λ’Κ· Οββ ββ’β Οββ β‘ Οββ ββ’β Οββ β· Ξ
β’Λ’β‘β·-ββ’β {Ξ = Ξ΅} Οβββ‘Οββ _ =
β’Λ’Κ·β‘β·Ξ΅β .projβ (wf-β’Λ’Κ·β‘β· Οβββ‘Οββ .projβ)
β’Λ’β‘β·-ββ’β {Ξ = _ β A} Οβββ‘Οββ Οβββ‘Οββ =
let _ , β’Οββ , β’Οββ = wf-β’Λ’Κ·β‘β· Οβββ‘Οββ
Οββββ‘Οβββ , β’Οβββ , β’Οβββ , Οββββ‘Οβββ = β’Λ’Κ·β‘β·ββ .projβ Οβββ‘Οββ
in
β’Λ’Κ·β‘β·ββ .projβ
( β’Λ’β‘β·-ββ’β Οβββ‘Οββ Οββββ‘Οβββ
, PE.subst (_β’_β·_ _ _) (substCompEq A) (subst-β’ β’Οβββ β’Οββ)
, PE.subst (_β’_β·_ _ _) (substCompEq A) (subst-β’ β’Οβββ β’Οββ)
, PE.subst (_β’_β‘_β·_ _ _ _) (substCompEq A) (subst-β’β‘ Οββββ‘Οβββ Οβββ‘Οββ)
)
opaque
β’Λ’β·-ββ’β :
β Β» Ξ¦ β’Λ’Κ· Οβ β· Ξ β
β Β» Ξ β’Λ’Κ· Οβ β· Ξ β
β Β» Ξ¦ β’Λ’Κ· Οβ ββ’β Οβ β· Ξ
β’Λ’β·-ββ’β β’Οβ β’Οβ =
β’Λ’Κ·β·ββ’Λ’Κ·β‘β· .projβ
(β’Λ’β‘β·-ββ’β (β’Λ’Κ·β·ββ’Λ’Κ·β‘β· .projβ β’Οβ) (β’Λ’Κ·β·ββ’Λ’Κ·β‘β· .projβ β’Οβ))
opaque
β’Λ’Κ·β‘β·-[][]β :
β Β» Ξ β’ tβ β‘ tβ β· wk[ k ] A β
β Β» Ξ β’Λ’Κ· consSubst (wkSubst k idSubst) tβ β‘
consSubst (wkSubst k idSubst) tβ β· drop k Ξ β A
β’Λ’Κ·β‘β·-[][]β tββ‘tβ =
let _ , β’tβ , β’tβ = wf-β’ tββ‘tβ in
P.β’Λ’Κ·β‘β·-[][]β β’tβ β’tβ tββ‘tβ
opaque
subst-β’β‘β :
Ξ Β»β A β’[ π ] β Ξ β’ t β‘ u β· A β
Ξ β’[ π [ sgSubst t β‘ sgSubst u ]J ]
subst-β’β‘β β’π = subst-β’β‘ β’π ββ β’Λ’Κ·β‘β·-sgSubst
opaque
substTypeΞ : Ξ β’ Ξ p , q β· A βΉ B β Ξ β’ t β· A β Ξ β’ B [ t ]β
substTypeΞ β’Ξ AB β’t =
let _ , β’B , _ = inversion-Ξ Ξ£ β’Ξ AB in
subst-β’β β’B β’t
opaque
subst-β’-β :
β Β» drop k Ξ β A β’[ π ] β β Β» Ξ β’ t β· wk[ k ] A β
β Β» Ξ β’[ π [ replaceβ k t ]J ]
subst-β’-β β’π = subst-β’ β’π ββ β’Λ’Κ·β·-[][]β
opaque
subst-β’β‘-β :
β Β» drop k Ξ β A β’[ π ] β β Β» Ξ β’ t β‘ u β· wk[ k ] A β
β Β» Ξ β’[ π [ replaceβ k t β‘ replaceβ k u ]J ]
subst-β’β‘-β β’π = subst-β’β‘ β’π ββ β’Λ’Κ·β‘β·-[][]β
opaque
substβΒ²TypeEq-prod :
Ξ Β»β Ξ£β¨ s β© p , q β· A βΉ B β’ C β‘ D β
Ξ Β»β A Β»β B β’
C [ prod s p (var x1) (var x0) ]βΒ² β‘
D [ prod s p (var x1) (var x0) ]βΒ²
substβΒ²TypeEq-prod {B} Cβ‘D =
let β’A , β’B , ok = inversion-Ξ Ξ£ (β’βββ’ (wf Cβ‘D))
β’Aβ² = wkβ β’A β’A
in
subst-β’β‘ Cβ‘D $ β’Λ’Κ·β‘β·-[][]β $ _β’_β‘_β·_.refl $
prodβ±Ό
(wk (liftΚ· (step id) (wkβ β’B β’Aβ²)) (wk (liftΚ· (step id) β’Aβ²) β’B))
(varβ β’B)
(PE.subst (_β’_β·_ _ _)
(PE.trans (PE.cong wk1 $ PE.sym $ wkSingleSubstId _) $
wk-Ξ² (U.wk _ B)) $
varβ β’B)
ok
opaque
substβΒ²Type-prod :
Ξ Β»β Ξ£β¨ s β© p , q β· A βΉ B β’ C β
Ξ Β»β A Β»β B β’ C [ prod s p (var x1) (var x0) ]βΒ²
substβΒ²Type-prod = projβ ββ wf-β’ ββ substβΒ²TypeEq-prod ββ refl
opaque
subst-β’ββ :
Ξ Β»β A Β»β B β’[ π ] β
Ξ β’ t β· A β
Ξ β’ u β· B [ t ]β β
Ξ β’[ π [ consSubst (sgSubst t) u ]J ]
subst-β’ββ β’π β’t β’u = subst-β’ β’π (ββ’Λ’Κ·β·β (β’Λ’Κ·β·-sgSubst β’t) β’u)
opaque
subst-β’β‘ββ :
Ξ Β»β A Β»β B β’[ π ] β
Ξ β’ tβ β‘ tβ β· A β
Ξ β’ uβ β‘ uβ β· B [ tβ ]β β
Ξ β’[ π [ consSubst (sgSubst tβ) uβ β‘ consSubst (sgSubst tβ) uβ ]J ]
subst-β’β‘ββ β’π tββ‘tβ uββ‘uβ =
subst-β’β‘ β’π $
β’Λ’Κ·β‘β·βββ² (β’βββ’ (wf β’π)) .projβ
(β’Λ’Κ·β‘β·-sgSubst tββ‘tβ , uββ‘uβ)
opaque
[][]β-cong :
β Β» drop k Ξ β A β’[ π ] β
β Β» Ξ β’ tβ β‘ tβ β· A [ wkSubst k idSubst ] β
β Β» Ξ β’[ π [ replaceβ k tβ β‘ replaceβ k tβ ]J ]
[][]β-cong {k} Bββ‘Bβ =
subst-β’β‘-β Bββ‘Bβ ββ
PE.subst (_β’_β‘_β·_ _ _ _) (PE.sym $ wk[]β‘[] k)
opaque
β’[][]β :
β Β» drop k Ξ β A β’[ π ] β
β Β» Ξ β’ t β· A [ wkSubst k idSubst ] β
β Β» Ξ β’[ π [ replaceβ k t ]J ]
β’[][]β {k} β’B =
subst-β’-β β’B ββ
PE.subst (_β’_β·_ _ _) (PE.sym $ wk[]β‘[] k)