Andrew Sneap, February-April 2021
Updated March 2022

In this file, I define directly addition of the Dedekind reals, and
show that the Reals are a group with respect to addition.

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

open import MLTT.Spartan renaming (_+_ to _∔_)
open import UF.Base
open import UF.FunExt
open import UF.Subsingletons
open import UF.PropTrunc
open import Notation.Order

open import UF.Powerset
open import DedekindReals.Properties
open import Rationals.Type
open import Rationals.Addition renaming (_+_ to _ℚ+_)
open import Rationals.Negation renaming (_-_ to _ℚ-_ ; -_ to ℚ-_)
open import Rationals.Order

module DedekindReals.Addition
         (fe : Fun-Ext)
         (pe : Prop-Ext)
         (pt : propositional-truncations-exist)
       where

open import DedekindReals.Type fe pe pt
open PropositionalTruncation pt

_+_ :     
((L-x , R-x) , inhabited-left-x , inhabited-right-x , rounded-left-x , rounded-right-x , disjoint-x , located-x) + ((L-y , R-y) , inhabited-left-y , inhabited-right-y , rounded-left-y , rounded-right-y , disjoint-y , located-y) =
 (L-z , R-z) , inhabited-left-z , inhabited-right-z , rounded-left-z , rounded-right-z , disjoint-z , located-z
 where
  x : 
  x = ((L-x , R-x) , inhabited-left-x , inhabited-right-x , rounded-left-x , rounded-right-x , disjoint-x , located-x)

  L-z R-z : 𝓟 
  L-z p = ( (r , s)   ×  , r  L-x × s  L-y × (p  r ℚ+ s)) , ∃-is-prop
  R-z q = ( (r , s)   ×  , r  R-x × s  R-y × (q  r ℚ+ s)) , ∃-is-prop

  inhabited-left-z :  q   , q  L-z
  inhabited-left-z = ∥∥-rec ∃-is-prop δ (binary-choice inhabited-left-x inhabited-left-y)
   where
    δ : (Σ p   , p  L-x) × (Σ q   , q  L-y)   z   , z  L-z
    δ ((p , l-x) , q , l-y) =  (p ℚ+ q) , ( (p , q) , l-x , l-y , refl ) 

  inhabited-right-z :  q   , q  R-z
  inhabited-right-z = ∥∥-rec ∃-is-prop δ (binary-choice inhabited-right-x inhabited-right-y)
   where
    δ : (Σ p   , p  R-x) × (Σ q   , q  R-y)   z   , z  R-z
    δ ((p , r-x) , q , r-y) =  (p ℚ+ q) , ( (p , q) , (r-x , r-y , refl) ) 

  ψ : (z r t s : )  t  r ℚ+ s  z  ((r ℚ+ (z ℚ- t)) ℚ+ s)
  ψ z r t s e = z                                               =⟨ ℚ-zero-left-neutral z ⁻¹ 
                (0ℚ ℚ+ z)                                       =⟨ ap (_ℚ+ z) (ℚ-inverse-sum-to-zero r ⁻¹) 
                ((r ℚ- r)) ℚ+ z                                 =⟨ (ℚ+-assoc r (ℚ- r) z) 
                (r ℚ+ ((ℚ- r) ℚ+ z))                            =⟨ ℚ-zero-right-neutral (r ℚ+ ((ℚ- r) ℚ+ z)) ⁻¹ 
                (r ℚ+ ((ℚ- r) ℚ+ z)) ℚ+ 0ℚ                      =⟨ ap₂ _ℚ+_ (ap (r ℚ+_) (ℚ+-comm (ℚ- r) z)) (ℚ-inverse-sum-to-zero' s ⁻¹) 
                (r ℚ+ (z ℚ- r)) ℚ+ ((ℚ- s) ℚ+ s)                =⟨ ℚ+-assoc (r ℚ+ (z ℚ+ (ℚ- r))) (ℚ- s) s ⁻¹ 
                ((r ℚ+ (z ℚ+ (ℚ- r))) ℚ+ (ℚ- s)) ℚ+ s           =⟨ ap (_ℚ+ s) (ℚ+-assoc r (z ℚ+ (ℚ- r)) (ℚ- s)) 
                (r ℚ+ ((z ℚ+ (ℚ- r)) ℚ+ (ℚ- s))) ℚ+ s           =⟨ ap  -  (r ℚ+ -) ℚ+ s) (ℚ+-assoc z (ℚ- r) (ℚ- s)) 
                (r ℚ+ (z ℚ+ ((ℚ- r) ℚ+ (ℚ- s)))) ℚ+ s           =⟨ ap  -  (r ℚ+ (z ℚ+ -)) ℚ+ s) (ℚ-minus-dist r s) 
                (r ℚ+ (z ℚ+ (ℚ- (r ℚ+ s)))) ℚ+ s                =⟨ ap ((λ -  (r ℚ+ (z ℚ+ (ℚ- -))) ℚ+ s)) (e ⁻¹) 
                (r ℚ+ (z ℚ+ (ℚ- t))) ℚ+ s                       

  rounded-left-z : (z : )  (z  L-z  ( t   , (z < t) × t  L-z))
  rounded-left-z z = I , II
   where
    I : z  L-z   t   , (z < t) × t  L-z
    I zLz = ∥∥-rec ∃-is-prop δ zLz
     where
      δ : Σ (r , s)   ×  , r  L-x × s  L-y × (z  r ℚ+ s)   t   , (z < t) × t  L-z
      δ ((r , s) , rLx , sLy , e) = γ (rounded-left-b L-x rounded-left-x r rLx) (rounded-left-b L-y rounded-left-y s sLy)
       where
        γ : ( p   , r < p × p  L-x)  ( q   , s < q × q  L-y)   t   , z < t × t  L-z
        γ f g = ζ (binary-choice f g)
         where
          ζ :  (Σ p   , r < p × p  L-x) × (Σ q   , s < q × q  L-y)    t   , z < t × t  L-z
          ζ bc = ∥∥-functor η bc
           where
            η : (Σ p   , r < p × p  L-x) × (Σ q   , s < q × q  L-y)  Σ t   , z < t × t  L-z
            η ((p , l₁ , pLx) , q , l₂ , qLy) = (p ℚ+ q) , (II , III)
             where
              II : z <  p ℚ+ q
              II = transport (_< p ℚ+ q) (e ⁻¹) (ℚ<-adding r p s q l₁ l₂)
              III : (p ℚ+ q)  L-z
              III =  (p , q) , (pLx , qLy , refl) 

    II :  t   , (z < t) × t  L-z  z  L-z
    II et = ∥∥-rec (∈-is-prop L-z z) δ et
     where
      δ : Σ t   , (z < t) × t  L-z  z  L-z
      δ (t , l , tLz) = ∥∥-functor γ tLz
       where
        γ : Σ (r , s)   ×  , r  L-x × s  L-y × (t  r ℚ+ s)
           Σ (r' , s')   ×  , r'  L-x × s'  L-y × (z  r' ℚ+ s')
        γ ((r , s) , rLx , sLy , e) = ((r ℚ+ (z ℚ- t)) , s) , III , sLy , IV
         where
          III : (r ℚ+ (z ℚ- t))  L-x
          III = rounded-left-c L-x rounded-left-x (r ℚ+ (z ℚ- t)) r (ℚ<-subtraction-preserves-order' r (z ℚ- t) (ℚ<-difference-positive' z t l) ) rLx
          IV : z  r ℚ+ (z ℚ- t) ℚ+ s
          IV = ψ z r t s e

  rounded-right-z : (z : )  (z  R-z)  ( q   , ((q < z) × (q  R-z)))
  rounded-right-z z = I , II
   where
    I : z  R-z   q   , q < z × q  R-z
    I zRz = ∥∥-rec ∃-is-prop δ zRz
     where
      δ : (Σ (r , s)   ×  , (r  R-x) × (s  R-y) × (z  (r ℚ+ s)))  ( q   , (q < z) × q  R-z)
      δ ((r , s) , rRx , sRy , e) = γ (rounded-right-b R-x rounded-right-x r rRx) (rounded-right-b R-y rounded-right-y s sRy)
       where
        γ : ( p   , p < r × p  R-x)  ( q   , q < s × q  R-y)   t   , t < z × t  R-z
        γ f g = ζ (binary-choice f g)
         where
          ζ :  (Σ p   , p < r × p  R-x) × (Σ q   , q < s × q  R-y)    t   , t < z × t  R-z
          ζ = ∥∥-functor η
           where
            η : (Σ p   , p < r × p  R-x) × (Σ q   , q < s × q  R-y)  Σ t   , t < z × t  R-z
            η ((p , l₁ , pRx) , q , l₂ , qRy) = p ℚ+ q , II , III
             where
              II : p ℚ+ q < z
              II = transport (p ℚ+ q <_) (e ⁻¹) (ℚ<-adding p r q s l₁ l₂)
              III : (p ℚ+ q)  R-z
              III =  (p , q) , pRx , qRy , refl 
    II :  t   , (t < z) × t  R-z  z  R-z
    II et = ∥∥-rec (∈-is-prop R-z z) δ et
     where
      δ : Σ t   , (t < z) × t  R-z  z  R-z
      δ (t , l , tRz) = ∥∥-functor γ tRz
       where
        γ : Σ (r , s)   ×  , r  R-x × s  R-y × (t  r ℚ+ s)
           Σ (r' , s')   ×  , r'  R-x × s'  R-y × (z  r' ℚ+ s')
        γ ((r , s) , rRx , sRy , e) = ((r ℚ+ (z ℚ- t)) , s) , III , sRy , IV
         where
          III : (r ℚ+ (z ℚ- t))  R-x
          III = rounded-right-c R-x rounded-right-x r (r ℚ+ (z ℚ- t)) (ℚ<-addition-preserves-order'' r (z ℚ- t) (ℚ<-difference-positive t z l)) rRx
          IV : z  r ℚ+ (z ℚ- t) ℚ+ s
          IV = ψ z r t s e

  disjoint-z : disjoint L-z R-z
  disjoint-z p q (α , β) = ∥∥-rec (ℚ<-is-prop p q) δ (binary-choice α β)
   where
    δ : (Σ (r , s)   ×  , r  L-x × s  L-y × (p  r ℚ+ s))
      × (Σ (r' , s')   ×  , r'  R-x × s'  R-y × (q  r' ℚ+ s'))
       p < q
    δ (((r , s) , l-x , l-y , e₁) , ((r' , s') , r-x , r-y , e₂)) = goal
     where
      I : r < r'
      I = disjoint-x r r' (l-x , r-x)

      II : s < s'
      II = disjoint-y s s' (l-y , r-y)

      goal : p < q
      goal = transport₂ _<_ (e₁ ⁻¹) (e₂ ⁻¹) (ℚ<-adding r r' s s' I II)

  located-z : located L-z R-z
  located-z p q l = I (ℝ-arithmetically-located' fe pe pt x ((q ℚ- p) , (ℚ<-difference-positive p q l)))
   where
    I :  (e , t)   ×  , (e  L-x × t  R-x) × (0ℚ < t ℚ- e < q ℚ- p)  p  L-z  q  R-z
    I = ∥∥-rec ∨-is-prop δ
     where
      δ : Σ (e , t)   ×  , (e  L-x × t  R-x) × (0ℚ < t ℚ- e < q ℚ- p)  p  L-z  q  R-z
      δ ((e , t) , (eLx , tRx) , (l₁ , l₂)) = IV II III
       where
        l₃ : p ℚ- e < q ℚ- t
        l₃ = transport₂ _<_ i ii (ℚ<-addition-preserves-order (t ℚ- e) (q ℚ- p) (p ℚ- t) l₂)
         where
          i : t ℚ- e ℚ+ (p ℚ- t)  p ℚ- e
          i = t ℚ- e ℚ+ (p ℚ- t)           =⟨ ℚ+-comm (t ℚ- e) (p ℚ- t) 
              p ℚ- t ℚ+ (t ℚ- e)           =⟨ ℚ+-assoc p (ℚ- t) (t ℚ- e) 
              p ℚ+ ((ℚ- t) ℚ+ (t ℚ- e))    =⟨ ap (p ℚ+_) (ℚ+-assoc (ℚ- t) t (ℚ- e) ⁻¹) 
              p ℚ+ ((ℚ- t) ℚ+ t ℚ- e)      =⟨ ap  α  p ℚ+ (α ℚ- e)) (ℚ-inverse-sum-to-zero' t) 
              p ℚ+ (0ℚ ℚ- e)               =⟨ ap (p ℚ+_) (ℚ-zero-left-neutral (ℚ- e)) 
              p ℚ- e 
          ii : q ℚ- p ℚ+ (p ℚ- t)  q ℚ- t
          ii = q ℚ- p ℚ+ (p ℚ- t)           =⟨ ℚ+-assoc q (ℚ- p) (p ℚ- t) 
               q ℚ+ ((ℚ- p) ℚ+ (p ℚ- t))    =⟨ ap (q ℚ+_) (ℚ+-assoc (ℚ- p) p (ℚ- t) ⁻¹) 
               q ℚ+ ((ℚ- p) ℚ+ p ℚ- t)      =⟨ ap  α  q ℚ+ (α ℚ- t)) (ℚ-inverse-sum-to-zero' p) 
               q ℚ+ (0ℚ ℚ- t)               =⟨ ap (q ℚ+_) (ℚ-zero-left-neutral (ℚ- t)) 
               q ℚ- t 

        II : Σ z   , (p ℚ- e < z) × (z < q ℚ- t)
        II = ℚ-dense (p ℚ- e) (q ℚ- t) l₃

        III : Σ y   , p ℚ- e < y < (pr₁ II)
        III = ℚ-dense (p ℚ- e) (pr₁ II) (pr₁ (pr₂ II))
        IV : ((y , _) : Σ y   , (p ℚ- e < y) × (y < q ℚ- t))  Σ z   , p ℚ- e < z < y   p  L-z  q  R-z 
        IV (y , l₄ , l₅) (z , l₆ , l₇) = ∥∥-functor η (located-y z y l₇)
         where
          η : z  L-y  y  R-y  p  L-z  q  R-z
          η (inl zLy) = inl  (p ℚ- z , z) , V , zLy , VI 
           where
            V : (p ℚ- z)  L-x
            V = rounded-left-c L-x rounded-left-x (p ℚ- z) e (ℚ<-swap' p e z l₆) eLx

            VI : p  p ℚ- z ℚ+ z
            VI = p                  =⟨ ℚ-zero-right-neutral p ⁻¹ 
                 p ℚ+ 0ℚ            =⟨ ap (p ℚ+_) (ℚ-inverse-sum-to-zero' z ⁻¹) 
                 p ℚ+ ((ℚ- z) ℚ+ z) =⟨ ℚ+-assoc p (ℚ- z) z ⁻¹ 
                 p ℚ- z ℚ+ z        

          η (inr yRy) = inr  (t , q ℚ- t) , tRx , V , VI 
           where
            V : (q ℚ- t)  R-y
            V = rounded-right-c R-y rounded-right-y y (q ℚ- t) l₅ yRy

            VI : q  t ℚ+ (q ℚ- t)
            VI = q                  =⟨ ℚ-zero-left-neutral q ⁻¹ 
                 0ℚ ℚ+ q            =⟨ ap (_ℚ+ q) (ℚ-inverse-sum-to-zero t ⁻¹) 
                 t ℚ+ (ℚ- t) ℚ+ q   =⟨ ℚ+-assoc t (ℚ- t) q 
                 t ℚ+ ((ℚ- t) ℚ+ q) =⟨ ap (t ℚ+_) (ℚ+-comm (ℚ- t) q) 
                 t ℚ+ (q ℚ- t)      
{-
plus2 : ℝ → ℝ → ℝ
plus2 x y = z
 where
  L : 𝓟 ℚ
  L p = (∃ k ꞉ ℚ , (k < x) × (p ℚ- k < y)) , ∃-is-prop
  R : 𝓟 ℚ
  R q = (∃ k ꞉ ℚ , (x < k) × (y < q ℚ+ k)) , ∃-is-prop

  inhabited-left' : inhabited-left L
  inhabited-left' = ∥∥-functor I (binary-choice (inhabited-from-real-L x) (inhabited-from-real-L y))
   where
    I : (Σ k ꞉ ℚ , k < x) × (Σ p ꞉ ℚ , p < y) → Σ p ꞉ ℚ , p ∈ L
    I ((k , k<x) , p , p<y) = p ℚ+ k , ∣ k , k<x , transport (_< y) (ℚ-inverse-intro'' p k) p<y ∣

  inhabited-right' : inhabited-right R
  inhabited-right' = ∥∥-functor I (binary-choice (inhabited-from-real-R x) (inhabited-from-real-R y))
   where
    I : (Σ k ꞉ ℚ , x < k) × (Σ q ꞉ ℚ , y < q) → Σ q ꞉ ℚ , q ∈ R
    I ((k , x<k) , q , y<q) = (q ℚ- k) , ∣ k , x<k ,  transport (y <_) (ℚ-inverse-intro'''' q k) y<q  ∣

  rounded-left' : rounded-left L
  rounded-left' = {!!}

  rounded-right' : rounded-right R
  rounded-right' = {!!}

  disjoint' : disjoint L R
  disjoint' = {!!}

  located' : located L R
  located' = {!!}

  z : ℝ
  z = (L , R) , inhabited-left' , inhabited-right' , rounded-left' , rounded-right' , disjoint' , located'
 -}

infixl 35 _+_

ℝ+-comm :  x y  x + y  y + x
ℝ+-comm x y = ℝ-equality-from-left-cut' (x + y) (y + x) I II
 where
  I : lower-cut-of (x + y)  lower-cut-of (y + x)
  I p p<x+y = ∥∥-functor i p<x+y
   where
    i : Σ (r , s)   ×  , (r < x) × (s < y) × (p  r ℚ+ s)
       Σ (r , s)   ×  , (r < y) × (s < x) × (p  r ℚ+ s)
    i ((r , s) , rLx , sLy , e) = (s , r) , (sLy , rLx , (e  ℚ+-comm r s))
  II : lower-cut-of (y + x)  lower-cut-of (x + y)
  II q x+y<q = ∥∥-functor i x+y<q
   where
    i : Σ (r , s)   ×  , (r < y) × (s < x) × (q  r ℚ+ s)
       Σ (r , s)   ×  , (r < x) × (s < y) × (q  r ℚ+ s)
    i ((r , s) , rLy , sLx , e) = (s , r) , (sLx , rLy , (e  ℚ+-comm r s))

ℝ-zero-left-neutral : (x : )  0ℝ + x  x
ℝ-zero-left-neutral x = ℝ-equality-from-left-cut' (0ℝ + x) x I II
 where
  I : lower-cut-of (0ℝ + x)  lower-cut-of x
  I p 0+x<x = ∥∥-rec (∈-is-prop (lower-cut-of x) p) i 0+x<x
   where
    i : Σ (r , s)   ×  , (r < 0ℝ) × (s < x) × (p  r ℚ+ s)  p < x
    i ((r , s) , r<0 , s<x , e) = rounded-left-c (lower-cut-of x) (rounded-from-real-L x) p s iv s<x
     where
      ii : p ℚ+ r < p
      ii = ℚ<-subtraction-preserves-order' p r r<0
      iii : p ℚ+ r < r ℚ+ s
      iii = transport (p ℚ+ r <_) e ii
      iv : p < s
      iv = transport₂ _<_ v vi (ℚ<-addition-preserves-order (p ℚ+ r) (r ℚ+ s) (ℚ- r) iii )
       where
        v : p ℚ+ r ℚ- r  p
        v = ℚ+-assoc p r (ℚ- r)  ℚ-inverse-intro p r ⁻¹
        vi : r ℚ+ s ℚ- r  s
        vi = r ℚ+ s ℚ- r   =⟨ ap (_ℚ- r) (ℚ+-comm r s) 
             s ℚ+ r ℚ- r   =⟨ ℚ+-assoc s r (ℚ- r) 
             s ℚ+ (r ℚ- r) =⟨ ℚ-inverse-intro s r ⁻¹ 
             s 
  II : lower-cut-of x  lower-cut-of (0ℝ + x)
  II q q<x = ∥∥-functor i by-rounded-x
   where
    by-rounded-x :  q'   , q < q' < x
    by-rounded-x = rounded-left-b (lower-cut-of x) (rounded-from-real-L x) q q<x
    i : Σ q'   , q < q' < x  Σ (r , s)   ×  , (r < 0ℝ) × (s < x) × (q  r ℚ+ s)
    i (q' , l , q'Lx) = (q ℚ- q' , q') , iii , q'Lx , ii
     where
      ii : q  q ℚ- q' ℚ+ q'
      ii = q                    =⟨ ℚ-inverse-intro q q' 
           q ℚ+ (q' ℚ- q')      =⟨ ap (q ℚ+_) (ℚ+-comm q' (ℚ- q')) 
           q ℚ+ ((ℚ- q') ℚ+ q') =⟨ ℚ+-assoc q (ℚ- q') q' ⁻¹ 
           q ℚ- q' ℚ+ q' 

      iii : q ℚ- q' < 0ℚ
      iii = transport (q ℚ- q' <_) iv (ℚ<-addition-preserves-order q q' (ℚ- q') l)
       where
        iv : q' ℚ- q'  0ℚ
        iv = ℚ-inverse-sum-to-zero q'

ℝ-zero-right-neutral : (x : )  x + 0ℝ  x
ℝ-zero-right-neutral x = ℝ+-comm x 0ℝ  ℝ-zero-left-neutral x

ℝ+-assoc :  x y z  x + y + z  x + (y + z)
ℝ+-assoc x y z = ℝ-equality-from-left-cut' _ _ ltr rtl
 where
  ltr : lower-cut-of (x + y + z)  lower-cut-of (x + (y + z))
  ltr p p<x+y+z = ∥∥-rec ∃-is-prop I p<x+y+z
   where
    I : Σ (a  , b)   ×  , (a  < (x + y)) × (b < z)        × (p  a ℚ+ b)
        (r  , s)   ×  , (r  < x)       × (s < (y + z))  × (p  r ℚ+ s)
    I ((a , b) , a<x+y , b<z , e) = ∥∥-rec ∃-is-prop II a<x+y
     where
      II : Σ (c , d)   ×  , (c < x) × (d < y)        × (a  c ℚ+ d)
           (r , s)   ×  , (r < x) × (s < (y + z))  × (p  r ℚ+ s)
      II ((c , d) , c<x , d<y , e') =  (c , (b ℚ+ d)) , c<x , III , i 
       where
        i : p  c ℚ+ (b ℚ+ d)
        i = p             =⟨ e 
            a ℚ+ b        =⟨ ap (_ℚ+ b) e' 
            c ℚ+ d ℚ+ b   =⟨ ℚ+-assoc c d b 
            c ℚ+ (d ℚ+ b) =⟨ ap (c ℚ+_) (ℚ+-comm d b) 
            c ℚ+ (b ℚ+ d) 

        III : (b ℚ+ d) < (y + z)
        III =  (d , b) , (d<y , b<z , ℚ+-comm b d) 
  rtl :  lower-cut-of (x + (y + z))  lower-cut-of (x + y + z)
  rtl p p<x+y+z-r = ∥∥-rec ∃-is-prop I p<x+y+z-r
   where
    I : Σ (a  , b)   ×  , (a  < x)        × (b < (y + z))  × (p  a ℚ+ b)
        (r  , s)   ×  , (r  < (x + y))  × (s < z)        × (p  r ℚ+ s)
    I ((a , b) , a<x , b<y+z , e) = ∥∥-rec ∃-is-prop II b<y+z
     where
      II : Σ (c , d)   ×  , (c < y)       × (d < z)  × (b  c ℚ+ d)
           (r , s)   ×  , (r < (x + y)) × (s < z)  × (p  r ℚ+ s)
      II ((c , d) , c<y , d<z , e') =  ((a ℚ+ c) , d) , III , d<z , i 
       where
        i : p  a ℚ+ c ℚ+ d
        i = e  (ap (a ℚ+_) e'  ℚ+-assoc a c d ⁻¹)
        III : (a ℚ+ c) < (x + y)
        III =  (a , c) , a<x , c<y , refl 


-_ :   
-_ x = (L , R) , inhabited-left-z , inhabited-right-z , rounded-left-z , rounded-right-z , disjoint-z , located-z
 where
  L : 𝓟 
  L p = ( r   , r > x × (p  ℚ- r)) , ∃-is-prop
  R : 𝓟 
  R q = ( r   , r < x × (q  ℚ- r)) , ∃-is-prop

  inhabited-left-z : inhabited-left L
  inhabited-left-z = ∥∥-rec ∃-is-prop I (binary-choice (inhabited-from-real-L x) (inhabited-from-real-R x))
   where
    I : (Σ a   , a < x) × (Σ b   , b > x)   p   , p  L
    I ((a , a<x) , b ,  x<b) = ∥∥-functor II (ℝ-locatedness x (ℚ- b) (ℚ- a) (ℚ<-swap a b (disjoint-from-real x a b (a<x , x<b))))
     where
      II : ((ℚ- b) < x)  (ℚ- a) > x  Σ p   , p  L
      II (inl z) = (ℚ- b) ,  b , x<b , refl 
      II (inr z) = a      ,  ℚ- a , z , ℚ-minus-minus a 

  inhabited-right-z : inhabited-right R
  inhabited-right-z = ∥∥-rec ∃-is-prop I (binary-choice (inhabited-from-real-L x) (inhabited-from-real-R x))
   where
    I : (Σ a   , a < x) × (Σ b   , b > x)   q   , q  R
    I ((a , a<x) , b , x<b) = ∥∥-functor II (ℝ-locatedness x (ℚ- b) (ℚ- a) (ℚ<-swap a b (disjoint-from-real x a b (a<x , x<b))))
     where
      II : ((ℚ- b) < x)  (ℚ- a) > x  Σ q   , q  R
      II (inl z) = b      ,  ℚ- b , z , (ℚ-minus-minus b) 
      II (inr z) = (ℚ- a) ,  a , (a<x , refl) 

  rounded-left-z : rounded-left L
  rounded-left-z p = ltr , rtl
   where
    ltr : p  L   p'   , p < p' × p'  L
    ltr p<x = ∥∥-rec ∃-is-prop I p<x
     where
      I : Σ r   , r > x × (p  ℚ- r)   p'   , p < p' × p'  L
      I (r , x<r , e) = ∥∥-functor III II
       where
        II :  r'   , r' < r × r' > x
        II = rounded-right-b (upper-cut-of x) (rounded-from-real-R x) r x<r
        III : Σ r'   , r' < r × r' > x  Σ p'   , p < p' × p'  L
        III (r' , l , r'<x) = ℚ- r' , transport (_< ℚ- r') (e ⁻¹) (ℚ<-swap r' r l) ,  r' , r'<x , refl 

    rtl :  p'   , p < p' × p'  L  p  L
    rtl exists-p' = ∥∥-rec ∃-is-prop I exists-p'
     where
      I : Σ p'   , p < p' × p'  L   r   , r > x × (p  ℚ- r)
      I (p' , l , p<-x) = ∥∥-functor II p<-x
       where
        II : Σ r   , r > x × (p'  ℚ- r)   Σ r   , r > x × (p  ℚ- r)
        II (r , x<r , e) = (ℚ- p) , (III , (ℚ-minus-minus p))
         where
          III : (ℚ- p) > x
          III = rounded-right-c (upper-cut-of x) (rounded-from-real-R x) (ℚ- p') (ℚ- p) (ℚ<-swap p p' l) (transport (_> x) i x<r)
           where
            i : r  ℚ- p'
            i = ℚ-minus-minus r  ap ℚ-_ e ⁻¹

  rounded-right-z : rounded-right R
  rounded-right-z q = ltr , rtl
   where
    ltr : q  R   q'   , q' < q × q'  R
    ltr x<q = ∥∥-rec ∃-is-prop I x<q
     where
      I : Σ r   , r < x × (q  ℚ- r)   q'   , q' < q × q'  R
      I (r , r<x , e) = ∥∥-functor III II
       where
        II :  r'   , r < r' < x
        II = rounded-left-b (lower-cut-of x) (rounded-from-real-L x) r r<x
        III : (Σ r'   , r < r' < x)  Σ q'   , q' < q × q'  R
        III (r' , l , x<r') = ℚ- r' , (transport (ℚ- r' <_) (e ⁻¹) (ℚ<-swap r r' l) ,  r' , x<r' , refl )
    rtl :  q'   , q' < q × q'  R  q  R
    rtl exists-q' = ∥∥-rec ∃-is-prop I exists-q'
     where
      I : Σ q'   , q' < q × q'  R   r   , r < x × (q  ℚ- r)
      I (q' , l , -x<q') = ∥∥-functor II -x<q'
       where
        II : Σ r   , r < x × (q'  ℚ- r)   Σ r   , r < x × (q  ℚ- r)
        II (r , r<x , e) = (ℚ- q) , (III , (ℚ-minus-minus q))
         where
          III : (ℚ- q) < x
          III = rounded-left-c  (lower-cut-of x) (rounded-from-real-L x) (ℚ- q) r (transport ((ℚ- q) <_) i (ℚ<-swap q' q l)) r<x
           where
           i : ℚ- q'  r
           i = ap ℚ-_ e  ℚ-minus-minus r ⁻¹

  disjoint-z : disjoint L R
  disjoint-z p q (p<x , x<q) = ∥∥-rec (ℚ<-is-prop p q) I (binary-choice p<x x<q)
   where
    I : (Σ p'   , p' > x × (p  ℚ- p')) × (Σ q'   , q' < x × (q  ℚ- q'))
       p < q
    I ((p' , p'<x , e) , q' , x<q' , e') = transport₂ _<_ (e ⁻¹) (e' ⁻¹) (ℚ<-swap q' p' II)
     where
      II : q' < p'
      II = disjoint-from-real x q' p' (x<q' , p'<x)

  located-z : located L R
  located-z p q p<q = ∥∥-functor I (ℝ-locatedness x (ℚ- q) (ℚ- p) (ℚ<-swap p q p<q))
   where
    I : (ℚ- q) < x  (ℚ- p) > x  p  L  q  R
    I (inl -q<x) = inr  (ℚ- q) , -q<x , ℚ-minus-minus q 
    I (inr x<-p) = inl  (ℚ- p) , x<-p , ℚ-minus-minus p 

_-_ :     
x - y = x + (- y)

ℝ+-inverse-exists :  x  Σ x'   , x + x'  0ℝ
ℝ+-inverse-exists x = (- x) , ℝ-equality-from-left-cut' (x - x) 0ℝ ltr rtl
 where
  ltr : lower-cut-of (x - x)  lower-cut-of 0ℝ
  ltr p p<x-x = ∥∥-rec (∈-is-prop (lower-cut-of 0ℝ) p) I p<x-x
   where
    I : Σ (r , s)   ×  , (r < x) × (s < (- x)) × (p  r ℚ+ s)
       p < 0ℝ
    I ((r , s) , r<x , s<-x , e) = ∥∥-rec (∈-is-prop (lower-cut-of 0ℝ) p) II s<-x
     where
      II : Σ k   , k > x × (s  ℚ- k)  p < 0ℝ
      II (k , x<k , e') = III (ℚ-trichotomous p 0ℚ)
       where
        r<k : r < k
        r<k = disjoint-from-real x r k (r<x , x<k)
        e'' : p  r ℚ- k
        e'' = e  ap (r ℚ+_) e'
        III : (p < 0ℚ)  (p  0ℚ)  (0ℚ < p)  p < 0ℝ
        III (inl p<0)       = p<0
        III (inr (inl p=0)) = 𝟘-elim (ℚ<-irrefl k (transport (_< k) i r<k))
         where
          i : r  k
          i = r                  =⟨ ℚ-inverse-intro r k 
              r ℚ+ (k ℚ- k)      =⟨ ap (r ℚ+_) (ℚ+-comm k (ℚ- k)) 
              r ℚ+ ((ℚ- k) ℚ+ k) =⟨ ℚ+-assoc r (ℚ- k) k ⁻¹ 
              r ℚ- k ℚ+ k        =⟨ ap (_ℚ+ k) e'' ⁻¹ 
              p ℚ+ k             =⟨ ap (_ℚ+ k) p=0 
              0ℚ ℚ+ k            =⟨ ℚ-zero-left-neutral k 
              k 
        III (inr (inr 0<p)) = 𝟘-elim (ℚ<-irrefl k (ℚ<-trans k r k k<r r<k))
         where
          i : 0ℚ < r ℚ- k
          i = transport (0ℚ <_) e'' 0<p
          k<r : k < r
          k<r = transport₂ _<_ iii iv (ℚ<-addition-preserves-order 0ℚ (r ℚ- k) k i)
           where
            iii : 0ℚ ℚ+ k  k
            iii = ℚ-zero-left-neutral k
            iv : r ℚ- k ℚ+ k  r
            iv = r ℚ- k ℚ+ k          =⟨ ℚ+-assoc r (ℚ- k) k  
                 r ℚ+ ((ℚ- k) ℚ+ k)   =⟨ ap (r ℚ+_) (ℚ+-comm (ℚ- k) k) 
                 r ℚ+ (k ℚ- k)        =⟨ ℚ-inverse-intro r k ⁻¹ 
                 r 

  rtl : lower-cut-of 0ℝ  lower-cut-of (x - x)
  rtl p p<0 = ∥∥-rec (∈-is-prop (lower-cut-of (x - x)) p) II I
   where
    I :  (a , b)   ×  , (a < x < b) × (0ℚ < b ℚ- a < ℚ- p)
    I = ℝ-arithmetically-located' fe pe pt x ((ℚ- p) , (ℚ<-swap p 0ℚ p<0))
    II : Σ (a , b)   ×  , (a < x < b) × (0ℚ < b ℚ- a < ℚ- p)  p < (x - x)
    II ((a , b) , (a<x , x<b) , (0<b-a , b-a<-p)) =  (a , p ℚ- a) , a<x ,  (a ℚ- p) , (i , ii)  , iii 
     where
      i : (a ℚ- p) > x
      i = rounded-right-c (upper-cut-of x) (rounded-from-real-R x) b (a ℚ- p) (transport₂ _<_ α β (ℚ<-addition-preserves-order (b ℚ- a) (ℚ- p) a b-a<-p)) x<b
       where
        α : b ℚ- a ℚ+ a  b
        α = b ℚ- a ℚ+ a          =⟨ ℚ+-assoc b (ℚ- a) a 
            b ℚ+ ((ℚ- a) ℚ+ a)   =⟨ ap (b ℚ+_) (ℚ+-comm (ℚ- a) a) 
            b ℚ+ (a ℚ- a)        =⟨ ℚ-inverse-intro b a ⁻¹ 
            b 
        β : (ℚ- p) ℚ+ a  a ℚ- p
        β = ℚ+-comm (ℚ- p) a
      ii : p ℚ- a  ℚ- (a ℚ- p)
      ii = p ℚ- a                =⟨ ℚ+-comm p (ℚ- a) 
           (ℚ- a) ℚ+ p           =⟨ ap ((ℚ- a) ℚ+_) (ℚ-minus-minus p) 
           (ℚ- a) ℚ+ (ℚ- (ℚ- p)) =⟨ ℚ-minus-dist a (ℚ- p) 
           ℚ- (a ℚ- p) 
      iii : p  a ℚ+ (p ℚ- a)
      iii = p                =⟨ ℚ-inverse-intro p a 
            p ℚ+ (a ℚ- a)    =⟨ ℚ+-assoc p a (ℚ- a) ⁻¹ 
            p ℚ+ a ℚ+ (ℚ- a) =⟨ ap (_ℚ- a) (ℚ+-comm p a) 
            a ℚ+ p ℚ- a      =⟨ ℚ+-assoc a p (ℚ- a) 
            a ℚ+ (p ℚ- a) 

{-
ℝ<-addition-preserves-order : ∀ x y z → x < y → x + z < y + z
ℝ<-addition-preserves-order x y z l = ∥∥-rec ∃-is-prop I l
 where
  I : Σ k ꞉ ℚ , k > x × k < y
    → ∃ v ꞉ ℚ , v > (x + z) × v < (y + z)
  I (k , x<k , k<y) = ∥∥-rec ∃-is-prop IV (binary-choice II III)
   where
    II : ∃ c ꞉ ℚ , c < k × c > x
    II = rounded-right-b (upper-cut-of x) (rounded-from-real-R x) k x<k
    III : ∃ d ꞉ ℚ , k < d × d < y
    III = rounded-left-b (lower-cut-of y) (rounded-from-real-L y) k k<y
    IV : ((Σ c ꞉ ℚ , c < k × c > x) × (Σ d ꞉ ℚ , k < d × d < y))
       → ∃ v ꞉ ℚ , v > (x + z) × v < (y + z)
    IV ((c , l₁ , c<x) , d , l₂ , d<y) = V (ℝ-arithmetically-located pt pe z (d ℚ- c) (ℚ<-difference-positive c d (ℚ<-trans c k d l₁ l₂)))
     where
      V : (∃ (a , b) ꞉ ℚ × ℚ , a < z × b > z × 0ℚ < b ℚ- a × b ℚ- a < d ℚ- c)
        → ∃ v ꞉ ℚ , v > (x + z) × v < (y + z)
      V = ∥∥-functor VI
       where
        VI : Σ (a , b) ꞉ ℚ × ℚ , a < z × b > z × 0ℚ < b ℚ- a × b ℚ- a < d ℚ- c
           → Σ v ꞉ ℚ , v > (x + z) × v < (y + z)
        VI ((a , b) , a<z , z<b , l₃ , l₄) = a ℚ+ b ℚ- k , VII , VIII ----- a + b - k maybe
         where
          VII : (a ℚ+ b ℚ- k) > (x + z)
          VII = ∣ ({!!} , {!!}) , ({!!} , ({!!} , {!!})) ∣
          VIII : (a ℚ+ b ℚ- k) < (y + z)
          VIII = {!!}

ℝ<-addition-preserves-order' : ∀ x y z → x < y → x + z < y + z
ℝ<-addition-preserves-order' x y z l = ∥∥-rec ∃-is-prop I l
 where
  I : Σ k ꞉ ℚ , x < k     × k < y
    → ∃ v ꞉ ℚ , x + z < v × v < y + z
  I (k , x<k , k<y) = {!!}
-}

ℝ+-inverse-exists' : (x : )  Σ x'   , (x' + x  0ℝ) × (x + x'  0ℝ)
ℝ+-inverse-exists' x = I (ℝ+-inverse-exists x)
 where
  I : (Σ x'   , (x + x'  0ℝ))  Σ x'   , (x' + x  0ℝ) × (x + x'  0ℝ)
  I (x' , e) = x' , ((ℝ+-comm x' x  e) , e)

open import Groups.Type

ℝ-additive-group : Group-structure 
ℝ-additive-group = _+_ , (ℝ-is-set , ℝ+-assoc , 0ℝ , ℝ-zero-left-neutral , ℝ-zero-right-neutral , ℝ+-inverse-exists')

\end{code}
}