{-# OPTIONS --safe #-}
module Cubical.Data.Int.MoreInts.QuoInt.Properties where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Isomorphism
open import Cubical.Functions.FunExtEquiv
open import Cubical.Relation.Nullary
open import Cubical.Data.Nat as ℕ using (ℕ; zero; suc)
open import Cubical.Data.Bool as Bool using (Bool; not; notnot)
open import Cubical.Data.Empty
open import Cubical.Data.Unit renaming (Unit to ⊤)
import Cubical.Data.Int as Int
open import Cubical.Data.Int.MoreInts.QuoInt.Base renaming (elim to ℤelim)
·S-comm : ∀ x y → x ·S y ≡ y ·S x
·S-comm = Bool.⊕-comm
·S-assoc : ∀ x y z → x ·S (y ·S z) ≡ (x ·S y) ·S z
·S-assoc = Bool.⊕-assoc
not-·Sˡ : ∀ x y → not (x ·S y) ≡ not x ·S y
not-·Sˡ = Bool.not-⊕ˡ
snotz : ∀ s n s' → ¬ (signed s (suc n) ≡ signed s' zero)
snotz s n s' eq = subst (λ { (signed s (suc n)) → ⊤
; _ → ⊥ }) eq tt
+-zeroʳ : ∀ s m → m + signed s zero ≡ m
+-zeroʳ s (signed s' zero) = signed-zero s s'
+-zeroʳ s (pos (suc n)) = cong sucℤ (+-zeroʳ s (pos n))
+-zeroʳ s (neg (suc n)) = cong predℤ (+-zeroʳ s (neg n))
+-zeroʳ spos (posneg i) j = posneg (i ∧ j)
+-zeroʳ sneg (posneg i) j = posneg (i ∨ ~ j)
+-identityʳ : ∀ m → m + pos zero ≡ m
+-identityʳ = +-zeroʳ spos
sucℤ-+ʳ : ∀ m n → sucℤ (m + n) ≡ m + sucℤ n
sucℤ-+ʳ (signed _ zero) _ = refl
sucℤ-+ʳ (posneg _) _ = refl
sucℤ-+ʳ (pos (suc m)) n = cong sucℤ (sucℤ-+ʳ (pos m) n)
sucℤ-+ʳ (neg (suc m)) n =
sucPredℤ (neg m + n) ∙∙
sym (predSucℤ (neg m + n)) ∙∙
cong predℤ (sucℤ-+ʳ (neg m) n)
predℤ-+ʳ : ∀ m n → predℤ (m + n) ≡ m + predℤ n
predℤ-+ʳ (signed _ zero) _ = refl
predℤ-+ʳ (posneg _) _ = refl
predℤ-+ʳ (neg (suc m)) n = cong predℤ (predℤ-+ʳ (neg m) n)
predℤ-+ʳ (pos (suc m)) n =
predSucℤ (pos m + n) ∙∙
sym (sucPredℤ (pos m + n)) ∙∙
cong sucℤ (predℤ-+ʳ (pos m) n)
+-comm : ∀ m n → m + n ≡ n + m
+-comm (signed s zero) n = sym (+-zeroʳ s n)
+-comm (pos (suc m)) n = cong sucℤ (+-comm (pos m) n) ∙ sucℤ-+ʳ n (pos m)
+-comm (neg (suc m)) n = cong predℤ (+-comm (neg m) n) ∙ predℤ-+ʳ n (neg m)
+-comm (posneg i) n = lemma n i
where
lemma : ∀ n → (λ i → (posneg i + n) ≡ (n + posneg i))
[ sym (+-zeroʳ spos n) ≡ sym (+-zeroʳ sneg n) ]
lemma (pos zero) i j = posneg (i ∧ j)
lemma (pos (suc n)) i = cong sucℤ (lemma (pos n) i)
lemma (neg zero) i j = posneg (i ∨ ~ j)
lemma (neg (suc n)) i = cong predℤ (lemma (neg n) i)
lemma (posneg i) j k = posneg ((i ∧ ~ k) ∨ (i ∧ j) ∨ (j ∧ k))
sucℤ-+ˡ : ∀ m n → sucℤ (m + n) ≡ sucℤ m + n
sucℤ-+ˡ (pos _) n = refl
sucℤ-+ˡ (neg zero) n = refl
sucℤ-+ˡ (neg (suc m)) n = sucPredℤ _
sucℤ-+ˡ (posneg _) n = refl
predℤ-+ˡ : ∀ m n → predℤ (m + n) ≡ predℤ m + n
predℤ-+ˡ (pos zero) n = refl
predℤ-+ˡ (pos (suc m)) n = predSucℤ _
predℤ-+ˡ (neg _) n = refl
predℤ-+ˡ (posneg _) n = refl
+-assoc : ∀ m n o → m + (n + o) ≡ m + n + o
+-assoc (signed s zero) n o = refl
+-assoc (posneg i) n o = refl
+-assoc (pos (suc m)) n o = cong sucℤ (+-assoc (pos m) n o) ∙ sucℤ-+ˡ (pos m + n) o
+-assoc (neg (suc m)) n o = cong predℤ (+-assoc (neg m) n o) ∙ predℤ-+ˡ (neg m + n) o
sucℤ-inj : ∀ m n → sucℤ m ≡ sucℤ n → m ≡ n
sucℤ-inj m n p = sym (predSucℤ m) ∙ cong predℤ p ∙ predSucℤ n
predℤ-inj : ∀ m n → predℤ m ≡ predℤ n → m ≡ n
predℤ-inj m n p = sym (sucPredℤ m) ∙ cong sucℤ p ∙ sucPredℤ n
+-injˡ : ∀ o m n → o + m ≡ o + n → m ≡ n
+-injˡ (signed _ zero) _ _ p = p
+-injˡ (posneg _) _ _ p = p
+-injˡ (pos (suc o)) m n p = +-injˡ (pos o) m n (sucℤ-inj _ _ p)
+-injˡ (neg (suc o)) m n p = +-injˡ (neg o) m n (predℤ-inj _ _ p)
+-injʳ : ∀ m n o → m + o ≡ n + o → m ≡ n
+-injʳ m n o p = +-injˡ o m n (+-comm o m ∙ p ∙ +-comm n o)
·-comm : ∀ m n → m · n ≡ n · m
·-comm m n i = signed (·S-comm (sign m) (sign n) i) (ℕ.·-comm (abs m) (abs n) i)
·-identityˡ : ∀ n → pos 1 · n ≡ n
·-identityˡ n = cong (signed (sign n)) (ℕ.+-zero (abs n)) ∙ signed-inv n
·-identityʳ : ∀ n → n · pos 1 ≡ n
·-identityʳ n = ·-comm n (pos 1) ∙ ·-identityˡ n
·-zeroˡ : ∀ {s} n → signed s zero · n ≡ signed s zero
·-zeroˡ _ = signed-zero _ _
·-zeroʳ : ∀ {s} n → n · signed s zero ≡ signed s zero
·-zeroʳ n = cong (signed _) (sym (ℕ.0≡m·0 (abs n))) ∙ signed-zero _ _
·-signed-pos : ∀ {s} m n → signed s m · pos n ≡ signed s (m ℕ.· n)
·-signed-pos {s} zero n = ·-zeroˡ {s} (pos n)
·-signed-pos {s} (suc m) n i = signed (·S-comm s (sign-pos n i) i) (suc m ℕ.· n)
·-assoc : ∀ m n o → m · (n · o) ≡ m · n · o
·-assoc (signed s zero) n o =
·-zeroˡ (n · o)
·-assoc m@(signed _ (suc _)) (signed s zero) o =
·-zeroʳ {sign o} m ∙ signed-zero _ _ ∙ cong (_· o) (sym (·-zeroʳ {s} m))
·-assoc m@(signed _ (suc _)) n@(signed _ (suc _)) (signed s zero) =
cong (m ·_) (·-zeroʳ {s} n) ∙ ·-zeroʳ {s} m ∙ sym (·-zeroʳ {s} (m · n))
·-assoc (signed sm (suc m)) (signed sn (suc n)) (signed so (suc o)) i =
signed (·S-assoc sm sn so i) (ℕ.·-assoc (suc m) (suc n) (suc o) i)
·-assoc (posneg i) n o j =
isSet→isSet' isSetℤ (·-assoc (pos zero) n o) (·-assoc (neg zero) n o)
(λ i → posneg i · (n · o)) (λ i → posneg i · n · o) i j
·-assoc m@(signed _ (suc _)) (posneg i) o j =
isSet→isSet' isSetℤ (·-assoc m (pos zero) o) (·-assoc m (neg zero) o)
(λ i → m · (posneg i · o)) (λ i → m · posneg i · o) i j
·-assoc m@(signed _ (suc _)) n@(signed _ (suc _)) (posneg i) j =
isSet→isSet' isSetℤ (·-assoc m n (pos zero)) (·-assoc m n (neg zero))
(λ i → m · (n · posneg i)) (λ i → m · n · posneg i) i j
negateSuc : ∀ n → - sucℤ n ≡ predℤ (- n)
negateSuc n i = - sucℤ (negate-invol n (~ i))
negatePred : ∀ n → - predℤ n ≡ sucℤ (- n)
negatePred n i = negate-invol (sucℤ (- n)) i
negate-+ : ∀ m n → - (m + n) ≡ (- m) + (- n)
negate-+ (signed _ zero) n = refl
negate-+ (posneg _) n = refl
negate-+ (pos (suc m)) n = negateSuc (pos m + n) ∙ cong predℤ (negate-+ (pos m) n)
negate-+ (neg (suc m)) n = negatePred (neg m + n) ∙ cong sucℤ (negate-+ (neg m) n)
negate-·ˡ : ∀ m n → - (m · n) ≡ (- m) · n
negate-·ˡ (signed _ zero) n = signed-zero (not (sign n)) (sign n)
negate-·ˡ (signed ss (suc m)) n i = signed (not-·Sˡ ss (sign n) i) (suc m ℕ.· abs n)
negate-·ˡ (posneg i) n j =
isSet→isSet' isSetℤ (signed-zero (not (sign n)) _) (signed-zero _ _)
refl (λ i → posneg (~ i) · n) i j
signed-distrib : ∀ s m n → signed s (m ℕ.+ n) ≡ signed s m + signed s n
signed-distrib s zero n = refl
signed-distrib spos (suc m) n = cong sucℤ (signed-distrib spos m n)
signed-distrib sneg (suc m) n = cong predℤ (signed-distrib sneg m n)
·-pos-suc : ∀ m n → pos (suc m) · n ≡ n + pos m · n
·-pos-suc m n = signed-distrib (sign n) (abs n) (m ℕ.· abs n)
∙ (λ i → signed-inv n i + signed (sign-pos m (~ i) ·S sign n) (m ℕ.· abs n))
·-distribˡ-pos : ∀ o m n → (pos o · m) + (pos o · n) ≡ pos o · (m + n)
·-distribˡ-pos zero m n = signed-zero (sign n) (sign (m + n))
·-distribˡ-pos (suc o) m n =
pos (suc o) · m + pos (suc o) · n ≡[ i ]⟨ ·-pos-suc o m i + ·-pos-suc o n i ⟩
m + pos o · m + (n + pos o · n) ≡⟨ +-assoc (m + pos o · m) n (pos o · n) ⟩
m + pos o · m + n + pos o · n ≡[ i ]⟨ +-assoc m (pos o · m) n (~ i) + pos o · n ⟩
m + (pos o · m + n) + pos o · n ≡[ i ]⟨ m + +-comm (pos o · m) n i + pos o · n ⟩
m + (n + pos o · m) + pos o · n ≡[ i ]⟨ +-assoc m n (pos o · m) i + pos o · n ⟩
m + n + pos o · m + pos o · n ≡⟨ sym (+-assoc (m + n) (pos o · m) (pos o · n)) ⟩
m + n + (pos o · m + pos o · n) ≡⟨ cong ((m + n) +_) (·-distribˡ-pos o m n) ⟩
m + n + pos o · (m + n) ≡⟨ sym (·-pos-suc o (m + n)) ⟩
pos (suc o) · (m + n) ∎
·-distribˡ-neg : ∀ o m n → (neg o · m) + (neg o · n) ≡ neg o · (m + n)
·-distribˡ-neg o m n =
neg o · m + neg o · n ≡[ i ]⟨ negate-·ˡ (pos o) m (~ i) + negate-·ˡ (pos o) n (~ i) ⟩
- (pos o · m) + - (pos o · n) ≡⟨ sym (negate-+ (pos o · m) (pos o · n)) ⟩
- (pos o · m + pos o · n) ≡⟨ cong -_ (·-distribˡ-pos o m n) ⟩
- (pos o · (m + n)) ≡⟨ negate-·ˡ (pos o) (m + n) ⟩
neg o · (m + n) ∎
·-distribˡ : ∀ o m n → (o · m) + (o · n) ≡ o · (m + n)
·-distribˡ (pos o) m n = ·-distribˡ-pos o m n
·-distribˡ (neg o) m n = ·-distribˡ-neg o m n
·-distribˡ (posneg i) m n j =
isSet→isSet' isSetℤ (·-distribˡ-pos zero m n) (·-distribˡ-neg zero m n)
(λ i → posneg i · n) (λ i → posneg i · (m + n)) i j
·-distribʳ : ∀ m n o → (m · o) + (n · o) ≡ (m + n) · o
·-distribʳ m n o = (λ i → ·-comm m o i + ·-comm n o i) ∙ ·-distribˡ o m n ∙ ·-comm o (m + n)
sign-pos-suc-· : ∀ m n → sign (pos (suc m) · n) ≡ sign n
sign-pos-suc-· m (signed s zero) = sign-pos (suc m ℕ.· zero)
sign-pos-suc-· m (posneg i) = sign-pos (suc m ℕ.· zero)
sign-pos-suc-· m (signed s (suc n)) = refl
·-injˡ : ∀ o m n → pos (suc o) · m ≡ pos (suc o) · n → m ≡ n
·-injˡ o m n p = sym (signed-inv m) ∙ (λ i → signed (sign-eq i) (abs-eq i)) ∙ signed-inv n
where sign-eq = sym (sign-pos-suc-· o m) ∙ cong sign p ∙ sign-pos-suc-· o n
abs-eq = ℕ.inj-sm· {o} (cong abs p)
·-injʳ : ∀ m n o → m · pos (suc o) ≡ n · pos (suc o) → m ≡ n
·-injʳ m n o p = ·-injˡ o m n (·-comm (pos (suc o)) m ∙ p ∙ ·-comm n (pos (suc o)))
private
_+'_ : ℤ → ℤ → ℤ
_+'_ = Iso.fun (binaryOpIso isoIntℤ) Int._+_
sucℤ→Int : ∀ (n : ℤ) → ℤ→Int (sucℤ n) ≡ Int.sucℤ (ℤ→Int n)
sucℤ→Int (pos n) = refl
sucℤ→Int (neg zero) = refl
sucℤ→Int (neg (suc zero)) = refl
sucℤ→Int (neg (suc (suc n))) = refl
sucℤ→Int (posneg i) = refl
predℤ→Int : ∀ (n : ℤ) → ℤ→Int (predℤ n) ≡ Int.predℤ (ℤ→Int n)
predℤ→Int (pos zero) = refl
predℤ→Int (pos (suc n)) = refl
predℤ→Int (neg zero) = refl
predℤ→Int (neg (suc n)) = refl
predℤ→Int (posneg i) = refl
ℤ→IntIsHom+ : ∀ (n m : ℤ) → ℤ→Int (n + m) ≡ (ℤ→Int n) Int.+ (ℤ→Int m)
ℤ→IntIsHom+ n m = (ℤelim (λ n → ∀ (m : ℤ) → ℤ→Int (n + m) ≡ (ℤ→Int n) Int.+ (ℤ→Int m)) posℤ→Int+Int≡+ negsucℤ→Int+Int≡+ n) m
where
posℤ→Int+Int≡+ : ∀ (n : ℕ) (m : ℤ) → ℤ→Int ((pos n) + m) ≡ (ℤ→Int (pos n)) Int.+ (ℤ→Int m)
posℤ→Int+Int≡+ zero m =
ℤ→Int (pos zero + m)
≡⟨ cong ℤ→Int (+-comm (pos zero) m) ⟩
ℤ→Int (m + pos zero)
≡⟨ cong ℤ→Int (+-zeroʳ spos m) ⟩
ℤ→Int m
≡⟨ Int.pos0+ (ℤ→Int m) ⟩
(ℤ→Int (pos zero)) Int.+ (ℤ→Int m) ∎
posℤ→Int+Int≡+ (suc n) m =
ℤ→Int ((pos (suc n)) + m)
≡⟨ cong ℤ→Int (sym (sucℤ-+ˡ (pos n) m)) ⟩
ℤ→Int (sucℤ ((pos n) + m))
≡⟨ sucℤ→Int ((pos n) + m) ⟩
Int.sucℤ (ℤ→Int ((pos n) + m))
≡⟨ cong Int.sucℤ (posℤ→Int+Int≡+ n m) ⟩
Int.sucℤ ((Int.pos n) Int.+ (ℤ→Int m))
≡⟨ Int.sucℤ+ (Int.pos n) (ℤ→Int m) ⟩
(ℤ→Int (pos (suc n))) Int.+ (ℤ→Int m) ∎
negsucℤ→Int+Int≡+ : ∀ (n : ℕ) (m : ℤ) → ℤ→Int ((neg (suc n)) + m) ≡ (ℤ→Int (neg (suc n))) Int.+ (ℤ→Int m)
negsucℤ→Int+Int≡+ zero m =
ℤ→Int ((neg (suc zero)) + m)
≡⟨ cong ℤ→Int (predℤ-+ˡ (neg zero) m) ⟩
ℤ→Int (predℤ ((neg zero) + m))
≡⟨ predℤ→Int ((neg zero) + m) ⟩
Int.predℤ (ℤ→Int ((neg zero) + m))
≡⟨ cong Int.predℤ (posℤ→Int+Int≡+ zero m) ⟩
Int.predℤ ((Int.pos zero) Int.+ (ℤ→Int m))
≡⟨ Int.predℤ+ (Int.pos zero) (ℤ→Int m) ⟩
Int.negsuc zero Int.+ ℤ→Int m ∎
negsucℤ→Int+Int≡+ (suc n) m =
ℤ→Int ((neg (suc (suc n))) + m)
≡⟨ cong ℤ→Int (predℤ-+ˡ (neg (suc n)) m) ⟩
ℤ→Int (predℤ ((neg (suc n)) + m))
≡⟨ predℤ→Int ((neg (suc n)) + m) ⟩
Int.predℤ (ℤ→Int ((neg (suc n)) + m))
≡⟨ cong Int.predℤ (negsucℤ→Int+Int≡+ n m) ⟩
Int.predℤ ((Int.negsuc n) Int.+ ℤ→Int m)
≡⟨ Int.predℤ+ (Int.negsuc n) (ℤ→Int m) ⟩
Int.negsuc (suc n) Int.+ ℤ→Int m ∎
private
+'≡+ : _+'_ ≡ _+_
+'≡+ =
_+'_
≡⟨ sym (cong (_∘_ (_∘_ Int→ℤ)) (funExt₂ ℤ→IntIsHom+)) ⟩
(λ n → (λ m → (Int→ℤ (ℤ→Int (n + m)))))
≡⟨ funExt₂ (λ n m → (Iso.rightInv isoIntℤ (n + m))) ⟩
_+_ ∎
op≡Intℤ : (Int.ℤ → Int.ℤ → Int.ℤ) ≡ (ℤ → ℤ → ℤ)
op≡Intℤ = isoToPath (binaryOpIso isoIntℤ)
+Int≡+' : (λ i → op≡Intℤ i) [ Int._+_ ≡ _+'_ ]
+Int≡+' = transport-filler op≡Intℤ Int._+_
+Int≡+ : (λ i → (op≡Intℤ ∙ refl) i) [ Int._+_ ≡ _+_ ]
+Int≡+ = compPathP +Int≡+' +'≡+
ℤ→IntIsHom- : ∀ (n : ℤ) → ℤ→Int (- n) ≡ Int.- (ℤ→Int n)
ℤ→IntIsHom- n = ℤelim (λ n → ℤ→Int (- n) ≡ Int.- (ℤ→Int n)) posℤ→Int-Int≡- negsucℤ→Int-Int≡- n
where
posℤ→Int-Int≡- : ∀ (n : ℕ) → ℤ→Int (- (pos n)) ≡ Int.- (ℤ→Int (pos n))
posℤ→Int-Int≡- zero = refl
posℤ→Int-Int≡- (suc n) = refl
negsucℤ→Int-Int≡- : ∀ (n : ℕ) → ℤ→Int (- (neg (suc n))) ≡ Int.- (ℤ→Int (neg (suc n)))
negsucℤ→Int-Int≡- zero = refl
negsucℤ→Int-Int≡- (suc n) = refl
private
-'_ : ℤ → ℤ
-'_ = Iso.fun (endoIso isoIntℤ) (Int.-_)
-'≡- : -'_ ≡ -_
-'≡- =
-'_
≡⟨ sym (cong (_∘_ Int→ℤ) (funExt ℤ→IntIsHom-)) ⟩
(λ n → (Int→ℤ (ℤ→Int (- n))))
≡⟨ funExt (λ n → (Iso.rightInv isoIntℤ (- n))) ⟩
-_ ∎
endo≡Intℤ : (Int.ℤ → Int.ℤ) ≡ (ℤ → ℤ)
endo≡Intℤ = isoToPath (endoIso isoIntℤ)
-Int≡-' : (λ i → endo≡Intℤ i) [ Int.-_ ≡ -'_ ]
-Int≡-' = transport-filler endo≡Intℤ (Int.-_)
-Int≡- : (λ i → (endo≡Intℤ ∙ refl) i) [ Int.-_ ≡ -_ ]
-Int≡- = compPathP -Int≡-' -'≡-
ℤ→IntIsHom· : ∀ (n m : ℤ) → ℤ→Int (n · m) ≡ (ℤ→Int n) Int.· (ℤ→Int m)
ℤ→IntIsHom· n m = (ℤelim (λ n → ∀ (m : ℤ) → ℤ→Int (n · m) ≡ (ℤ→Int n) Int.· (ℤ→Int m)) posℤ→Int·Int≡· negsucℤ→Int·Int≡· n) m
where
posℤ→Int·Int≡· : ∀ (n : ℕ) (m : ℤ) → ℤ→Int ((pos n) · m) ≡ (ℤ→Int (pos n)) Int.· (ℤ→Int m)
posℤ→Int·Int≡· zero m =
ℤ→Int ((pos zero) · m)
≡⟨ sym (cong ℤ→Int (sym (·-zeroˡ {s = spos} m))) ⟩
(ℤ→Int (pos zero)) Int.· (ℤ→Int m) ∎
posℤ→Int·Int≡· (suc n) m =
ℤ→Int ((pos (suc n)) · m)
≡⟨ cong ℤ→Int (·-pos-suc n m) ⟩
ℤ→Int (m + ((pos n) · m))
≡⟨ ℤ→IntIsHom+ m ((pos n) · m) ⟩
(ℤ→Int m) Int.+ ℤ→Int ((pos n) · m)
≡⟨ cong (λ k → (ℤ→Int m) Int.+ k) (posℤ→Int·Int≡· n m) ⟩
(ℤ→Int (pos (suc n))) Int.· (ℤ→Int m) ∎
negsucℤ→Int·Int≡· : ∀ (n : ℕ) (m : ℤ) → ℤ→Int ((neg (suc n)) · m) ≡ (ℤ→Int (neg (suc n))) Int.· (ℤ→Int m)
negsucℤ→Int·Int≡· zero m =
ℤ→Int (neg (suc zero) · m)
≡⟨ cong (λ k → ℤ→Int (- k)) (·-identityˡ m) ⟩
ℤ→Int (- m)
≡⟨ ℤ→IntIsHom- m ⟩
(ℤ→Int (neg (suc zero))) Int.· (ℤ→Int m) ∎
negsucℤ→Int·Int≡· (suc n) m =
ℤ→Int ((neg (suc (suc n))) · m)
≡⟨ cong ℤ→Int (sym (·-distribʳ (neg (suc zero)) (neg (suc n)) m)) ⟩
ℤ→Int (((neg (suc zero)) · m) + ((neg (suc n)) · m))
≡⟨ cong ( (λ k → ℤ→Int ((- k) + ((neg (suc n)) · m)))) (·-identityˡ m) ⟩
ℤ→Int ((- m) + ((neg (suc n)) · m))
≡⟨ ℤ→IntIsHom+ (- m) ((neg (suc n)) · m) ⟩
(ℤ→Int (- m)) Int.+ (ℤ→Int ((neg (suc n)) · m))
≡⟨ cong (λ k → k Int.+ (ℤ→Int ((neg (suc n)) · m))) (ℤ→IntIsHom- m) ⟩
Int.- (ℤ→Int m) Int.+ (ℤ→Int ((neg (suc n)) · m))
≡⟨ cong (λ k → Int.- (ℤ→Int m) Int.+ k) (negsucℤ→Int·Int≡· n m) ⟩
(ℤ→Int (neg (suc (suc n)))) Int.· (ℤ→Int m) ∎
private
_·'_ : ℤ → ℤ → ℤ
_·'_ = Iso.fun (binaryOpIso isoIntℤ) Int._·_
·'≡· : _·'_ ≡ _·_
·'≡· =
_·'_
≡⟨ sym (cong (_∘_ (_∘_ Int→ℤ)) (funExt₂ ℤ→IntIsHom·)) ⟩
(λ n → (λ m → (Int→ℤ (ℤ→Int (n · m)))))
≡⟨ funExt₂ (λ n m → (Iso.rightInv isoIntℤ (n · m))) ⟩
_·_ ∎
·Int≡·' : (λ i → op≡Intℤ i) [ Int._·_ ≡ _·'_ ]
·Int≡·' = transport-filler op≡Intℤ Int._·_
·Int≡· : (λ i → (op≡Intℤ ∙ refl) i) [ Int._·_ ≡ _·_ ]
·Int≡· = compPathP ·Int≡·' ·'≡·