Andrew Sneap, November 2021
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan renaming (_+_ to _∔_)
open import Naturals.Addition renaming (_+_ to _ℕ+_)
open import Naturals.Properties
open import UF.Base hiding (_≈_)
open import Integers.Type hiding (abs)
open import Integers.Abs
open import Integers.Addition renaming (_+_ to _ℤ+_)
open import Integers.Multiplication renaming (_*_ to _ℤ*_)
open import Integers.Negation renaming (-_ to ℤ-_)
open import Rationals.Fractions
open import Naturals.Multiplication renaming (_*_ to _ℕ*_)
module Rationals.FractionsOperations where
\end{code}
The denom-setup function is useful to manipulate denominators into an easier to work with form.
\begin{code}
denom-setup : (a b : ℕ) → pos (succ (pred (succ a ℕ* succ b))) = pos (succ a) ℤ* pos (succ b)
denom-setup a b = pos (succ (pred (succ a ℕ* succ b))) =⟨ i ⟩
pos (succ a ℕ* succ b) =⟨ ii ⟩
pos (succ a) ℤ* pos (succ b) ∎
where
i = ap pos (succ-pred-multiplication a b ⁻¹)
ii = pos-multiplication-equiv-to-ℕ (succ a) (succ b) ⁻¹
-_ : 𝔽 → 𝔽
-_ (x , a) = ℤ- x , a
_+_ : 𝔽 → 𝔽 → 𝔽
(x , y) + (x' , y')
= x ℤ* pos (succ y') ℤ+ x' ℤ* pos (succ y) , pred (succ y ℕ* succ y')
infixl 33 _+_
𝔽-zero-right-neutral : (q : 𝔽) → q + (pos 0 , 0) = q
𝔽-zero-right-neutral (x , a)
= (x , a) + (pos 0 , 0) =⟨ refl ⟩
x ℤ+ (pos 0 ℤ* pos (succ a)) , a =⟨ i ⟩
x ℤ+ pos 0 , a =⟨ refl ⟩
x , a ∎
where
i = ap (λ - → x ℤ+ - , a) (ℤ*-comm (pos 0) (pos (succ a)))
𝔽+-comm : (p q : 𝔽) → p + q = q + p
𝔽+-comm (x , a) (y , b) = ap₂ _,_ I II
where
I : x ℤ* pos (succ b) ℤ+ y ℤ* pos (succ a)
= y ℤ* pos (succ a) ℤ+ x ℤ* pos (succ b)
I = ℤ+-comm (x ℤ* pos (succ b)) (y ℤ* (pos (succ a)))
II : pred (succ a ℕ* succ b) = pred (succ b ℕ* succ a)
II = ap pred (mult-commutativity (succ a) (succ b))
𝔽+-assoc : (a b c : 𝔽) → a + b + c = a + (b + c)
𝔽+-assoc (x , a) (y , b) (z , c) = ap₂ _,_ I II
where
left : 𝔽
left = (x , a) + (y , b)
right : 𝔽
right = (y , b) + (z , c)
α δ : ℤ
α = pr₁ left
δ = pr₁ right
β γ : ℕ
β = pr₂ left
γ = pr₂ right
a' = pos (succ a)
b' = pos (succ b)
c' = pos (succ c)
I : α ℤ* c' ℤ+ z ℤ* pos (succ (pred (succ a ℕ* succ b)))
= x ℤ* pos (succ (pred (succ b ℕ* succ c))) ℤ+ δ ℤ* a'
I = α ℤ* c' ℤ+ z ℤ* pos (succ (pred (succ a ℕ* succ b))) =⟨ i ⟩
(x ℤ* b' ℤ+ y ℤ* a') ℤ* c' ℤ+ z ℤ* pos (succ a ℕ* succ b) =⟨ ii ⟩
(x ℤ* b' ℤ+ y ℤ* a') ℤ* c' ℤ+ z ℤ* (a' ℤ* b') =⟨ iii ⟩
x ℤ* b' ℤ* c' ℤ+ y ℤ* a' ℤ* c' ℤ+ z ℤ* (b' ℤ* a') =⟨ iv ⟩
x ℤ* b' ℤ* c' ℤ+ (y ℤ* a' ℤ* c' ℤ+ z ℤ* (b' ℤ* a')) =⟨ v ⟩
x ℤ* (b' ℤ* c') ℤ+ (y ℤ* c' ℤ* a' ℤ+ z ℤ* b' ℤ* a') =⟨ vi ⟩
x ℤ* (b' ℤ* c') ℤ+ (y ℤ* c' ℤ+ z ℤ* b') ℤ* a' =⟨ vii ⟩
x ℤ* pos (succ b ℕ* succ c) ℤ+ (y ℤ* c' ℤ+ z ℤ* b') ℤ* a' =⟨ viii ⟩
x ℤ* pos (succ (pred (succ b ℕ* succ c))) ℤ+ δ ℤ* a' ∎
where
iₐₚ : succ (pred (succ a ℕ* succ b)) = succ a ℕ* succ b
iₐₚ = succ-pred-multiplication a b ⁻¹
iiₐₚ : pos (succ a ℕ* succ b) = a' ℤ* b'
iiₐₚ = pos-multiplication-equiv-to-ℕ (succ a) (succ b) ⁻¹
iiiₐₚ : z ℤ* (a' ℤ* b') = z ℤ* (b' ℤ* a')
iiiₐₚ = ap (z ℤ*_) (ℤ*-comm a' b')
vₐₚ₁ : y ℤ* a' ℤ* c' = y ℤ* c' ℤ* a'
vₐₚ₁ = ℤ-mult-rearrangement y a' c'
vₐₚ₂ : z ℤ* (b' ℤ* a') = z ℤ* b' ℤ* a'
vₐₚ₂ = ℤ*-assoc z b' a' ⁻¹
viₐₚ : y ℤ* c' ℤ* a' ℤ+ z ℤ* b' ℤ* a' = (y ℤ* c' ℤ+ z ℤ* b') ℤ* a'
viₐₚ = distributivity-mult-over-ℤ (y ℤ* c') (z ℤ* b') a' ⁻¹
viiₐₚ : b' ℤ* c' = pos (succ b ℕ* succ c)
viiₐₚ = pos-multiplication-equiv-to-ℕ (succ b) (succ c)
viiiₐₚ : succ b ℕ* succ c = succ (pred (succ b ℕ* succ c))
viiiₐₚ = succ-pred-multiplication b c
i = ap (λ - → α ℤ* c' ℤ+ z ℤ* pos -) iₐₚ
ii = ap (λ - → (x ℤ* b' ℤ+ y ℤ* a') ℤ* c' ℤ+ z ℤ* -) iiₐₚ
iii = ap₂ _ℤ+_ (distributivity-mult-over-ℤ (x ℤ* b') (y ℤ* a') c') iiiₐₚ
iv = ℤ+-assoc (x ℤ* b' ℤ* c') (y ℤ* a' ℤ* c') (z ℤ* (b' ℤ* a'))
v = ap₂ _ℤ+_ (ℤ*-assoc x b' c') (ap₂ _ℤ+_ vₐₚ₁ vₐₚ₂)
vi = ap (λ - → x ℤ* (b' ℤ* c') ℤ+ - ) viₐₚ
vii = ap (λ - → x ℤ* - ℤ+ (y ℤ* c' ℤ+ z ℤ* b') ℤ* a') viiₐₚ
viii = ap (λ - → x ℤ* pos - ℤ+ δ ℤ* a') viiiₐₚ
II : pred (succ (pred (succ a ℕ* (succ b))) ℕ* succ c)
= pred (succ a ℕ* succ (pred (succ b ℕ+ succ b ℕ* c)))
II = pred (succ (pred (succ a ℕ* succ b)) ℕ* succ c) =⟨ i ⟩
pred (succ a ℕ* succ b ℕ* succ c) =⟨ ii ⟩
pred (succ a ℕ* (succ b ℕ* succ c)) =⟨ iii ⟩
pred (succ a ℕ* succ (pred (succ b ℕ+ succ b ℕ* c))) ∎
where
i = ap (λ - → pred (- ℕ* succ c)) (succ-pred-multiplication a b ⁻¹)
ii = ap pred (mult-associativity (succ a) (succ b) (succ c))
iii = ap (λ - → pred (succ a ℕ* -)) (succ-pred-multiplication b c)
≈-addition : (p q r : 𝔽) → p ≈ q → (p + r) ≈ (q + r)
≈-addition (x , a) (y , b) (z , c) e₁ = III
where
I : pos (succ (pred (succ b ℕ* succ c))) = pos (succ b) ℤ* pos (succ c)
I = denom-setup b c
II : pos (succ a) ℤ* pos (succ c) = pos (succ (pred (succ a ℕ* succ c)))
II = denom-setup a c ⁻¹
a' b' c' : ℤ
a' = pos (succ a)
b' = pos (succ b)
c' = pos (succ c)
III : (x , a) + (z , c) ≈ (y , b) + (z , c)
III = (x ℤ* c' ℤ+ (z ℤ* a')) ℤ* pos (succ (pred (succ b ℕ* succ c))) =⟨ i ⟩
(x ℤ* c' ℤ+ z ℤ* a') ℤ* (b' ℤ* c') =⟨ ii ⟩
x ℤ* c' ℤ* (b' ℤ* c') ℤ+ z ℤ* a' ℤ* (b' ℤ* c') =⟨ iii ⟩
x ℤ* (b' ℤ* c') ℤ* c' ℤ+ z ℤ* (b' ℤ* c') ℤ* a' =⟨ iv ⟩
x ℤ* b' ℤ* c' ℤ* c' ℤ+ z ℤ* b' ℤ* c' ℤ* a' =⟨ v ⟩
y ℤ* a' ℤ* c' ℤ* c' ℤ+ z ℤ* b' ℤ* (c' ℤ* a') =⟨ vi ⟩
y ℤ* c' ℤ* a' ℤ* c' ℤ+ z ℤ* b' ℤ* (a' ℤ* c') =⟨ vii ⟩
y ℤ* c' ℤ* (a' ℤ* c') ℤ+ z ℤ* b' ℤ* (a' ℤ* c') =⟨ viii ⟩
(y ℤ* c' ℤ+ z ℤ* b') ℤ* (a' ℤ* c') =⟨ ix ⟩
(y ℤ* c' ℤ+ (z ℤ* b')) ℤ* pos (succ (pred (succ a ℕ* succ c))) ∎
where
iiiₐₚ = ℤ-mult-rearrangement z a' (b' ℤ* c')
ivₐₚ = ap (_ℤ* a') (ℤ*-assoc z b' c' ⁻¹)
viₐₚ = ap (λ - → z ℤ* b' ℤ* -) (ℤ*-comm c' a')
i = ap (λ - → (x ℤ* c' ℤ+ (z ℤ* a')) ℤ* -) I
ii = distributivity-mult-over-ℤ (x ℤ* c') (z ℤ* a') (b' ℤ* c')
iii = ap₂ _ℤ+_ (ℤ-mult-rearrangement x c' (b' ℤ* c')) iiiₐₚ
iv = ap₂ _ℤ+_ (ap (_ℤ* c') (ℤ*-assoc x b' c' ⁻¹)) ivₐₚ
v = ap₂ _ℤ+_ (ap (λ - → - ℤ* c' ℤ* c') e₁) (ℤ*-assoc (z ℤ* b') c' a')
vi = ap₂ _ℤ+_ (ap (_ℤ* c') (ℤ-mult-rearrangement y a' c')) viₐₚ
vii = ap (_ℤ+ z ℤ* b' ℤ* (a' ℤ* c')) (ℤ*-assoc (y ℤ* c') a' c')
viii = distributivity-mult-over-ℤ (y ℤ* c') (z ℤ* b') (a' ℤ* c') ⁻¹
ix = ap (λ - → (y ℤ* c' ℤ+ (z ℤ* b')) ℤ* -) II
_*_ : 𝔽 → 𝔽 → 𝔽
(x , y) * (x' , y') = x ℤ* x' , pred (succ y ℕ* succ y')
infixl 34 _*_
≈-over-* : (p q r : 𝔽) → p ≈ q → (p * r) ≈ (q * r)
≈-over-* (x , a) (y , b) (z , c) e = I
where
a' b' c' : ℤ
a' = pos (succ a)
b' = pos (succ b)
c' = pos (succ c)
I : x ℤ* z ℤ* pos (succ (pred (succ b ℕ* succ c)))
= y ℤ* z ℤ* pos (succ (pred (succ a ℕ* succ c)))
I = x ℤ* z ℤ* pos (succ (pred (succ b ℕ* succ c))) =⟨ i ⟩
x ℤ* z ℤ* (b' ℤ* c') =⟨ ii ⟩
x ℤ* z ℤ* b' ℤ* c' =⟨ iii ⟩
x ℤ* b' ℤ* z ℤ* c' =⟨ iv ⟩
y ℤ* a' ℤ* z ℤ* c' =⟨ v ⟩
y ℤ* (a' ℤ* z) ℤ* c' =⟨ vi ⟩
y ℤ* (z ℤ* a') ℤ* c' =⟨ vii ⟩
y ℤ* z ℤ* a' ℤ* c' =⟨ viii ⟩
y ℤ* z ℤ* (a' ℤ* c') =⟨ ix ⟩
y ℤ* z ℤ* pos (succ (pred (succ a ℕ* succ c))) ∎
where
i = ap (λ - → x ℤ* z ℤ* -) (denom-setup b c)
ii = ℤ*-assoc (x ℤ* z) b' c' ⁻¹
iii = ap (_ℤ* c') (ℤ-mult-rearrangement x z b')
iv = ap (λ - → - ℤ* z ℤ* c') e
v = ap (_ℤ* c') (ℤ*-assoc y a' z )
vi = ap (λ - → y ℤ* - ℤ* c') (ℤ*-comm a' z)
vii = ap (_ℤ* c') (ℤ*-assoc y z a' ⁻¹)
viii = ℤ*-assoc (y ℤ* z) a' c'
ix = ap (λ - → (y ℤ* z ℤ* -)) (denom-setup a c ⁻¹)
1/3+1/3≈2/3 : (pos 1 , 2) + (pos 1 , 2) ≈ (pos 2 , 2)
1/3+1/3≈2/3 = refl
1/3+2/3≈1 : (pos 1 , 2) + (pos 2 , 2) ≈ (pos 1 , 0)
1/3+2/3≈1 = refl
𝔽-mult-left-id : (q : 𝔽) → (pos 1 , 0) * q = q
𝔽-mult-left-id (x , a) = to-×-= γ₁ γ₂
where
γ₁ : pos 1 ℤ* x = x
γ₁ = ℤ-mult-left-id x
γ₂ : pred (1 ℕ* succ a) = a
γ₂ = ap pred (mult-commutativity 1 (succ a))
𝔽-zero-left-is-zero : (q : 𝔽) → (pos 0 , 0) * q ≈ (pos 0 , 0)
𝔽-zero-left-is-zero (x , a)
= pos 0 ℤ* x ℤ* pos 1 =⟨ i ⟩
pos 0 ℤ* (x ℤ* pos 1) =⟨ ii ⟩
pos 0 =⟨ iii ⟩
pos 0 ℤ* pos (succ (pred (1 ℕ* succ a))) ∎
where
i = ℤ*-assoc (pos 0) x (pos 1)
ii = ℤ-zero-left-base (x ℤ* pos 1)
iii = ℤ-zero-left-base (pos (succ (pred (1 ℕ* succ a)))) ⁻¹
𝔽*-comm : (p q : 𝔽) → p * q = q * p
𝔽*-comm (x , a) (y , b) = ap₂ _,_ I II
where
I : x ℤ* y = y ℤ* x
I = ℤ*-comm x y
II : pred (succ a ℕ* succ b) = pred (succ b ℕ* succ a)
II = ap pred (mult-commutativity (succ a) (succ b))
𝔽*-assoc : (p q r : 𝔽) → p * q * r = p * (q * r)
𝔽*-assoc (x , a) (y , b) (z , c) = ap₂ _,_ I II
where
I : x ℤ* y ℤ* z = x ℤ* (y ℤ* z)
I = ℤ*-assoc x y z
a' b' c' : ℕ
a' = succ a
b' = succ b
c' = succ c
II : pred (succ (pred (a' ℕ* b')) ℕ* c') = pred (a' ℕ* succ (pred (b' ℕ* c')))
II = pred (succ (pred (a' ℕ* b')) ℕ* c') =⟨ i ⟩
pred (a' ℕ* b' ℕ* c') =⟨ ii ⟩
pred (a' ℕ* (b' ℕ* c')) =⟨ iii ⟩
pred (a' ℕ* succ (pred (b' ℕ* c'))) ∎
where
i = ap (λ - → pred (- ℕ* c')) (succ-pred-multiplication a b ⁻¹)
ii = ap pred (mult-associativity a' b' c')
iii = ap (λ - → pred (a' ℕ* -)) (succ-pred-multiplication b c)
𝔽-dist : (p q r : 𝔽) → p * (q + r) ≈ p * q + p * r
𝔽-dist (x , a) (y , b) (z , c) = I
where
a' b' c' : ℕ
a' = succ a
b' = succ b
c' = succ c
a'' b'' c'' k l : ℤ
a'' = pos a'
b'' = pos b'
c'' = pos c'
k = pos (succ (pred (a' ℕ* c')))
l = pos (succ (pred (a' ℕ* b')))
I-lemma : (x y p q : ℤ) → x ℤ* y ℤ* (p ℤ* q) = x ℤ* p ℤ* (y ℤ* q)
I-lemma x y p q = x ℤ* y ℤ* (p ℤ* q) =⟨ ℤ*-assoc (x ℤ* y) p q ⁻¹ ⟩
x ℤ* y ℤ* p ℤ* q =⟨ ap (_ℤ* q) (ℤ*-assoc x y p ) ⟩
x ℤ* (y ℤ* p) ℤ* q =⟨ ap (λ - → x ℤ* - ℤ* q) (ℤ*-comm y p) ⟩
x ℤ* (p ℤ* y) ℤ* q =⟨ ap (_ℤ* q) (ℤ*-assoc x p y ⁻¹) ⟩
x ℤ* p ℤ* y ℤ* q =⟨ ℤ*-assoc (x ℤ* p) y q ⟩
x ℤ* p ℤ* (y ℤ* q) ∎
I : _ = _
I = x ℤ* (y ℤ* c'' ℤ+ z ℤ* b'') ℤ* pos (succ (pred (succ (pred (a' ℕ* b')) ℕ* (succ (pred (a' ℕ* c')))))) =⟨ i ⟩
x ℤ* (y ℤ* c'' ℤ+ z ℤ* b'') ℤ* (l ℤ* k) =⟨ ii ⟩
x ℤ* (y ℤ* c'' ℤ+ z ℤ* b'') ℤ* (pos (a' ℕ* b') ℤ* pos (a' ℕ* c')) =⟨ iii ⟩
x ℤ* (y ℤ* c'' ℤ+ z ℤ* b'') ℤ* (a'' ℤ* b'' ℤ* (a'' ℤ* c'')) =⟨ iv ⟩
x ℤ* (y ℤ* c'' ℤ+ z ℤ* b'') ℤ* (a'' ℤ* (b'' ℤ* (a'' ℤ* c''))) =⟨ v ⟩
x ℤ* (y ℤ* c'' ℤ+ z ℤ* b'') ℤ* a'' ℤ* (b'' ℤ* (a'' ℤ* c'')) =⟨ vi ⟩
x ℤ* a'' ℤ* (y ℤ* c'' ℤ+ (z ℤ* b'')) ℤ* (a'' ℤ* (b'' ℤ* c'')) =⟨ vii ⟩
(x ℤ* a'' ℤ* (y ℤ* c'') ℤ+ x ℤ* a'' ℤ* (z ℤ* b'')) ℤ* (a'' ℤ* (pos (b' ℕ* c'))) =⟨ viii ⟩
(x ℤ* y ℤ* (a'' ℤ* c'') ℤ+ x ℤ* z ℤ* (a'' ℤ* b'')) ℤ* (a'' ℤ* (pos (b' ℕ* c'))) =⟨ ix ⟩
(x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* (a'' ℤ* (pos (b' ℕ* c'))) =⟨ xi ⟩
(x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* pos (a' ℕ* (b' ℕ* c')) =⟨ xii ⟩
(x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* pos (a' ℕ* succ (pred (b' ℕ* c'))) =⟨ xiii ⟩
(x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* pos (succ (pred (a' ℕ* succ (pred (b' ℕ* c'))))) ∎
where
i = ap (λ β → x ℤ* (y ℤ* c'' ℤ+ (z ℤ* b'')) ℤ* β ) (denom-setup (pred (a' ℕ* b')) (pred (a' ℕ* c')))
ii = ap₂ (λ α β → x ℤ* (y ℤ* c'' ℤ+ (z ℤ* b'')) ℤ* (pos α ℤ* pos β)) (succ-pred-multiplication a b ⁻¹) (succ-pred-multiplication a c ⁻¹)
iii = ap₂ (λ α β → x ℤ* (y ℤ* c'' ℤ+ (z ℤ* b'')) ℤ* (α ℤ* β) ) (pos-multiplication-equiv-to-ℕ a' b' ⁻¹) (pos-multiplication-equiv-to-ℕ a' c' ⁻¹)
iv = ap (λ α → x ℤ* (y ℤ* c'' ℤ+ (z ℤ* b'')) ℤ* α ) (ℤ*-assoc a'' b'' ( a'' ℤ* c'') )
v = ℤ*-assoc (x ℤ* ( y ℤ* c'' ℤ+ (z ℤ* b'') )) a'' ( b'' ℤ* (a'' ℤ* c'')) ⁻¹
vi = ap₂ (λ α β → α ℤ* β) (ℤ-mult-rearrangement x ( y ℤ* c'' ℤ+ (z ℤ* b'')) a'') (ℤ-mult-rearrangement''' b'' a'' c'')
vii = ap₂ (λ α β → α ℤ* (a'' ℤ* β)) (distributivity-mult-over-ℤ' (y ℤ* c'') (z ℤ* b'') (x ℤ* a'')) (pos-multiplication-equiv-to-ℕ b' c')
viii = ap₂ (λ α β → (α ℤ+ β) ℤ* ((a'' ℤ* (pos (b' ℕ* c'))))) (I-lemma x a'' y c'') (I-lemma x a'' z b'')
ix = ap₂ (λ α β → (x ℤ* y ℤ* α ℤ+ x ℤ* z ℤ* β) ℤ* ((a'' ℤ* (pos (b' ℕ* c'))))) (denom-setup a c ⁻¹) (denom-setup a b ⁻¹)
xi = ap (λ α → (x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* α) (pos-multiplication-equiv-to-ℕ a' (b' ℕ* c'))
xii = ap (λ α → (x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* (pos (a' ℕ* α))) (succ-pred-multiplication b c)
xiii = ap (λ α → (x ℤ* y ℤ* k ℤ+ (x ℤ* z ℤ* l)) ℤ* pos α) (succ-pred-multiplication a (pred (b' ℕ* c')))
abs : 𝔽 → 𝔽
abs (x , a) = absℤ x , a
𝔽-abs-0 : pos 0 , 0 = abs (pos 0 , 0)
𝔽-abs-0 = by-definition
𝔽-abs-neg-equals-pos : (q : 𝔽) → abs q ≈ abs (- q)
𝔽-abs-neg-equals-pos (x , a) = ap (_ℤ* (pos (succ a))) (absℤ-removes-neg-sign x)
𝔽-subtraction-dist-over-mult : (p q : 𝔽) → (- p) * q ≈ (- (p * q))
𝔽-subtraction-dist-over-mult (x , a) (y , b) = γ
where
I : (ℤ- x) ℤ* y = ℤ- (x ℤ* y)
I = negation-dist-over-mult' x y
γ : _
γ = ap (_ℤ* pos (succ (pred (succ a ℕ* succ b)))) I
𝔽-minus-dist : ((x , a) (y , b) : 𝔽)
→ (ℤ- x , a) + (ℤ- y , b) ≈ (- ((x , a) + (y , b)))
𝔽-minus-dist (x , a) (y , b) = γ
where
pa = (pos ∘ succ) a
pb = (pos ∘ succ) b
γ' : (ℤ- x) ℤ* pb ℤ+ (ℤ- y) ℤ* pa = ℤ- (x ℤ* pb ℤ+ y ℤ* pa)
γ' = (ℤ- x) ℤ* pb ℤ+ (ℤ- y) ℤ* pa =⟨ i ⟩
(ℤ- x ℤ* pb) ℤ+ (ℤ- y) ℤ* pa =⟨ ii ⟩
(ℤ- x ℤ* pb) ℤ+ (ℤ- y ℤ* pa) =⟨ iii ⟩
ℤ- (x ℤ* pb ℤ+ y ℤ* pa) ∎
where
i = ap (_ℤ+ (ℤ- y) ℤ* pa) (negation-dist-over-mult' x pb)
ii = ap ((ℤ- x ℤ* pb) ℤ+_) (negation-dist-over-mult' y pa)
iii = negation-dist (x ℤ* pb) (y ℤ* pa)
γ : ((ℤ- x , a) + (ℤ- y , b)) ≈ (- ((x , a) + (y , b)))
γ = ap (_ℤ* pos (succ (pred (succ a ℕ* succ b)))) γ'
𝔽+-inverse : ((x , a) : 𝔽) → ((ℤ- x , a) + (x , a)) ≈ (pos 0 , 0)
𝔽+-inverse (x , a) = γ
where
pa = (pos ∘ succ) a
γ : ((ℤ- x , a) + (x , a)) ≈ (pos 0 , 0)
γ = ((ℤ- x) ℤ* pa ℤ+ x ℤ* pa) ℤ* pos 1 =⟨ i ⟩
((ℤ- x) ℤ* pa ℤ+ x ℤ* pa) =⟨ ii ⟩
((ℤ- x) ℤ+ x) ℤ* pa =⟨ iii ⟩
(x ℤ+ (ℤ- x)) ℤ* pa =⟨ iv ⟩
pos 0 ℤ* pa =⟨ v ⟩
pos 0 =⟨ vi ⟩
pos 0 ℤ* pos (succ (pred (succ a ℕ* succ a))) ∎
where
i = ℤ-mult-right-id ((ℤ- x) ℤ* pa ℤ+ (x ℤ* pa))
ii = distributivity-mult-over-ℤ (ℤ- x) x pa ⁻¹
iii = ap (_ℤ* pa) (ℤ+-comm (ℤ- x) x)
iv = ap (_ℤ* pa) (ℤ-sum-of-inverse-is-zero x)
v = ℤ-zero-left-base pa
vi = ℤ-zero-left-base (pos (succ (pred (succ a ℕ* succ a)))) ⁻¹
𝔽+-inverse' : ((x , a) : 𝔽) → ((x , a) + (ℤ- x , a)) ≈ (pos 0 , 0)
𝔽+-inverse' (x , a) = γ
where
I : (x , a) + (ℤ- x , a) = (ℤ- x , a) + (x , a)
I = 𝔽+-comm (x , a) (ℤ- x , a)
II : ((x , a) + (ℤ- x , a)) ≈ ((x , a) + (ℤ- x , a))
II = ≈-refl ((x , a) + (ℤ- x , a))
III : ((x , a) + (ℤ- x , a)) ≈ ((ℤ- x , a) + (x , a))
III = transport (((x , a) + (ℤ- x , a)) ≈_) I II
IV : ((ℤ- x , a) + (x , a)) ≈ (pos 0 , 0)
IV = 𝔽+-inverse (x , a)
γ : ((x , a) + (ℤ- x , a)) ≈ (pos 0 , 0)
γ = ≈-trans ((x , a) + (ℤ- x , a)) ((ℤ- x , a) + (x , a)) (pos 0 , 0) III IV
𝔽-add-same-denom : ((x , a) (y , a) : 𝔽) → (((x , a) + (y , a)) ≈ (x ℤ+ y , a))
𝔽-add-same-denom (x , a) (y , b) = γ
where
γ : _
γ = (x ℤ* pos (succ b) ℤ+ y ℤ* pos (succ b)) ℤ* pos (succ b) =⟨ i ⟩
(x ℤ+ y) ℤ* pos (succ b) ℤ* pos (succ b) =⟨ ii ⟩
(x ℤ+ y) ℤ* (pos (succ b) ℤ* pos (succ b)) =⟨ iii ⟩
(x ℤ+ y) ℤ* pos (succ (pred (succ b ℕ* succ b))) ∎
where
i = ap (_ℤ* pos (succ b)) (distributivity-mult-over-ℤ x y (pos (succ b)) ⁻¹)
ii = ℤ*-assoc (x ℤ+ y ) (pos (succ b)) (pos (succ b))
iii = ap ((x ℤ+ y) ℤ*_) (denom-setup b b ⁻¹)
\end{code}