{-# OPTIONS --cubical --safe #-}
module CantorNormalForm.Base where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Everything
open import Cubical.Data.Sum
open import Cubical.Data.Sigma
open import Cubical.Data.Empty
renaming (rec to โฅ-rec)
open import Cubical.Relation.Nullary
open import Cubical.Data.Nat
using (โ ; zero ; suc)
open import General-Properties
mutual
data Cnf : Set where
๐ : Cnf
ฯ^_+_[_] : (a b : Cnf) โ (a โฅ left b) โ Cnf
data _<_ : Cnf โ Cnf โ Set where
<โ : โ {a b r} โ ๐ < ฯ^ a + b [ r ]
<โ : โ {a b c d r s} โ a < b โ ฯ^ a + c [ r ] < ฯ^ b + d [ s ]
<โ : โ {a b c d r s} โ a โก b โ c < d โ ฯ^ a + c [ r ] < ฯ^ b + d [ s ]
left : Cnf โ Cnf
left ๐ = ๐
left (ฯ^ a + _ [ _ ]) = a
_>_ _โฅ_ _โค_ : Cnf โ Cnf โ Set
a > b = b < a
a โฅ b = (a > b) โ (a โก b)
a โค b = b โฅ a
<โ' : โ {a b} โ left a < left b โ a < b
<โ' {๐} {ฯ^ _ + _ [ x ]} _ = <โ
<โ' {ฯ^ _ + _ [ _ ]} {ฯ^ _ + _ [ _ ]} a<b = <โ a<b
<โ'' : โ {a b d s} โ left a < b โ a < ฯ^ b + d [ s ]
<โ'' {๐} _ = <โ
<โ'' {ฯ^ _ + _ [ _ ]} a<b = <โ a<b
right : Cnf โ Cnf
right ๐ = ๐
right (ฯ^ _ + b [ _ ]) = b
caseCnf : โ {โ} {A : Type โ} (x y : A) โ Cnf โ A
caseCnf x y ๐ = x
caseCnf x y (ฯ^ _ + _ [ _ ]) = y
๐โขฯ : โ {a b} {r : a โฅ left b} โ ยฌ (๐ โก ฯ^ a + b [ r ])
๐โขฯ e = subst (caseCnf Cnf โฅ) e ๐
ฯโข๐ : โ {a b} {r : a โฅ left b} โ ยฌ (ฯ^ a + b [ r ] โก ๐)
ฯโข๐ e = subst (caseCnf โฅ Cnf) e ๐
โข๐โ>๐ : โ a โ ยฌ (a โก ๐) โ a > ๐
โข๐โ>๐ ๐ f = โฅ-rec (f refl)
โข๐โ>๐ (ฯ^ _ + _ [ _ ]) f = <โ
๐โค : {a : Cnf} โ ๐ โค a
๐โค {๐} = inr (refl)
๐โค {ฯ^ a + b [ r ]} = inl <โ
โฎ๐ : โ {a} โ ยฌ (a < ๐)
โฎ๐ ()
ฯ^โฐ๐ : โ {a b r} โ ยฌ (ฯ^ a + b [ r ] โค ๐)
ฯ^โฐ๐ (inr e) = ๐โขฯ e
โค๐โโก๐ : โ {a} โ a โค ๐ โ a โก ๐
โค๐โโก๐ (inr e) = sym e
left-is-โค-monotone : {a b : Cnf} โ a โค b โ left a โค left b
left-is-โค-monotone (inl <โ) = ๐โค
left-is-โค-monotone (inl (<โ r)) = inl r
left-is-โค-monotone (inl (<โ e r)) = inr (sym e)
left-is-โค-monotone (inr e) = inr (cong left e)
left-is-<-โค-monotone : {a b : Cnf} โ a < b โ left a โค left b
left-is-<-โค-monotone r = left-is-โค-monotone (inl r)
<-irrefl : โ {a} โ ยฌ a < a
<-irrefl (<โ r) = <-irrefl r
<-irrefl (<โ a=a r) = <-irrefl r
<-irreflexive : โ {a b} โ a โก b โ ยฌ a < b
<-irreflexive e = subst (ฮป x โ ยฌ _ < x) e <-irrefl
<-trans : โ {a b c} โ a < b โ b < c โ a < c
<-trans <โ (<โ _) = <โ
<-trans <โ (<โ _ _) = <โ
<-trans (<โ r) (<โ s) = <โ (<-trans r s)
<-trans (<โ r) (<โ p _) = <โ (subst (ฮป x โ _ < x) p r)
<-trans (<โ p _) (<โ s) = <โ (subst (ฮป x โ x < _) (sym p) s)
<-trans (<โ p r) (<โ q s) = <โ (p โ q) (<-trans r s)
left< : {a b : Cnf} {r : a โฅ left b} โ a < ฯ^ a + b [ r ]
left< {๐} = <โ
left< {ฯ^ a + c [ s ]} = <โ left<
leftโค : {a : Cnf} โ left a โค a
leftโค {๐} = inr refl
leftโค {ฯ^ a + b [ r ]} = inl left<
right< : (a b : Cnf) (r : a โฅ left b) โ b < ฯ^ a + b [ r ]
right< a ๐ _ = <โ
right< a (ฯ^ b + c [ s ]) (inl r) = <โ r
right< a (ฯ^ b + c [ s ]) (inr e) = <โ (sym e) (right< b c s)
rightโค : (a : Cnf) โ right a โค a
rightโค ๐ = inr refl
rightโค (ฯ^ a + b [ r ]) = inl (right< a b r)
ฯ^<-cases : โ {a b c d r s}
โ ฯ^ a + c [ r ] < ฯ^ b + d [ s ]
โ (a < b) โ ((a โก b) ร (c < d))
ฯ^<-cases (<โ a<b) = inl a<b
ฯ^<-cases (<โ aโกb c<d) = inr (aโกb , c<d)
<โโฏ : {a b : Cnf} โ a < b โ ยฌ (a > b)
<โโฏ (<โ r) (<โ s) = <โโฏ r s
<โโฏ (<โ r) (<โ e s) = <-irreflexive (sym e) r
<โโฏ (<โ e r) (<โ s) = <-irreflexive (sym e) s
<โโฏ (<โ e r) (<โ _ s) = <โโฏ r s
โคโโฏ : {a b : Cnf} โ a โค b โ ยฌ (a > b)
โคโโฏ (inl a<b) = <โโฏ a<b
โคโโฏ (inr bโกa) = <-irreflexive bโกa
โคโงโฎโโก : {a b : Cnf} โ a โค b โ ยฌ (a < b) โ a โก b
โคโงโฎโโก (inl a<b) aโฎb = โฅ-rec (aโฎb a<b)
โคโงโฎโโก (inr bโกa) _ = sym bโกa
โค-refl : โ {a} โ a โค a
โค-refl = inr refl
โค-trans : {a b c : Cnf} โ a โค b โ b โค c โ a โค c
โค-trans (inl a<b) (inl b<c) = inl (<-trans a<b b<c)
โค-trans (inl a<b) (inr cโกb) = inl (subst (_ <_) (sym cโกb) a<b)
โค-trans (inr bโกa) (inl b<c) = inl (subst (_< _) bโกa b<c)
โค-trans (inr bโกa) (inr cโกb) = inr (cโกb โ bโกa)
โค-antisym : {a b : Cnf} โ a โค b โ b โค a โ a โก b
โค-antisym (inl a<b) (inl a>b) = โฅ-rec (<โโฏ a<b a>b)
โค-antisym (inl a<b) (inr aโกb) = โฅ-rec (<-irreflexive aโกb a<b)
โค-antisym (inr bโกa) (inl a>b) = โฅ-rec (<-irreflexive bโกa a>b)
โค-antisym (inr bโกa) (inr aโกb) = aโกb
<-in-โค : {a b : Cnf} โ a < b โ a โค b
<-in-โค = inl
<โโค-in-< : {a b c : Cnf} โ a < b โ b โค c โ a < c
<โโค-in-< a<b (inl b<c) = <-trans a<b b<c
<โโค-in-< a<b (inr cโกb) = subst (_ <_) (sym cโกb) a<b
โคโ<-in-< : {a b c : Cnf} โ a โค b โ b < c โ a < c
โคโ<-in-< (inl a<b) b<c = <-trans a<b b<c
โคโ<-in-< (inr bโกa) b<c = subst (_< _) bโกa b<c
โค-splits : {a b : Cnf} โ a โค b โ (a < b) โ (a โก b)
โค-splits (inl a<b) = inl a<b
โค-splits (inr bโกa) = inr (sym bโกa)
import Agda.Builtin.Equality as P
PropEqfromPath : โ {โ} {A : Set โ} {x y : A} โ x โก y โ x P.โก y
PropEqfromPath {x = x} p = subst (x P.โก_) p P.refl
mutual
Cnf-is-discrete : Discrete Cnf
Cnf-is-discrete ๐ ๐ = yes refl
Cnf-is-discrete ๐ (ฯ^ b + d [ s ]) = no ๐โขฯ
Cnf-is-discrete (ฯ^ a + c [ r ]) ๐ = no ฯโข๐
Cnf-is-discrete (ฯ^ a + c [ r ]) (ฯ^ b + d [ s ])
with Cnf-is-discrete a b with Cnf-is-discrete c d
Cnf-is-discrete (ฯ^ a + ๐ [ r ]) (ฯ^ b + d [ s ]) | yes aโกb | yes ๐โกd
with PropEqfromPath aโกb | PropEqfromPath ๐โกd
Cnf-is-discrete (ฯ^ a + ๐ [ r ]) (ฯ^ b + d [ s ]) | yes aโกb | yes ๐โกd
| P.refl | P.refl = yes (cong (ฯ^ a + ๐ [_]) (isPropโจโคโฉ r s))
Cnf-is-discrete (ฯ^ a + c@(ฯ^ _ + _ [ _ ]) [ r ]) (ฯ^ b + d [ s ]) | yes aโกb | yes cโกd
with PropEqfromPath aโกb | PropEqfromPath cโกd
Cnf-is-discrete (ฯ^ a + c@(ฯ^ _ + _ [ _ ]) [ r ]) (ฯ^ b + d [ s ]) | yes aโกb | yes cโกd
| P.refl | P.refl = yes (cong (ฯ^ a + c [_]) (isPropโจโคโฉ r s))
Cnf-is-discrete (ฯ^ a + c [ r ]) (ฯ^ b + d [ s ]) | yes aโกb | no cโขd =
no (ฮป e โ cโขd (cong right e))
Cnf-is-discrete (ฯ^ a + c [ r ]) (ฯ^ b + d [ s ]) | no aโขb | v =
no (ฮป e โ aโขb (cong left e))
โก-normalise : โ {a b} โ a โก b โ a โก b
โก-normalise {a} {b} aโกb with Cnf-is-discrete a b
... | yes p = p
... | no ยฌp = โฅ-rec (ยฌp aโกb)
โก-normalise-constant : โ {a b} (p q : a โก b) โ โก-normalise p โก โก-normalise q
โก-normalise-constant {a} {b} p q with Cnf-is-discrete a b
... | yes _ = refl
... | no ยฌp = โฅ-rec (ยฌp p)
โก-canonical : โ {a b} (p : a โก b)
โ (sym (โก-normalise refl)) โ (โก-normalise p) โก p
โก-canonical = J (ฮป y p โ sym (โก-normalise refl) โ (โก-normalise p) โก p)
(lCancel (โก-normalise refl))
Cnf-is-set : isSet Cnf
Cnf-is-set _ _ p q = (sym (โก-canonical p)) โ
cong (sym (โก-normalise refl) โ_) (โก-normalise-constant p q) โ
โก-canonical q
isPropโจ<โฉ : โ {a b} โ isProp (a < b)
isPropโจ<โฉ <โ <โ = refl
isPropโจ<โฉ (<โ r) (<โ s) = cong <โ (isPropโจ<โฉ r s)
isPropโจ<โฉ (<โ r) (<โ q s) = โฅ-rec (<-irreflexive q r)
isPropโจ<โฉ (<โ p r) (<โ s) = โฅ-rec (<-irreflexive p s)
isPropโจ<โฉ (<โ p r) (<โ q s) = congโ <โ (Cnf-is-set _ _ p q) (isPropโจ<โฉ r s)
isPropโจโคโฉ : โ {a b} โ isProp (a โค b)
isPropโจโคโฉ (inl r) (inl s) = cong inl (isPropโจ<โฉ r s)
isPropโจโคโฉ (inl r) (inr q) = โฅ-rec (<-irreflexive (sym q) r)
isPropโจโคโฉ (inr p) (inl s) = โฅ-rec (<-irreflexive (sym p) s)
isPropโจโคโฉ (inr p) (inr q) = cong inr (Cnf-is-set _ _ p q)
Cnfโผ : โ {a b c d r s} โ a โก c โ b โก d โ ฯ^ a + b [ r ] โก ฯ^ c + d [ s ]
Cnfโผ {a} {b} {c} {d} {r} {s} aโกc bโกd = claimโ r r' โ claimโ r' s
where
r' : c โฅ left b
r' = subst _ aโกc r
claimโ : โ r r' โ ฯ^ a + b [ r ] โก ฯ^ a + b [ r' ]
claimโ r r' = cong (ฯ^ a + b [_]) (isPropโจโคโฉ r r')
claimโ : (r : a โฅ left b) (r' : c โฅ left b) โ ฯ^ a + b [ r ] โก ฯ^ c + b [ r' ]
claimโ = subst _ aโกc claimโ
claimโ : โ r' s โ ฯ^ c + d [ r' ] โก ฯ^ c + d [ s ]
claimโ r' s = cong (ฯ^ c + d [_]) (isPropโจโคโฉ r' s)
claimโ : (r' : c โฅ left b) (s : c โฅ left d) โ ฯ^ c + b [ r' ] โก ฯ^ c + d [ s ]
claimโ = subst _ (sym bโกd) claimโ
<-tri : (a b : Cnf) โ (a < b) โ (a โฅ b)
<-tri ๐ ๐ = inr (inr refl)
<-tri ๐ (ฯ^ b + d [ _ ]) = inl <โ
<-tri (ฯ^ a + c [ _ ]) ๐ = inr (inl <โ)
<-tri (ฯ^ a + c [ _ ]) (ฯ^ b + d [ _ ]) with <-tri a b with <-tri c d
... | inl a<b | _ = inl (<โ a<b)
... | inr (inl a>b) | _ = inr (inl (<โ a>b))
... | inr (inr aโกb) | inl c<d = inl (<โ aโกb c<d)
... | inr (inr aโกb) | inr (inl c>d) = inr (inl (<โ (sym aโกb) c>d))
... | inr (inr aโกb) | inr (inr cโกd) = inr (inr (Cnfโผ aโกb cโกd))
<-dec : (a b : Cnf) โ Dec (a < b)
<-dec a b with <-tri a b
... | inl a<b = yes a<b
... | inr aโฅb = no (โคโโฏ aโฅb)
โค-dec : (a b : Cnf) โ Dec (a โค b)
โค-dec a b with <-tri b a
... | inl a>b = no (ฮป aโคb โ โคโโฏ aโคb a>b)
... | inr aโคb = yes aโคb
โค-connex : (a b : Cnf) โ (a โค b) โ (a โฅ b)
โค-connex a b with <-tri a b
... | inl a<b = inl (inl a<b)
... | inr aโฅb = inr aโฅb
<-extensional : isExtensional _<_
<-extensional a b h with <-tri a b
... | inl a<b = โฅ-rec (<-irrefl (snd (h a) a<b))
... | inr (inl a>b) = โฅ-rec (<-irrefl (fst (h b) a>b))
... | inr (inr aโกb) = aโกb
โค-extensional : isExtensional _โค_
โค-extensional a b h = โค-antisym (fst (h a) โค-refl) (snd (h b) โค-refl)
โคโ : โ {a b c r s} โ a โค b โ ฯ^ a + c [ r ] โค ฯ^ b + c [ s ]
โคโ (inl a<b) = inl (<โ a<b)
โคโ (inr bโกa) = inr (Cnfโผ bโกa refl)
โคโโปยน : โ {a b c d r s} โ ฯ^ a + c [ r ] โค ฯ^ b + d [ s ] โ a โค b
โคโโปยน (inl (<โ a<b)) = inl a<b
โคโโปยน (inl (<โ aโกb c<d)) = inr (sym aโกb)
โคโโปยน (inr e) = inr (cong left e)
โคโ : โ {a b c d r s} โ a โก b โ c โค d โ ฯ^ a + c [ r ] โค ฯ^ b + d [ s ]
โคโ aโกb (inl c<d) = inl (<โ aโกb c<d)
โคโ aโกb (inr dโกc) = inr (Cnfโผ (sym aโกb) dโกc)
<โโปยน : โ {a b c d r s} โ a โก b โ ฯ^ a + c [ r ] < ฯ^ b + d [ s ] โ c < d
<โโปยน aโกb (<โ a<b) = โฅ-rec (<-irreflexive aโกb a<b)
<โโปยน aโกb (<โ _ c<d) = c<d
โคโโปยน : โ {a b c d r s} โ a โก b โ ฯ^ a + c [ r ] โค ฯ^ b + d [ s ] โ c โค d
โคโโปยน aโกb (inl r) = inl (<โโปยน aโกb r)
โคโโปยน aโกb (inr e) = inr (cong right e)
โคโ' : โ {a b c d r s} โ a โค b โ c โค d โ ฯ^ a + c [ r ] โค ฯ^ b + d [ s ]
โคโ' (inl a<b) cโคd = inl (<โ a<b)
โคโ' (inr bโกa) cโคd = โคโ (sym bโกa) cโคd
โฎโโฅ : {a b : Cnf} โ ยฌ (a < b) โ a โฅ b
โฎโโฅ {a} {b} ยฌa<b with <-tri a b
... | inl a<b = โฅ-rec (ยฌa<b a<b)
... | inr aโฅb = aโฅb
โฐโ> : {a b : Cnf} โ ยฌ (a โค b) โ a > b
โฐโ> {a} {b} ยฌaโคb with <-tri b a
... | inl a>b = a>b
... | inr aโคb = โฅ-rec (ยฌaโคb aโคb)
ฯ^โจ_โฉ : Cnf โ Cnf
ฯ^โจ a โฉ = ฯ^ a + ๐ [ ๐โค ]
๐ : Cnf
๐ = ฯ^โจ ๐ โฉ
ฯ : Cnf
ฯ = ฯ^โจ ๐ โฉ
๐โคฯ^ : โ {a b r} โ ๐ โค ฯ^ a + b [ r ]
๐โคฯ^ {๐} = โคโ refl ๐โค
๐โคฯ^ {ฯ^ a + c [ s ]} = inl (<โ <โ)
ฯ^โฎ๐ : โ {a b r} โ ยฌ (ฯ^ a + b [ r ] < ๐)
ฯ^โฎ๐ = โคโโฏ ๐โคฯ^
<๐โโก๐ : โ {a} โ a < ๐ โ a โก ๐
<๐โโก๐ <โ = refl
fin<ฯ : โ a โ left a โก ๐ โ a < ฯ
fin<ฯ ๐ p = <โ
fin<ฯ (ฯ^ u + x [ _ ]) uโก๐ = <โ (subst (_< ๐) (sym uโก๐) <โ)
<ฯโfin : โ {a} โ a < ฯ โ left a โก ๐
<ฯโfin <โ = refl
<ฯโfin (<โ r) = <๐โโก๐ r
mutual
NtoC : โ โ Cnf
NtoC 0 = ๐
NtoC (suc n) = ฯ^ ๐ + NtoC n [ inr (sym (left-NtoC-is-๐ n)) ]
left-NtoC-is-๐ : โ n โ left (NtoC n) โก ๐
left-NtoC-is-๐ 0 = refl
left-NtoC-is-๐ (suc n) = refl
leftโก๐-is-nat : โ a โ left a โก ๐ โ ฮฃ[ n โ โ ] a โก NtoC n
leftโก๐-is-nat ๐ e = 0 , refl
leftโก๐-is-nat (ฯ^ a + b [ r ]) aโก๐ = suc n , claim
where
lbโก๐ : left b โก ๐
lbโก๐ = โค๐โโก๐ (subst (left b โค_) aโก๐ r)
IH : ฮฃ[ n โ โ ] b โก NtoC n
IH = leftโก๐-is-nat b lbโก๐
n : โ
n = fst IH
claim : ฯ^ a + b [ r ] โก NtoC (suc n)
claim = Cnfโผ aโก๐ (snd IH)