module Cubical.Data.Int.Order where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Function
open import Cubical.Data.Empty as ⊥ using (⊥)
open import Cubical.Data.Int.Base as ℤ
open import Cubical.Data.Int.Properties as ℤ
open import Cubical.Data.Nat as ℕ
open import Cubical.Data.NatPlusOne.Base as ℕ₊₁
open import Cubical.Data.Sigma
open import Cubical.Relation.Nullary
infix 4 _≤_ _<_ _≥_ _>_
_≤_ : ℤ → ℤ → Type₀
m ≤ n = Σ[ k ∈ ℕ ] m +pos k ≡ n
_<_ : ℤ → ℤ → Type₀
m < n = sucℤ m ≤ n
_≥_ : ℤ → ℤ → Type₀
m ≥ n = n ≤ m
_>_ : ℤ → ℤ → Type₀
m > n = n < m
data Trichotomy (m n : ℤ) : Type₀ where
lt : m < n → Trichotomy m n
eq : m ≡ n → Trichotomy m n
gt : n < m → Trichotomy m n
private
variable
m n o s : ℤ
k l : ℕ
private
witness-prop : ∀ j → isProp (m +pos j ≡ n)
witness-prop {m} {n} j = isSetℤ (m +pos j) n
isProp≤ : isProp (m ≤ n)
isProp≤ {m} {n} (k , p) (l , q)
= Σ≡Prop witness-prop lemma
where
lemma : k ≡ l
lemma = injPos (inj-z+ (p ∙ sym q))
isProp< : isProp (m < n)
isProp< = isProp≤
zero-≤pos : 0 ≤ pos l
zero-≤pos {l} = l , (sym (pos0+ (pos l)))
¬-pos<-zero : ¬ (pos k) < 0
¬-pos<-zero {k} (i , p) = snotz (injPos (pos+ (suc k) i ∙ p))
negsuc<-zero : negsuc k < 0
negsuc<-zero {k} = k ,
((sucℤ (negsuc k) +pos k) ≡⟨ sym (sucℤ+ (negsuc k) (pos k)) ⟩
sucℤ (negsuc k +pos k) ≡⟨ +sucℤ (negsuc k) (pos k) ⟩
neg (suc k) ℤ.+ pos (suc k) ≡⟨ -Cancel' (pos (suc k)) ⟩
pos zero ∎)
¬pos≤negsuc : ¬ (pos k) ≤ negsuc l
¬pos≤negsuc {k} {l} (i , p) = posNotnegsuc (k ℕ.+ i) l (pos+ k i ∙ p)
negsuc<pos : negsuc k < pos l
negsuc<pos {zero} {zero} = 0 , refl
negsuc<pos {zero} {suc l} = suc l , sym (pos0+ (pos (suc l)))
negsuc<pos {suc k} {zero} = suc k , -Cancel' (pos (suc k))
negsuc<pos {suc k} {suc l} = suc k ℕ.+ suc l
, cong (negsuc k ℤ.+_) (pos+ (suc k) (suc l)) ∙
+Assoc (negsuc k) (pos (suc k)) (pos (suc l)) ∙
cong (ℤ._+ pos (suc l)) (-Cancel' (pos (suc k))) ∙
sym (pos0+ (pos (suc l)))
suc-≤-suc : m ≤ n → sucℤ m ≤ sucℤ n
suc-≤-suc {m} {n} (k , p) = k , (sym (sucℤ+pos k m) ∙ cong sucℤ p)
negsuc-≤-negsuc : pos k ≤ pos l → negsuc l ≤ negsuc k
negsuc-≤-negsuc {k} {l} (i , p) = i ,
((negsuc l +pos i) ≡⟨ cong (λ x → negsuc x +pos i)
(sym (injPos (pos+ k i ∙ p))) ⟩
(negsuc (k ℕ.+ i) +pos i) ≡⟨ cong (ℤ._+ pos i) (negsuc+ k i) ⟩
((negsuc k ℤ.+ - pos i) +pos i) ≡⟨ minusPlus (pos i) (negsuc k) ⟩
negsuc k ∎)
pos-≤-pos : negsuc k ≤ negsuc l → pos l ≤ pos k
pos-≤-pos {k} {l} (i , p) = i ,
((pos l +pos i)
≡⟨ sym (cong (pos l ℤ.+_) (plusMinus (negsuc k) (pos i))) ⟩
pos l ℤ.+ sucℤ ((pos i +negsuc k) +pos k)
≡[ j ]⟨ pos l ℤ.+ sucℤ ((+Comm (pos i) (negsuc k)) j +pos k) ⟩
pos l ℤ.+ sucℤ ((negsuc k +pos i) +pos k)
≡[ j ]⟨ pos l ℤ.+ sucℤ (p j +pos k) ⟩
pos l ℤ.+ sucℤ (negsuc l +pos k)
≡⟨ cong (pos l ℤ.+_) (sucℤ+ (negsuc l) (pos k)) ⟩
pos l ℤ.+ (sucℤ (negsuc l) +pos k)
≡⟨ +Assoc (pos l) (sucℤ (negsuc l)) (pos k) ⟩
((pos l ℤ.+ sucℤ (negsuc l)) +pos k)
≡[ j ]⟨ (pos l ℤ.+ sucℤnegsucneg l j) +pos k ⟩
((pos l ℤ.+ neg l) +pos k)
≡[ j ]⟨ (pos l ℤ.+ (-pos l (~ j))) +pos k ⟩
((pos l - pos l) +pos k)
≡⟨ cong (_+pos k) (-Cancel (pos l)) ⟩
0 +pos k ≡⟨ +Comm 0 (pos k) ⟩
pos k ∎)
≤-+o : m ≤ n → m ℤ.+ o ≤ n ℤ.+ o
≤-+o {m} {n} {o} (i , p)
= i , (((m ℤ.+ o) +pos i) ≡⟨ sym (+Assoc m o (pos i)) ⟩
m ℤ.+ (o ℤ.+ pos i) ≡⟨ cong (m ℤ.+_) (+Comm o (pos i)) ⟩
m ℤ.+ (pos i ℤ.+ o) ≡⟨ +Assoc m (pos i) o ⟩
(m +pos i) ℤ.+ o ≡⟨ cong (ℤ._+ o) p ⟩
n ℤ.+ o ∎)
≤SumRightPos : n ≤ pos k ℤ.+ n
≤SumRightPos {n} {k}
= subst (_≤ pos k ℤ.+ n) (sym (pos0+ n)) (≤-+o {o = n} (zero-≤pos {k}))
≤-o+ : m ≤ n → o ℤ.+ m ≤ o ℤ.+ n
≤-o+ {m} {n} {o} = subst2 (_≤_) (+Comm m o) (+Comm n o) ∘ ≤-+o {o = o}
≤SumLeftPos : n ≤ n ℤ.+ pos k
≤SumLeftPos {n} {k} = ≤-o+ {o = n} (zero-≤pos {k})
pred-≤-pred : sucℤ m ≤ sucℤ n → m ≤ n
pred-≤-pred {m} {n} (k , p) = k , cong (_+pos k) (sym (predSuc m))
∙ sym (predℤ+pos k (sucℤ m))
∙ cong predℤ p
∙ predSuc n
isRefl≤ : m ≤ m
isRefl≤ = 0 , refl
≤-suc : m ≤ n → m ≤ sucℤ n
≤-suc (k , p) = suc k , cong sucℤ p
suc-< : sucℤ m < n → m < n
suc-< p = pred-≤-pred (≤-suc p)
≤-sucℤ : n ≤ sucℤ n
≤-sucℤ = ≤-suc isRefl≤
≤-predℤ : predℤ n ≤ n
≤-predℤ {n} = 1 , sucPred n
isTrans≤ : m ≤ n → n ≤ o → m ≤ o
isTrans≤ {m} {n} {o} (i , p) (j , q) = (i ℕ.+ j)
, ((m ℤ.+ pos (i ℕ.+ j)) ≡⟨ cong (m ℤ.+_) (pos+ i j) ⟩
m ℤ.+ (pos i +pos j) ≡⟨ +Assoc m (pos i) (pos j) ⟩
((m +pos i) +pos j) ≡⟨ cong (_+pos j) p ⟩
(n +pos j) ≡⟨ q ⟩
o ∎)
isAntisym≤ : m ≤ n → n ≤ m → m ≡ n
isAntisym≤ {m} {n} (i , p) (j , q)
= cong (m +pos_) (injPos lemma₂) ∙ p
where lemma₀ : pos (j ℕ.+ i) ℤ.+ m ≡ m
lemma₀ = pos (j ℕ.+ i) ℤ.+ m ≡⟨ cong (ℤ._+ m) (pos+ j i) ⟩
(pos j +pos i) ℤ.+ m ≡⟨ sym (+Assoc (pos j) (pos i) m) ⟩
pos j ℤ.+ (pos i ℤ.+ m) ≡⟨ cong (pos j ℤ.+_) (+Comm (pos i) m) ⟩
pos j ℤ.+ (m ℤ.+ pos i) ≡⟨ cong (pos j ℤ.+_) p ⟩
pos j ℤ.+ n ≡⟨ +Comm (pos j) n ⟩
(n +pos j) ≡⟨ q ⟩
m ∎
lemma₁ : pos (j ℕ.+ i) ≡ 0
lemma₁ = n+z≡z→n≡0 (pos (j ℕ.+ i)) m lemma₀
lemma₂ : 0 ≡ pos i
lemma₂ = cong pos (sym (snd (m+n≡0→m≡0×n≡0 (injPos lemma₁))))
≤Monotone+ : m ≤ n → o ≤ s → m ℤ.+ o ≤ n ℤ.+ s
≤Monotone+ {o = o} p q = isTrans≤ (≤-+o {o = o} p) (≤-o+ q)
≤-o+-cancel : o ℤ.+ m ≤ o ℤ.+ n → m ≤ n
≤-o+-cancel {o} {m} (i , p) = i , inj-z+ {z = o} (+Assoc o m (pos i) ∙ p)
≤-+o-cancel : m ℤ.+ o ≤ n ℤ.+ o → m ≤ n
≤-+o-cancel {m} {o} {n} (i , p) = i , (inj-+z {z = o}
((m +pos i) ℤ.+ o ≡⟨ sym (+Assoc m (pos i) o) ⟩
m ℤ.+ (pos i ℤ.+ o) ≡⟨ cong (m ℤ.+_) (+Comm (pos i) o) ⟩
m ℤ.+ (o +pos i) ≡⟨ +Assoc m o (pos i) ⟩
((m ℤ.+ o) +pos i) ≡⟨ p ⟩
n ℤ.+ o ∎))
≤-+pos-trans : m ℤ.+ pos k ≤ n → m ≤ n
≤-+pos-trans {m} {k} {n} p = isTrans≤ ≤SumRightPos (subst (_≤ n) (+Comm m (pos k)) p)
≤-pos+-trans : pos k ℤ.+ m ≤ n → m ≤ n
≤-pos+-trans {k} {m} {n} p = isTrans≤ ≤SumRightPos p
≤-·o : m ≤ n → m ℤ.· (pos k) ≤ n ℤ.· (pos k)
≤-·o {m} {n} {k} (i , p) = i ℕ.· k ,
(((m ℤ.· pos k) +pos (i ℕ.· k)) ≡⟨ cong (m ℤ.· pos k ℤ.+_) (pos·pos i k) ⟩
m ℤ.· pos k ℤ.+ pos i ℤ.· pos k ≡⟨ sym (·DistL+ m (pos i) (pos k)) ⟩
(m +pos i) ℤ.· pos k ≡⟨ cong (ℤ._· pos k) p ⟩
n ℤ.· pos k ∎)
0≤o→≤-·o : 0 ≤ o → m ≤ n → m ℤ.· o ≤ n ℤ.· o
0≤o→≤-·o {pos o} 0≤o m≤n = ≤-·o {k = o} m≤n
0≤o→≤-·o {negsuc o} 0≤o _ = ⊥.rec (¬pos≤negsuc 0≤o)
<-·o : m < n → m ℤ.· (pos (suc k)) < n ℤ.· (pos (suc k))
<-·o {m} {n} {k} (i , p) = (i ℕ.· suc k ℕ.+ k) ,
((sucℤ (m ℤ.· pos (suc k)) +pos (i ℕ.· suc k ℕ.+ k)) ≡⟨ cong (sucℤ (m ℤ.· pos (suc k)) ℤ.+_)
(pos+ (i ℕ.· suc k) k) ⟩
sucℤ (m ℤ.· pos (suc k)) ℤ.+ (pos (i ℕ.· suc k) +pos k) ≡⟨ cong (sucℤ (m ℤ.· pos (suc k)) ℤ.+_)
(+Comm (pos (i ℕ.· suc k)) (pos k)) ⟩
sucℤ (m ℤ.· pos (suc k)) ℤ.+ (pos k +pos (i ℕ.· suc k)) ≡⟨ +Assoc (sucℤ (m ℤ.· pos (suc k))) (pos k) (pos (i ℕ.· suc k)) ⟩
((sucℤ (m ℤ.· pos (suc k)) +pos k) +pos (i ℕ.· suc k)) ≡⟨ cong (_+pos (i ℕ.· suc k))
(sym (sucℤ+pos k (m ℤ.· pos (suc k)))) ⟩
(sucℤ ((m ℤ.· pos (suc k)) +pos k) +pos (i ℕ.· suc k)) ≡⟨ cong (_+pos (i ℕ.· suc k)) (+sucℤ (m ℤ.· pos (suc k)) (pos k)) ⟩
(((m ℤ.· pos (suc k)) ℤ.+ (pos (suc k))) +pos (i ℕ.· suc k)) ≡⟨ cong (_+pos (i ℕ.· suc k))
(+Comm (m ℤ.· pos (suc k)) (pos (suc k))) ⟩
((pos (suc k) ℤ.+ m ℤ.· pos (suc k)) +pos (i ℕ.· suc k)) ≡⟨ cong (_+pos (i ℕ.· suc k)) (sym (sucℤ· m (pos (suc k)))) ⟩
(((sucℤ m) ℤ.· pos (suc k)) +pos (i ℕ.· suc k)) ≡⟨ cong ((sucℤ m) ℤ.· pos (suc k) ℤ.+_)
(pos·pos i (suc k)) ⟩
((sucℤ m) ℤ.· pos (suc k)) ℤ.+ pos i ℤ.· pos (suc k) ≡⟨ sym (·DistL+ ((sucℤ m)) (pos i) (pos (suc k))) ⟩
((sucℤ m) +pos i) ℤ.· pos (suc k) ≡⟨ cong (ℤ._· pos (suc k)) p ⟩
n ℤ.· pos (suc k) ∎)
<-o+-cancel : o ℤ.+ m < o ℤ.+ n → m < n
<-o+-cancel {o} {m} {n} = ≤-o+-cancel ∘ subst (_≤ o ℤ.+ n) (+sucℤ o m)
<-weaken : m < n → m ≤ n
<-weaken {m} (i , p) = (suc i) , sucℤ+ m (pos i) ∙ p
isIrrefl< : ¬ m < m
isIrrefl< {pos zero} (i , p) = snotz (injPos (pos+ (suc zero) i ∙ p))
isIrrefl< {pos (suc n)} (i , p) = isIrrefl< {m = pos n} (i ,
(sym (pos+ (suc n) i)
∙ cong pos(+-comm (suc n) i
∙ +-suc i n
∙ cong suc (+-comm i n)
∙ injSuc (injPos (pos+ (suc (suc n)) i ∙ p)))))
isIrrefl< {negsuc zero} (i , p)
= posNotnegsuc (zero ℕ.+ i) zero (+Comm (pos i) (pos zero) ∙ p)
isIrrefl< {negsuc (suc n)} (i , p) = isIrrefl< {m = negsuc n} (i ,
((sucℤ (negsuc n) +pos i) ≡⟨ sym (sucℤ+ (negsuc n) (pos i)) ⟩
sucℤ (negsuc n +pos i) ≡⟨ cong sucℤ p ⟩
negsuc n ∎))
0<o→<-·o : 0 < o → m < n → m ℤ.· o < n ℤ.· o
0<o→<-·o {pos zero} 0<o _ = ⊥.rec (isIrrefl< 0<o)
0<o→<-·o {pos (suc o)} 0<o m<n = <-·o {k = o} m<n
0<o→<-·o {negsuc o} 0<o _ = ⊥.rec (¬pos≤negsuc (<-weaken 0<o))
pos≤0→≡0 : pos k ≤ 0 → pos k ≡ 0
pos≤0→≡0 {zero} _ = refl
pos≤0→≡0 {suc k} p = ⊥.rec (¬-pos<-zero {k = k} p)
predℤ-≤-predℤ : m ≤ n → predℤ m ≤ predℤ n
predℤ-≤-predℤ {m} {n} (i , p) = i ,
((predℤ m +pos i) ≡⟨ sym (predℤ+ m (pos i)) ⟩
predℤ (m +pos i) ≡⟨ cong predℤ p ⟩
predℤ n ∎)
¬m+posk<m : ¬ m ℤ.+ pos k < m
¬m+posk<m {m} {k} = ¬-pos<-zero ∘ <-o+-cancel {o = m} {m = pos k} {n = 0}
≤<-trans : o ≤ m → m < n → o < n
≤<-trans p = isTrans≤ (suc-≤-suc p)
<≤-trans : o < m → m ≤ n → o < n
<≤-trans = isTrans≤
isTrans< : o < m → m < n → o < n
isTrans< p = ≤<-trans (<-weaken p)
isAsym< : m < n → ¬ n ≤ m
isAsym< m<n = isIrrefl< ∘ <≤-trans m<n
<-+o : m < n → m ℤ.+ o < n ℤ.+ o
<-+o {m} {n} {o} = subst (_≤ n ℤ.+ o) (sym (sucℤ+ m o)) ∘ ≤-+o {o = o}
<-o+ : m < n → o ℤ.+ m < o ℤ.+ n
<-o+ {m} {n} {o} = subst (_≤ o ℤ.+ n) (sym (+sucℤ o m)) ∘ ≤-o+ {o = o}
<-+pos-trans : m ℤ.+ pos k < n → m < n
<-+pos-trans {k = k} = ≤<-trans (k , refl)
<-pos+-trans : pos k ℤ.+ m < n → m < n
<-pos+-trans {k} {m} = ≤<-trans (k , (+Comm m (pos k)))
<Monotone+ : m < n → o < s → m ℤ.+ o < n ℤ.+ s
<Monotone+ {o = o} m<n o<s = isTrans< (<-+o {o = o} m<n) (<-o+ o<s)
<-+-≤ : m < n → o ≤ s → m ℤ.+ o < n ℤ.+ s
<-+-≤ {o = o} m<n o≤s = <≤-trans (<-+o {o = o} m<n) (≤-o+ o≤s)
-pos≤ : m - (pos k) ≤ m
-pos≤ {m} {k} = k , minusPlus (pos k) m
·suc≤0 : m ℤ.· (pos (suc k)) ≤ 0 → m ≤ 0
·suc≤0 {pos n} {k} (i , p) = 0 ,
cong pos (sym (0≡n·sm→0≡n
(sym (m+n≡0→m≡0×n≡0
(injPos (pos+ (n ℕ.· suc k) i ∙
cong (_+pos i) (pos·pos n (suc k)) ∙
p)) .fst))))
·suc≤0 {negsuc _} _ = negsuc<-zero
·suc<0 : m ℤ.· (pos (suc k)) < 0 → m < 0
·suc<0 {pos n} {k} (i , p) =
⊥.rec (snotz (injPos
(pos+ (suc (n ℕ.· suc k)) i ∙
cong (λ x → sucℤ x +pos i) (pos·pos n (suc k)) ∙
p)))
·suc<0 {negsuc _} _ = negsuc<-zero
≤-·o-cancel : m ℤ.· (pos (suc k)) ≤ n ℤ.· (pos (suc k)) → m ≤ n
≤-·o-cancel {m} {k} {n} mk≤nk =
subst2 _≤_
(minusPlus n m)
(+Comm 0 n)
(≤-+o {o = n}
(·suc≤0 (subst2 _≤_
(cong (m ℤ.· pos (suc k) ℤ.+_) (-DistL· n (pos (suc k))) ∙
sym (·DistL+ m (- n) (pos (suc k))))
(-Cancel (n ℤ.· pos (suc k)))
(≤-+o {o = - (n ℤ.· pos (suc k))} mk≤nk))))
0<o→≤-·o-cancel : 0 < o → m ℤ.· o ≤ n ℤ.· o → m ≤ n
0<o→≤-·o-cancel {pos zero} 0<o _ = ⊥.rec (isIrrefl< 0<o)
0<o→≤-·o-cancel {pos (suc o)} 0<o mo≤no = ≤-·o-cancel {k = o} mo≤no
0<o→≤-·o-cancel {negsuc o} 0<o _ = ⊥.rec (¬pos≤negsuc 0<o)
≤-o·-cancel : (pos (suc k)) ℤ.· m ≤ (pos (suc k)) ℤ.· n → m ≤ n
≤-o·-cancel {k} {m} {n} = ≤-·o-cancel ∘ (subst2 _≤_ (·Comm (pos (suc k)) m) (·Comm (pos (suc k)) n))
<-·o-cancel : m ℤ.· (pos (suc k)) < n ℤ.· (pos (suc k)) → m < n
<-·o-cancel {m} {k} {n} mk<nk =
subst2 _<_
(minusPlus n m)
(+Comm 0 n)
(<-+o {o = n}
(·suc<0 (subst2 _<_
(cong (m ℤ.· pos (suc k) ℤ.+_) (-DistL· n (pos (suc k))) ∙
sym (·DistL+ m (- n) (pos (suc k))))
(-Cancel (n ℤ.· pos (suc k)))
(<-+o {o = - (n ℤ.· pos (suc k))} mk<nk))))
0<o→<-·o-cancel : 0 < o → m ℤ.· o < n ℤ.· o → m < n
0<o→<-·o-cancel {pos zero} 0<o _ = ⊥.rec (isIrrefl< 0<o)
0<o→<-·o-cancel {pos (suc o)} 0<o mo<no = <-·o-cancel {k = o} mo<no
0<o→<-·o-cancel {negsuc o} 0<o _ = ⊥.rec (¬pos≤negsuc 0<o)
<-o·-cancel : (pos (suc k)) ℤ.· m < (pos (suc k)) ℤ.· n → m < n
<-o·-cancel {k} {m} {n} = <-·o-cancel ∘ (subst2 _<_ (·Comm (pos (suc k)) m) (·Comm (pos (suc k)) n))
-Dist≤ : m ≤ n → (- n) ≤ (- m)
-Dist≤ {pos zero} {pos zero} _ = isRefl≤
-Dist≤ {pos zero} {pos (suc n)} _ = <-weaken negsuc<-zero
-Dist≤ {pos (suc m)} {pos zero} = ⊥.rec ∘ snotz ∘ injPos ∘ pos≤0→≡0
-Dist≤ {pos (suc m)} {pos (suc n)} = suc-≤-suc ∘ negsuc-≤-negsuc
-Dist≤ {pos m} {negsuc n} = ⊥.rec ∘ ¬pos≤negsuc
-Dist≤ {negsuc zero} {pos zero} = suc-≤-suc
-Dist≤ {negsuc zero} {pos (suc n)} = suc-≤-suc ∘ -Dist≤ ∘ suc-≤-suc
-Dist≤ {negsuc (suc m)} {pos zero} _ = zero-≤pos
-Dist≤ {negsuc (suc m)} {pos (suc n)} _ = negsuc<pos
-Dist≤ {negsuc m} {negsuc n} = suc-≤-suc ∘ pos-≤-pos
-Dist< : m < n → (- n) < (- m)
-Dist< {m} {n} = subst (- n <_) (cong sucℤ (-sucℤ m) ∙ sucPred (- m))
∘ suc-≤-suc
∘ -Dist≤
≤max : m ≤ ℤ.max m n
≤max {pos zero} {pos m} = zero-≤pos
≤max {pos (suc m)} {pos zero} = isRefl≤
≤max {pos (suc m)} {pos (suc n)} = suc-≤-suc (≤max {m = pos m} {n = pos n})
≤max {pos zero} {negsuc n} = isRefl≤
≤max {pos (suc m)} {negsuc n} = isRefl≤
≤max {negsuc m} {pos zero} = negsuc<-zero
≤max {negsuc m} {pos (suc n)} = isTrans≤ negsuc<-zero zero-≤pos
≤max {negsuc zero} {negsuc n} = isRefl≤
≤max {negsuc (suc m)} {negsuc zero} = negsuc-≤-negsuc zero-≤pos
≤max {negsuc (suc m)} {negsuc (suc n)} = pred-≤-pred (subst (negsuc m ≤_)
(sym (sucPred (ℤ.max (negsuc m) (negsuc n))))
(≤max {m = negsuc m} {n = negsuc n}))
≤→max : m ≤ n → ℤ.max m n ≡ n
≤→max {pos zero} {pos n} m≤n = refl
≤→max {pos (suc m)} {pos zero} m≤n = ⊥.rec (snotz (injPos (pos≤0→≡0 m≤n)))
≤→max {pos (suc m)} {pos (suc n)} m≤n
= cong sucℤ (≤→max {m = pos m} {n = pos n} (pred-≤-pred m≤n))
≤→max {pos m} {negsuc n} m≤n = ⊥.rec (¬pos≤negsuc m≤n)
≤→max {negsuc m} {pos n} m≤n = refl
≤→max {negsuc zero} {negsuc zero} m≤n = refl
≤→max {negsuc zero} {negsuc (suc n)} m≤n
= ⊥.rec (snotz (injPos (pos≤0→≡0 (pos-≤-pos m≤n))))
≤→max {negsuc (suc m)} {negsuc zero} m≤n = refl
≤→max {negsuc (suc m)} {negsuc (suc n)} m≤n
= cong predℤ (≤→max {m = negsuc m} {n = negsuc n} (suc-≤-suc m≤n))
min≤ : ℤ.min m n ≤ m
min≤ {pos zero} {pos n} = isRefl≤
min≤ {pos (suc m)} {pos zero} = zero-≤pos
min≤ {pos (suc m)} {pos (suc n)} = suc-≤-suc (min≤ {m = pos m} {n = pos n})
min≤ {pos zero} {negsuc n} = negsuc<-zero
min≤ {pos (suc m)} {negsuc n} = isTrans≤ negsuc<-zero zero-≤pos
min≤ {negsuc zero} {pos n} = isRefl≤
min≤ {negsuc (suc m)} {pos n} = isRefl≤
min≤ {negsuc zero} {negsuc zero} = isRefl≤
min≤ {negsuc zero} {negsuc (suc n)} = negsuc-≤-negsuc zero-≤pos
min≤ {negsuc (suc m)} {negsuc zero} = isRefl≤
min≤ {negsuc (suc m)} {negsuc (suc n)} = pred-≤-pred (subst (_≤ negsuc m)
(sym (sucPred (ℤ.min (negsuc m) (negsuc n))))
(min≤ {m = negsuc m} {n = negsuc n}))
≤→min : m ≤ n → ℤ.min m n ≡ m
≤→min {pos zero} {pos n} _ = refl
≤→min {pos (suc m)} {pos zero} m≤n = ⊥.rec (snotz (injPos (pos≤0→≡0 m≤n)))
≤→min {pos (suc m)} {pos (suc n)} m≤n
= cong sucℤ (≤→min {m = pos m} {n = pos n} (pred-≤-pred m≤n))
≤→min {pos m} {negsuc n} m≤n = ⊥.rec (¬pos≤negsuc m≤n)
≤→min {negsuc m} {pos n} _ = refl
≤→min {negsuc zero} {negsuc zero} _ = refl
≤→min {negsuc zero} {negsuc (suc n)} m≤n
= ⊥.rec (snotz (injPos (pos≤0→≡0 (pos-≤-pos m≤n))))
≤→min {negsuc (suc m)} {negsuc zero} _ = refl
≤→min {negsuc (suc m)} {negsuc (suc n)} m≤n
= cong predℤ (≤→min {m = negsuc m} {n = negsuc n} (suc-≤-suc m≤n))
≤MonotoneMin : m ≤ n → o ≤ s → ℤ.min m o ≤ ℤ.min n s
≤MonotoneMin {m} {n} {o} {s} m≤n o≤s
= subst (_≤ ℤ.min n s)
(sym (minAssoc n s (ℤ.min m o)) ∙
cong (ℤ.min n) (minAssoc s m o ∙
cong (λ a → ℤ.min a o) (ℤ.minComm s m) ∙
sym (minAssoc m s o)) ∙
minAssoc n m (ℤ.min s o) ∙
cong₂ ℤ.min (ℤ.minComm n m ∙ ≤→min m≤n)
(ℤ.minComm s o ∙ ≤→min o≤s))
(min≤ {m = ℤ.min n s} {n = ℤ.min m o})
≤MonotoneMax : m ≤ n → o ≤ s → ℤ.max m o ≤ ℤ.max n s
≤MonotoneMax {m} {n} {o} {s} m≤n o≤s
= subst (ℤ.max m o ≤_)
(sym (maxAssoc m o (ℤ.max n s)) ∙
cong (ℤ.max m) (maxAssoc o n s ∙
cong (λ a → ℤ.max a s) (ℤ.maxComm o n) ∙
sym (maxAssoc n o s)) ∙
maxAssoc m n (ℤ.max o s) ∙
cong₂ ℤ.max (≤→max m≤n) (≤→max o≤s))
(≤max {m = ℤ.max m o} {n = ℤ.max n s})
≤Dec : ∀ m n → Dec (m ≤ n)
≤Dec (pos zero) (pos n) = yes zero-≤pos
≤Dec (pos (suc m)) (pos zero) = no ¬-pos<-zero
≤Dec (pos (suc m)) (pos (suc n)) with ≤Dec (pos m) (pos n)
... | yes m≤n = yes (suc-≤-suc m≤n)
... | no m≰n = no λ m+1≤n+1 → m≰n (pred-≤-pred m+1≤n+1)
≤Dec (pos m) (negsuc n) = no λ m≤n → ¬-pos<-zero (≤<-trans m≤n negsuc<-zero)
≤Dec (negsuc m) (pos n) = yes (isTrans≤ negsuc<-zero zero-≤pos)
≤Dec (negsuc zero) (negsuc zero) = yes isRefl≤
≤Dec (negsuc zero) (negsuc (suc n)) = no λ nsz≤nssn → ¬-pos<-zero (pos-≤-pos nsz≤nssn)
≤Dec (negsuc (suc m)) (negsuc zero) = yes (pred-≤-pred negsuc<-zero)
≤Dec (negsuc (suc m)) (negsuc (suc n)) with ≤Dec (negsuc m) (negsuc n)
... | yes m≤n = yes (pred-≤-pred m≤n)
... | no m≰n = no λ m+1≤n+1 → m≰n (suc-≤-suc m+1≤n+1)
≤Stable : ∀ m n → Stable (m ≤ n)
≤Stable m n = Dec→Stable (≤Dec m n)
<Dec : ∀ m n → Dec (m < n)
<Dec m n = ≤Dec (sucℤ m) n
<Stable : ∀ m n → Stable (m < n)
<Stable m n = Dec→Stable (<Dec m n)
Trichotomy-suc : Trichotomy m n → Trichotomy (sucℤ m) (sucℤ n)
Trichotomy-suc (lt m<n) = lt (suc-≤-suc m<n)
Trichotomy-suc (eq m≡n) = eq (cong sucℤ m≡n)
Trichotomy-suc (gt n<m) = gt (suc-≤-suc n<m)
Trichotomy-pred : Trichotomy (sucℤ m) (sucℤ n) → Trichotomy m n
Trichotomy-pred (lt m<n) = lt (pred-≤-pred m<n)
Trichotomy-pred {m} {n} (eq m≡n) = eq (sym (predSuc m)
∙ cong predℤ m≡n
∙ predSuc n)
Trichotomy-pred (gt n<m) = gt (pred-≤-pred n<m)
_≟_ : ∀ m n → Trichotomy m n
pos zero ≟ pos zero = eq refl
pos zero ≟ pos (suc n) = lt (suc-≤-suc zero-≤pos)
pos (suc m) ≟ pos zero = gt (suc-≤-suc zero-≤pos)
pos (suc m) ≟ pos (suc n) = Trichotomy-suc (pos m ≟ pos n)
pos m ≟ negsuc n = gt (<≤-trans negsuc<-zero zero-≤pos)
negsuc m ≟ pos n = lt (<≤-trans negsuc<-zero zero-≤pos)
negsuc zero ≟ negsuc zero = eq refl
negsuc zero ≟ negsuc (suc n) = gt (negsuc-≤-negsuc zero-≤pos)
negsuc (suc m) ≟ negsuc zero = lt (negsuc-≤-negsuc zero-≤pos)
negsuc (suc m) ≟ negsuc (suc n) = Trichotomy-pred (negsuc m ≟ negsuc n)