Andrew Sneap, Jan-July 2021

This file defines addition of rational numbers, and proves various properties of
addition.

\begin{code}

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

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

open import UF.Base hiding (_≈_)
open import Integers.Type
open import Integers.Addition renaming (_+_ to _ℤ+_)
open import Rationals.Fractions
open import Rationals.FractionsOperations renaming (_+_ to _𝔽+_)
open import Rationals.Type

module Rationals.Addition where

_+_ : ℚ → ℚ → ℚ
(p , _) + (q , _) = toℚ (p 𝔽+ q)

infixl 32 _+_

ℚ+-comm : (p q : ℚ) → p + q ＝ q + p
ℚ+-comm (p , _) (q , _) = ap toℚ I
 where
  I : p 𝔽+ q ＝ q 𝔽+ p
  I = 𝔽+-comm p q

toℚ-+ : (p q : 𝔽) → toℚ (p 𝔽+ q) ＝ toℚ p + toℚ q
toℚ-+ p q = equiv→equality (p 𝔽+ q) (p' 𝔽+ q') conclusion
 where
  p-ℚ = toℚ p
  q-ℚ = toℚ q
  p' = to𝔽 p-ℚ
  q' = to𝔽 q-ℚ

  I : p ≈ p'
  I = ≈-toℚ p

  II : q ≈ q'
  II = ≈-toℚ q

  III : p 𝔽+ q ≈ p' 𝔽+ q
  III = ≈-addition p p' q I

  IV : q 𝔽+ p' ≈ q' 𝔽+ p'
  IV = ≈-addition  q q' p' II

  V : p' 𝔽+ q ≈ p' 𝔽+ q'
  V = transport₂ _≈_ (𝔽+-comm q p') (𝔽+-comm q' p') IV

  conclusion : p 𝔽+ q ≈ p' 𝔽+ q'
  conclusion = ≈-trans (p 𝔽+ q) (p' 𝔽+ q) (p' 𝔽+ q') III V

ℚ+-assoc : (p q r : ℚ) → p + q + r ＝ p + (q + r)
ℚ+-assoc (p , α) (q , β) (r , δ) = γ
 where
  γ : (p , α) + (q , β) + (r , δ) ＝ (p , α) + ((q , β) + (r , δ))
  γ = (p , α) + (q , β) + (r , δ)   ＝⟨ refl ⟩
      toℚ (p 𝔽+ q) + (r , δ)        ＝⟨ i    ⟩
      toℚ (p 𝔽+ q) + toℚ r          ＝⟨ ii   ⟩
      toℚ (p 𝔽+ q 𝔽+ r)             ＝⟨ iii  ⟩
      toℚ (p 𝔽+ (q 𝔽+ r))           ＝⟨ iv   ⟩
      toℚ p + toℚ (q 𝔽+ r)          ＝⟨ v    ⟩
      (p , α) + toℚ (q 𝔽+ r)        ＝⟨ refl ⟩
      (p , α) + ((q , β) + (r , δ)) ∎
   where
    i   = ap (toℚ (p 𝔽+ q) +_) (toℚ-to𝔽 (r , δ))
    ii  = toℚ-+ (p 𝔽+ q) r ⁻¹
    iii = ap toℚ (𝔽+-assoc p q r)
    iv  = toℚ-+ p (q 𝔽+ r)
    v   = ap (_+ toℚ (q 𝔽+ r)) (toℚ-to𝔽 (p , α) ⁻¹)

ℚ+-rearrange : (x y z : ℚ) → x + y + z ＝ x + z + y
ℚ+-rearrange x y z = x + y + z     ＝⟨ ℚ+-assoc x y z          ⟩
                     x + (y + z)   ＝⟨ ap (x +_) (ℚ+-comm y z) ⟩
                     x + (z + y)   ＝⟨ ℚ+-assoc x z y ⁻¹       ⟩
                     x + z + y     ∎

ℚ+-rearrange' : (x y z : ℚ) → x + y + z ＝ z + x + y
ℚ+-rearrange' x y z = x + y + z   ＝⟨ ℚ+-comm (x + y) z ⟩
                      z + (x + y) ＝⟨ ℚ+-assoc z x y ⁻¹ ⟩
                      z + x + y   ∎

ℚ-zero-right-neutral : (q : ℚ) → q + 0ℚ ＝ q
ℚ-zero-right-neutral (q , α) = γ
 where
  γ : (q , α) + 0ℚ ＝ (q , α)
  γ = (q , α) + 0ℚ           ＝⟨ refl                            ⟩
      toℚ (q 𝔽+ (pos 0 , 0)) ＝⟨ ap toℚ (𝔽-zero-right-neutral q) ⟩
      toℚ q                  ＝⟨ toℚ-to𝔽 (q , α) ⁻¹              ⟩
      q , α                  ∎

ℚ-zero-left-neutral : (q : ℚ) → 0ℚ + q ＝ q
ℚ-zero-left-neutral q = ℚ+-comm 0ℚ q ∙ ℚ-zero-right-neutral q

add-same-denom : ((x , a) (y , a) : 𝔽)
               → toℚ (x , a) + toℚ (y , a) ＝ toℚ (x ℤ+ y , a)
add-same-denom (x , a) (y , b) = γ
 where
  I : ((x , b) 𝔽+ (y , b)) ≈ (x ℤ+ y , b)
    → toℚ ((x , b) 𝔽+ (y , b)) ＝ toℚ (x ℤ+ y , b)
  I = equiv→equality ((x , b) 𝔽+ (y , b)) (x ℤ+ y , b)

  II : (x , b) 𝔽+ (y , b) ≈ (x ℤ+ y , b)
  II = 𝔽-add-same-denom (x , b) (y , b)

  γ : toℚ (x , b) + toℚ (y , b) ＝ toℚ (x ℤ+ y , b)
  γ = toℚ (x , b) + toℚ (y , b) ＝⟨ toℚ-+ (x , b) (y , b) ⁻¹ ⟩
      toℚ ((x , b) 𝔽+ (y , b))  ＝⟨ I II                     ⟩
      toℚ (x ℤ+ y , b)          ∎

1/3+1/3 : 1/3 + 1/3 ＝ 2/3
1/3+1/3 = refl

1/4+1/4 : 1/4 + 1/4 ＝ 1/2
1/4+1/4 = refl

1/2+1/4 : 1/2 + 1/4 ＝ 3/4
1/2+1/4 = refl

1/4+3/4 : 1/4 + 3/4 ＝ 1ℚ
1/4+3/4 = refl

1/3+2/3 : 1/3 + 2/3 ＝ 1ℚ
1/3+2/3 = refl

2/3+1/3 : 2/3 + 1/3 ＝ 1ℚ
2/3+1/3 = refl

1/2+1/2 : 1/2 + 1/2 ＝ 1ℚ
1/2+1/2 = refl

1/5+1/5 : 1/5 + 1/5 ＝ 2/5
1/5+1/5 = refl

1/5+2/5 : 1/5 + 2/5 ＝ 3/5
1/5+2/5 = refl

2/5+1/5 : 2/5 + 1/5 ＝ 3/5
2/5+1/5 = refl

2/5+3/5 : 2/5 + 3/5 ＝ 1ℚ
2/5+3/5 = refl

\end{code}
