Andrew Sneap, 26th November 2021

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import MLTT.Spartan renaming (_+_ to _∔_)

open import Naturals.AbsoluteDifference using (∣_-_∣)
open import Naturals.Order
open import Notation.Order
open import UF.Base
open import UF.Subsingletons

open import Integers.Abs
open import Integers.Type
open import Integers.Addition
open import Integers.Multiplication
open import Integers.Negation
open import Naturals.Addition renaming (_+_ to _ℕ+_)

module Integers.Order where

\end{code}

First, the definition of < and ≤ for the integers. See the NaturalsOrder import
to see how < is defined similarly to < for the natural numbers.  Following the
definitions are the proofs that the relations are propositions, and some simple
proofs for each.

\begin{code}

_≤ℤ_ _≥ℤ_ : (x y : )  𝓤₀ ̇
x ≤ℤ y = Σ n   , x + pos n  y
x ≥ℤ y = y ≤ℤ x

_<ℤ_ _>ℤ_ : (x y : )  𝓤₀ ̇
x <ℤ y = succℤ x ≤ℤ y
x >ℤ y = y <ℤ x

instance
 Order-ℤ-ℤ : Order  
 _≤_ {{Order-ℤ-ℤ}} = _≤ℤ_

 Strict-Order-ℤ-ℤ : Strict-Order  
 _<_ {{Strict-Order-ℤ-ℤ}} = _<ℤ_

 Strict-Order-Chain-ℤ-ℤ-ℤ : Strict-Order-Chain    _<_ _<_
 _<_<_ {{Strict-Order-Chain-ℤ-ℤ-ℤ}} p q r = (p < q) × (q < r)

 Order-Chain-ℤ-ℤ-ℤ : Order-Chain    _≤_ _≤_
 _≤_≤_ {{Order-Chain-ℤ-ℤ-ℤ}} p q r = (p  q) × (q  r)

ℤ≤-is-prop : (x y : )  is-prop (x  y)
ℤ≤-is-prop x y (n , p) (m , q) = to-subtype-= I II
 where
  I : (k : )  (α β : x + pos k  y)  α  β
  I _ = ℤ-is-set

  II : n  m
  II = pos-lc (ℤ+-lc (pos n) (pos m) x γ)
   where
    γ : x + pos n  x + pos m
    γ = x + pos n =⟨ p    
        y         =⟨ q ⁻¹ 
        x + pos m 

ℤ<-is-prop : (x y : )  is-prop (x < y)
ℤ<-is-prop x = ℤ≤-is-prop (succℤ x)

≤-incrℤ : (x : )  x  succℤ x
≤-incrℤ x = 1 , refl

<-incrℤ : (x : )  x < succℤ x
<-incrℤ x = 0 , refl

≤-predℤ : (x : )  predℤ x  x
≤-predℤ x = 1 , succpredℤ x

≤-predℤ' : (x y : )  x  y  predℤ x  predℤ y
≤-predℤ' x y (n , e) = n , γ
 where
  γ : predℤ x + pos n  predℤ y
  γ = predℤ x + pos n   =⟨ ℤ-left-pred x (pos n) 
      predℤ (x + pos n) =⟨ ap predℤ e            
      predℤ y 

<-predℤ : (x : )  predℤ x < x
<-predℤ x = 0 , succpredℤ x

<-is-≤ : (x y : )  x < y  x  y
<-is-≤ x y (a , p) = succ a , γ
 where
  γ : succℤ (x + pos a)  y
  γ = succℤ (x + pos a) =⟨ ℤ-left-succ x (pos a) ⁻¹ 
      succℤ x + pos a   =⟨ p                        
      y                 

ℕ-order-respects-ℤ-order : (m n : )  m < n  pos m < pos n
ℕ-order-respects-ℤ-order m n l = I (subtraction'' m n l)
 where
  I : (Σ k   , succ k ℕ+ m  n)  pos m < pos n
  I (k , e) = k , II
   where
    II : succℤ (pos m) + pos k  pos n
    II = succℤ (pos m) + pos k =⟨ distributivity-pos-addition (succ m) k     
         pos (succ m ℕ+ k)     =⟨ ap pos (addition-commutativity (succ m) k) 
         pos (k ℕ+ succ m)     =⟨ ap pos (succ-left k m ⁻¹)                  
         pos (succ k ℕ+ m)     =⟨ ap pos e                                   
         pos n                 

ℕ-order-respects-ℤ-order' : (m n : )  m < n  negsucc n < negsucc m
ℕ-order-respects-ℤ-order' m n l = I (subtraction'' m n l)
 where
  I : (Σ k   , succ k ℕ+ m  n)  negsucc n < negsucc m
  I (k , e) = k , γ
   where
    k' = pos (succ k)
    m' = pos (succ m)
    n' = pos (succ n)

    II : k' + m'  n'
    II = k' + m'                =⟨ i  
         pos (succ k ℕ+ succ m) =⟨ ii 
         n'                     
     where
      i  = distributivity-pos-addition (succ k) (succ m)
      ii = ap (pos  succ) e

    γ : succℤ (negsucc n) + pos k  negsucc m
    γ = succℤ (negsucc n) + pos k         =⟨ i    
        negsucc n + k'                    =⟨ ii   
        k' + negsucc n                    =⟨ iii  
        k' + negsucc n + pos 0            =⟨ iv   
        k' + negsucc n + (m' + negsucc m) =⟨ v    
        k' + negsucc n + m' + negsucc m   =⟨ vi   
        k' + (negsucc n + m') + negsucc m =⟨ vii  
        k' + (m' + negsucc n) + negsucc m =⟨ viii 
        k' + m' + negsucc n + negsucc m   =⟨ ix   
        k' + m' + (negsucc n + negsucc m) =⟨ x    
        n' + (negsucc n + negsucc m)      =⟨ xi   
        n' + negsucc n + negsucc m        =⟨ xii  
        pos 0 + negsucc m                 =⟨ xiii 
        negsucc m                         
      where
       ivₐₚ : pos 0  m' - m'
       ivₐₚ = ℤ-sum-of-inverse-is-zero m' ⁻¹

       i    = ℤ-left-succ (negsucc n) (pos k)
       ii   = ℤ+-comm (negsucc n) k'
       iii  = ℤ-zero-right-neutral (k' + negsucc n)
       iv   = ap ((k' + negsucc n) +_) ivₐₚ
       v    = ℤ+-assoc (k' + negsucc n) m' (negsucc m) ⁻¹
       vi   = ap (_+ negsucc m) (ℤ+-assoc k' (negsucc n) m')
       vii  = ap  p  k' + p + negsucc m) (ℤ+-comm (negsucc n) m')
       viii = ap (_+ negsucc m) (ℤ+-assoc k' m' (negsucc n) ⁻¹)
       ix   = ℤ+-assoc (k' + m') (negsucc n) (negsucc m)
       x    = ap  p  p + (negsucc n + negsucc m)) II
       xi   = ℤ+-assoc n' (negsucc n) (negsucc m) ⁻¹
       xii  = ap (_+ negsucc m) (ℤ-sum-of-inverse-is-zero n')
       xiii = ℤ-zero-left-neutral (negsucc m)

ℤ-bigger-or-equal-not-less : (x y : )  x  y  ¬ (y < x)
ℤ-bigger-or-equal-not-less x y (α , p) (β , q) = 𝟘-elim γ
 where
  I : x + succℤ (pos (α ℕ+ β))  x + pos 0
  I = x + succℤ (pos (α ℕ+ β))    =⟨ i             
      x + succℤ (pos α + pos β)   =⟨ ii            
      succℤ (x + (pos α + pos β)) =⟨ iii           
      succℤ (x + pos α + pos β)   =⟨ iv            
      succℤ (x + pos α) + pos β   =⟨ v             
      x                           =⟨ by-definition 
      x + pos 0                   
   where
    i   = ap  -  x + succℤ -) (distributivity-pos-addition α β ⁻¹)
    ii  = ℤ-right-succ x (pos α + pos β)
    iii = ap succℤ (ℤ+-assoc x (pos α) (pos β) ⁻¹)
    iv  = ℤ-left-succ (x + pos α) (pos β) ⁻¹
    v   = transport  -  succℤ - + (pos β)  x) (p ⁻¹) q

  II : succℤ (pos (α ℕ+ β))  pos 0
  II = ℤ+-lc (succℤ (pos (α ℕ+ β))) (pos 0) x I

  γ : 𝟘
  γ = pos-succ-not-zero (α ℕ+ β) II

ℤ≤-split : (x y : )  x  y  (x < y)  (x  y)
ℤ≤-split x y (zero , p)   = inr p
ℤ≤-split x y (succ a , p) = inl (a , (ℤ-left-succ x (pos a)   p))

ℤ≤-trans : (x y z : )  x  y  y  z  x  z
ℤ≤-trans x y z (a , p) (b , q) = a ℕ+ b , I
 where
  I : x + pos (a ℕ+ b)  z
  I = x + pos (a ℕ+ b)    =⟨ ap (x +_) (distributivity-pos-addition a b ⁻¹) 
      x + (pos a + pos b) =⟨ ℤ+-assoc x (pos a) (pos b) ⁻¹                  
      x + pos a + pos b   =⟨ ap (_+ (pos b)) p                              
      y + (pos b)         =⟨ q                                              
      z                   

ℤ<-trans : (x y z : )  x < y  y < z  x < z
ℤ<-trans x y z l₁ l₂ = ℤ≤-trans (succℤ x) (succℤ y) z I l₂
 where
  I : succℤ x  succℤ y
  I = ℤ≤-trans (succℤ x) y (succℤ y) l₁ (≤-incrℤ y)

ℤ<-≤-trans : (x y z : )  x < y  y  z  x < z
ℤ<-≤-trans x y z l₁ l₂ = cases γ₁ γ₂ I
 where
  I : (y < z)  (y  z)
  I = ℤ≤-split y z l₂

  γ₁ : y < z  x < z
  γ₁ l₃ = ℤ<-trans x y z l₁ l₃

  γ₂ : y  z  x < z
  γ₂ e = transport (x <_) e l₁

ℤ≤-<-trans : (x y z : )  x  y  y < z  x < z
ℤ≤-<-trans x y z l₁ l₂ = cases γ₁ γ₂ I
 where
  I : (x < y)  (x  y)
  I = ℤ≤-split x y l₁

  γ₁ : x < y  x < z
  γ₁ l₃ = ℤ<-trans x y z l₃ l₂

  γ₂ : x  y  x < z
  γ₂ e = transport (_< z) (e ⁻¹) l₂

ℤ≤-refl : (x : )  x  x
ℤ≤-refl x = 0 , refl

ℤ-equal-not-less-than : (x : )  ¬ (x < x)
ℤ-equal-not-less-than x (0 , α)      = succℤ-no-fp x (α ⁻¹)
ℤ-equal-not-less-than x (succ n , α) = pos-succ-not-zero (n ℕ+ 1) γ
 where
  I : x + succℤ (succℤ (pos n))  x + pos 0
  I = x + succℤ (succℤ (pos n))  =⟨ ℤ-right-succ x (succℤ (pos n))   
      succℤ (x + succℤ (pos n))  =⟨ ℤ-left-succ x (succℤ (pos n)) ⁻¹ 
      succℤ x + succℤ (pos n)    =⟨ by-definition                    
      succℤ x + pos (succ n)     =⟨ α                                
      x                          =⟨ ℤ-zero-right-neutral x           
      x + pos 0                  

  γ : succℤ (succℤ (pos n))  pos 0
  γ = ℤ+-lc (succℤ (succℤ (pos n))) (pos 0) x I

ℤ-zero-less-than-pos : (n : )  pos 0 < pos (succ n)
ℤ-zero-less-than-pos n = ℕ-order-respects-ℤ-order 0 (succ n) (zero-least n)

ℤ-zero-least-pos : (n : )  pos 0  pos n
ℤ-zero-least-pos 0 = ℤ≤-refl (pos 0)
ℤ-zero-least-pos (succ n) = γ
 where
  I : pos 0  pos n
  I = ℤ-zero-least-pos n

  II : pos n  pos (succ n)
  II = ≤-incrℤ (pos n)

  γ : pos 0  pos (succ n)
  γ = ℤ≤-trans (pos 0) (pos n) (pos (succ n)) I II

negative-less-than-positive : (x y : )  negsucc x < pos y
negative-less-than-positive x y = (x ℕ+ y) , I
 where
  I : succℤ (negsucc x) + pos (x ℕ+ y)  pos y
  I = succℤ (negsucc x) + pos (x ℕ+ y)        =⟨ i    
      succℤ (negsucc x) + (pos x + pos y)     =⟨ ii   
      succℤ (negsucc x) + pos x + pos y       =⟨ iii  
      negsucc x + pos (succ x) + pos y        =⟨ refl 
      (- pos (succ x)) + pos (succ x) + pos y =⟨ iv   
      pos 0 + pos y                           =⟨ v    
      pos y                                   
   where
    i   = ap (succℤ (negsucc x) +_) (distributivity-pos-addition x y ⁻¹)
    ii  = ℤ+-assoc (succℤ (negsucc x)) (pos x) (pos y) ⁻¹
    iii = ap (_+ pos y) (ℤ-left-succ (negsucc x) (pos x))
    iv  = ap (_+ pos y) (ℤ-sum-of-inverse-is-zero' (pos (succ x)))
    v   = ℤ-zero-left-neutral (pos y)

ℤ≤-swap : (x y : )  x  y  - y  - x
ℤ≤-swap x y (k , e) = k , ℤ+-lc ((- y) + pos k) (- x) (y + x) I
 where
  I : y + x + ((- y) + pos k)  y + x - x
  I = y + x + ((- y) + pos k) =⟨ i             
      x + y + ((- y) + pos k) =⟨ ii            
      x + y - y + pos k       =⟨ iii           
      x + (y - y) + pos k     =⟨ iv            
      x + pos 0 + pos k       =⟨ by-definition 
      x + pos k               =⟨ e             
      y                       =⟨ by-definition 
      y + pos 0               =⟨ v             
      y + (x - x)             =⟨ vi            
      y + x - x               
   where
    i   = ap (_+ ((- y) + pos k)) (ℤ+-comm y x)
    ii  = ℤ+-assoc (x + y) (- y) (pos k) ⁻¹
    iii = ap (_+ pos k) (ℤ+-assoc x y (- y))
    iv  = ap  α  x + α + (pos k)) (ℤ-sum-of-inverse-is-zero y)
    v   = ap (y +_) (ℤ-sum-of-inverse-is-zero x ⁻¹)
    vi  = ℤ+-assoc y x (- x) ⁻¹

ℤ≤-swap₂ : (x y z : )  x  y  z  (- y  - x) × (- z  - y)
ℤ≤-swap₂ x y z (l₁ , l₂) = (ℤ≤-swap x y l₁) , (ℤ≤-swap y z l₂)

ℕ≤-to-ℤ≤ : (x y : )  x  y  pos x  pos y
ℕ≤-to-ℤ≤ x y l = I (subtraction x y l)
 where
  I : (Σ k   , k ℕ+ x  y)  pos x  pos y
  I (k , e) = k , II
   where
    II : pos x + pos k  pos y
    II = pos x + pos k =⟨ distributivity-pos-addition x k     
         pos (x ℕ+ k)  =⟨ ap pos (addition-commutativity x k) 
         pos (k ℕ+ x)  =⟨ ap pos e                            
         pos y         

ℤ-dichotomous : (x y : )  (x  y)  (y  x)
ℤ-dichotomous (pos x) (pos y) = I (≤-dichotomous x y)
 where
  I : (x  y)  (y  x)  (pos x  pos y)  (pos y  pos x)
  I (inl l) = inl (ℕ≤-to-ℤ≤ x y l)
  I (inr r) = inr (ℕ≤-to-ℤ≤ y x r)
ℤ-dichotomous (pos x) (negsucc y) = inr (negative-less-than-positive (succ y) x)
ℤ-dichotomous (negsucc x) (pos y) = inl (negative-less-than-positive (succ x) y)
ℤ-dichotomous (negsucc x) (negsucc y) = Cases (≤-dichotomous x y) γ₁ γ₂
 where
  I : (a b : )  a  b  negsucc b  negsucc a
  I a b l = ℤ≤-swap (pos (succ a)) (pos (succ b)) II
   where
    II : pos (succ a)  pos (succ b)
    II = ℕ≤-to-ℤ≤ (succ a) (succ b) l

  γ₁ : x  y  (negsucc x  negsucc y)  (negsucc y  negsucc x)
  γ₁ l = inr (I x y l)

  γ₂ : y  x  (negsucc x  negsucc y)  (negsucc y  negsucc x)
  γ₂ l = inl (I y x l)

trich-locate : (x y : )  𝓤₀ ̇
trich-locate x y = (x < y)  (x  y)  (y < x)

ℤ-trichotomous : (x y : )  trich-locate x y
ℤ-trichotomous x y = I (ℤ-dichotomous x y)
 where
  I : (x  y)  (y  x)  (x < y)  (x  y)  (y < x)
  I (inl l) = II (ℤ≤-split x y l)
   where
    II : (x < y)  (x  y)  (x < y)  (x  y)  (y < x)
    II (inl l) = inl l
    II (inr r) = inr (inl r)
  I (inr r) = II (ℤ≤-split y x r)
   where
    II : (y < x)  (y  x)  (x < y)  (x  y)  (y < x)
    II (inl l) = inr (inr l)
    II (inr r) = inr (inl (r ⁻¹))

ℤ-dichotomous' : (x y : )  x < y  y  x
ℤ-dichotomous' x y = I (ℤ-trichotomous x y)
 where
  I : (x < y)  (x  y)  (y < x)  x < y  y  x
  I (inl x<y) = inl x<y
  I (inr (inl x=y)) = inr (transport (_≤ x) x=y (ℤ≤-refl x))
  I (inr (inr y<x)) = inr (<-is-≤ y x y<x)

ℤ-trichotomous-is-prop : (x y : )  is-prop (trich-locate x y)
ℤ-trichotomous-is-prop x y = +-is-prop I II γ
 where
  I : is-prop (x < y)
  I = ℤ<-is-prop x y

  II : is-prop ((x  y)  y < x)
  II = +-is-prop ℤ-is-set (ℤ<-is-prop y x) III
   where
    III : x  y  ¬ (y < x)
    III e l = ℤ-equal-not-less-than y (transport (y <_) e l)

  γ : x < y  ¬ ((x  y)  y < x)
  γ l (inl e ) = ℤ-equal-not-less-than x (transport (x <_) (e ⁻¹) l)
  γ l (inr l') = ℤ-bigger-or-equal-not-less x y (<-is-≤ x y l) l'

ℤ≤-adding : (a b c d : )  a  b  c  d  a + c  b + d
ℤ≤-adding a b c d (p , β) (q , β') = (p ℕ+ q) , I
 where
  I : a + c + pos (p ℕ+ q)  b + d
  I = a + c + pos (p ℕ+ q)    =⟨ i    
      a + c + (pos p + pos q) =⟨ ii   
      a + c + pos p + pos q   =⟨ iii  
      c + a + pos p + pos q   =⟨ iv   
      c + (a + pos p) + pos q =⟨ v    
      c + b + pos q           =⟨ vi   
      b + c + pos q           =⟨ vii  
      b + (c + pos q)         =⟨ viii 
      b + d                   
   where
    i    = ap (a + c +_) (distributivity-pos-addition p q ⁻¹)
    ii   = ℤ+-assoc (a + c) (pos p) (pos q) ⁻¹
    iii  = ap  z  z + pos p + pos q) (ℤ+-comm a c)
    iv   = ap (_+ pos q) (ℤ+-assoc c a (pos p))
    v    = ap  z  c + z + pos q) β
    vi   = ap (_+ pos q) (ℤ+-comm c b)
    vii  = ℤ+-assoc b c (pos q)
    viii = ap (b +_) β'

ℤ<-adding : (a b c d : )  a < b  c < d  a + c < b + d
ℤ<-adding a b c d l₁ l₂ = ℤ<-trans (a + c) (a + succℤ c) (b + d) II III
 where
  I : succℤ a + succℤ c  b + d
  I = ℤ≤-adding (succℤ a) b (succℤ c) d l₁ l₂

  II : a + c < a + succℤ c
  II = 0 , (ℤ-right-succ a c ⁻¹)

  III : a + succℤ c < b + d
  III = transport (_≤ b + d) (ℤ-left-succ a (succℤ c)) I

ℤ≤-adding' :  (a b c : )  a  b  a + c  b + c
ℤ≤-adding' a b c (k , p) = k , I
 where
  I : a + c + pos k  b + c
  I = a + c + pos k   =⟨ ℤ+-assoc a c (pos k)          
      a + (c + pos k) =⟨ ap (a +_) (ℤ+-comm c (pos k)) 
      a + (pos k + c) =⟨ ℤ+-assoc a (pos k) c ⁻¹       
      a + pos k + c   =⟨ ap (_+ c) p                   
      b + c           

ℤ≤-adding-left : (a b c : )  a  b  c + a  c + b
ℤ≤-adding-left a b c l = transport₂ _≤_ I II III
 where
  I : a + c  c + a
  I = ℤ+-comm a c

  II : b + c  c + b
  II = ℤ+-comm b c

  III : a + c  b + c
  III = ℤ≤-adding' a b c l

ℤ≤-adding₂ : (a b c d : )  a  b  c  (a + d  b + d  c + d)
ℤ≤-adding₂ a b c d (l₁ , l₂) = (ℤ≤-adding' a b d l₁) , (ℤ≤-adding' b c d l₂)

ℤ<-adding' : (a b c : )  a < b  a + c < b + c
ℤ<-adding' a b c (k , p) = I (ℤ≤-adding' (succℤ a) b c (k , p))
 where
  I : succℤ a + c  b + c  a + c < b + c
  I (h , q) = h , II
   where
    II : succℤ (a + c) + pos h  b + c
    II = succℤ (a + c) + pos h =⟨ ap (_+ (pos h)) (ℤ-left-succ a c ⁻¹) 
         succℤ a + c + pos h   =⟨ q                                    
         b + c                 

ℤ<-adding-left : (a b c : )  a < b  c + a < c + b
ℤ<-adding-left a b c l = transport₂ _<_ I II III
 where
  I : a + c  c + a
  I = ℤ+-comm a c

  II : b + c  c + b
  II = ℤ+-comm b c

  III : a + c < b + c
  III = ℤ<-adding' a b c l

ℤ<-adding'' : (a b c : )  a < b  c + a < c + b
ℤ<-adding'' a b c l = transport₂ _<_ (ℤ+-comm a c) (ℤ+-comm b c) I
 where
  I : a + c < b + c
  I = ℤ<-adding' a b c l

pmpo-lemma : (a b : )  (n : )  a < b   a * pos (succ n) < b * pos (succ n)
pmpo-lemma a b = ℕ-induction base step
 where
  base : a < b
        a * pos 1 < b * pos 1
  base z = z

  step : (k : )
        (a < b  a * pos (succ k) < b * pos (succ k))
        a < b
        a * pos (succ (succ k)) < b * pos (succ (succ k))
  step k IH l = ℤ<-adding a b (a + (a * pos k)) (b + (b * pos k)) l (IH l)

positive-multiplication-preserves-order : (a b c : )
                                         is-pos-succ c
                                         a < b
                                         a * c < b * c
positive-multiplication-preserves-order a b (negsucc x)    p l = 𝟘-elim p
positive-multiplication-preserves-order a b (pos 0)        p l = 𝟘-elim p
positive-multiplication-preserves-order a b (pos (succ x)) p l = pmpo-lemma a b x l

positive-multiplication-preserves-order' : (a b c : )
                                          is-pos-succ c
                                          a  b
                                          a * c  b * c
positive-multiplication-preserves-order' a b c p l = I (ℤ≤-split a b l)
 where
  I : (a < b)  (a  b)  a * c  b * c
  I (inl l) = <-is-≤ (a * c) (b * c) γ
   where
    γ :  a * c < b * c
    γ = positive-multiplication-preserves-order a b c p l
  I (inr e) = transport (_≤ b * c) γ (ℤ≤-refl (b * c))
   where
    γ : b * c  a * c
    γ = ap (_* c) (e ⁻¹)

ℤ*-multiplication-order : (a b c : )
                         pos 0  c
                         a  b
                         a * c  b * c
ℤ*-multiplication-order a b (pos 0) p l = ℤ≤-refl (pos 0)
ℤ*-multiplication-order a b (pos (succ c)) p l
 = positive-multiplication-preserves-order' a b (pos (succ c))  l
ℤ*-multiplication-order a b (negsucc c) p l = 𝟘-elim γ
 where
  I : negsucc c < pos 0
  I = negative-less-than-positive c 0

  γ : 𝟘
  γ = ℤ-bigger-or-equal-not-less (pos 0) (negsucc c) p I

nmco-lemma : (a b : )  (c : )  a < b  b * (negsucc c) < a * (negsucc c)
nmco-lemma a b = ℕ-induction base step
 where
  base : a < b  b * negsucc 0 < a * negsucc 0
  base (k , γ) = k , I
   where
    II : (- b) + pos k + (a - a)  a + pos k + ((- b) - a)
    II = (- b) + pos k + (a - a)    =⟨ i   
          pos k - b + (a - a)       =⟨ ii  
          pos k - b + a - a         =⟨ iii 
          a + (pos k - b) - a       =⟨ iv  
          a + pos k - b - a         =⟨ v   
          a + pos k + ((- b) - a)   
     where
      i   = ap (_+ (a - a)) (ℤ+-comm (- b) (pos k))
      ii  = ℤ+-assoc (pos k - b) a (- a) ⁻¹
      iii = ap (_+ (- a)) (ℤ+-comm (pos k - b) a)
      iv  = ap (_+ (- a)) (ℤ+-assoc a (pos k) (- b) ⁻¹)
      v   = ℤ+-assoc (a + pos k) (- b) (- a)

    I : succℤ (b * negsucc 0) + pos k  a * negsucc 0
    I = succℤ (b * negsucc 0) + pos k    =⟨ by-definition 
        succℤ (- b) + pos k              =⟨ i             
        succℤ ((- b) + pos k)            =⟨ ii            
        succℤ ((- b) + pos k) + pos 0    =⟨ iii           
        succℤ ((- b) + pos k) + (a - a)  =⟨ iv            
        succℤ ((- b) + pos k + (a - a))  =⟨ v             
        succℤ (a + pos k + ((- b) - a))  =⟨ vi            
        succℤ (a + pos k) + ((- b) - a)  =⟨ vii           
        succℤ a + pos k + ((- b) - a)    =⟨ viii          
        b + ((- b) - a)                  =⟨ ix            
        b - b - a                        =⟨ x             
        pos 0 - a                        =⟨ xi            
        - a                              =⟨ by-definition 
        a * negsucc 0                    
     where
       i    = ℤ-left-succ (- b) (pos k)
       ii   = ℤ-zero-right-neutral (succℤ ((- b) +pos k))
       iii  = ap (succℤ ((- b) + pos k) +_) (ℤ-sum-of-inverse-is-zero a ⁻¹)
       iv   = ℤ-left-succ ((- b) + pos k) (a - a)
       v    = ap succℤ II
       vi   = ℤ-left-succ (a + pos k) ((- b) - a) ⁻¹
       vii  = ap (_+ ((- b) - a)) (ℤ-left-succ a (pos k) ⁻¹)
       viii = ap (_+ ((- b) - a)) γ
       ix   = ℤ+-assoc b (- b) (- a) ⁻¹
       x    = ap (_+ (- a)) (ℤ-sum-of-inverse-is-zero b)
       xi   = ℤ-zero-left-neutral (- a)

  step : (k : )
        (a < b  b * negsucc k < a * negsucc k)
         a < b  b * negsucc (succ k) < a * negsucc (succ k)
  step k IH l = ℤ<-adding (- b) (- a) (b * negsucc k) (a * negsucc k) I II
   where
    I : - b < - a
    I = base l
    II :  b * negsucc k < a * negsucc k
    II = IH l

negative-multiplication-changes-order : (a b c : )
                                       negative c
                                       a < b
                                       b * c < a * c
negative-multiplication-changes-order a b (pos c)     g l = 𝟘-elim g
negative-multiplication-changes-order a b (negsucc c) g l = nmco-lemma a b c l

negative-multiplication-changes-order' : (a b c : )
                                        negative c
                                        a  b
                                        b * c  a * c
negative-multiplication-changes-order' a b (pos x) g l = 𝟘-elim g
negative-multiplication-changes-order' a b (negsucc x) g l = I (ℤ≤-split a b l)
 where
  I : a < b  (a  b)  b * negsucc x  a * negsucc x
  I (inl a<b) = <-is-≤ (b * negsucc x) (a * negsucc x) γ
   where
    γ : b * negsucc x < a * negsucc x
    γ = negative-multiplication-changes-order a b (negsucc x)  a<b
  I (inr a=b) = transport (b * negsucc x ≤ℤ_) γ₁ γ₂
   where
    γ₁ : b * negsucc x  a * negsucc x
    γ₁ = ap (_* negsucc x) (a=b ⁻¹)

    γ₂ : b * negsucc x  b * negsucc x
    γ₂ = ℤ≤-refl (b * negsucc x)

ℤ-mult-right-cancellable : (x y z : )  not-zero z  x * z  y * z  x  y
ℤ-mult-right-cancellable x y (pos 0)        nz e = 𝟘-elim (nz )
ℤ-mult-right-cancellable x y (pos (succ z)) nz e = tri-split (ℤ-trichotomous x y)
 where
  tri-split : (x < y)  (x  y)  (y < x)  x  y
  tri-split (inl l) = 𝟘-elim (ℤ-equal-not-less-than (x * pos (succ z)) II)
   where
    I : x * pos (succ z) < y * pos (succ z)
    I = positive-multiplication-preserves-order x y (pos (succ z))  l

    II : x * pos (succ z) < x * pos (succ z)
    II = transport (x * pos (succ z) <_) (e ⁻¹) I

  tri-split (inr (inl m)) = m
  tri-split (inr (inr r)) = 𝟘-elim (ℤ-equal-not-less-than (y * pos (succ z)) II)
   where
    I : y * pos (succ z) < x * pos (succ z)
    I = positive-multiplication-preserves-order y x (pos (succ z))  r

    II : y * pos (succ z) < y * pos (succ z)
    II = transport (y * pos (succ z) <_) e I
ℤ-mult-right-cancellable x y (negsucc z)    nz e = tri-split (ℤ-trichotomous x y)
 where
  tri-split : (x < y)  (x  y)  (y < x)  x  y
  tri-split (inl l) = 𝟘-elim (ℤ-equal-not-less-than (y * negsucc z) II)
   where
    I : y * negsucc z < x * negsucc z
    I = nmco-lemma x y z l

    II : y * negsucc z < y * negsucc z
    II = transport (y * negsucc z <_) e I

  tri-split (inr (inl r)) = r
  tri-split (inr (inr r)) = 𝟘-elim (ℤ-equal-not-less-than (x * negsucc z) II)
   where
    I : (x * negsucc z) < (y * negsucc z)
    I = nmco-lemma y x z r

    II : x * negsucc z < x * negsucc z
    II = transport (x * negsucc z <_) (e ⁻¹) I

ℤ-mult-left-cancellable : (x y z : )  not-zero z
                                       z * x  z * y
                                       x  y
ℤ-mult-left-cancellable x y z nz e = ℤ-mult-right-cancellable x y z nz I
 where
  I : x * z  y * z
  I = x * z   =⟨ ℤ*-comm x z 
      z * x   =⟨ e           
      z * y   =⟨ ℤ*-comm z y 
      y * z   

non-zero-multiplication : (x y : )  ¬ (x  pos 0)  ¬ (y  pos 0)  ¬ (x * y  pos 0)
non-zero-multiplication (pos 0)        y xnz ynz e = xnz refl
non-zero-multiplication (pos (succ x)) y xnz ynz e = ynz γ
 where
  γ : y  pos 0
  γ = ℤ-mult-left-cancellable y (pos 0) (pos (succ x)) id e
non-zero-multiplication (negsucc x)    y xnz ynz e = ynz γ
 where
  γ : y  pos 0
  γ = ℤ-mult-left-cancellable y (pos 0) (negsucc x) id e

orcl : (a b : )  (n : )  a * (pos (succ n))  b * (pos (succ n))  a  b
orcl a b = ℕ-induction base step
 where
  base : a * pos 1  b * pos 1  a  b
  base = id

  step : (k : )
        (a * pos (succ k)  b * pos (succ k)  a  b)
        a * pos (succ (succ k))  b * pos (succ (succ k))
        a  b
  step k IH (α , β) = cases₃ γ₁ γ₂ γ₃ (ℤ-trichotomous a b)
   where
    k' = pos (succ (succ k))

    γ₁ : a < b  a  b
    γ₁ = <-is-≤ a b

    γ₂ : a  b  a  b
    γ₂ e = transport (a ≤_) e (ℤ≤-refl a)

    γ₃ : b < a  a  b
    γ₃ l = 𝟘-elim III
     where
      I : a * k'  b * k'
      I = α , β

      II : b * k' < a * k'
      II = positive-multiplication-preserves-order b a k'  l

      III : 𝟘
      III = ℤ-bigger-or-equal-not-less (a * k') (b * k') I II

orcl' : (a b : )  (n : )  a * (pos (succ n)) < b * (pos (succ n))  a < b
orcl' a b n l = II (ℤ≤-split a b I)
 where
  I : a  b
  I = orcl a b n (<-is-≤ (a * pos (succ n)) (b * pos (succ n)) l)
  II : a < b  (a  b)  a < b
  II (inl l) = l
  II (inr e) = 𝟘-elim (ℤ-equal-not-less-than (a * pos (succ n)) III)
   where
    III : a * pos (succ n) < a * pos (succ n)
    III = transport  -  (a * pos (succ n)) < (- * pos (succ n))) (e ⁻¹) l

ordering-right-cancellable : (a b c : )  is-pos-succ c  a * c < b * c  a < b
ordering-right-cancellable a b (negsucc x) p l    = 𝟘-elim p
ordering-right-cancellable a b (pos 0) p l        = 𝟘-elim p
ordering-right-cancellable a b (pos (succ x)) p l = orcl' a b x l

ℤ≤-ordering-right-cancellable : (a b c : )
                               is-pos-succ c  a * c  b * c  a  b
ℤ≤-ordering-right-cancellable a b (pos zero) p l     = 𝟘-elim p
ℤ≤-ordering-right-cancellable a b (pos (succ x)) p l = orcl a b x l
ℤ≤-ordering-right-cancellable a b (negsucc x) p l    = 𝟘-elim p

ℤ≤-anti : (x y : )  x  y  y  x  x  y
ℤ≤-anti x y l₁ l₂ = I (ℤ≤-split x y l₁) (ℤ≤-split y x l₂)
 where
  I : x < y  (x  y)  y < x  (y  x)
     x  y
  I (inl x<y) (inr e)   = e ⁻¹
  I (inr e)   (inl y<x) = e
  I (inr e)   (inr e')  = e
  I (inl x<y) (inl y<x) = 𝟘-elim III
   where
    II : x < x
    II = ℤ<-trans x y x x<y y<x

    III : 𝟘
    III = ℤ-equal-not-less-than x II

maxℤ :     
maxℤ x y with ℤ-dichotomous x y
... | inl x≤y = y
... | inr y≤x = x

max₂ :       
max₂ x y z = maxℤ (maxℤ x y) z

max₃ :         
max₃ w x y z = maxℤ (max₂ w x y) z

minℤ :     
minℤ x y with ℤ-dichotomous x y
... | inl x≤y = x
... | inr y≤x = y

min₂ :       
min₂ x y z = minℤ (minℤ x y) z

min₃ :         
min₃ w x y z = minℤ (min₂ w x y) z

\end{code}

Added by Todd

\begin{code}

ℤ≤-attach : (x y : )  (y  x)  (x < y)  x  y
ℤ≤-attach x x (inl refl) = 0 , refl
ℤ≤-attach x y (inr (a , p)) = succ a , (ℤ-left-succ-pos x a ⁻¹  p)

ℤ≤-same-witness : (x y : )  ((n , _) (m , _) : x  y)  n  m
ℤ≤-same-witness x y p q = ap pr₁ (ℤ≤-is-prop x y p q)

ℤ≤-add-witness : (x y z : )  ((n , p) : x  y) ((m , q) : y  z)
                ((o , r) : x  z)
                o  n ℕ+ m
ℤ≤-add-witness x y z x≤y y≤z x≤z
 = ℤ≤-same-witness x z x≤z (ℤ≤-trans x y z x≤y y≤z)

ℤ-less-not-bigger-or-equal : (x y : )  x < y  ¬ (y  x)
ℤ-less-not-bigger-or-equal x y x<y y≤x
 = ℤ-bigger-or-equal-not-less y x y≤x x<y

\end{code}

Lane Biocini, 07 September 2023

A proof of the triangle inequality in the Integers using the Absolute
Difference operation defined in the Naturals. We first prove a convenience
lemma.

\begin{code}

ℕ-order-respects-ℤ-order'' : (m n : )  m  n  pos m  pos n
ℕ-order-respects-ℤ-order'' zero n l = ℤ-zero-least-pos n
ℕ-order-respects-ℤ-order'' (succ m) n l = ℕ-order-respects-ℤ-order m n l

triangle-inequality₀ : (x y : )  abs (pos x +pos y) ≤ℕ abs (pos x) ℕ+ abs (pos y)
triangle-inequality₀ x y = transport (_≤ℕ x ℕ+ y) Γ (≤-refl (x ℕ+ y))
 where
  Γ : x ℕ+ y  abs (pos x +pos y)
  Γ = x ℕ+ y =⟨ ap abs (distributivity-pos-addition x y) ⁻¹ 
    abs (pos x +pos y) 

triangle-inequality₁ : (x y : )  abs (pos x +negsucc y) ≤ℕ succ (x ℕ+ y)
triangle-inequality₁ x y = transport (_≤ℕ succ (x ℕ+ y)) Γ γ
 where
  Γ :  x - succ y   abs (pos x +negsucc y)
  Γ = abs-pos-plus-negsucc x y ⁻¹

  γ :  x - succ y  ≤ℕ succ (x ℕ+ y)
  γ = triangle-inequality x 0 (succ y)

triangle-inequality₂ : (x y : )  abs (negsucc x +pos y) ≤ℕ (succ x ℕ+ y)
triangle-inequality₂ x y = transport₂ _≤ℕ_ I II (triangle-inequality₁ y x)
 where
  I : abs (pos y +negsucc x)  abs (negsucc x +pos y)
  I = ap abs (ℤ+-comm (pos y) (negsucc x))

  II : succ (y ℕ+ x)  succ x ℕ+ y
  II = ap succ (addition-commutativity y x)  succ-left x y ⁻¹

triangle-inequality₃ : (x y : )  abs (negsucc x +negsucc y) ≤ℕ succ (succ x ℕ+ y)
triangle-inequality₃ x y = transport (_≤ℕ succ (succ x ℕ+ y)) Γ γ
 where
  Γ : abs (pos (succ x) + pos (succ y))  abs (negsucc x +negsucc y)
  Γ = abs (succℤ (pos (succ x) +pos y))   =⟨ i 
      abs (- succℤ (pos (succ x) +pos y)) =⟨ ii 
      abs (negsucc x +negsucc y)          
   where
    i = abs-removes-neg-sign (succℤ (pos (succ x) +pos y))
    ii = ap abs (negation-dist (pos (succ x)) (pos (succ y))) ⁻¹

  γ : abs (pos (succ x) + pos (succ y)) ≤ℕ succ (succ x ℕ+ y)
  γ = triangle-inequality₀ (succ x) (succ y)

ℤ-triangle-inequality : (x y : )  abs (x + y) ≤ℕ abs x ℕ+ abs y
ℤ-triangle-inequality (pos x) (pos y) = triangle-inequality₀ x y
ℤ-triangle-inequality (pos x) (negsucc y) = triangle-inequality₁ x y
ℤ-triangle-inequality (negsucc x) (pos y) = triangle-inequality₂ x y
ℤ-triangle-inequality (negsucc x) (negsucc y) = triangle-inequality₃ x y

ℤ-triangle-inequality' : (x y : )  absℤ (x + y) ≤ℤ absℤ x + absℤ y
ℤ-triangle-inequality' x y = transport₂ _≤ℤ_ I II γ
 where
  I : pos (abs (x + y))  absℤ (x + y)
  I = pos-abs-is-absℤ (x + y)

  II : pos (abs x ℕ+ abs y)  absℤ x + absℤ y
  II = pos (abs x ℕ+ abs y)   =⟨ i 
     (pos (abs x) +pos abs y) =⟨ ii 
     absℤ x + absℤ y          
   where
    i = distributivity-pos-addition (abs x) (abs y) ⁻¹
    ii : (pos (abs x) +pos abs y)  absℤ x + absℤ y
    ii = ap₂  x y  x + y) (pos-abs-is-absℤ x) (pos-abs-is-absℤ y)

  γ : pos (abs (x + y)) ≤ℤ pos (abs x ℕ+ abs y)
  γ = ℕ-order-respects-ℤ-order'' (abs (x + y)) (abs x ℕ+ abs y) (ℤ-triangle-inequality x y)