Andrew Sneap, January-March 2021
Updated November 2021

In this file I define order of rationals, and prove many properties of order.

\begin{code}

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

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

open import Naturals.Properties
open import Notation.Order
open import Naturals.Addition renaming (_+_ to _ℕ+_)
open import MLTT.Plus-Properties
open import UF.Base hiding (_≈_)
open import UF.Subsingletons
open import Integers.Addition renaming (_+_ to _ℤ+_) hiding (_-_)
open import Integers.Type
open import Integers.Multiplication renaming (_*_ to _ℤ*_)
open import Integers.Order
open import Naturals.Multiplication renaming (_*_ to _ℕ*_)
open import Rationals.Fractions
open import Rationals.FractionsOperations renaming (_+_ to _𝔽+_ ; _*_ to _𝔽*_) hiding (-_)
open import Rationals.FractionsOrder
open import Rationals.Type
open import Rationals.Addition
open import Rationals.Multiplication
open import Rationals.Negation

module Rationals.Order where

_≤ℚ_ : (p q : ℚ) → 𝓤₀ ̇
(p , _) ≤ℚ (q , _) = p 𝔽≤ q

_<ℚ_ : (p q : ℚ) → 𝓤₀ ̇
(p , _) <ℚ (q , _) = p 𝔽< q

instance
 Strict-Order-ℚ-ℚ : Strict-Order ℚ ℚ
 _<_ {{Strict-Order-ℚ-ℚ}} = _<ℚ_

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

 Order-ℚ-ℚ : Order ℚ ℚ
 _≤_ {{Order-ℚ-ℚ}} = _≤ℚ_

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

ℚ≤-is-prop : (p q : ℚ) → is-prop (p ≤ q)
ℚ≤-is-prop (p , _) (q , _) = 𝔽≤-is-prop p q

ℚ<-is-prop : (p q : ℚ) → is-prop (p < q)
ℚ<-is-prop (p , _) (q , _) = 𝔽<-is-prop p q

ℚ<-trans : (p q r : ℚ) → p < q → q < r → p < r
ℚ<-trans (p , _) (q , _) (r , _) α β = 𝔽<-trans p q r α β

ℚ≤-refl : (q : ℚ) → q ≤ q
ℚ≤-refl q = 0 , by-definition

ℚ<-coarser-than-≤ : (p q : ℚ) → p < q → p ≤ q
ℚ<-coarser-than-≤ (p , _) (q , _) l = 𝔽<-coarser-than-≤ p q l

toℚ-< : (p q : 𝔽) → p 𝔽< q → toℚ p < toℚ q
toℚ-< (x , a) (y , b) l = γ
 where
  x' = numℚ (x , a)
  a' = dnomℚ (x , a)
  h  = hcf𝔽 (x , a)
  y' = numℚ (y , b)
  b' = dnomℚ (y , b)
  h' = hcf𝔽 (y , b)
  pb' = (pos ∘ succ) b'
  pa' = (pos ∘ succ) a'
  ph  = (pos ∘ succ) h
  pb  = (pos ∘ succ) b
  ph' = (pos ∘ succ) h'
  pa  = (pos ∘ succ) a

  I : is-pos-succ (ph ℤ* ph')
  I = is-pos-succ-mult ph ph' ⋆ ⋆

  lemma : (p q r s : ℤ) → p ℤ* q ℤ* (r ℤ* s) ＝ q ℤ* s ℤ* (p ℤ* r)
  lemma p q r s = p ℤ* q ℤ* (r ℤ* s)   ＝⟨ i   ⟩
                  q ℤ* p ℤ* (r ℤ* s)   ＝⟨ ii  ⟩
                  q ℤ* (p ℤ* (r ℤ* s)) ＝⟨ iii ⟩
                  q ℤ* (p ℤ* (s ℤ* r)) ＝⟨ iv  ⟩
                  q ℤ* (p ℤ* s ℤ* r)   ＝⟨ v   ⟩
                  q ℤ* (s ℤ* p ℤ* r)   ＝⟨ vi  ⟩
                  q ℤ* (s ℤ* (p ℤ* r)) ＝⟨ vii ⟩
                  q ℤ* s ℤ* (p ℤ* r)   ∎
   where
    i   = ap (_ℤ* (r ℤ* s)) (ℤ*-comm p q)
    ii  = ℤ*-assoc q p (r ℤ* s)
    iii = ap (λ - → q ℤ* (p ℤ* -)) (ℤ*-comm r s)
    iv  = ap (q ℤ*_) (ℤ*-assoc p s r ⁻¹)
    v   = ap (λ - → q ℤ* (- ℤ* r)) (ℤ*-comm p s)
    vi  = ap (q ℤ*_) (ℤ*-assoc s p r)
    vii = ℤ*-assoc q s (p ℤ* r) ⁻¹

  II : x ℤ* pb ＝ x' ℤ* pb' ℤ* (ph ℤ* ph')
  II = x ℤ* pb                  ＝⟨ ap (_ℤ* pb) (numr (x , a))          ⟩
       ph ℤ* x' ℤ* pb           ＝⟨ ap (ph ℤ* x' ℤ*_) (dnomrP' (y , b)) ⟩
       ph ℤ* x' ℤ* (ph' ℤ* pb') ＝⟨ lemma ph x' ph' pb'                 ⟩
       x' ℤ* pb' ℤ* (ph ℤ* ph') ∎

  III : y ℤ* pa ＝ y' ℤ* pa' ℤ* (ph ℤ* ph')
  III = y ℤ* pa                  ＝⟨ ap (_ℤ* pa) (numr (y , b))           ⟩
        ph' ℤ* y' ℤ* pa          ＝⟨ ap (ph' ℤ* y' ℤ*_) (dnomrP' (x , a)) ⟩
        ph' ℤ* y' ℤ* (ph ℤ* pa') ＝⟨ lemma ph' y' ph pa'                  ⟩
        y' ℤ* pa' ℤ* (ph' ℤ* ph) ＝⟨ ap (y' ℤ* pa' ℤ*_) (ℤ*-comm ph' ph)  ⟩
        y' ℤ* pa' ℤ* (ph ℤ* ph') ∎

  γ' : x' ℤ* pb' ℤ* (ph ℤ* ph') < y' ℤ* pa' ℤ* (ph ℤ* ph')
  γ' = transport₂ _<_ II III l

  γ : x' ℤ* pb' < y' ℤ* pa'
  γ = ordering-right-cancellable (x' ℤ* pb') (y' ℤ* pa') (ph ℤ* ph') I γ'

0<1/2 : 0ℚ < 1/2
0<1/2 = 0 , refl

0<1/3 : 0ℚ < 1/3
0<1/3 = 0 , refl

0<1/4 : 0ℚ < 1/4
0<1/4 = 0 , refl

0<1/5 : 0ℚ < 1/5
0<1/5 = 0 , refl

1/2<1 : 1/2 < 1ℚ
1/2<1 = 0 , refl

1/4<1/2 : 1/4 < 1/2
1/4<1/2 = 1 , refl

1/4<1 : 1/4 < 1ℚ
1/4<1 = 2 , refl

0<4/5 : 0ℚ < 4/5
0<4/5 = 3 , refl

0<1 : 0ℚ < 1ℚ
0<1 = 0 , refl

toℚ-≤ : (p q : 𝔽) → p 𝔽≤ q → toℚ p ≤ toℚ q
toℚ-≤ (x , a) (y , b) l = Cases I II III
 where
  pa = (pos ∘ succ) a
  pb = (pos ∘ succ) b

  I : x ℤ* pb < y ℤ* pa ∔ (x ℤ* pb ＝ y ℤ* pa)
  I = ℤ≤-split (x ℤ* pb) (y ℤ* pa) l

  II : x ℤ* pb < y ℤ* pa → toℚ (x , a) ≤ toℚ (y , b)
  II l = ℚ<-coarser-than-≤ (toℚ (x , a)) (toℚ (y , b)) l'
   where
    l' : toℚ (x , a) < toℚ (y , b)
    l' = toℚ-< (x , a) (y , b) l

  III : x ℤ* pb ＝ y ℤ* pa → toℚ (x , a) ≤ toℚ (y , b)
  III e = transport (toℚ (x , a) ≤_) e' (ℚ≤-refl (toℚ (x , a)))
   where
    e' : toℚ (x , a) ＝ toℚ (y , b)
    e' = equiv→equality (x , a) (y , b) e

ℚ-no-max-element : (p : ℚ) → Σ q ꞉ ℚ , (p < q)
ℚ-no-max-element ((x , a) , α) = q , III
 where
  q : ℚ
  q = toℚ (succℤ x , a)

  x' : ℤ
  x' = pr₁ (pr₁ q)
  a' : ℕ
  a'  = pr₂ (pr₁ q)
  pa  = (pos ∘ succ) a
  pa' = (pos ∘ succ) a'

  I : succℤ x ℤ* pa' ＝ x' ℤ* pa
  I = ≈-toℚ (succℤ x , a)

  II : x ℤ* pa' < succℤ x ℤ* pa'
  II = positive-multiplication-preserves-order x (succℤ x) pa' ⋆ (<-incrℤ x)

  III : x ℤ* pa' < x' ℤ* pa
  III = transport (x ℤ* pa' <_) I II

ℚ-no-least-element : (q : ℚ) → Σ p ꞉ ℚ , p < q
ℚ-no-least-element ((x , a) , α) = p , III
 where
  p : ℚ
  p = toℚ ((predℤ x) , a)

  x' : ℤ
  x' = pr₁ (pr₁ p)
  a' : ℕ
  a' = pr₂ (pr₁ p)

  pa = (pos ∘ succ) a
  pa' = (pos ∘ succ) a'

  I : predℤ x ℤ* pa' ＝ x' ℤ* pa
  I = ≈-toℚ (predℤ x , a)

  II : predℤ x ℤ* pa' < x ℤ* pa'
  II = positive-multiplication-preserves-order (predℤ x) x pa' ⋆ (<-predℤ x)

  III : x' ℤ* pa < (x ℤ* pa')
  III = transport (_< x ℤ* pa') I II

ℚ-trichotomous : (p q : ℚ) → (p < q) ∔ (p ＝ q) ∔ (q < p)
ℚ-trichotomous ((x , a) , α) ((y , b) , β) =
 γ (ℤ-trichotomous (x ℤ* pos (succ b)) (y ℤ* pos (succ a)))
 where
  γ : ((x ℤ* pos (succ b)) < (y ℤ* pos (succ a)))
     ∔ (x ℤ* pos (succ b) ＝ y ℤ* pos (succ a))
     ∔ ((y ℤ* pos (succ a)) < (x ℤ* pos (succ b)))
    →  (((x , a) , α) < ((y , b) , β))
     ∔ ((x , a) , α ＝ (y , b) , β)
     ∔ (((y , b) , β) < ((x , a) , α))
  γ (inl z)       = inl z
  γ (inr (inr z)) = inr (inr z)
  γ (inr (inl z)) = inr (inl γ')
   where
    I : x , a ＝ y , b
    I = equiv-with-lowest-terms-is-equal (x , a) (y , b) z α β

    γ' : (x , a) , α ＝ (y , b) , β
    γ' = to-subtype-＝ is-in-lowest-terms-is-prop I

ℚ-dichotomous : (p q : ℚ) → (p ≤ q) ∔ (q ≤ p)
ℚ-dichotomous ((x , a) , α) ((y , b) , β) = γ
 where
  γ : (((x , a) , α) ≤ ((y , b) , β)) ∔ (((y , b) , β) ≤ ((x , a) , α))
  γ = ℤ-dichotomous (x ℤ* pos (succ b)) (y ℤ* pos (succ a))

ℚ-dichotomous' : (p q : ℚ) → p < q ∔ q ≤ p
ℚ-dichotomous' p q = γ (ℚ-trichotomous p q)
 where
  γ : (p < q) ∔ (p ＝ q) ∔ (q < p) → (p < q) ∔ (q ≤ p)
  γ (inl l) = inl l
  γ (inr (inl e)) = inr (transport (_≤ p) e (ℚ≤-refl p))
  γ (inr (inr l)) = inr (ℚ<-coarser-than-≤ q p l)

located-property : (p q x : ℚ) → p < q → (p < x) ∔ (x < q)
located-property p q x l = γ (ℚ-trichotomous x q)
 where
  γ : (x < q) ∔ (x ＝ q) ∔ (q < x) → (p < x) ∔ (x < q)
  γ (inl z)       = inr z
  γ (inr (inl z)) = inl (transport (p <_) (z ⁻¹) l)
  γ (inr (inr z)) = inl (ℚ<-trans p q x l z)

half-𝔽 : 𝔽 → 𝔽
half-𝔽 (x , a) = x , succ (2 ℕ* a)

rounded-lemma₀ : (a : ℕ) → succ (2 ℕ* pred (succ a)) ＝ pred (2 ℕ* (succ a))
rounded-lemma₀ 0 = refl
rounded-lemma₀ (succ a) =
 succ (2 ℕ* pred (succ (succ a))) ＝⟨ i    ⟩
 succ (2 ℕ* succ a)               ＝⟨ ii   ⟩
 pred (succ (succ (2 ℕ* succ a))) ＝⟨ refl ⟩
 pred (2 ℕ* succ a ℕ+ 2)          ＝⟨ refl ⟩
 pred (2 ℕ* (succ a) ℕ+ 2 ℕ* 1)   ＝⟨ iii  ⟩
 pred (2 ℕ+ (2 ℕ* (succ a)))      ＝⟨ refl ⟩
 pred (2 ℕ* succ (succ a))        ∎
  where
   i   = ap (λ - → succ (2 ℕ* -)) (pred-succ (succ a))
   ii  = pred-succ (succ (2 ℕ* succ a)) ⁻¹
   iii = ap pred (distributivity-mult-over-addition 2 (succ a) 1 ⁻¹)

ℚ-zero-less-than-positive : (x y : ℕ) → 0ℚ < toℚ ((pos (succ x)) , y)
ℚ-zero-less-than-positive x y = toℚ-< (pos 0 , 0) (pos (succ x) , y) (x , γ)
 where
  γ : succℤ (pos 0 ℤ* pos (succ y)) ℤ+ pos x ＝ pos (succ x) ℤ* pos 1
  γ = succℤ (pos 0 ℤ* pos (succ y)) ℤ+ pos x ＝⟨ i   ⟩
      succℤ (pos 0) ℤ+ pos x                 ＝⟨ ii   ⟩
      succℤ (pos 0 ℤ+ pos x)                 ＝⟨ iii  ⟩
      succℤ (pos x)                          ＝⟨ refl ⟩
      pos (succ x)                           ＝⟨ refl ⟩
      pos (succ x) ℤ* pos 1                  ∎
   where
    i   = ap (λ α → succℤ α ℤ+ pos x) (ℤ-zero-left-base (pos (succ y)))
    ii  = ℤ-left-succ (pos 0) (pos x)
    iii = ap succℤ (ℤ+-comm (pos 0) (pos x))

ℚ<-addition-preserves-order : (p q r : ℚ) → p < q → (p + r) < (q + r)
ℚ<-addition-preserves-order (p , _) (q , _) (r , _) l =
 toℚ-< (p 𝔽+ r) (q 𝔽+ r) (𝔽<-addition-preserves-order p q r l)

ℚ<-adding : (p q r s : ℚ) → p < q → r < s → p + r < q + s
ℚ<-adding (p , _) (q , _) (r , _) (s , _) l₁ l₂ = toℚ-< (p 𝔽+ r) (q 𝔽+ s) I
 where
  I : p 𝔽+ r 𝔽< q 𝔽+ s
  I = 𝔽<-adding p q r s l₁ l₂

ℚ<-addition-preserves-order' : (p q r : ℚ) → p < q → 0ℚ < r → p < q + r
ℚ<-addition-preserves-order' p q r l m = γ
 where
  I : p + 0ℚ ＝ p
  I = ℚ-zero-right-neutral p

  II  : p + 0ℚ < q + r
  II = ℚ<-adding p q 0ℚ r l m

  γ : p < q + r
  γ = transport (_< q + r) I II

ℚ<-pos-multiplication-preserves-order : (p q : ℚ) → 0ℚ < p → 0ℚ < q → 0ℚ < p * q
ℚ<-pos-multiplication-preserves-order (p , _) (q , _) l₁ l₂ = γ
 where
  I : (pos 0 , 0) 𝔽< (p 𝔽* q)
  I = 𝔽-pos-multiplication-preserves-order p q l₁ l₂

  γ : toℚ (pos 0 , 0) < toℚ (p 𝔽* q)
  γ = toℚ-< (pos 0 , 0) (p 𝔽* q) I

ℚ≤-pos-multiplication-preserves-order : (p q : ℚ)
                                      → 0ℚ ≤ p → 0ℚ ≤ q → 0ℚ ≤ (p * q)
ℚ≤-pos-multiplication-preserves-order (p , _) (q , _) l₁ l₂ = γ
 where
  I : (pos 0 , 0) 𝔽≤ (p 𝔽* q)
  I = 𝔽≤-pos-multiplication-preserves-order p q l₁ l₂

  γ : toℚ (pos 0 , 0) ≤ toℚ (p 𝔽* q)
  γ = toℚ-≤ (pos 0 , 0) (p 𝔽* q) I

ℚ<-addition-preserves-order'' : (p q : ℚ) → 0ℚ < q → p < p + q
ℚ<-addition-preserves-order'' p q l = γ
 where
  I : 0ℚ + p ＝ p
  I = ℚ-zero-left-neutral p

  II : q + p ＝ p + q
  II = ℚ+-comm q p

  III : 0ℚ + p < q + p
  III = ℚ<-addition-preserves-order 0ℚ q p l

  γ : p < p + q
  γ = transport₂ _<_ I II III

ℚ<-addition-preserves-order''' : (p q r : ℚ)
                               → p < q → r + p < r + q
ℚ<-addition-preserves-order''' p q r l₁ = transport₂ _<_ I II III
 where
  I : p + r ＝ r + p
  I = ℚ+-comm p r

  II : q + r ＝ r + q
  II = ℚ+-comm q r

  III : p + r < q + r
  III = ℚ<-addition-preserves-order p q r l₁

ℚ<-subtraction-preserves-order : (p q : ℚ) → 0ℚ < q → p - q < p
ℚ<-subtraction-preserves-order p q l = transport (p - q <_) III II
 where
  I : p < p + q
  I = ℚ<-addition-preserves-order'' p q l

  II : p - q < p + q - q
  II = ℚ<-addition-preserves-order p (p + q) (- q) I

  III : p + q - q ＝ p
  III = p + q - q   ＝⟨ ℚ+-assoc p q (- q)                  ⟩
        p + (q - q) ＝⟨ ap (p +_) (ℚ-inverse-sum-to-zero q) ⟩
        p + 0ℚ      ＝⟨ ℚ-zero-right-neutral p              ⟩
        p           ∎

ℚ<-subtraction-preserves-order' : (p q : ℚ) → q < 0ℚ → p + q < p
ℚ<-subtraction-preserves-order' p q l = γ
 where
  I : q + p < 0ℚ + p
  I = ℚ<-addition-preserves-order q 0ℚ p l

  II : q + p ＝ p + q
  II = ℚ+-comm q p

  III : 0ℚ + p ＝ p
  III = ℚ-zero-left-neutral p

  γ : p + q < p
  γ = transport₂ _<_ II III I

ℚ<-subtraction-preserves-order'' : (p q r : ℚ) → p < q - r → p + r < q
ℚ<-subtraction-preserves-order'' p q r l = transport (p + r <_) II I
 where
  I : p + r < q - r + r
  I = ℚ<-addition-preserves-order p (q - r) r l

  II : q - r + r ＝ q
  II = q - r + r       ＝⟨ ℚ+-assoc q (- r) r                   ⟩
       q + ((- r) + r) ＝⟨ ap (q +_) (ℚ-inverse-sum-to-zero' r) ⟩
       q + 0ℚ          ＝⟨ ℚ-zero-right-neutral q               ⟩
       q               ∎

ℚ<-subtraction-preserves-order''' : (p q r : ℚ) → p + q < r → p < r - q
ℚ<-subtraction-preserves-order''' p q r l = transport (_< r - q) II I
 where
  I : p + q - q < r - q
  I = ℚ<-addition-preserves-order (p + q) r (- q) l

  II : p + q - q ＝ p
  II = p + q - q   ＝⟨ ℚ+-assoc p q (- q)                  ⟩
       p + (q - q) ＝⟨ ap (p +_) (ℚ-inverse-sum-to-zero q) ⟩
       p + 0ℚ      ＝⟨ ℚ-zero-right-neutral p              ⟩
       p           ∎

ℚ<-subtraction-order : (p q r : ℚ) → p - q < r → p < q + r
ℚ<-subtraction-order p q r l = γ
 where
  I : p - q + q ＝ p
  I = ℚ-inverse-intro'''' p q ⁻¹

  II : r + q ＝ q + r
  II = ℚ+-comm r q

  III : p - q + q < r + q
  III = ℚ<-addition-preserves-order (p - q) r q l

  γ : p < q + r
  γ = transport₂ _<_ I II III

ℚ<-subtraction-order' : (p q : ℚ) → p + q < q → p < 0ℚ
ℚ<-subtraction-order' p q l = transport (p <_) (ℚ-inverse-sum-to-zero q) I
 where
  I : p < q - q
  I = ℚ<-subtraction-preserves-order''' p q q l

ℚ-addition-order : (p q r : ℚ) → 0ℚ < q + r → p < p + q + r
ℚ-addition-order p q r l = γ
 where
  I : p < p + (q + r)
  I = ℚ<-addition-preserves-order'' p (q + r) l

  II : p + (q + r) ＝ p + q + r
  II = ℚ+-assoc p q r ⁻¹

  γ : p < p + q + r
  γ = transport (p <_) II I

ℚ-subtraction-order : (p q r : ℚ) → 0ℚ < q + r → p - q - r < p
ℚ-subtraction-order p q r l = γ
 where
  I : p - (q + r) < p
  I = ℚ<-subtraction-preserves-order p (q + r) l

  II : p - (q + r) ＝ p - q - r
  II = p - (q + r)     ＝⟨ ap (p +_) (ℚ-minus-dist q r ⁻¹) ⟩
       p + ((- q) - r) ＝⟨ ℚ+-assoc p (- q) (- r) ⁻¹       ⟩
       p - q - r       ∎

  γ : p - q - r < p
  γ = transport (_< p) II I

ℚ<-difference-positive' : (p q : ℚ) → p < q → p - q < 0ℚ
ℚ<-difference-positive' p q l = γ
 where
  I : q - q ＝ 0ℚ
  I = ℚ-inverse-sum-to-zero q

  II : p - q < q - q
  II = ℚ<-addition-preserves-order p q (- q) l

  γ : p - q <  0ℚ
  γ = transport (p - q <_) I II

ℚ<-swap' : (p q r : ℚ) → p - q < r → p - r < q
ℚ<-swap' p q r l = transport₂ _<_ I II III
 where
  I : p - q + (q - r) ＝ p - r
  I = p - q + (q - r)       ＝⟨ i   ⟩
      p + ((- q) + (q - r)) ＝⟨ ii  ⟩
      p + ((- q) + q - r)   ＝⟨ iii ⟩
      p + (0ℚ - r)          ＝⟨ iv  ⟩
      p - r                 ∎
   where
    i   = ℚ+-assoc p (- q) (q - r)
    ii  = ap (p +_) (ℚ+-assoc (- q) q (- r) ⁻¹)
    iii = ap (λ z → p + (z - r)) (ℚ-inverse-sum-to-zero' q)
    iv  = ap (p +_) (ℚ-zero-left-neutral (- r))

  II : r + (q - r) ＝ q
  II = r + (q - r)     ＝⟨ ap (r +_) (ℚ+-comm q (- r))         ⟩
       r + ((- r) + q) ＝⟨ ℚ+-assoc r (- r) q ⁻¹               ⟩
       r - r + q       ＝⟨ ap (_+ q) (ℚ-inverse-sum-to-zero r) ⟩
       0ℚ + q          ＝⟨ ℚ-zero-left-neutral q               ⟩
       q ∎

  III : p - q + (q - r) < r + (q - r)
  III = ℚ<-addition-preserves-order (p - q) r (q - r) l

ℚ<-adding-zero : (p q : ℚ) → 0ℚ < p → 0ℚ < q → 0ℚ < p + q
ℚ<-adding-zero p q l₁ l₂ = ℚ<-adding 0ℚ p 0ℚ q l₁ l₂

ℚ<-irrefl : (p : ℚ) → ¬ (p < p)
ℚ<-irrefl ((x , a) , _) l = ℤ-equal-not-less-than (x ℤ* (pos (succ a))) l

ℚ≤-split : (p q : ℚ) → p ≤ q → (p < q) ∔ (p ＝ q)
ℚ≤-split ((x , a) , α) ((y , b) , β) l = cases II III I
 where
  I : x ℤ* pos (succ b) < y ℤ* pos (succ a)
    ∔ (x ℤ* pos (succ b) ＝ y ℤ* pos (succ a))
  I = ℤ≤-split (x ℤ* pos (succ b)) (y ℤ* pos (succ a)) l

  II : x ℤ* pos (succ b) < y ℤ* pos (succ a)
     → x ℤ* pos (succ b) < y ℤ* pos (succ a)
     ∔ ((x , a) , α ＝ (y , b) , β)
  II = inl

  III : (x ℤ* pos (succ b) ＝ y ℤ* pos (succ a))
      → x ℤ* pos (succ b) < y ℤ* pos (succ a)
      ∔ ((x , a) , α ＝ (y , b) , β)
  III e = inr (ℚ-＝ ((x , a) , α) ((y , b) , β) e)

ℚ≤-addition-preserves-order : (p q r : ℚ) → p ≤ q → (p + r) ≤ (q + r)
ℚ≤-addition-preserves-order p q r l = I (ℚ≤-split p q l)
 where
  I : (p < q) ∔ (p ＝ q) → (p + r) ≤ (q + r)
  I (inl l) = ℚ<-coarser-than-≤ (p + r) (q + r) II
   where
    II : p + r < q + r
    II = ℚ<-addition-preserves-order p q r l
  I (inr e) = transport (p + r ≤_) II (ℚ≤-refl (p + r))
   where
    II : p + r ＝ q + r
    II = ap (_+ r) e

ℚ≤-addition-preserves-order'' : (p q : ℚ) → 0ℚ ≤ q → p ≤ p + q
ℚ≤-addition-preserves-order'' p q l = transport₂ _≤_ I II III
 where
  I : 0ℚ + p ＝ p
  I = ℚ-zero-left-neutral p

  II : q + p ＝ p + q
  II = ℚ+-comm q p

  III : 0ℚ + p ≤ q + p
  III = ℚ≤-addition-preserves-order 0ℚ q p l

ℚ≤-difference-positive : (p q : ℚ) → p ≤ q → 0ℚ ≤ q - p
ℚ≤-difference-positive p q l = transport (_≤ q - p) (ℚ-inverse-sum-to-zero p) I
 where
  I : p - p ≤ q - p
  I = ℚ≤-addition-preserves-order p q (- p) l

ℚ≤-pos-multiplication-preserves-order' : (p q r : ℚ)
                                       → (p ≤ q) → 0ℚ ≤ r → p * r ≤ q * r
ℚ≤-pos-multiplication-preserves-order' p q r l₁ l₂ = transport₂ _≤_ III IV II
 where
  I-lem : 0ℚ ≤ q - p
  I-lem = ℚ≤-difference-positive p q l₁

  I : 0ℚ ≤ (q - p) * r
  I = ℚ≤-pos-multiplication-preserves-order (q - p) r I-lem l₂

  II : 0ℚ + p * r ≤ (q - p) * r + p * r
  II = ℚ≤-addition-preserves-order 0ℚ ((q - p) * r) (p * r) I

  III : 0ℚ + p * r ＝ p * r
  III = ℚ-zero-left-neutral (p * r)

  IV : (q - p) * r + p * r ＝ q * r
  IV = (q - p) * r + p * r         ＝⟨ i   ⟩
       q * r + (- p) * r + p * r   ＝⟨ ii  ⟩
       q * r + ((- p) * r + p * r) ＝⟨ iii ⟩
       q * r + ((- p * r) + p * r) ＝⟨ iv  ⟩
       q * r + 0ℚ                  ＝⟨ v   ⟩
       q * r                       ∎
   where
    i   = ap (_+ p * r) (ℚ-distributivity' r q (- p))
    ii  = ℚ+-assoc (q * r) ((- p) * r) (p * r)
    iii = ap (λ z → (q * r) + (z + p * r)) (ℚ-negation-dist-over-mult p r)
    iv  = ap (q * r +_) (ℚ-inverse-sum-to-zero' (p * r))
    v   = ℚ-zero-right-neutral (q * r)

ℚ<-difference-positive : (p q : ℚ) → p < q → 0ℚ < q - p
ℚ<-difference-positive p q l = transport (_< q - p) (ℚ-inverse-sum-to-zero p) I
 where
  I : p - p < q - p
  I = ℚ<-addition-preserves-order p q (- p) l

ℚ<-pos-multiplication-preserves-order' : (p q r : ℚ)
                                       → p < q → 0ℚ < r → p * r < q * r
ℚ<-pos-multiplication-preserves-order' p q r l₁ l₂ = transport₂ _<_ III IV II
 where
  I-lem : 0ℚ < q - p
  I-lem = ℚ<-difference-positive p q l₁

  I : 0ℚ < (q - p) * r
  I = ℚ<-pos-multiplication-preserves-order (q - p) r I-lem l₂

  II : 0ℚ + p * r < (q - p) * r + p * r
  II = ℚ<-addition-preserves-order 0ℚ ((q - p) * r) (p * r) I

  III : 0ℚ + p * r ＝ p * r
  III = ℚ-zero-left-neutral (p * r)

  IV : (q - p) * r + p * r ＝ q * r
  IV = (q - p) * r + p * r         ＝⟨ i   ⟩
       q * r + (- p) * r + p * r   ＝⟨ ii  ⟩
       q * r + ((- p) * r + p * r) ＝⟨ iii ⟩
       q * r + ((- p * r) + p * r) ＝⟨ iv  ⟩
       q * r + 0ℚ                  ＝⟨ v   ⟩
       q * r                       ∎
   where
    i   = ap (_+ p * r) (ℚ-distributivity' r q (- p))
    ii  = ℚ+-assoc (q * r) ((- p) * r) (p * r)
    iii = ap (λ z → (q * r) + (z + p * r)) (ℚ-negation-dist-over-mult p r)
    iv  = ap (q * r +_) (ℚ-inverse-sum-to-zero' (p * r))
    v   = ℚ-zero-right-neutral (q * r)

ℚ<-pos-multiplication-preserves-order'' : (p q r : ℚ)
                                        → p < q → 0ℚ < r → r * p < r * q
ℚ<-pos-multiplication-preserves-order'' p q r l₁ l₂ = transport₂ _<_ I II III
 where
  I : p * r ＝ r * p
  I = ℚ*-comm p r

  II : q * r ＝ r * q
  II = ℚ*-comm q r

  III : p * r < q * r
  III = ℚ<-pos-multiplication-preserves-order' p q r l₁ l₂

order1ℚ : (p : ℚ) → p < p + 1ℚ
order1ℚ p = ℚ<-addition-preserves-order'' p 1ℚ (0 , refl)

order1ℚ' : (p : ℚ) → p - 1ℚ < p
order1ℚ' p = ℚ<-subtraction-preserves-order p 1ℚ (0 , refl)

ℚ≤-trans : (p q r : ℚ) → p ≤ q → q ≤ r → p ≤ r
ℚ≤-trans p q r l₁ l₂ = I (ℚ≤-split p q l₁) (ℚ≤-split q r l₂)
 where
  I : (p < q) ∔ (p ＝ q) → (q < r) ∔ (q ＝ r) → p ≤ r
  I (inl k) (inl e) = ℚ<-coarser-than-≤ p r (ℚ<-trans p q r k e)
  I (inl k) (inr e) = ℚ<-coarser-than-≤ p r (transport (p <_) e k)
  I (inr k) (inl e) = ℚ<-coarser-than-≤ p r (transport (_< r) (k ⁻¹) e)
  I (inr k) (inr e) = transport (p ≤_) e l₁

ℚ<-≤-trans : (p q r : ℚ) → p < q → q ≤ r → p < r
ℚ<-≤-trans p q r l₁ l₂ = I (ℚ≤-split q r l₂)
 where
  I : (q < r) ∔ (q ＝ r) → p < r
  I (inl l) = ℚ<-trans p q r l₁ l
  I (inr l) = transport (p <_) l l₁

ℚ≤-<-trans : (p q r : ℚ) → p ≤ q → q < r → p < r
ℚ≤-<-trans p q r l₁ l₂ = I (ℚ≤-split p q l₁)
 where
  I : (p < q) ∔ (p ＝ q) → p < r
  I (inl l) = ℚ<-trans p q r l l₂
  I (inr l) = transport (_< r) (l ⁻¹) l₂

ℚ≤-adding : (x y u v : ℚ) → x ≤ y → u ≤ v → x + u ≤ y + v
ℚ≤-adding x y u v l₁ l₂ = ℚ≤-trans (x + u) (y + u) (y + v) I III
 where
  I : x + u ≤ y + u
  I = ℚ≤-addition-preserves-order x y u l₁

  II : u + y ≤ v + y
  II = ℚ≤-addition-preserves-order u v y l₂

  III : y + u ≤ y + v
  III = transport₂ _≤_ (ℚ+-comm u y) (ℚ+-comm v y) II

ℚ≤-swap : (x y : ℚ) → x ≤ y → - y ≤ - x
ℚ≤-swap x y l = transport id III II
 where
  I : x - x ≤ y - x
  I = ℚ≤-addition-preserves-order x y (- x) l

  II : x - x - y ≤ y - x - y
  II = ℚ≤-addition-preserves-order (x - x) (y - x) (- y) I

  III : (x - x - y ≤ y - x - y) ＝ (- y ≤ - x)
  III = ap₂ _≤_ α β
   where
    α : x - x - y ＝ - y
    α = x - x - y             ＝⟨ ap (_- y) (ℚ-inverse-sum-to-zero x) ⟩
        0ℚ - y                ＝⟨ ℚ-zero-left-neutral (- y)           ⟩
        - y                   ∎
    β : y - x - y ＝ - x
    β = y - x - y             ＝⟨ ap (_- y) (ℚ+-comm y (- x))             ⟩
        (- x) + y - y         ＝⟨ ℚ+-assoc (- x) y (- y)                  ⟩
        (- x) + (y - y)       ＝⟨ ap ((- x) +_) (ℚ-inverse-sum-to-zero y) ⟩
        (- x) + 0ℚ            ＝⟨ ℚ-zero-right-neutral (- x)              ⟩
        (- x)                 ∎

ℚ≤-swap' : (x : ℚ) → x ≤ 0ℚ → 0ℚ ≤ - x
ℚ≤-swap' x l = transport (_≤ - x) ℚ-minus-zero-is-zero (ℚ≤-swap x 0ℚ l)

ℚ≤-swap''' : (x y : ℚ) → - y ≤ - x → x ≤ y
ℚ≤-swap''' x y l = transport₂ _≤_ I II III
 where
  I : - (- x) ＝ x
  I = ℚ-minus-minus x ⁻¹

  II : - (- y) ＝ y
  II = ℚ-minus-minus y ⁻¹

  III : - (- x) ≤ - (- y)
  III = ℚ≤-swap (- y) (- x) l

ℚ<-swap : (x y : ℚ) → x < y → - y < - x
ℚ<-swap x y l = γ (ℚ≤-split (- y) (- x) I)
 where
  I : - y ≤ - x
  I = ℚ≤-swap x y (ℚ<-coarser-than-≤ x y l)

  γ : - y < - x ∔ (- y ＝ - x) → - y < - x
  γ (inl il) = il
  γ (inr ir) = 𝟘-elim (ℚ<-irrefl x (transport (x <_) γ' l))
   where
    γ' : y ＝ x
    γ' = y       ＝⟨ ℚ-minus-minus y    ⟩
         - (- y) ＝⟨ ap -_ ir           ⟩
         - (- x) ＝⟨ ℚ-minus-minus x ⁻¹ ⟩
         x       ∎

ℚ<-swap'' : (p : ℚ) → p < 0ℚ → 0ℚ < - p
ℚ<-swap'' p l = transport (_< - p) ℚ-minus-zero-is-zero (ℚ<-swap p 0ℚ l)

ℚ<-swap''' : (x y : ℚ) → - y < - x → x < y
ℚ<-swap''' x y l = transport₂ _<_ I II III
 where
  I : - (- x) ＝ x
  I = ℚ-minus-minus x ⁻¹

  II : - (- y) ＝ y
  II = ℚ-minus-minus y ⁻¹

  III : - (- x) < - (- y)
  III = ℚ<-swap (- y) (- x) l

ℚ-num-neg-not-pos : (x a : ℕ) (α : is-in-lowest-terms (negsucc x , a))
                  → ¬ (0ℚ ≤ ((negsucc x , a) , α))
ℚ-num-neg-not-pos x a α l = 𝟘-elim (γ IV)
 where
  I : pos 0 ℤ* pos (succ a) ≤ negsucc x ℤ* pos 1
  I = l

  II : pos 0 ℤ* pos (succ a) ＝ pos 0
  II = ℤ-zero-left-base (pos (succ a))

  III : negsucc x ℤ+ pos 0 ＝ negsucc x
  III = ℤ-zero-right-neutral (negsucc x)

  IV : pos 0 ≤ negsucc x
  IV = transport₂ _≤_ II III I

  γ : ¬ (pos 0 ≤ negsucc x)
  γ (k , e) = pos-not-negsucc γ'
   where
    γ' : pos k ＝ negsucc x
    γ' = pos k          ＝⟨ ℤ-zero-left-neutral (pos k) ⁻¹  ⟩
         pos 0 ℤ+ pos k ＝⟨ e                               ⟩
         negsucc x      ∎

ℚ-num-neg-not-pos' : (x a : ℕ) (α : is-in-lowest-terms (negsucc x , a))
                   → ¬ (0ℚ < ((negsucc x , a) , α))
ℚ-num-neg-not-pos' x a α l = ℚ-num-neg-not-pos x a α γ
 where
  γ : 0ℚ ≤ ((negsucc x , a) , α)
  γ = ℚ<-coarser-than-≤ 0ℚ ((negsucc x , a) , α) l

ℚ<-positive-not-zero : (p : ℚ) → 0ℚ < p → ¬ (p ＝ 0ℚ)
ℚ<-positive-not-zero p 0<p e = ℚ<-irrefl p γ
 where
  γ : p < p
  γ = transport (_< p) (e ⁻¹) 0<p

ℚ-inv-preserves-pos : (p : ℚ)
                    → 0ℚ < p
                    → (nz : ¬ (p ＝ 0ℚ))
                    → 0ℚ < ℚ*-inv p nz
ℚ-inv-preserves-pos ((pos 0 , a) , α) l nz = 𝟘-elim (nz γ)
 where
  γ : (pos 0 , a) , α ＝ 0ℚ
  γ = numerator-zero-is-zero ((pos 0 , a) , α) refl
ℚ-inv-preserves-pos ((negsucc x , a) , α) l nz = 𝟘-elim γ
 where
  γ : 𝟘
  γ = ℚ-num-neg-not-pos' x a α l
ℚ-inv-preserves-pos ((pos (succ x) , a) , α) l nz = γ
 where
  γ : 0ℚ < toℚ (pos (succ a) , x)
  γ = ℚ-zero-less-than-positive a x

ℚ-equal-or-less-than-is-prop : (x y : ℚ) → is-prop ((x ＝ y) ∔ (y < x))
ℚ-equal-or-less-than-is-prop x y (inl l) (inl r) = ap inl (ℚ-is-set l r)
ℚ-equal-or-less-than-is-prop x y (inl l) (inr r) = 𝟘-elim (ℚ<-irrefl y γ)
 where
  γ : y < y
  γ = transport (y <_) l r
ℚ-equal-or-less-than-is-prop x y (inr l) (inl r) = 𝟘-elim (ℚ<-irrefl x γ)
 where
  γ : x < x
  γ = transport (_< x) (r ⁻¹) l
ℚ-equal-or-less-than-is-prop x y (inr l) (inr r) = ap inr (ℚ<-is-prop y x l r)

ℚ-trich-a : (x y : ℚ) → (l : x < y) → ℚ-trichotomous x y ＝ inl l
ℚ-trich-a x y l = equality-cases (ℚ-trichotomous x y) I II
 where
  I : (l₂ : x < y)
    → ℚ-trichotomous x y ＝ inl l₂
    → ℚ-trichotomous x y ＝ inl l
  I l₂ e = e ∙ ap inl (ℚ<-is-prop x y l₂ l)

  II : (y₁ : (x ＝ y) ∔ (y < x))
     → ℚ-trichotomous x y ＝ inr y₁
     → ℚ-trichotomous x y ＝ inl l
  II (inl e) _ = 𝟘-elim (ℚ<-irrefl y (transport (_< y) e l))
  II (inr lt) _ = 𝟘-elim (ℚ<-irrefl x (ℚ<-trans x y x l lt))

ℚ-trich-b : (x y : ℚ) → (r : (x ＝ y) ∔ (y < x)) → ℚ-trichotomous x y ＝ inr r
ℚ-trich-b x y r = equality-cases (ℚ-trichotomous x y) I II
 where
  I : (l : x < y) → ℚ-trichotomous x y ＝ inl l → ℚ-trichotomous x y ＝ inr r
  I l _ = Cases r (λ e → 𝟘-elim (ℚ<-irrefl y (transport (_< y) e l)))
                   λ e → 𝟘-elim (ℚ<-irrefl x (ℚ<-trans x y x l e))
  II : (s : (x ＝ y) ∔ (y < x))
     → ℚ-trichotomous x y ＝ inr s
     → ℚ-trichotomous x y ＝ inr r
  II s e = e ∙ (ap inr III)
   where
    III : s ＝ r
    III = ℚ-equal-or-less-than-is-prop x y s r

ℚ-trich-c : (x : ℚ) → (e : (x ＝ x) ∔ x < x) → ℚ-trichotomous x x ＝ inr e
ℚ-trich-c x e = equality-cases (ℚ-trichotomous x x) I II
 where
  I : (k : x < x) → ℚ-trichotomous x x ＝ inl k → ℚ-trichotomous x x ＝ inr e
  I k f = 𝟘-elim (ℚ<-irrefl x k)

  II : (k : (x ＝ x) ∔ (x < x))
     → ℚ-trichotomous x x ＝ inr k
     → ℚ-trichotomous x x ＝ inr e
  II k l = Cases k III (λ - → 𝟘-elim (ℚ<-irrefl x -) )
   where
    III : x ＝ x → ℚ-trichotomous x x ＝ inr e
    III z = l ∙ ap inr (ℚ-equal-or-less-than-is-prop x x k e)

trisect : (x y : ℚ) → x < y
        → Σ (x' , y') ꞉ ℚ × ℚ , (x < x') × (x' < y') × (y' < y)
                              × (y - x' ＝ 2/3 * (y - x))
                              × (y' - x ＝ 2/3 * (y - x))
trisect x y l = (x + d * 1/3 , x + d * 2/3) , γ₁ , γ₂ , γ₃ , γ₄  , γ₅
 where
  d : ℚ
  d  = y - x

  I : 0ℚ < d
  I = ℚ<-difference-positive x y l

  II : 0ℚ < d * 1/3
  II = ℚ<-pos-multiplication-preserves-order d 1/3 I 0<1/3

  γ₁ : x < x + d * 1/3
  γ₁ = ℚ<-addition-preserves-order'' x (d * 1/3) II

  III : x + d * 1/3 < x + d * 1/3 + d * 1/3
  III = ℚ<-addition-preserves-order'' (x + d * 1/3) (d * 1/3) II

  IV : x + d * 1/3 + d * 1/3 ＝ x + d * 2/3
  IV = x + d * 1/3 + d * 1/3   ＝⟨ ℚ+-assoc x (d * 1/3) (d * 1/3)            ⟩
       x + (d * 1/3 + d * 1/3) ＝⟨ ap (x +_) (ℚ-distributivity d 1/3 1/3 ⁻¹) ⟩
       x + d * (1/3 + 1/3)     ＝⟨ ap (λ - → x + d * -) 1/3+1/3              ⟩
       x + d * 2/3             ∎

  γ₂ : x + d * 1/3 < x + d * 2/3
  γ₂ = transport (x + d * 1/3 <_) IV III

  V : x + d * 2/3 < x + d * 2/3 + d * 1/3
  V = ℚ<-addition-preserves-order'' (x + d * 2/3) (d * 1/3) II

  VI : x + d * 2/3 + d * 1/3 ＝ y
  VI = x + d * 2/3 + d * 1/3   ＝⟨ ℚ+-assoc x (d * 2/3) (d * 1/3)            ⟩
       x + (d * 2/3 + d * 1/3) ＝⟨ ap (x +_) (ℚ-distributivity d 2/3 1/3 ⁻¹) ⟩
       x + d * (2/3 + 1/3)     ＝⟨ ap (λ - → x + d * -) 2/3+1/3              ⟩
       x + d * 1ℚ              ＝⟨ ap (x +_) (ℚ-mult-right-id d)             ⟩
       x + (y - x)             ＝⟨ ap (x +_) (ℚ+-comm y (- x))               ⟩
       x + ((- x) + y)         ＝⟨ ℚ+-assoc x (- x) y ⁻¹                     ⟩
       x - x + y               ＝⟨ ℚ-inverse-intro' y x ⁻¹                   ⟩
       y                        ∎

  γ₃ : x + d * 2/3 < y
  γ₃ = transport (x + d * 2/3 <_) VI V

  γ₅ : x + d * 2/3 - x ＝ 2/3 * d
  γ₅ = x + d * 2/3 - x ＝⟨ ℚ+-rearrange x (d * 2/3) (- x)  ⟩
       x - x + d * 2/3 ＝⟨ ℚ-inverse-intro' (d * 2/3) x ⁻¹ ⟩
       d * 2/3         ＝⟨ ℚ*-comm d 2/3                   ⟩
       2/3 * d         ∎

  VII : d * (- 1/3) ＝ - d * 1/3
  VII = ℚ-negation-dist-over-mult' d 1/3

  γ₄ : y - (x + d * 1/3) ＝ 2/3 * d
  γ₄ = y - (x + d * 1/3)     ＝⟨ ap (y +_) (ℚ-minus-dist x (d * 1/3) ⁻¹) ⟩
       y + ((- x) - d * 1/3) ＝⟨ ℚ+-assoc y (- x) (- d * 1/3) ⁻¹         ⟩
       d - d * 1/3           ＝⟨ ap (_- d * 1/3) (ℚ-mult-right-id d ⁻¹)  ⟩
       d * 1ℚ - d * 1/3      ＝⟨ ap (d * 1ℚ +_) VII ⁻¹                   ⟩
       d * 1ℚ + d * (- 1/3)  ＝⟨ ℚ-distributivity d 1ℚ (- 1/3) ⁻¹        ⟩
       d * (1ℚ - 1/3)        ＝⟨ ap (d *_) 1-1/3                         ⟩
       d * 2/3               ＝⟨ ℚ*-comm d 2/3                           ⟩
       2/3 * d               ∎

ℚ≤-anti : (p q : ℚ) → p ≤ q → q ≤ p → p ＝ q
ℚ≤-anti p q l₁ l₂ = I (ℚ≤-split p q l₁) (ℚ≤-split q p l₂)
 where
  I : (p < q) ∔ (p ＝ q) → (q < p) ∔ (q ＝ p) → p ＝ q
  I (inl l) (inl r) = 𝟘-elim (ℚ<-irrefl p (ℚ<-trans p q p l r))
  I (inl l) (inr r) = r ⁻¹
  I (inr e) (inl f) = e
  I (inr e) (inr f) = e

halving-preserves-order : (p : ℚ) → 0ℚ < p → 0ℚ < p * 1/2
halving-preserves-order p l
 = ℚ<-pos-multiplication-preserves-order p 1/2 l 0<1/2

halving-preserves-order' : (p : ℚ) → 0ℚ < p → 0ℚ < 1/2 * p
halving-preserves-order' p l
 = ℚ<-pos-multiplication-preserves-order 1/2 p 0<1/2 l

quarter-preserves-order : (p : ℚ) → 0ℚ < p → 0ℚ < p * 1/4
quarter-preserves-order p l
 = ℚ<-pos-multiplication-preserves-order p 1/4 l 0<1/4

quarter-preserves-order' : (p : ℚ) → 0ℚ < p → 0ℚ < 1/4 * p
quarter-preserves-order' p l
 = ℚ<-pos-multiplication-preserves-order 1/4 p 0<1/4 l

half-of-pos-is-less : (p : ℚ) → 0ℚ < p → 1/2 * p < p
half-of-pos-is-less p l = transport (1/2 * p <_) III II
 where
  I : 0ℚ < 1/2 * p
  I = halving-preserves-order' p l

  II : 1/2 * p < 1/2 * p + 1/2 * p
  II = ℚ<-addition-preserves-order'' (1/2 * p) (1/2 * p) I

  III : 1/2 * p + 1/2 * p ＝ p
  III = 1/2 * p + 1/2 * p ＝⟨ ℚ-distributivity' p 1/2 1/2 ⁻¹ ⟩
        (1/2 + 1/2) * p   ＝⟨ ap (_* p) (1/2+1/2)            ⟩
        1ℚ * p            ＝⟨ ℚ-mult-left-id p               ⟩
        p                 ∎

bisect : (p q : ℚ) → p < q → (p < p + 1/2 * (q - p)) × (p + 1/2 * (q - p) < q)
bisect p q l = γ₁ , γ₂
 where
  I : 0ℚ < (q - p) * 1/2
  I = halving-preserves-order (q - p) (ℚ<-difference-positive p q l)

  II : 0ℚ < 1/2 * (q - p)
  II = transport (0ℚ <_) (ℚ*-comm (q - p) 1/2) I

  III : p + 1/2 * (q - p) < p + 1/2 * (q - p) + 1/2 * (q - p)
  III = ℚ<-addition-preserves-order'' (p + 1/2 * (q - p)) (1/2 * (q - p)) II

  IV : p + 1/2 * (q - p) + 1/2 * (q - p) ＝ q
  IV = p + 1/2 * (q - p) + 1/2 * (q - p)   ＝⟨ i    ⟩
       p + (1/2 * (q - p) + 1/2 * (q - p)) ＝⟨ ii   ⟩
       p + (1/2 + 1/2) * (q - p)           ＝⟨ iii  ⟩
       p + 1ℚ * (q - p)                    ＝⟨ iv   ⟩
       p + (q - p)                         ＝⟨ v    ⟩
       p + ((- p) + q)                     ＝⟨ vi   ⟩
       p - p + q                           ＝⟨ vii  ⟩
       0ℚ + q                              ＝⟨ viii ⟩
       q                                   ∎
   where
    i    = ℚ+-assoc p (1/2 * (q - p)) (1/2 * (q - p))
    ii   = ap (p +_) (ℚ-distributivity' (q - p) 1/2 1/2 ⁻¹)
    iii  = ap (λ α → p + α * (q - p)) 1/2+1/2
    iv   = ap (p +_) (ℚ-mult-left-id (q - p))
    v    = ap (p +_) (ℚ+-comm q (- p))
    vi   = ℚ+-assoc p (- p) q ⁻¹
    vii  = ap (_+ q) (ℚ-inverse-sum-to-zero p)
    viii = ℚ-zero-left-neutral q

  γ₁ : p < p + 1/2 * (q - p)
  γ₁ = ℚ<-addition-preserves-order'' p (1/2 * (q - p)) II

  γ₂ : p + 1/2 * (q - p) < q
  γ₂ = transport (p + 1/2 * (q - p) <_) IV III

ℚ-dense : (p q : ℚ) → p < q → Σ x ꞉ ℚ , (p < x) × (x < q)
ℚ-dense p q l =  p + 1/2 * (q - p) , bisect p q l

inequality-chain-outer-bounds-inner : (a b c d : ℚ)
                                    → a < b → b < c → c < d → c - b < d - a
inequality-chain-outer-bounds-inner a b c d l₁ l₂ l₃ = γ
 where
  I : c - b < d - b
  I = ℚ<-addition-preserves-order c d (- b) l₃

  II : - b < - a
  II = ℚ<-swap a b l₁

  III : (- b) + d < (- a) + d
  III = ℚ<-addition-preserves-order (- b) (- a) d II

  IV : d - b < d - a
  IV = transport₂ _<_ (ℚ+-comm (- b) d) (ℚ+-comm (- a) d) III

  γ : c - b < d - a
  γ = ℚ<-trans (c - b) (d - b) (d - a) I IV

ℚ<-trans₂ : (p q r s : ℚ) → p < q → q < r → r < s → p < s
ℚ<-trans₂ p q r s l₁ l₂ l₃ = ℚ<-trans p r s I l₃
 where
  I : p < r
  I = ℚ<-trans p q r l₁ l₂

ℚ<-trans₃ : (p q r s t : ℚ) → p < q → q < r → r < s → s < t → p < t
ℚ<-trans₃ p q r s t l₁ l₂ l₃ l₄ = ℚ<-trans p s t I l₄
 where
  I : p < s
  I = ℚ<-trans₂ p q r s l₁ l₂ l₃

ℚ≤-trans₂ : (p q r s : ℚ) → p ≤ q → q ≤ r → r ≤ s → p ≤ s
ℚ≤-trans₂ p q r s l₁ l₂ l₃ = ℚ≤-trans p r s I l₃
 where
  I : p ≤ r
  I = ℚ≤-trans p q r l₁ l₂

ℚ≤-trans₃ : (p q r s t : ℚ) → p ≤ q → q ≤ r → r ≤ s → s ≤ t → p ≤ t
ℚ≤-trans₃ p q r s t l₁ l₂ l₃ l₄ = ℚ≤-trans p s t I l₄
 where
  I : p ≤ s
  I = ℚ≤-trans₂ p q r s l₁ l₂ l₃

ℚ<-addition-cancellable : (a b c : ℚ) → a + b < c + b → a < c
ℚ<-addition-cancellable a b c l = transport₂ _<_ (I a b) (I c b) γ
 where
  I : (a b : ℚ) → a + b - b ＝ a
  I a b = a + b - b   ＝⟨ ℚ+-assoc a b (- b)                  ⟩
          a + (b - b) ＝⟨ ap (a +_) (ℚ-inverse-sum-to-zero b) ⟩
          a + 0ℚ      ＝⟨ ℚ-zero-right-neutral a              ⟩
          a           ∎

  γ : a + b - b < c + b - b
  γ = ℚ<-addition-preserves-order (a + b) (c + b) (- b) l

ℚ<-addition-cancellable' : (a b c : ℚ) → b + a < b + c → a < c
ℚ<-addition-cancellable' a b c l = ℚ<-addition-cancellable a b c γ
 where
  γ : a + b < c + b
  γ = transport₂ _<_ (ℚ+-comm b a) (ℚ+-comm b c) l

order-lemma : (a b c d : ℚ) → a - b < c - d → (d < b) ∔ (a < c)
order-lemma a b c d l = γ (ℚ-trichotomous a c)
 where
  γ : (a < c) ∔ (a ＝ c) ∔ (c < a) → (d < b) ∔ (a < c)
  γ (inl a<c) = inr a<c
  γ (inr (inl a＝c)) = inl (ℚ<-swap''' d b II)
   where
    I : c - b < c - d
    I = transport (λ z → z - b < c - d) a＝c l

    II : - b < - d
    II = ℚ<-addition-cancellable' (- b) c (- d) I
  γ (inr (inr c<a)) = inl (ℚ<-swap''' d b IV)
   where
    I :  - a < - c
    I = ℚ<-swap c a c<a

    II : (- a) + (a - b) < (- c) + (c - d)
    II = ℚ<-adding (- a) (- c) (a - b) (c - d) I l

    III : (a b : ℚ) → (- a) + (a - b) ＝ - b
    III a b = (- a) + (a - b) ＝⟨ ℚ+-assoc (- a) a (- b) ⁻¹            ⟩
             (- a) + a - b    ＝⟨ ap (_- b) (ℚ-inverse-sum-to-zero' a) ⟩
             0ℚ - b           ＝⟨ ℚ-zero-left-neutral (- b)            ⟩
             - b              ∎

    IV : - b < - d
    IV = transport₂ _<_ (III a b) (III c d) II

order-lemma' : (p q r : ℚ)
             → p < q
             → (p < r - 1/4 * (q - p)) ∔ (r + 1/4 * (q - p) < q)
order-lemma' p q r l = γ
 where
  ε = q - p

  I : 0ℚ < ε
  I = ℚ<-difference-positive p q l

  II : 1/2 * ε < ε
  II = half-of-pos-is-less ε I

  III : 1/2 * ε ＝ (r + 1/4 * ε) - (r - 1/4 * ε)
  III = 1/2 * ε                               ＝⟨ i    ⟩
        (1/4 + 1/4) * ε                       ＝⟨ ii   ⟩
        1/4 * ε + 1/4 * ε                     ＝⟨ iii  ⟩
        1/4 * ε - (- 1/4 * ε)                 ＝⟨ iv   ⟩
        1/4 * ε + (r - r - (- 1/4 * ε))       ＝⟨ v    ⟩
        1/4 * ε + (r + ((- r) - (- 1/4 * ε))) ＝⟨ vi   ⟩
        1/4 * ε + r + ((- r) - (- 1/4 * ε))   ＝⟨ vii  ⟩
        1/4 * ε + r - (r - 1/4 * ε)           ＝⟨ viii ⟩
        r + 1/4 * ε - (r - 1/4 * ε)           ∎
   where
    i    = ap (_* ε) 1/4+1/4
    ii   = ℚ-distributivity' ε 1/4 1/4
    iii  = ap (1/4 * ε +_) (ℚ-minus-minus (1/4 * ε))
    iv   = ap (1/4 * ε +_) (ℚ-inverse-intro' (- (- 1/4 * ε)) r)
    v    = ap (1/4 * ε +_) (ℚ+-assoc r (- r) (- (- 1/4 * ε)))
    vi   = ℚ+-assoc (1/4 * ε) r ((- r) - (- 1/4 * ε)) ⁻¹
    vii  = ap (1/4 * ε + r +_) (ℚ-minus-dist r (- 1/4 * ε))
    viii = ap (_- (r - 1/4 * ε)) (ℚ+-comm (1/4 * ε) r)

  IV : (r + 1/4 * ε) - (r - 1/4 * ε) < q - p
  IV = transport (_< q - p) III II

  γ : (p < r - 1/4 * ε) ∔ (r + 1/4 * ε < q)
  γ = order-lemma (r + 1/4 * ε) (r - 1/4 * ε) q p IV

ℚ<-swap-right-add : (p q r : ℚ) → p < q + r → (- q) - r < - p
ℚ<-swap-right-add p q r l = γ
 where
  I : - (q + r) < - p
  I = ℚ<-swap p (q + r) l

  II : - (q + r) ＝ (- q) - r
  II = ℚ-minus-dist q r ⁻¹

  γ : (- q) - r < - p
  γ = transport (_< - p) II I

ℚ<-swap-left-neg : (p q r : ℚ) → p - q < r → - r < (- p) + q
ℚ<-swap-left-neg p q r l = γ
 where
  I : - r <ℚ - (p - q)
  I = ℚ<-swap (p - q) r l

  II : - (p - q) ＝ (- p) + q
  II = - (p - q)     ＝⟨ ℚ-minus-dist p (- q) ⁻¹            ⟩
       (- p) - (- q) ＝⟨ ap ((- p) +_) (ℚ-minus-minus q ⁻¹) ⟩
       (- p) + q     ∎

  γ : - r < (- p) + q
  γ = transport (- r <_) II I

ℚ≤-addition-preserves-order-left : (p q r : ℚ) → p ≤ q → r + p ≤ r + q
ℚ≤-addition-preserves-order-left p q r l = γ
 where
  I : p + r ＝ r + p
  I = ℚ+-comm p r

  II : q + r ＝ r + q
  II = ℚ+-comm q r

  γ : r + p ≤ r + q
  γ = transport₂ _≤_ I II (ℚ≤-addition-preserves-order p q r l)

\end{code}
