module TLC.Equality where
open import SOAS.Common
open import SOAS.Context
open import SOAS.Variable
open import SOAS.Families.Core
open import SOAS.Families.Build
open import SOAS.ContextMaps.Inductive
open import TLC.Signature
open import TLC.Syntax
open import SOAS.Metatheory.SecondOrder.Metasubstitution Ξ:Syn
open import SOAS.Metatheory.SecondOrder.Equality Ξ:Syn
private
variable
Ξ± Ξ² Ξ³ Ο : ΞT
Ξ Ξ Ξ : Ctx
infix 1 _βΉ_β’_ββ_
data _βΉ_β’_ββ_ : β π Ξ {Ξ±} β (π β· Ξ) Ξ± Ξ β (π β· Ξ) Ξ± Ξ β Set where
ΖΞ² : β
Ξ± β© Ξ² β β
Ξ± βΜ£ βΉ β
β’ (Ζ πβ¨ xβ β©) $ π ββ πβ¨ π β©
ΖΞ· : β
Ξ± β£ Ξ² βΜ£ βΉ β
β’ Ζ (π $ xβ) ββ π
πΞ· : β
π βΜ£ βΉ β
β’ π ββ unit
fΞ² : β
Ξ± β β
Ξ² βΜ£ βΉ β
β’ fst (β¨ π , π β©) ββ π
sΞ² : β
Ξ± β β
Ξ² βΜ£ βΉ β
β’ snd (β¨ π , π β©) ββ π
pΞ· : β
Ξ± β Ξ² βΜ£ βΉ β
β’ β¨ (fst π) , (snd π) β© ββ π
πΞ· : β
π β β
Ξ± βΜ£ βΉ β
β’ abort π ββ π
lΞ² : β
Ξ± β β
Ξ± β© Ξ³ β β
Ξ² β© Ξ³ βΜ£ βΉ β
β’ case (inl π) (πβ¨ xβ β©) (π β¨ xβ β©) ββ πβ¨ π β©
rΞ² : β
Ξ² β β
Ξ± β© Ξ³ β β
Ξ² β© Ξ³ βΜ£ βΉ β
β’ case (inr π) (πβ¨ xβ β©) (π β¨ xβ β©) ββ π β¨ π β©
cΞ· : β
Ξ± β Ξ² β β
(Ξ± β Ξ²) β© Ξ³ βΜ£ βΉ β
β’ case π (πβ¨ inl xβ β©) (πβ¨ inr xβ β©) ββ πβ¨ π β©
zeΞ² : β
Ξ± β β
Ξ± Β· N β© Ξ± βΜ£ βΉ β
β’ nrec ze π (πβ¨ xβ β xβ β©) ββ π
suΞ² : β
Ξ± β β
Ξ± Β· N β© Ξ± β β
N βΜ£ βΉ β
β’ nrec (su π ) π (πβ¨ xβ β xβ β©) ββ πβ¨ (nrec π π (πβ¨ xβ β xβ β©)) β π β©
open EqLogic _βΉ_β’_ββ_
open β-Reasoning
ift : β
Ξ± β β
Ξ± βΜ£ βΉ β
β’ if true π π β π
ift = ax lΞ² withγ unit β π β π γ
iff : β
Ξ± β β
Ξ± βΜ£ βΉ β
β’ if false π π β π
iff = ax rΞ² withγ unit β π β π γ
ΖΞ²Β² : β
Ξ² Β· Ξ± β© Ξ³ β β
Ξ± β β
Ξ² βΜ£ βΉ β
β’ (Ζ (Ζ πβ¨ xβ β xβ β©)) $ π $ π β πβ¨ π β π β©
ΖΞ²Β² = begin
(Ζ (Ζ πβ¨ xβ β xβ β©)) $ π $ π
ββ¨ cong[ ax ΖΞ² withγ (Ζ πβ¨ xβ β xβ β©) β π γ ]inside βα΅ $ π β©
(Ζ πβ¨ xβ β π β©) $ π
ββ¨ ax ΖΞ² withγ (πβ¨ xβ β π β©) β π γ β©
πβ¨ π β π β©
β
1+2 : β
β βΉ β
β’ uncurry $ plus $ β¨ su ze , su (su ze) β© β su (su (su ze))
1+2 = begin
uncurry $ plus $ β¨ su ze , su (su ze) β©
ββ¨ thm ΖΞ²Β² withγ xβ $ fst xβ $ snd xβ β plus β β¨ su ze , su (su ze) β© γ β©
plus $ fst β¨ su ze , su (su ze) β© $ snd β¨ su ze , su (su ze) β©
ββ¨ congβ[ ax fΞ² withγ su ze β su (su ze) γ ][
ax sΞ² withγ su ze β su (su ze) γ ]inside plus $ βα΅ $ βα΅ β©
plus $ su ze $ su (su ze)
ββ¨ thm ΖΞ²Β² withγ nrec xβ xβ (su xβ) β su ze β su (su ze) γ β©
nrec (su ze) (su (su ze)) (su xβ)
ββ¨ ax suΞ² withγ su (su ze) β su xβ β ze γ β©
su (nrec ze (su (su ze)) (su xβ))
ββ¨ cong[ ax zeΞ² withγ su (su ze) β su xβ γ ]inside su βα΅ β©
su (su (su ze))
β