@@ -10,6 +10,8 @@ open import Cubical.Data.Empty as ⊥
1010open import Cubical.Data.Sigma
1111open import Cubical.Data.Sum as ⊎
1212
13+ open import Cubical.Data.Bool.Base hiding (_≟_)
14+
1315open import Cubical.Data.Nat.Base
1416open import Cubical.Data.Nat.Properties
1517
@@ -258,22 +260,59 @@ predℕ-≤-predℕ {suc m} {suc n} ineq = pred-≤-pred ineq
258260left-≤-max : m ≤ max m n
259261left-≤-max {zero} {n} = zero-≤
260262left-≤-max {suc m} {zero} = ≤-refl
261- left-≤-max {suc m} {suc n} = suc-≤-suc left-≤-max
263+ left-≤-max {suc m} {suc n} = subst (_ ≤_) (sym maxSuc) $ suc-≤-suc $ left-≤-max {m} {n}
262264
263265right-≤-max : n ≤ max m n
264266right-≤-max {zero} {m} = zero-≤
265267right-≤-max {suc n} {zero} = ≤-refl
266- right-≤-max {suc n} {suc m} = suc-≤-suc right-≤-max
268+ right-≤-max {suc n} {suc m} = subst (_ ≤_) (sym maxSuc) $ suc-≤-suc $ right-≤-max {n} {m}
267269
268270min-≤-left : min m n ≤ m
269271min-≤-left {zero} {n} = ≤-refl
270272min-≤-left {suc m} {zero} = zero-≤
271- min-≤-left {suc m} {suc n} = suc-≤-suc min-≤-left
273+ min-≤-left {suc m} {suc n} = subst (_≤ _) (sym minSuc) $ suc-≤-suc $ min-≤-left {m} {n}
272274
273275min-≤-right : min m n ≤ n
274276min-≤-right {zero} {n} = zero-≤
275277min-≤-right {suc m} {zero} = ≤-refl
276- min-≤-right {suc m} {suc n} = suc-≤-suc min-≤-right
278+ min-≤-right {suc m} {suc n} = subst (_≤ _) (sym minSuc) $ suc-≤-suc $ min-≤-right {m} {n}
279+
280+ -- Boolean order relations and their conversions to/from ≤ and <
281+
282+ _≤ᵇ_ : ℕ → ℕ → Bool
283+ m ≤ᵇ n = m <ᵇ suc n
284+
285+ _≥ᵇ_ : ℕ → ℕ → Bool
286+ m ≥ᵇ n = n ≤ᵇ m
287+
288+ _>ᵇ_ : ℕ → ℕ → Bool
289+ m >ᵇ n = n <ᵇ m
290+
291+ private
292+ ≤ᵇ-∸-+-cancel : ∀ m n → Bool→Type (m ≤ᵇ n) → (n ∸ m) + m ≡ n
293+ ≤ᵇ-∸-+-cancel zero zero t = refl
294+ ≤ᵇ-∸-+-cancel zero (suc n) t = +-zero (suc n)
295+ ≤ᵇ-∸-+-cancel (suc m) (suc n) t = +-suc (n ∸ m) m ∙ cong suc (≤ᵇ-∸-+-cancel m n t)
296+
297+ <ᵇ→< : Bool→Type (m <ᵇ n) → m < n
298+ <ᵇ→< {m} {suc n} t .fst = n ∸ m
299+ <ᵇ→< {m} {suc n} t .snd =
300+ n ∸ m + suc m ≡⟨ +-suc (n ∸ m) m ⟩
301+ suc (n ∸ m + m) ≡⟨ cong suc (≤ᵇ-∸-+-cancel m n t) ⟩
302+ suc n ∎
303+
304+ <→<ᵇ : m < n → Bool→Type (m <ᵇ n)
305+ <→<ᵇ {m} {zero} m<0 = ¬-<-zero m<0
306+ <→<ᵇ {zero} {suc n} 0<sn = tt
307+ <→<ᵇ {suc m} {suc n} sm<sn = <→<ᵇ (pred-≤-pred sm<sn)
308+
309+ ≤ᵇ→≤ : Bool→Type (m ≤ᵇ n) → m ≤ n
310+ ≤ᵇ→≤ {zero} {n} t = zero-≤
311+ ≤ᵇ→≤ {suc m} {suc n} t = <ᵇ→< t
312+
313+ ≤→≤ᵇ : m ≤ n → Bool→Type (m ≤ᵇ n)
314+ ≤→≤ᵇ {zero} {n} 0≤n = tt
315+ ≤→≤ᵇ {suc m} {n} sm≤n = <→<ᵇ sm≤n
277316
278317≤Dec : ∀ m n → Dec (m ≤ n)
279318≤Dec zero n = yes (n , +-zero _)
@@ -296,11 +335,27 @@ Trichotomy-suc (lt m<n) = lt (suc-≤-suc m<n)
296335Trichotomy-suc (eq m=n) = eq (cong suc m=n)
297336Trichotomy-suc (gt n<m) = gt (suc-≤-suc n<m)
298337
338+ private
339+ ∸→>ᵇ : ∀ m n → caseNat ⊥.⊥ Unit (m ∸ n) → Bool→Type (m >ᵇ n)
340+ ∸→>ᵇ (suc m) zero t = tt
341+ ∸→>ᵇ (suc m) (suc n) t = ∸→>ᵇ m n t
342+
299343_≟_ : ∀ m n → Trichotomy m n
300- zero ≟ zero = eq refl
301- zero ≟ suc n = lt (n , +-comm n 1 )
302- suc m ≟ zero = gt (m , +-comm m 1 )
303- suc m ≟ suc n = Trichotomy-suc (m ≟ n)
344+ m ≟ n with m ∸ n UsingEq | n ∸ m UsingEq
345+ ... | zero , p | zero , q = eq (∸≡0→≡ p q)
346+ ... | zero , p | suc _ , q = lt (<ᵇ→< $ ∸→>ᵇ n m $ subst (caseNat ⊥.⊥ Unit) (sym q) tt)
347+ ... | suc _ , p | zero , q = gt (<ᵇ→< $ ∸→>ᵇ m n $ subst (caseNat ⊥.⊥ Unit) (sym p) tt)
348+ ... | suc _ , p | suc _ , q = ⊥.rec $ ¬m<m {m} $ <-trans
349+ (<ᵇ→< $ ∸→>ᵇ n m $ subst (caseNat ⊥.⊥ Unit) (sym q) tt)
350+ (<ᵇ→< $ ∸→>ᵇ m n $ subst (caseNat ⊥.⊥ Unit) (sym p) tt)
351+
352+ -- Alternative version of ≟, defined without builtin primitives
353+
354+ _≟'_ : ∀ m n → Trichotomy m n
355+ zero ≟' zero = eq refl
356+ zero ≟' suc n = lt (n , +-comm n 1 )
357+ suc m ≟' zero = gt (m , +-comm m 1 )
358+ suc m ≟' suc n = Trichotomy-suc (m ≟' n)
304359
305360Dichotomyℕ : ∀ (n m : ℕ) → (n ≤ m) ⊎ (n > m)
306361Dichotomyℕ n m with (n ≟ m)
@@ -331,7 +386,10 @@ splitℕ-< m n with m ≟ n
331386<-split : m < suc n → (m < n) ⊎ (m ≡ n)
332387<-split {n = zero} = inr ∘ snd ∘ m+n≡0→m≡0×n≡0 ∘ snd ∘ pred-≤-pred
333388<-split {zero} {suc n} = λ _ → inl (suc-≤-suc zero-≤)
334- <-split {suc m} {suc n} = ⊎.map suc-≤-suc (cong suc) ∘ <-split ∘ pred-≤-pred
389+ <-split {suc m} {suc n} sm<ssn with m ≟ n
390+ ... | lt m<n = inl (suc-≤-suc m<n)
391+ ... | eq m≡n = inr (cong suc m≡n)
392+ ... | gt n<m = ⊥.rec $ ¬m<m {suc (suc n)} $ ≤-trans (suc-≤-suc (suc-≤-suc n<m)) sm<ssn
335393
336394≤-split : m ≤ n → (m < n) ⊎ (m ≡ n)
337395≤-split p = <-split (suc-≤-suc p)
0 commit comments