Todd Waugh Ambridge, January 2024

# Structural properties of ternary Boehm encodings

\begin{code}
{-# OPTIONS --without-K --safe #-}

open import Integers.Addition renaming (_+_ to _ℤ+_)
open import Notation.Order
open import Integers.Order
open import Integers.Type
open import MLTT.Spartan
open import Naturals.Addition renaming (_+_ to _ℕ+_)

open import TWA.Thesis.Chapter5.Integers

module TWA.Thesis.Chapter5.BoehmStructure where
\end{code}

## downLeft, downMid and downRight

\begin{code}
downLeft downMid downRight :   
downLeft  a = a ℤ+ a
downMid   a = succℤ (downLeft a)
downRight a = succℤ (downMid  a)
\end{code}

## downLeft and downRight properties

\begin{code}
pred-downMid : (a : )  predℤ (downMid a)  downLeft a
pred-downMid a = predsuccℤ _

pred-downRight : (a : )  predℤ (downRight a)  downMid a
pred-downRight a = predsuccℤ _

pred-pred-downRight
 : (a : )  predℤ (predℤ (downRight a))  downLeft a
pred-pred-downRight a = ap predℤ (predsuccℤ _)  predsuccℤ _

downLeft-monotone' : (a b : )  ((n , _) : a ≤ℤ b)
                    downLeft a +pos (n ℕ+ n)  downLeft b
downLeft-monotone' a b (n , refl)
 = ap ((a ℤ+ a) ℤ+_) (distributivity-pos-addition n n ⁻¹)
  ℤ+-rearrangement (a ℤ+ a) (pos n) (pos n) ⁻¹
  ap  -  (- +pos n) +pos n) (ℤ+-comm a a)
  ap (_+pos n)
     (ℤ+-assoc a a (pos n)
      ap (a ℤ+_) (ℤ+-comm a (pos n))
      ℤ+-assoc a (pos n) a ⁻¹)
  ℤ+-assoc (a +pos n) a (pos n)

ℤ≤<-trans : (a b c : )  a ≤ℤ b  b <ℤ c  a <ℤ c
ℤ≤<-trans a b c (m , refl) (n , refl)
 = m ℕ+ n
 , (ap (succℤ a ℤ+_) (distributivity-pos-addition m n ⁻¹)
  ℤ+-assoc (succℤ a) (pos m) (pos n) ⁻¹ 
  ap (_+pos n) (ℤ-left-succ-pos a m))

downLeft<<downRight : (a b : )  a <ℤ b  downLeft a <ℤ downRight b
downLeft<<downRight a b (n , refl)
 = (succ (succ (succ (n ℕ+ n))))
 , ap (succℤ  succℤ)
     (ap succℤ
       (ap (_+pos (n ℕ+ n)) (ℤ-left-succ a a ⁻¹)
        ap ((succℤ a ℤ+ a) ℤ+_) (distributivity-pos-addition n n ⁻¹)
        ℤ+-rearrangement (succℤ a ℤ+ a) (pos n) (pos n) ⁻¹
        ap  -  (- +pos n) +pos n) (ℤ+-comm (succℤ a) a)
        ap (_+pos n)
           (ℤ+-assoc a (succℤ a) (pos n)
          ap (a ℤ+_) (ℤ+-comm (succℤ a) (pos n))
          ℤ+-assoc a (pos n) (succℤ a) ⁻¹)
        ℤ+-assoc (a +pos n) (succℤ a) (pos n))
    ℤ-left-succ (a +pos n) (succℤ a +pos n) ⁻¹
    ap (_ℤ+ (succℤ a +pos n)) (ℤ-left-succ-pos a n ⁻¹))

downLeft<downRight
 : (a : ) (n : )
  rec a downLeft (succ n) <ℤ rec a downRight (succ n)
downLeft<downRight a zero = 1 , refl
downLeft<downRight a (succ n)
 = downLeft<<downRight _ _ (downLeft<downRight a n)

downLeft≤downRight
 : (a : ) (n : )  rec a downLeft n ≤ℤ rec a downRight n
downLeft≤downRight a 0 = zero , refl
downLeft≤downRight a (succ n) = <-is-≤ _ _ (downLeft<downRight a n)

downLeft-≤-succ : (a : )  downLeft a ≤ℤ downLeft (succℤ a)
downLeft-≤-succ a
 = 2 , (ap succℤ (ℤ-left-succ a a ⁻¹)  ℤ-right-succ (succℤ a) a ⁻¹)

downLeft-monotone : (a b : )  a ≤ℤ b  downLeft a ≤ℤ downLeft b
downLeft-monotone = ≤-succ-to-monotone downLeft downLeft-≤-succ

downLeftⁿ-monotone : (a b : ) (n : )  a ≤ℤ b
                    rec a downLeft (succ n) ≤ℤ rec b downLeft (succ n)
downLeftⁿ-monotone a b 0 a≤b
 = downLeft-monotone a b a≤b
downLeftⁿ-monotone a b (succ n) a≤b
 = downLeft-monotone _ _ (downLeftⁿ-monotone a b n a≤b)

downRight-≤-succ : (a : )  downRight a ≤ℤ downRight (succℤ a)
downRight-≤-succ a = 2 , ap (succℤ  succℤ) (pr₂ (downLeft-≤-succ a))

downRight-monotone : (a b : )  a ≤ℤ b  downRight a ≤ℤ downRight b
downRight-monotone = ≤-succ-to-monotone downRight downRight-≤-succ

downRightⁿ-monotone
 : (a b : ) (n : )
  a ≤ℤ b
  rec a downRight (succ n) ≤ℤ rec b downRight (succ n)
downRightⁿ-monotone a b 0 a≤b
 = downRight-monotone a b a≤b
downRightⁿ-monotone a b (succ n) a≤b
 = downRight-monotone _ _ (downRightⁿ-monotone a b n a≤b)

downLeft≤<downRight : (a b : )  a ≤ℤ b  downLeft a <ℤ downRight b
downLeft≤<downRight a b a≤b
 = ℤ≤<-trans _ _ _ (downLeft-monotone _ _ a≤b) (downLeft<downRight b 0)

downLeft≠downMid : (a b : )  a  b  downLeft a  downMid b
downLeft≠downMid a a refl
 = ℤ-less-not-equal (downLeft a) (downMid a)
     (0 , refl)

downLeft≠downRight : (a b : )  a  b  downLeft a  downRight b
downLeft≠downRight a a refl
 = ℤ-less-not-equal (downLeft a) (downRight a)
     (1 , refl)

downMid≠downRight : (a b : )  a  b  downMid a  downRight b
downMid≠downRight a a refl
 = ℤ-less-not-equal (downMid a) (downRight a)
     (0 , refl)

downRight=downLeft : (a : )  downRight a  downLeft (succℤ a)
downRight=downLeft a
 = ap succℤ (ℤ-left-succ a a ⁻¹  ℤ+-comm (succℤ a) a)
  ℤ-left-succ a (succℤ a) ⁻¹
\end{code}

## below and below'

\begin{code}
_below_ :     𝓤₀ ̇ 
a below b = downLeft b  a  downRight b

downLeft-below  : (a : )  downLeft a below a
downLeft-below  a = (0 , refl) , (2 , refl)

downMid-below   : (a : )  downMid a below a
downMid-below   a = (1 , refl) , (1 , refl)

downRight-below : (a : )  downRight a below a
downRight-below a = (2 , refl) , (0 , refl)

_below'_ :     𝓤₀ ̇
a below' b = (a  downLeft b) + (a  downMid b) + (a  downRight b)

below'-implies-below : (a b : )  a below' b  a below b
below'-implies-below .(downLeft  b) b (inl      refl )
 = downLeft-below b
below'-implies-below .(downMid   b) b (inr (inl refl))
 = downMid-below b
below'-implies-below .(downRight b) b (inr (inr refl))
 = downRight-below b

below-implies-below' : (a b : )  a below b  a below' b
below-implies-below' a b ((0 , e) , _)
 = inl (e ⁻¹)
below-implies-below' a b ((1 , e) , _)
 = (inr  inl) (e ⁻¹)
below-implies-below' a b ((2 , e) , _)
 = (inr  inr) (e ⁻¹)
below-implies-below' a b ((succ (succ (succ _)) , _) , (0 , f))
 = (inr  inr) f
below-implies-below' a b ((succ (succ (succ _)) , _) , (1 , f))
 = (inr  inl) (succℤ-lc f)
below-implies-below' a b ((succ (succ (succ _)) , _) , (2 , f))
 = inl (succℤ-lc (succℤ-lc f))
below-implies-below' a b
 ((succ (succ (succ n)) , e) , (succ (succ (succ m)) , f))
 = 𝟘-elim (k≠2 k=2)
 where
   k : 
   k = (succ (succ (succ (succ (succ (succ (n ℕ+ m)))))))
   η : downLeft b +pos k  downRight b
   η = ap ((succℤ ^ 6)  downLeft b ℤ+_)
          (distributivity-pos-addition n m ⁻¹)
      ap (succℤ ^ 6)
         (ℤ+-assoc (downLeft b) (pos n) (pos m) ⁻¹)
      ap (succℤ ^ 5)
         (ℤ-left-succ-pos (downLeft b +pos n) m ⁻¹)
      ap (succℤ ^ 4)
         (ℤ-left-succ-pos (succℤ (downLeft b +pos n)) m ⁻¹)
      ap (succℤ ^ 3)
         (ℤ-left-succ-pos ((succℤ ^ 2) (downLeft b +pos n)) m ⁻¹)
      ap ((succℤ ^ 3)  (_+pos m)) e
      f
   ζ : downLeft b +pos 2  downRight b
   ζ = refl
   k=2 : k  2
   k=2 = pos-lc (ℤ+-lc (pos k) (pos 2) (downLeft b) (η  ζ ⁻¹))
   k≠2 : k  2
   k≠2 = λ ()
\end{code}

## upLeft and upRight

\begin{code}
upRight :   
upRight x = sign x (num x /2)

upLeft :   
upLeft x = upRight (predℤ x)
\end{code}

## upLeft and upRight properties

\begin{code}
upRight-suc : (a : )  upRight (succℤ (succℤ a))  succℤ (upRight a)
upRight-suc (pos zero) = refl
upRight-suc (pos (succ zero)) = refl
upRight-suc (pos (succ (succ x))) = refl
upRight-suc (negsucc zero) = refl
upRight-suc (negsucc (succ zero)) = refl
upRight-suc (negsucc (succ (succ x))) = refl

upRight-pred : (a : )  upRight (predℤ (predℤ a))  predℤ (upRight a)
upRight-pred (pos 0) = refl
upRight-pred (pos 1) = refl
upRight-pred (pos (succ (succ x))) = refl
upRight-pred (negsucc 0) = refl
upRight-pred (negsucc 1) = refl
upRight-pred (negsucc (succ (succ x))) = refl

upLeft-suc : (a : )  upLeft (succℤ (succℤ a))  succℤ (upLeft a)
upLeft-suc (pos zero) = refl
upLeft-suc (pos (succ zero)) = refl
upLeft-suc (pos (succ (succ x))) = refl
upLeft-suc (negsucc zero) = refl
upLeft-suc (negsucc (succ zero)) = refl
upLeft-suc (negsucc (succ (succ x))) = refl

upLeft-pred : (a : )  upLeft (predℤ (predℤ a))  predℤ (upLeft a)
upLeft-pred = upRight-pred  predℤ

upRight-succ-pos : (a : )  upRight (pos a) ≤ℤ upRight (succℤ (pos a))
upRight-succ-pos 0 = 0 , refl
upRight-succ-pos 1 = 1 , refl
upRight-succ-pos (succ (succ a))
 = m , (ℤ-left-succ-pos (pos (a /2)) m  ap succℤ (pr₂ IH))
 where
   IH = upRight-succ-pos a
   m = pr₁ IH

upRight-succ-negsucc
 : (a : )  upRight (negsucc a) ≤ℤ upRight (succℤ (negsucc a))
upRight-succ-negsucc 0 = 1 , refl
upRight-succ-negsucc 1 = 0 , refl
upRight-succ-negsucc (succ (succ a))
 = m , (ℤ-left-pred-pos (negsucc (a /2)) m
        ap predℤ (pr₂ IH)
        upRight-pred _ ⁻¹
        ap (upRight  predℤ) (predsuccℤ _))
 where
   IH = upRight-succ-negsucc a
   m = pr₁ IH

upRight-≤-succ : (a : )  upRight a ≤ℤ upRight (succℤ a)
upRight-≤-succ = ℤ-elim  a  upRight a ≤ℤ upRight (succℤ a))
                   upRight-succ-pos upRight-succ-negsucc

upRight-monotone : (a b : )  a ≤ℤ b  upRight a ≤ℤ upRight b
upRight-monotone = ≤-succ-to-monotone upRight upRight-≤-succ

upLeft-monotone : (a b : )  a ≤ℤ b  upLeft a ≤ℤ upLeft b
upLeft-monotone a b (n , refl)
 = upRight-monotone _ _ (n , ℤ-left-pred-pos a n)

upRight≤upLeft-succ : (a : )  upRight a  upLeft (succℤ a)
upRight≤upLeft-succ a = ap upRight (predsuccℤ _ ⁻¹)

upRight≤upLeft : (a b : )  a <ℤ b  upRight a ≤ℤ upLeft b
upRight≤upLeft a b (n      , refl)
 = transport (_≤ℤ upLeft (succℤ a +pos n)) (upRight≤upLeft-succ a ⁻¹)
     (upLeft-monotone _ _ (n , refl))

upRight-<-succ-succ : (a : )  upRight a <ℤ upRight (succℤ (succℤ a))
upRight-<-succ-succ a
 = transport (upRight a <ℤ_) (upRight-suc a ⁻¹) (0 , refl)

upRight-<<' : (a b : ) (n : )  (a +pos succ n)  predℤ b
             upRight a <ℤ upRight b
upRight-<<' a b zero e
 = transport  -  upRight a <ℤ upRight -)
     (ap succℤ e  succpredℤ _)
     (upRight-<-succ-succ a)
upRight-<<' a b (succ n) e
 = transport  -  upRight a <ℤ upRight -)
     (ap succℤ e  succpredℤ _)
     (ℤ≤-trans _ _ _ (upRight-<-succ-succ a)
       (upRight-monotone _ _
       (succ n , ap succℤ (ℤ-left-succ-pos (succℤ a) n
                ap succℤ (ℤ-left-succ-pos a n)))))
 
upRight-<< : (a b : )  a <ℤ predℤ b  upRight a <ℤ upRight b
upRight-<< a b (n , e)
 = upRight-<<' a b n (ℤ-left-succ-pos a n ⁻¹  e)

upLeft-<< : (a b : )  a <ℤ b  upLeft a <ℤ upRight b
upLeft-<< a b (n , refl)
 = upRight-<< (predℤ a) b
     (n , (ap (_+pos n) (succpredℤ _)  predsuccℤ _ ⁻¹
          ap predℤ (ℤ-left-succ-pos a n ⁻¹)))
\end{code}

## above and above'

\begin{code}
_above_ :     𝓤₀ ̇ 
b above a = upLeft a ≤ℤ b ≤ℤ upRight a

_above'_ :     𝓤₀ ̇
a above' b = (a  upLeft b) + (a  upRight b)

upLeft-=-+-pos : (a : )  (upLeft (pos a)  upRight (pos a))
                         + (succℤ (upLeft (pos a))  upRight (pos a))
upLeft-=-+-pos 0 = inr refl
upLeft-=-+-pos 1 = inl refl
upLeft-=-+-pos (succ (succ a))
 = Cases (upLeft-=-+-pos a)
      l  inl (upLeft-suc (pos a)  ap succℤ l))
      r  inr (ap succℤ (upLeft-suc (pos a)  r)))

upLeft-=-+-negsucc
 : (a : )
  (upLeft (negsucc a)  upRight (negsucc a))
 + (succℤ (upLeft (negsucc a))  upRight (negsucc a))
upLeft-=-+-negsucc 0 = inl refl
upLeft-=-+-negsucc 1 = inr refl
upLeft-=-+-negsucc (succ (succ a))
 = Cases (upLeft-=-+-negsucc a)
       l  inl (upLeft-pred (negsucc a)  ap predℤ l))
       r  inr (predsuccℤ _ ⁻¹  ap predℤ r))

upLeft-=-+
 : (a : )  (upLeft a  upRight a) + (succℤ (upLeft a)  upRight a)
upLeft-=-+ = ℤ-elim _ upLeft-=-+-pos upLeft-=-+-negsucc

upLeft≤upRight : (a : )  upLeft a ≤ℤ upRight a
upLeft≤upRight a = upRight-monotone _ _ (1 , succpredℤ _)

upLeft-upRight-mono : (a b : )  a ≤ℤ b  upLeft a ≤ℤ upRight b
upLeft-upRight-mono a b a≤b
 = ℤ≤-trans _ _ _ (upLeft-monotone _ _ a≤b) (upLeft≤upRight b)

upLeft≤upRightⁿ : (a : ) (n : )  rec a upLeft n ≤ℤ rec a upRight n
upLeft≤upRightⁿ a 0 = ℤ≤-refl a
upLeft≤upRightⁿ a 1 = upLeft≤upRight a
upLeft≤upRightⁿ a (succ (succ n))
 = upLeft-upRight-mono _ _ (upLeft≤upRightⁿ a (succ n))

upLeft-above : (a : )  upLeft a above a
upLeft-above a = ℤ≤-refl _ , upLeft≤upRight a

upRight-above : (a : )  upRight a above a
upRight-above a = upLeft≤upRight a , ℤ≤-refl _

above'-implies-above : (a b : )  a above' b  a above b
above'-implies-above .(upLeft  b) b (inl refl) = upLeft-above b
above'-implies-above .(upRight b) b (inr refl) = upRight-above b

above-implies-above' : (a b : )  a above b  a above' b
above-implies-above' a b (l≤a , a≤r)
 = Cases (ℤ≤-split (upLeft b) a l≤a)
      l<a  Cases (ℤ≤-split a (upRight b) a≤r)
        a<r  𝟘-elim
                  (Cases (upLeft-=-+ b)
                     e  ℤ-less-not-bigger-or-equal (upLeft b) a
                             l<a
                             (transport (a ≤ℤ_) (e ⁻¹) a≤r))
                     e  ℤ-less-not-bigger-or-equal a (upRight b)
                             a<r
                             (transport (_≤ℤ a) e l<a))))
       inr)
     (inl  _⁻¹)
\end{code}

## Relationship between below and above

\begin{code}
upRight-downLeft-pos : (b : )  pos b  upRight (downLeft (pos b))
upRight-downLeft-pos 0 = refl
upRight-downLeft-pos (succ b)
 = ap succℤ (upRight-downLeft-pos b)
  upRight-suc (downLeft (pos b)) ⁻¹
  ap (upRight  succℤ) (ℤ-left-succ-pos (pos b) b ⁻¹)

upRight-downLeft-negsucc
 : (b : )  negsucc b  upRight (downLeft (negsucc b))
upRight-downLeft-negsucc 0 = refl
upRight-downLeft-negsucc (succ b)
 = ap predℤ (upRight-downLeft-negsucc b)
  upRight-pred (downLeft (negsucc b)) ⁻¹
  ap (upRight  predℤ) (ℤ-left-pred-negsucc (negsucc b) b ⁻¹)

upRight-downMid-pos : (b : )  pos b  upRight (downMid (pos b))
upRight-downMid-pos 0 = refl
upRight-downMid-pos (succ b)
 = ap succℤ (upRight-downMid-pos b)
  upRight-suc (downMid (pos b)) ⁻¹
  ap (upRight  succℤ  succℤ) (ℤ-left-succ-pos (pos b) b ⁻¹)

upRight-downMid-negsucc
 : (b : )  negsucc b  upRight (downMid (negsucc b))
upRight-downMid-negsucc 0 = refl
upRight-downMid-negsucc (succ b)
 = ap predℤ (upRight-downMid-negsucc b)
  upRight-pred (downMid (negsucc b)) ⁻¹
  ap (upRight  predℤ) (predsuccℤ _)
  ap upRight (ℤ-left-pred-negsucc (negsucc b) b ⁻¹)
  ap upRight (succpredℤ _ ⁻¹)

upRight-downLeft : (a : )  a  upRight (downLeft a)
upRight-downLeft
 = ℤ-elim _ upRight-downLeft-pos upRight-downLeft-negsucc

upRight-downMid : (a : )  a  upRight (downMid a)
upRight-downMid = ℤ-elim _ upRight-downMid-pos upRight-downMid-negsucc

upRight-downRight : (a : )  succℤ a  upRight (downRight a)
upRight-downRight a = ap succℤ (upRight-downLeft a)
                     upRight-suc (downLeft a) ⁻¹

upLeft-downLeft : (a : )  succℤ (upLeft (downLeft a))  a
upLeft-downLeft a = upRight-suc (predℤ (downLeft a)) ⁻¹
                   ap (upRight  succℤ) (succpredℤ _)
                   upRight-downMid a ⁻¹

upLeft-downMid : (a : )  upLeft (downMid a)  a
upLeft-downMid a = ap upRight (pred-downMid a)  upRight-downLeft a ⁻¹

upLeft-downRight : (a : )  upLeft (downRight a)  a
upLeft-downRight a
 = ap upRight (pred-downRight a)  upRight-downMid a ⁻¹

below-implies-above-dL : (b : )  b above (downLeft b)
below-implies-above-dL b
 = (1 , upLeft-downLeft  b)
 , (0 , upRight-downLeft b)

below-implies-above-dM : (b : )  b above (downMid b)
below-implies-above-dM b
 = (0 , upLeft-downMid  b)
 , (0 , upRight-downMid b)

below-implies-above-dR : (b : )  b above (downRight b)
below-implies-above-dR b
 = (0 , upLeft-downRight  b)
 , (1 , upRight-downRight b)

below'-implies-above : (a b : )  a below' b  b above a
below'-implies-above .(downLeft  b) b (inl refl)
 = below-implies-above-dL b
below'-implies-above .(downMid   b) b (inr (inl refl))
 = below-implies-above-dM b
below'-implies-above .(downRight b) b (inr (inr refl))
 = below-implies-above-dR b

dL-transform : (a : )  downLeft (succℤ a)  (succℤ ^ 2) (downLeft a)
dL-transform a = ℤ-left-succ a (succℤ a)  ap succℤ (ℤ-right-succ a a)

dL-transform-pred
 : (a : )  downLeft (predℤ a)  (predℤ ^ 2) (downLeft a)
dL-transform-pred a
 = ℤ-left-pred a (predℤ a)  ap predℤ (ℤ-right-pred a a)

dR-transform
 : (a : )  downRight (succℤ a)  (succℤ ^ 2) (downRight a)
dR-transform a = ap (succℤ ^ 2) (dL-transform a)

dR-transform-pred
 : (a b : )  downRight (predℤ a)  (predℤ ^ 2) (downRight a)
dR-transform-pred a b = ap (succℤ ^ 2) (dL-transform-pred a)
                       ap succℤ (succpredℤ _)
                       succpredℤ _
                       predsuccℤ _ ⁻¹
                       ap predℤ (predsuccℤ _ ⁻¹)

downLeft-upRight : (b : )  downLeft (upRight b) ≤ℤ b
downLeft-upRight
 = ℤ-elim _ downLeft-upRight-pos downLeft-upRight-negsucc
 where
  downLeft-upRight-pos : (b : )  downLeft (upRight (pos b)) ≤ℤ pos b
  downLeft-upRight-pos 0 = 0 , refl
  downLeft-upRight-pos 1 = 1 , refl
  downLeft-upRight-pos (succ (succ b))
   = transport (_≤ℤ succℤ (succℤ (pos b)))
      ((ap downLeft (upRight-suc (pos b))
         dL-transform (upRight (pos b))) ⁻¹)
      (ℤ≤-succⁿ-inj _ _ 2 (downLeft-upRight-pos b))
  downLeft-upRight-negsucc
   : (b : )  downLeft (upRight (negsucc b)) ≤ℤ negsucc b
  downLeft-upRight-negsucc 0 = 1 , refl
  downLeft-upRight-negsucc 1 = 0 , refl
  downLeft-upRight-negsucc (succ (succ b))
   = transport (_≤ℤ predℤ (predℤ (negsucc b)))
       ((ap downLeft (upRight-pred (negsucc b))
          dL-transform-pred (upRight (negsucc b))) ⁻¹)
       (ℤ≤-predⁿ-inj _ _ 2 (downLeft-upRight-negsucc b))

downLeft-upLeft  : (b : )  downLeft (upLeft b) ≤ℤ b
downLeft-upLeft b
 = ℤ≤-trans _ _ _
     (downLeft-monotone _ _ (upLeft≤upRight b))
     (downLeft-upRight b)

downRight-upLeft-pos : (b : )  pos b ≤ℤ downRight (upLeft (pos b))
downRight-upLeft-pos 0 = 0 , refl
downRight-upLeft-pos 1 = 1 , refl
downRight-upLeft-pos (succ (succ b))
 = transport ((succℤ ^ 2) (pos b) ≤ℤ_)
    ((ap downRight (upLeft-suc (pos b))
       dR-transform (upLeft (pos b))) ⁻¹)
    (ℤ≤-succⁿ-inj _ _ 2 (downRight-upLeft-pos b))

downRight-upLeft-negsucc
 : (b : )  negsucc b ≤ℤ downRight (upLeft (negsucc b))
downRight-upLeft-negsucc 0 = 1 , refl
downRight-upLeft-negsucc 1 = 0 , refl
downRight-upLeft-negsucc (succ (succ b))
 = transport ((predℤ ^ 2) (negsucc b) ≤ℤ_)
     ((ap downRight (upLeft-pred (negsucc b))
       dR-transform-pred (upLeft (negsucc b)) (pos b)) ⁻¹)
     (ℤ≤-predⁿ-inj _ _ 2 (downRight-upLeft-negsucc b)) 
 
downRight-upLeft : (b : )  b ≤ℤ downRight (upLeft b)
downRight-upLeft
 = ℤ-elim _ downRight-upLeft-pos downRight-upLeft-negsucc

downRight-upRight : (b : )  b ≤ℤ downRight (upRight b)
downRight-upRight b
 = ℤ≤-trans _ _ _
     (downRight-upLeft b)
     (downRight-monotone _ _ (upLeft≤upRight b))
     
above-upRight : (b : )  b below (upRight b)
above-upRight b = downLeft-upRight b , downRight-upRight b

above-upLeft : (b : )  b below (upLeft b)
above-upLeft b = downLeft-upLeft  b , downRight-upLeft b

above'-implies-below : (a b : )  a above' b  b below a
above'-implies-below .(upLeft  b) b (inl refl) = above-upLeft b
above'-implies-below .(upRight b) b (inr refl) = above-upRight b

above-implies-below : (a b : )  a above b  b below a
above-implies-below a b
 = above'-implies-below a b  above-implies-above' a b

below-implies-above : (a b : )  a below b  b above a
below-implies-above a b
 = below'-implies-above a b  below-implies-below' a b

above-downLeft : (a : )  a above (downLeft a)
above-downLeft a
 = below-implies-above (downLeft a) a (downLeft-below a)

above-downMid : (a : )  a above (downMid a)
above-downMid a
 = below-implies-above (downMid a) a (downMid-below a)

above-downRight : (a : )  a above (downRight a)
above-downRight a
 = below-implies-above (downRight a) a (downRight-below a)
\end{code}