open import Definition.Typed.EqualityRelation
open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.LogicalRelation.Substitution.Introductions.Nat
{a} {M : Set a}
{π : Modality M}
(R : Type-restrictions π)
β¦ eqrel : EqRelSet R β¦
where
open EqRelSet eqrel
open Type-restrictions R
open import Definition.LogicalRelation R
open import Definition.LogicalRelation.Hidden R
import Definition.LogicalRelation.Hidden.Restricted R as R
open import Definition.LogicalRelation.Irrelevance R
open import Definition.LogicalRelation.Properties R
open import Definition.LogicalRelation.ShapeView R
open import Definition.LogicalRelation.Substitution R
open import
Definition.LogicalRelation.Substitution.Introductions.Universe R
open import Definition.LogicalRelation.Unary R
open import Definition.Typed R
open import Definition.Typed.Properties R
open import Definition.Typed.Reasoning.Reduction R
import Definition.Typed.Stability R as S
open import Definition.Typed.Substitution R
open import Definition.Typed.Well-formed R
open import Definition.Untyped M
open import Definition.Untyped.Neutral M type-variant
open import Definition.Untyped.Properties M
open import Tools.Empty
open import Tools.Fin
open import Tools.Function
open import Tools.Product as Ξ£
import Tools.PropositionalEquality as PE
import Tools.Reasoning.PropositionalEquality
private variable
Ξ Ξ : Con Term _
A Aβ Aβ B t tβ tβ u uβ uβ v vβ vβ : Term _
Οβ Οβ : Subst _ _
l lβ² lβ³ lβ΄ : Universe-level
p q r : M
opaque
β©ββ : Ξ β©β¨ l β© β β β’ Ξ
β©ββ =
(Ξ» β©β β
case β-view β©β of Ξ» {
(βα΅£ ββ*β) β
wfEq (subset* ββ*β) })
, (Ξ» β’Ξ β βα΅£ (id (ββ±Ό β’Ξ)))
opaque
β©ββ·Uβ : Ξ β©β¨ 1 β© β β· U 0 β β’ Ξ
β©ββ·Uβ =
(Ξ» β©β β
case β©β·Uβ .projβ β©β of Ξ»
(_ , _ , _ , ββ* , _) β
wfEqTerm (subset*Term ββ*))
, (Ξ» β’Ξ β
β©β·Uβ .projβ
( β€α΅-refl , β©ββ .projβ β’Ξ
, (_ , id (ββ±Ό β’Ξ) , ββ , β
β-βrefl β’Ξ)
))
opaque
unfolding _β©β¨_β©_β‘_
β©ββ‘β : Ξ β©β¨ l β© β β‘ A β Ξ β©β β β‘ A
β©ββ‘β =
(Ξ» (β©β , _ , ββ‘A) β
case β-view β©β of Ξ» {
(βα΅£ _) β
ββ‘A })
, (Ξ» ββ‘A β
case id (ββ±Ό (wfEq (subset* ββ‘A))) of Ξ»
ββ*β β
let β©β = βα΅£ ββ*β in
β©β
, (redSubst* ββ‘A β©β) .projβ
, ββ‘A)
opaque
β©ββ‘ββ·Uβ : Ξ β©β¨ 1 β© β β‘ β β· U 0 β β’ Ξ
β©ββ‘ββ·Uβ =
(Ξ» ββ‘β β
case β©β‘β·Uβ .projβ ββ‘β of Ξ»
(_ , _ , _ , _ , ββ* , _) β
wfEqTerm (subset*Term ββ*))
, (Ξ» β’Ξ β
case id (ββ±Ό β’Ξ) of Ξ»
ββ*β β
β©β‘β·Uβ .projβ
( β€α΅-refl , β©ββ‘β .projβ (id (ββ±Ό β’Ξ))
, (_ , _ , ββ*β , ββ*β , ββ , ββ , β
β-βrefl β’Ξ)
))
opaque
unfolding _β©β¨_β©_β‘_β·_
β©β‘β·ββ : Ξ β©β¨ l β© t β‘ u β· β β Ξ β©β t β‘ u β·β
β©β‘β·ββ =
(Ξ» (β©β , tβ‘u) β
case β-view β©β of Ξ» {
(βα΅£ _) β
tβ‘u })
, (Ξ» tβ‘u β
βα΅£ (id (ββ±Ό (wfEqTerm (subset*Term (_β©β_β‘_β·β.d tβ‘u))))) , tβ‘u)
opaque
β©β·ββ : Ξ β©β¨ l β© t β· β β Ξ β©β t β·β
β©β·ββ {Ξ} {l} {t} =
Ξ β©β¨ l β© t β· β ββ¨ β©β·ββ©β‘β· β©
Ξ β©β¨ l β© t β‘ t β· β ββ¨ β©β‘β·ββ β©
Ξ β©β t β‘ t β·β βΛβ¨ β©ββ·βββ©ββ‘β·β β©
Ξ β©β t β·β β‘β
opaque
β©zeroβ·ββ : Ξ β©β¨ l β© zero β· β β β’ Ξ
β©zeroβ·ββ =
wfTerm ββ escape-β©β·
, (Ξ» β’Ξ β
β©β·ββ .projβ $
ββ _ (id (zeroβ±Ό β’Ξ)) (β
β-zerorefl β’Ξ) zeroα΅£)
opaque
β©zeroβ‘zeroβ·ββ : Ξ β©β¨ l β© zero β‘ zero β· β β β’ Ξ
β©zeroβ‘zeroβ·ββ {Ξ} {l} =
Ξ β©β¨ l β© zero β‘ zero β· β βΛβ¨ β©β·ββ©β‘β· β©
Ξ β©β¨ l β© zero β· β ββ¨ β©zeroβ·ββ β©
β’ Ξ β‘β
opaque
β©sucβ‘sucβ·ββ :
Ξ β©β¨ l β© suc t β‘ suc u β· β β
Ξ β©β¨ l β© t β‘ u β· β
β©sucβ‘sucβ·ββ {Ξ} {l} {t} {u} =
Ξ β©β¨ l β© suc t β‘ suc u β· β ββ¨ β©β‘β·ββ β©
Ξ β©β suc t β‘ suc u β·β ββ¨ lemmaβ , lemmaβ β©
Ξ β©β t β‘ u β·β βΛβ¨ β©β‘β·ββ β©
Ξ β©β¨ l β© t β‘ u β· β β‘β
where
lemmaβ : [Natural]-prop Ξ (suc t) (suc u) β Ξ β©β t β‘ u β·β
lemmaβ (sucα΅£ tβ‘u) = tβ‘u
lemmaβ (ne (neNfββ _ () _ _))
lemmaβ : Ξ β©β suc t β‘ suc u β·β β Ξ β©β t β‘ u β·β
lemmaβ (βββ _ _ suc-tβ*tβ² suc-uβ*uβ² _ tβ²β‘uβ²) =
case whnfRed*Term suc-tβ*tβ² sucβ of Ξ» {
PE.refl β
case whnfRed*Term suc-uβ*uβ² sucβ of Ξ» {
PE.refl β
lemmaβ tβ²β‘uβ²}}
lemmaβ : Ξ β©β t β‘ u β·β β Ξ β©β suc t β‘ suc u β·β
lemmaβ
tβ‘u@(βββ _ _ tβ*tβ² uβ*uβ² tβ²β
uβ² tβ²β‘uβ²) =
let tβ²-ok , uβ²-ok = split tβ²β‘uβ² in
βββ _ _ (id (sucβ±Ό (redFirst*Term tβ*tβ²)))
(id (sucβ±Ό (redFirst*Term uβ*uβ²)))
(β
-suc-cong $
β
β-red (id (ββ±Ό (wfEqTerm (β
β-eq tβ²β
uβ²))) , ββ)
(tβ*tβ² , naturalWhnf tβ²-ok) (uβ*uβ² , naturalWhnf uβ²-ok)
tβ²β
uβ²)
(sucα΅£ tβ‘u)
opaque
β©sucβ·ββ :
Ξ β©β¨ l β© suc t β· β β
Ξ β©β¨ l β© t β· β
β©sucβ·ββ {Ξ} {l} {t} =
Ξ β©β¨ l β© suc t β· β ββ¨ β©β·ββ©β‘β· β©
Ξ β©β¨ l β© suc t β‘ suc t β· β ββ¨ β©sucβ‘sucβ·ββ β©
Ξ β©β¨ l β© t β‘ t β· β βΛβ¨ β©β·ββ©β‘β· β©
Ξ β©β¨ l β© t β· β β‘β
opaque
β©zeroβ‘sucβ·ββ : Ξ β©β¨ l β© zero β‘ suc t β· β β β₯
β©zeroβ‘sucβ·ββ =
(Ξ» zeroβ‘suc β
case β©β‘β·ββ .projβ zeroβ‘suc of Ξ» {
(βββ _ _ zeroβ* sucβ* _ rest) β
case whnfRed*Term zeroβ* zeroβ of Ξ» {
PE.refl β
case whnfRed*Term sucβ* sucβ of Ξ» {
PE.refl β
case rest of Ξ» where
(ne (neNfββ _ () _ _)) }}})
, β₯-elim
opaque
βα΅ : β©α΅ Ξ β Ξ β©α΅β¨ l β© β
βα΅ {Ξ} {l} β©Ξ =
β©α΅βΚ° .projβ
( β©Ξ
, Ξ» {_} {Ξ = Ξ} {Οβ = Οβ} {Οβ = Οβ} β
Ξ β©Λ’ Οβ β‘ Οβ β· Ξ ββ¨ projβ ββ escape-β©Λ’β‘β· β©
β’ Ξ ββ¨ ββ±Ό β©
(Ξ β’ β) ββ¨ id β©
Ξ β’ β β* β βΛβ¨ β©ββ‘β β©β
Ξ β©β¨ l β© β β‘ β β‘
)
opaque
βα΅α΅ : β©α΅ Ξ β Ξ β©α΅β¨ 1 β© β β· U 0
βα΅α΅ {Ξ} β©Ξ =
β©α΅β·βΚ° .projβ
( β©α΅U β©Ξ
, Ξ» {_} {Ξ = Ξ} {Οβ = Οβ} {Οβ = Οβ} β
Ξ β©Λ’ Οβ β‘ Οβ β· Ξ ββ¨ projβ ββ escape-β©Λ’β‘β· β©
β’ Ξ βΛβ¨ β©ββ‘ββ·Uβ β©β
Ξ β©β¨ 1 β© β β‘ β β· U 0 β‘
)
opaque
β©zero :
β’ Ξ β
Ξ β©β¨ l β© zero β· β
β©zero = β©zeroβ·ββ .projβ
opaque
zeroα΅ :
β©α΅ Ξ β
Ξ β©α΅β¨ l β© zero β· β
zeroα΅ {Ξ} {l} β©Ξ =
β©α΅β·βΚ° .projβ
( βα΅ β©Ξ
, Ξ» {_} {Ξ = Ξ} {Οβ = Οβ} {Οβ = Οβ} β
Ξ β©Λ’ Οβ β‘ Οβ β· Ξ ββ¨ projβ ββ escape-β©Λ’β‘β· β©
β’ Ξ βΛβ¨ β©zeroβ‘zeroβ·ββ β©β
Ξ β©β¨ l β© zero β‘ zero β· β β‘
)
opaque
β©suc :
Ξ β©β¨ l β© t β· β β
Ξ β©β¨ l β© suc t β· β
β©suc = β©sucβ·ββ .projβ
opaque
β©sucβ‘suc :
Ξ β©β¨ l β© t β‘ u β· β β
Ξ β©β¨ l β© suc t β‘ suc u β· β
β©sucβ‘suc = β©sucβ‘sucβ·ββ .projβ
opaque
suc-congα΅ :
Ξ β©α΅β¨ l β© t β‘ u β· β β
Ξ β©α΅β¨ l β© suc t β‘ suc u β· β
suc-congα΅ tβ‘u =
β©α΅β‘β·βΚ° .projβ
( βα΅ (wf-β©α΅ $ wf-β©α΅β· $ wf-β©α΅β‘β· tβ‘u .projβ)
, β©sucβ‘suc ββ R.β©β‘β·β ββ β©α΅β‘β·ββ©Λ’β‘β·ββ©[]β‘[]β· tβ‘u
)
opaque
sucα΅ :
Ξ β©α΅β¨ l β© t β· β β
Ξ β©α΅β¨ l β© suc t β· β
sucα΅ β©t =
β©α΅β·ββ©α΅β‘β· .projβ $
suc-congα΅ (refl-β©α΅β‘β· β©t)
private opaque
β©natrecβ‘natrecβ² :
Ξ β β β’ Aβ β
Aβ β
(β {vβ vβ} β
Ξ β©β¨ l β© vβ β‘ vβ β· β β
Ξ β©β¨ l β© Aβ [ vβ ]β β‘ Aβ [ vβ ]β) β
(β {vβ vβ} β
Ξ β©β¨ l β© vβ β‘ vβ β· β β
Ξ β©β¨ l β© Aβ [ vβ ]β β‘ Aβ [ vβ ]β) β
(β {vβ vβ} β
Ξ β©β¨ l β© vβ β‘ vβ β· β β
Ξ β©β¨ l β© Aβ [ vβ ]β β‘ Aβ [ vβ ]β) β
Ξ β’ tβ β· Aβ [ zero ]β β
Ξ β’ tβ β· Aβ [ zero ]β β
Ξ β©β¨ l β© tβ β‘ tβ β· Aβ [ zero ]β β
Ξ β β β Aβ β’ uβ β
uβ β· Aβ [ suc (var x1) ]βΒ² β
(β {vβ vβ wβ wβ} β
Ξ β©β¨ l β© vβ β‘ vβ β· β β
Ξ β©β¨ l β© wβ β‘ wβ β· Aβ [ vβ ]β β
Ξ β©β¨ l β© uβ [ vβ , wβ ]ββ β‘ uβ [ vβ , wβ ]ββ β· Aβ [ suc vβ ]β) β
Ξ β©β vβ β‘ vβ β·β β
Ξ β©β¨ l β© natrec p q r Aβ tβ uβ vβ β‘
natrec p q r Aβ tβ uβ vβ β· Aβ [ vβ ]β
β©natrecβ‘natrecβ²
{Aβ} {Aβ} {l} {tβ} {tβ} {uβ} {uβ} {vβ} {vβ} {p} {q} {r}
Aββ
Aβ Aββ‘Aβ Aββ‘Aβ Aββ‘Aβ β’tβ β’tβ tββ‘tβ uββ
uβ uββ‘uβ
β©β-vββ‘vβ@(βββ vββ² vββ² vββ*vββ² vββ*vββ² vββ²β
vββ² vββ²βΌvββ²) =
let β’Aββ‘Aβ = β
-eq Aββ
Aβ
_ , β’uβ , β’uβ = wf-β’β‘β· (β
β-eq uββ
uβ)
β’uβ =
S.stabilityTerm (S.refl-β β’Aββ‘Aβ)
(conv β’uβ $
subst-β’β‘ β’Aββ‘Aβ $ refl-β’Λ’Κ·β‘β· $
β’Λ’Κ·β·-[][]β (sucβ±Ό (varβ (wf-β’β‘ β’Aββ‘Aβ .projβ))))
in
case β©β‘β·ββ {l = l} .projβ β©β-vββ‘vβ of Ξ»
vββ‘vβ β
case wf-β©β‘β· vββ‘vβ of Ξ»
(β©vβ , β©vβ) β
case β©β·-β* vββ*vββ² β©vβ of Ξ»
vββ‘vββ² β
case β©β·-β* vββ*vββ² β©vβ of Ξ»
vββ‘vββ² β
case
vββ² β‘Λβ¨ vββ‘vββ² β©β©β·
vβ β‘β¨ vββ‘vβ β©β©β·
vβ β‘β¨ vββ‘vββ² β©β©β·β
vββ² β
of Ξ»
vββ²β‘vββ² β
case Aββ‘Aβ vββ²β‘vββ² of Ξ»
Aβ[vββ²]β‘Aβ[vββ²] β
case β
-eq $ escape-β©β‘ Aβ[vββ²]β‘Aβ[vββ²] of Ξ»
β’Aβ[vββ²]β‘Aβ[vββ²] β
case
(Ξ» (hyp : _ β©β¨ l β© _ β‘ _ β· _) β
natrec p q r Aβ tβ uβ vβ β· Aβ [ vβ ]β β*β¨ natrec-subst* β’tβ β’uβ vββ*vββ² β©β©β·β·
β¨ Aββ‘Aβ vββ‘vββ² β©β©β·
natrec p q r Aβ tβ uβ vββ² β· Aβ [ vββ² ]β β‘β¨ hyp β©β©β·β·β*
β¨ β’Aβ[vββ²]β‘Aβ[vββ²] β©β
β· Aβ [ vββ² ]β Λβ¨ β
-eq $ escape-β©β‘ $ Aββ‘Aβ vββ‘vββ² β©β
natrec p q r Aβ tβ uβ vββ² β· Aβ [ vβ ]β β*β¨ natrec-subst* β’tβ β’uβ vββ*vββ² β©ββ·
natrec p q r Aβ tβ uβ vβ β)
of Ξ»
lemma β
lemma
(case vββ²βΌvββ² of Ξ» where
(ne (neNfββ inc vββ²-ne vββ²-ne vββ²~vββ²)) β
neutral-β©β‘β· inc (wf-β©β‘ Aβ[vββ²]β‘Aβ[vββ²] .projβ)
(natrecβ vββ²-ne) (natrecβ vββ²-ne) $
~-natrec Aββ
Aβ (escape-β©β‘β· tββ‘tβ) uββ
uβ vββ²~vββ²
zeroα΅£ β
natrec p q r Aβ tβ uβ zero ββ¨ natrec-zero β’tβ β’uβ β©β©β·
tβ β· Aβ [ zero ]β β‘β¨ tββ‘tβ β©β©β·β·β*
β¨ β’Aβ[vββ²]β‘Aβ[vββ²] β©β
tβ β· Aβ [ zero ]β ββ¨ natrec-zero β’tβ β’uβ β©ββ·
natrec p q r Aβ tβ uβ zero β
(sucα΅£ {n = vββ³} {nβ² = vββ³} β©β-vββ³β‘vββ³) β
case β©β‘β·ββ .projβ β©β-vββ³β‘vββ³ of Ξ»
vββ³β‘vββ³ β
case wf-β©β‘β· vββ³β‘vββ³ of Ξ»
(β©vββ³ , β©vββ³) β
natrec p q r Aβ tβ uβ (suc vββ³) ββ¨ natrec-suc β’tβ β’uβ (escape-β©β· β©vββ³) β©β©β·
uβ [ vββ³ , natrec p q r Aβ tβ uβ vββ³ ]ββ β· Aβ [ suc vββ³ ]β β‘β¨ uββ‘uβ vββ³β‘vββ³ $
β©natrecβ‘natrecβ² Aββ
Aβ Aββ‘Aβ Aββ‘Aβ Aββ‘Aβ β’tβ β’tβ tββ‘tβ
uββ
uβ uββ‘uβ β©β-vββ³β‘vββ³ β©β©β·β·β*
β¨ β’Aβ[vββ²]β‘Aβ[vββ²] β©β
uβ [ vββ³ , natrec p q r Aβ tβ uβ vββ³ ]ββ β· Aβ [ suc vββ³ ]β ββ¨ natrec-suc β’tβ β’uβ (escape-β©β· β©vββ³)
β©ββ·
natrec p q r Aβ tβ uβ (suc vββ³) β)
opaque
β©natrecβ‘natrec :
Ξ β β β’ Aβ β‘ Aβ β
Ξ β β β©α΅β¨ l β© Aβ β‘ Aβ β
Ξ β©α΅β¨ lβ² β© tβ β‘ tβ β· Aβ [ zero ]β β
Ξ β β β Aβ β’ uβ β‘ uβ β· Aβ [ suc (var x1) ]βΒ² β
Ξ β β β Aβ β©α΅β¨ lβ³ β© uβ β‘ uβ β· Aβ [ suc (var x1) ]βΒ² β
Ξ β©α΅β¨ lβ΄ β© vβ β‘ vβ β· β β
β¦ inc : Neutrals-included or-empty Ξ β¦ β
Ξ β©Λ’ Οβ β‘ Οβ β· Ξ β
Ξ β©β¨ l β© natrec p q r Aβ tβ uβ vβ [ Οβ ] β‘
natrec p q r Aβ tβ uβ vβ [ Οβ ] β· Aβ [ vβ ]β [ Οβ ]
β©natrecβ‘natrec
{Aβ} {Aβ} {l} {Οβ} β’Aββ‘Aβ Aββ‘Aβ tββ‘tβ β’uββ‘uβ uββ‘uβ vββ‘vβ Οββ‘Οβ =
case wf-β©α΅β‘ Aββ‘Aβ of Ξ»
(β©Aβ , β©Aβ) β
case wf-β©α΅β‘β· tββ‘tβ of Ξ»
(_ , β©tβ) β
case conv-β©α΅β·
(β©α΅β‘ββ©α΅β‘β·ββ©α΅[]ββ‘[]β Aββ‘Aβ $
refl-β©α΅β‘β· $ zeroα΅ {l = l} $ wf-β©α΅ (wf-β©α΅β· β©tβ))
β©tβ of Ξ»
β©tβ β
case wf-β©Λ’β‘β· Οββ‘Οβ of Ξ»
(β©Οβ , β©Οβ) β
case escape-β©Λ’β‘β· Οββ‘Οβ of Ξ»
(_ , β’Οββ‘Οβ) β
case PE.subst (_β©β¨_β©_β‘_β·_ _ _ _ _) (singleSubstLift Aβ _) $
R.β©β‘β·β $ β©α΅β‘β·ββ©Λ’β‘β·ββ©[]β‘[]β· tββ‘tβ Οββ‘Οβ of Ξ»
tβ[Οβ]β‘tβ[Οβ] β
PE.subst (_β©β¨_β©_β‘_β·_ _ _ _ _) (PE.sym $ singleSubstLift Aβ _) $
β©natrecβ‘natrecβ²
(with-inc-β’β
(subst-β’β‘-β β’Aββ‘Aβ β’Οββ‘Οβ) $
R.escape-β©β‘ β¦ inc = included β¦ (β©α΅β‘ββ©Λ’β‘β·ββ©[β]β‘[β] Aββ‘Aβ Οββ‘Οβ))
(R.β©β‘β ββ
β©α΅β‘ββ©Λ’β‘β·ββ©β‘β·ββ©[β][]ββ‘[β][]β (refl-β©α΅β‘ β©Aβ) (refl-β©Λ’β‘β· β©Οβ) ββ
R.ββ©β‘β·)
(R.β©β‘β ββ
β©α΅β‘ββ©Λ’β‘β·ββ©β‘β·ββ©[β][]ββ‘[β][]β (refl-β©α΅β‘ β©Aβ) (refl-β©Λ’β‘β· β©Οβ) ββ
R.ββ©β‘β·)
(R.β©β‘β ββ β©α΅β‘ββ©Λ’β‘β·ββ©β‘β·ββ©[β][]ββ‘[β][]β Aββ‘Aβ Οββ‘Οβ ββ R.ββ©β‘β·)
(escape-β©β· $ wf-β©β‘β· tβ[Οβ]β‘tβ[Οβ] .projβ)
(PE.subst (_β’_β·_ _ _) (singleSubstLift Aβ _) $
R.escape-β©β· $ β©α΅β·ββ©Λ’β·ββ©[]β· β©tβ β©Οβ)
(level-β©β‘β·
(wf-β©β‘
(R.β©β‘β $
β©α΅β‘ββ©Λ’β‘β·ββ©β‘β·ββ©[β][]ββ‘[β][]β Aββ‘Aβ Οββ‘Οβ $ R.ββ©β‘β· $
refl-β©β‘β· $ β©zero {l = l} $ escape-β©Λ’β· β©Οβ .projβ)
.projβ)
tβ[Οβ]β‘tβ[Οβ])
(with-inc-β’β
β·
(PE.subst (_β’_β‘_β·_ _ _ _) ([][]β-commutes Aβ) $
subst-β’β‘β·-β β’uββ‘uβ β’Οββ‘Οβ)
(PE.subst (_β’_β
_β·_ _ _ _) (natrecSucCase _ Aβ) $
R.escape-β©β‘β· β¦ inc = included β¦ $
β©α΅β‘β·ββ©Λ’β‘β·ββ©[ββ]β‘[ββ]β· uββ‘uβ Οββ‘Οβ))
(Ξ» {vβ = vβ} {vβ = _} {wβ = wβ} vββ‘vβ wββ‘wβ β
level-β©β‘β·
(wf-β©β‘
(R.β©β‘β $ β©α΅β‘ββ©Λ’β‘β·ββ©β‘β·ββ©[β][]ββ‘[β][]β Aββ‘Aβ Οββ‘Οβ $
R.ββ©β‘β· $ β©sucβ‘suc vββ‘vβ)
.projβ) $
PE.subst (_β©β¨_β©_β‘_β·_ _ _ _ _)
(Aβ [ suc (var x1) ]βΒ² [ Οβ β β ] [ vβ , wβ ]ββ β‘β¨ PE.cong _[ _ , _ ]ββ $ natrecSucCase _ Aβ β©
Aβ [ Οβ β ] [ suc (var x1) ]βΒ² [ vβ , wβ ]ββ β‘Λβ¨ substCompβΒ² (Aβ [ _ ]) _ β©
Aβ [ Οβ β ] [ suc vβ ]β β) $
R.β©β‘β·β $
β©α΅β‘β·ββ©Λ’β‘β·ββ©β‘β·ββ©β‘β·ββ©[ββ][]βββ‘[ββ][]βββ· uββ‘uβ Οββ‘Οβ
(R.ββ©β‘β· vββ‘vβ) (R.ββ©β‘β· wββ‘wβ))
(β©β‘β·ββ .projβ $ R.β©β‘β·β $ β©α΅β‘β·ββ©Λ’β‘β·ββ©[]β‘[]β· vββ‘vβ Οββ‘Οβ)
where
open Tools.Reasoning.PropositionalEquality
opaque
natrec-congα΅ :
Ξ β β β’ Aβ β‘ Aβ β
Ξ β β β©α΅β¨ l β© Aβ β‘ Aβ β
Ξ β©α΅β¨ lβ² β© tβ β‘ tβ β· Aβ [ zero ]β β
Ξ β β β Aβ β’ uβ β‘ uβ β· Aβ [ suc (var x1) ]βΒ² β
Ξ β β β Aβ β©α΅β¨ lβ³ β© uβ β‘ uβ β· Aβ [ suc (var x1) ]βΒ² β
Ξ β©α΅β¨ lβ΄ β© vβ β‘ vβ β· β β
Ξ β©α΅β¨ l β© natrec p q r Aβ tβ uβ vβ β‘ natrec p q r Aβ tβ uβ vβ β·
Aβ [ vβ ]β
natrec-congα΅ β’Aββ‘Aβ Aββ‘Aβ tββ‘tβ β’uββ‘uβ uββ‘uβ vββ‘vβ =
β©α΅β‘β·βΚ° .projβ
( β©α΅ββ©α΅β·ββ©α΅[]β (wf-β©α΅β‘ Aββ‘Aβ .projβ) (wf-β©α΅β‘β· vββ‘vβ .projβ)
, β©natrecβ‘natrec β’Aββ‘Aβ Aββ‘Aβ tββ‘tβ β’uββ‘uβ uββ‘uβ vββ‘vβ
)
opaque
natrecα΅ :
Ξ β β β©α΅β¨ l β© A β
Ξ β©α΅β¨ lβ² β© t β· A [ zero ]β β
Ξ β β β A β’ u β· A [ suc (var x1) ]βΒ² β
Ξ β β β A β©α΅β¨ lβ³ β© u β· A [ suc (var x1) ]βΒ² β
Ξ β©α΅β¨ lβ΄ β© v β· β β
Ξ β©α΅β¨ l β© natrec p q r A t u v β· A [ v ]β
natrecα΅ β©A β©t β’u β©u β©v =
β©α΅β·ββ©α΅β‘β· .projβ $
natrec-congα΅ (refl (β’βββ’ (wfTerm β’u))) (refl-β©α΅β‘ β©A) (refl-β©α΅β‘β· β©t)
(refl β’u) (refl-β©α΅β‘β· β©u) (refl-β©α΅β‘β· β©v)
opaque
natrec-zeroα΅ :
Ξ β©α΅β¨ l β© t β· A [ zero ]β β
Ξ β β β A β’ u β· A [ suc (var x1) ]βΒ² β
Ξ β©α΅β¨ l β© natrec p q r A t u zero β‘ t β· A [ zero ]β
natrec-zeroα΅ {A} β©t β’u =
β©α΅β·-β
(Ξ» β©Ο β
PE.subst (_β’_β_β·_ _ _ _) (PE.sym $ singleSubstLift A _) $
natrec-zero
(PE.subst (_β’_β·_ _ _) (singleSubstLift A _) $
R.escape-β©β· $ β©α΅β·ββ©Λ’β·ββ©[]β· β©t β©Ο)
(PE.subst (_β’_β·_ _ _) (natrecSucCase _ A) $
subst-β’β·-β β’u (escape-β©Λ’β· β©Ο .projβ)))
β©t
opaque
natrec-sucα΅ :
Ξ β β β©α΅β¨ lβ² β© A β
Ξ β©α΅β¨ lβ³ β© t β· A [ zero ]β β
Ξ β β β A β’ u β· A [ suc (var x1) ]βΒ² β
Ξ β β β A β©α΅β¨ l β© u β· A [ suc (var x1) ]βΒ² β
Ξ β©α΅β¨ lβ΄ β© v β· β β
Ξ β©α΅β¨ l β© natrec p q r A t u (suc v) β‘
u [ v , natrec p q r A t u v ]ββ β· A [ suc v ]β
natrec-sucα΅ {A} {u} β©A β©t β’u β©u β©v =
β©α΅β·-β
(Ξ» β©Ο β
PE.substβ (_β’_β_β·_ _ _) (PE.sym $ [,]-[]-commute u)
(PE.sym $ singleSubstLift A _) $
natrec-suc
(PE.subst (_β’_β·_ _ _) (singleSubstLift A _) $
R.escape-β©β· $ β©α΅β·ββ©Λ’β·ββ©[]β· β©t β©Ο)
(PE.subst (_β’_β·_ _ _) (natrecSucCase _ A) $
subst-β’β·-β β’u (escape-β©Λ’β· β©Ο .projβ))
(R.escape-β©β· $ β©α΅β·ββ©Λ’β·ββ©[]β· β©v β©Ο))
(PE.subst (_β©α΅β¨_β©_β·_ _ _ _) (PE.sym $ substCompβΒ² A _) $
β©α΅β·ββ©α΅β·ββ©α΅β·ββ©α΅[]βββ· β©u β©v (natrecα΅ β©A β©t β’u β©u β©v))