Tom de Jong, 3 - 5 March 2020

As suggested by Martin Escardo.

The (usual) order on the dyadic rationals

\begin{code}

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

open import MLTT.Spartan
open import DyadicsInductive.Dyadics
open import UF.Subsingletons

\end{code}

We inductively define an order ≺ on 𝔻 and prove that it is transitive and
linear.

We also show that is is "dense" and "has no endpoints", but formulated using Σ
rather than ∃. Although the proper formulation would use ∃ (to ensure that being
dense and having no endpoints is property, rather than structure), we still
prove the Σ-versions for two reasons:
- we can easily prove them and derive the ∃-versions from them;
- so that this module does not depend on propositional truncation.

\begin{code}

module DyadicsInductive.DyadicOrder where

\end{code}

We defined ≺ by using the translation (from 𝔻 to (-1,1)) as set out in Dyadic.

\begin{code}

_≺_ : 𝔻  𝔻  𝓤₀ ̇
middle   middle  = 𝟘
middle   left y  = 𝟘
middle   right y = 𝟙
left x   middle  = 𝟙
left x   left y  = x  y
left x   right y = 𝟙
right x  middle  = 𝟘
right x  left y  = 𝟘
right x  right y = x  y

\end{code}

Monotonicity of left and right holds by definition (so we will never call these
lemmas), but we record them here for clarity.

\begin{code}

left-monotone : {x y : 𝔻}  x  y  left x  left y
left-monotone = id

right-monotone : {x y : 𝔻}  x  y  right x  right y
right-monotone = id

\end{code}

\begin{code}

≺-is-prop-valued : (x y : 𝔻)  is-prop (x  y)
≺-is-prop-valued middle    middle    = 𝟘-is-prop
≺-is-prop-valued middle    (left y)  = 𝟘-is-prop
≺-is-prop-valued middle    (right y) = 𝟙-is-prop
≺-is-prop-valued (left x)  middle    = 𝟙-is-prop
≺-is-prop-valued (left x)  (left y)  = ≺-is-prop-valued x y
≺-is-prop-valued (left x)  (right y) = 𝟙-is-prop
≺-is-prop-valued (right x) middle    = 𝟘-is-prop
≺-is-prop-valued (right x) (left y)  = 𝟘-is-prop
≺-is-prop-valued (right x) (right y) = ≺-is-prop-valued x y

≺-is-transitive : (x y z : 𝔻)  x  y  y  z  x  z
≺-is-transitive middle middle z = 𝟘-induction
≺-is-transitive middle (left y) middle = 𝟘-induction
≺-is-transitive middle (left y) (left z) = 𝟘-induction
≺-is-transitive middle (left y) (right z) = 𝟘-induction
≺-is-transitive middle (right y) middle _ = id
≺-is-transitive middle (right y) (left z) _ = id
≺-is-transitive middle (right y) (right z) _ _ = 
≺-is-transitive (left x) middle middle _ _ = 
≺-is-transitive (left x) middle (left z) _ = 𝟘-induction
≺-is-transitive (left x) middle (right z) _ = id
≺-is-transitive (left x) (left y) middle _ = id
≺-is-transitive (left x) (left y) (left z) = ≺-is-transitive x y z
≺-is-transitive (left x) (left y) (right z) _ = id
≺-is-transitive (left x) (right y) middle _ _ = 
≺-is-transitive (left x) (right y) (left z) _ = 𝟘-induction
≺-is-transitive (left x) (right y) (right z) _ _ = 
≺-is-transitive (right x) middle z = 𝟘-induction
≺-is-transitive (right x) (left y) z = 𝟘-induction
≺-is-transitive (right x) (right y) middle _ = id
≺-is-transitive (right x) (right y) (left z) _ = id
≺-is-transitive (right x) (right y) (right z) = ≺-is-transitive x y z

≺-is-linear : (x y : 𝔻)  x  y  x  y + y  x
≺-is-linear middle middle p = 𝟘-induction (p refl)
≺-is-linear middle (left y) _ = inr 
≺-is-linear middle (right y) _ = inl 
≺-is-linear (left x) middle _ = inl 
≺-is-linear (left x) (left y) lx≠ly = ≺-is-linear x y x≠y
 where
  x≠y : x  y
  x≠y = contrapositive (ap left) lx≠ly
≺-is-linear (left x) (right y) _ = inl 
≺-is-linear (right x) middle _ = inr 
≺-is-linear (right x) (left y) _ = inr 
≺-is-linear (right x) (right y) rx≠ry = ≺-is-linear x y x≠y
 where
  x≠y : x  y
  x≠y = contrapositive (ap right) rx≠ry

\end{code}

Discreteness of 𝔻 and linearity of ≺ imply that ≺ is trichotomous, i.e. for
every x y : 𝔻 , x ≺ y or x = y or y ≺ x holds. The lemmas after
≺-is-trichotomous show that exactly one of these is the case, as witnessed by
trichotomy-is-a-singleton.

\begin{code}

≺-is-trichotomous : (x y : 𝔻)  x  y + (x  y) + (y  x)
≺-is-trichotomous x y = cases a b (𝔻-is-discrete x y)
 where
  a : x  y  (x  y) + (x  y) + (y  x)
  a = inr  inl
  b : (x  y)  (x  y) + (x  y) + (y  x)
  b n = cases c d (≺-is-linear x y n)
   where
    c : x  y  (x  y) + (x  y) + (y  x)
    c = inl
    d : y  x  (x  y) + (x  y) + (y  x)
    d = inr  inr

≺-to-≠ : {x y : 𝔻}  x  y  x  y
≺-to-≠ {middle}  {middle}      = 𝟘-induction
≺-to-≠ {middle}  {left y}      = 𝟘-induction
≺-to-≠ {middle}  {right y} _   = middle-is-not-right
≺-to-≠ {left x}  {middle}  _   =  p  middle-is-not-left (p ⁻¹))
≺-to-≠ {left x}  {left y}  x≺y = contrapositive left-lc (≺-to-≠ x≺y)
≺-to-≠ {left x}  {right y} _   = left-is-not-right
≺-to-≠ {right x} {middle}      = 𝟘-induction
≺-to-≠ {right x} {left y}      = 𝟘-induction
≺-to-≠ {right x} {right y} x≺y = contrapositive right-lc (≺-to-≠ x≺y)

≺-to-≠' : {x y : 𝔻}  y  x  x  y
≺-to-≠' l e = ≺-to-≠ l (e ⁻¹)

=-to-¬≺ : {x y : 𝔻}  x  y  ¬ (x  y)
=-to-¬≺ e l = ≺-to-≠ l e

=-to-¬≺' : {x y : 𝔻}  x  y  ¬ (y  x)
=-to-¬≺' e l = ≺-to-≠ l (e ⁻¹)

≺-to-¬≺ : (x y : 𝔻)  x  y  ¬ (y  x)
≺-to-¬≺ middle    middle      = 𝟘-induction
≺-to-¬≺ middle    (left y)    = 𝟘-induction
≺-to-¬≺ middle    (right y) _ = id
≺-to-¬≺ (left x)  middle    _ = id
≺-to-¬≺ (left x)  (left y)    = ≺-to-¬≺ x y
≺-to-¬≺ (left x)  (right y) _ = id
≺-to-¬≺ (right x) middle      = 𝟘-induction
≺-to-¬≺ (right x) (left y)    = 𝟘-induction
≺-to-¬≺ (right x) (right y)   = ≺-to-¬≺ x y

trichotomy-is-a-singleton : {x y : 𝔻}  is-singleton (x  y + (x  y) + y  x)
trichotomy-is-a-singleton {x} {y} =
 pointed-props-are-singletons (≺-is-trichotomous x y) γ
  where
   γ : is-prop (x  y + (x  y) + y  x)
   γ = +-is-prop (≺-is-prop-valued x y) h g
    where
     h : is-prop ((x  y) + y  x)
     h = +-is-prop 𝔻-is-set (≺-is-prop-valued y x) =-to-¬≺'
     g : x  y  ¬ ((x  y) + y  x)
     g l = cases a b
      where
       a : x  y
       a = ≺-to-≠ l
       b : ¬ (y  x)
       b = ≺-to-¬≺ x y l

\end{code}

Next, we prove that ≺ has no endpoints and is dense (although formulated with Σ,
as explained at the top of this file).

\begin{code}

left-≺ : (x : 𝔻)  left x  x
left-≺ middle    = 
left-≺ (left x)  = left-≺ x
left-≺ (right x) = 

≺-right : (x : 𝔻)  x  right x
≺-right middle    = 
≺-right (left x)  = 
≺-right (right x) = ≺-right x

≺-has-no-left-endpoint-Σ : (x : 𝔻)  Σ y  𝔻 , y  x
≺-has-no-left-endpoint-Σ x = left x , left-≺ x

≺-has-no-right-endpoint-Σ : (x : 𝔻)  Σ y  𝔻 , x  y
≺-has-no-right-endpoint-Σ x = right x , ≺-right x

≺-is-dense-Σ : (x y : 𝔻)  x  y  Σ z  𝔻 , x  z × z  y
≺-is-dense-Σ middle (right y) _ = right (left y) ,  , left-≺ y
≺-is-dense-Σ (left x) middle _ = left (right x) , ≺-right x , 
≺-is-dense-Σ (left x) (left y) x≺y = γ (≺-is-dense-Σ x y x≺y)
 where
  γ : (Σ z  𝔻 , x  z × z  y)  Σ z  𝔻 , left x  z × z  left y
  γ (z , x≺z , z≺y) = left z , x≺z , z≺y
≺-is-dense-Σ (left x) (right y) _ = middle ,  , 
≺-is-dense-Σ (right x) middle = 𝟘-induction
≺-is-dense-Σ (right x) (left y) = 𝟘-induction
≺-is-dense-Σ (right x) (right y) l = γ (≺-is-dense-Σ x y l)
 where
  γ : (Σ z  𝔻 , x  z × z  y)  Σ z  𝔻 , right x  z × z  right y
  γ (z , m , n) = right z , m , n

\end{code}

Binary interpolation is a generalisation of density, which can, in our case, be
proved from density using trichotomy of ≺.

We will need this property to construct the (rounded) ideal completion of
(𝔻 , ≺).

\begin{code}

≺-interpolation₂-Σ : (x₁ x₂ y : 𝔻)  x₁  y  x₂  y
                    Σ z  𝔻 , x₁  z × x₂  z × z  y
≺-interpolation₂-Σ x₁ x₂ y l₁ l₂ = cases₃ a b c (≺-is-trichotomous x₁ x₂)
 where
  a : x₁  x₂  Σ z  𝔻 , x₁  z × x₂  z × z  y
  a k = γ (≺-is-dense-Σ x₂ y l₂)
   where
    γ : (Σ z  𝔻 , x₂  z × z  y)  Σ z  𝔻 , x₁  z × x₂  z × z  y
    γ (z , m , n) = z , ≺-is-transitive x₁ x₂ z k m , m , n
  b : x₁  x₂  Σ z  𝔻 , x₁  z × x₂  z × z  y
  b refl = γ (≺-is-dense-Σ x₁ y l₁)
   where
    γ : (Σ z  𝔻 , x₁  z × z  y)  Σ z  𝔻 , x₁  z × x₂  z × z  y
    γ (z , m , n) = z , m , m , n
  c : x₂  x₁  Σ z  𝔻 , x₁  z × x₂  z × z  y
  c k = γ (≺-is-dense-Σ x₁ y l₁)
   where
    γ : (Σ z  𝔻 , x₁  z × z  y)  Σ z  𝔻 , x₁  z × x₂  z × z  y
    γ (z , m , n) = z , m , ≺-is-transitive x₂ x₁ z k m , n

\end{code}