{-# OPTIONS --safe #-} module Cubical.Data.Int.Order where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Function open import Cubical.Data.Empty as ⊥ open import Cubical.Data.Int.Base as ℤ open import Cubical.Data.Int.Properties as ℤ open import Cubical.Data.Nat 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)) zero-≤pos : 0 ≤ pos l zero-≤pos {l} = l , (sym (pos0+ (pos 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} = subst (_≤ o ℤ.+ n) (+Comm m o) ∘ subst (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 ∎) <-o+-cancel : o ℤ.+ m < o ℤ.+ n → m < n <-o+-cancel {o} {m} {n} = ≤-o+-cancel ∘ subst (_≤ o ℤ.+ n) (+sucℤ o m) ¬-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 ∎) 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 ∎)) 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} <-weaken : m < n → m ≤ n <-weaken {m} (i , p) = (suc i) , sucℤ+ m (pos i) ∙ p ≤<-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 ≤-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})) 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})) ≤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)