Todd Waugh Ambridge, January 2024 # Additional integer properties \begin{code} {-# OPTIONS --without-K --safe #-} open import Integers.Addition renaming (_+_ to _+ℤ_ ; _-_ to _ℤ-_) open import Integers.Multiplication renaming (_*_ to _ℤ*_) open import Integers.Negation renaming (-_ to ℤ-_) open import Integers.Order open import Integers.Type open import MLTT.Spartan open import Naturals.Addition renaming (_+_ to _+ℕ_) open import Naturals.Multiplication renaming (_*_ to _ℕ*_) open import Naturals.Order open import Notation.Order hiding (_≤_≤_) open import UF.Base open import UF.Subsingletons module TWA.Thesis.Chapter5.Integers where \end{code} ## ℤ-elimination \begin{code} ℤ-elim : (P : ℤ → 𝓤 ̇ ) → ((n : ℕ) → P (pos n)) → ((n : ℕ) → P (negsucc n)) → Π P ℤ-elim P Pp Pn (pos n) = Pp n ℤ-elim P Pp Pn (negsucc n) = Pn n \end{code} ## Monotone and rec properties \begin{code} succ-to-monotone' : (P : ℤ → ℤ → 𝓤 ̇ ) → ((a : ℤ) → P a a) → ((a b c : ℤ) → P a b → P b c → P a c) → ((a : ℤ) → P a (succℤ a)) → (a b : ℤ) (n : ℕ) → a +pos n = b → P a b succ-to-monotone' P r t s a a zero refl = r a succ-to-monotone' P r t s a b (succ n) refl = t a (succℤ a) b (s a) (succ-to-monotone' P r t s (succℤ a) (succℤ (a +pos n)) n (ℤ-left-succ-pos a n)) succ-to-monotone : (P : ℤ → ℤ → 𝓤 ̇ ) → ((a : ℤ) → P a a) → ((a b c : ℤ) → P a b → P b c → P a c) → ((a : ℤ) → P a (succℤ a)) → (a b : ℤ) → a ≤ℤ b → P a b succ-to-monotone P r t s a b (n , γ) = succ-to-monotone' P r t s a b n γ ≤-succ-to-monotone : (f : ℤ → ℤ) → ((a : ℤ) → f a ≤ℤ f (succℤ a)) → (a b : ℤ) → a ≤ℤ b → f a ≤ℤ f b ≤-succ-to-monotone f = succ-to-monotone (λ x y → f x ≤ℤ f y) (λ x → ℤ≤-refl (f x)) (λ x y z → ℤ≤-trans (f x) (f y) (f z)) rec-to-monotone : (f g : ℤ → ℤ) → ((a b : ℤ) → a ≤ℤ b → f a ≤ℤ g b) → (a b : ℤ) (n : ℕ) → a ≤ℤ b → rec a f n ≤ℤ rec b g n rec-to-monotone f g h a b zero a≤b = a≤b rec-to-monotone f g h a b (succ n) a≤b = h (rec a f n) (rec b g n) (rec-to-monotone f g h a b n a≤b) rec-f-= : {X : 𝓤 ̇ } → (f : X → X) (x : X) (n : ℕ) → rec (f x) f n = rec x f (succ n) rec-f-= f x zero = refl rec-f-= f x (succ n) = ap f (rec-f-= f x n) \end{code} ## Sign and num for integers \begin{code} sign : ℤ → (ℕ → ℤ) sign (pos _) = pos sign (negsucc _) = negsucc num : ℤ → ℕ num (pos n) = n num (negsucc n) = n \end{code} ## Natural number functions definitions and properties \begin{code} _/2 : ℕ → ℕ 0 /2 = 0 1 /2 = 0 succ (succ n) /2 = succ (n /2) _/2' : ℤ → ℤ pos x /2' = pos (x /2) negsucc x /2' = ℤ- (pos (succ x /2)) _ℕ^_ : ℕ → ℕ → ℕ a ℕ^ b = ((a ℕ*_) ^ b) 1 infixl 33 _ℕ^_ 2^ : ℕ → ℕ 2^ = 2 ℕ^_ power-of-pos-positive : ∀ n → is-pos-succ (pos (2^ n)) power-of-pos-positive 0 = ⋆ power-of-pos-positive (succ n) = transport is-pos-succ (pos-multiplication-equiv-to-ℕ 2 (2^ n)) I where I : is-pos-succ (pos 2 ℤ* pos (2^ n)) I = is-pos-succ-mult (pos 2) (pos (2^ n)) ⋆ (power-of-pos-positive n) prod-of-powers : (n a b : ℕ) → n ℕ^ a ℕ* n ℕ^ b = n ℕ^ (a +ℕ b) prod-of-powers n a zero = refl prod-of-powers n a (succ b) = I where I : n ℕ^ a ℕ* n ℕ^ succ b = n ℕ^ (a +ℕ succ b) I = n ℕ^ a ℕ* n ℕ^ succ b =⟨ refl ⟩ n ℕ^ a ℕ* (n ℕ* n ℕ^ b) =⟨ mult-associativity (n ℕ^ a) n (n ℕ^ b) ⁻¹ ⟩ n ℕ^ a ℕ* n ℕ* n ℕ^ b =⟨ ap (_ℕ* n ℕ^ b) (mult-commutativity (n ℕ^ a) n) ⟩ n ℕ* n ℕ^ a ℕ* n ℕ^ b =⟨ mult-associativity n (n ℕ^ a) (n ℕ^ b) ⟩ n ℕ* (n ℕ^ a ℕ* n ℕ^ b) =⟨ ap (n ℕ*_) (prod-of-powers n a b) ⟩ n ℕ* n ℕ^ (a +ℕ b) =⟨ refl ⟩ n ℕ^ succ (a +ℕ b) =⟨ refl ⟩ n ℕ^ (a +ℕ succ b) ∎ exponents-of-two-ordered : (m : ℕ) → 2 ℕ^ m < 2 ℕ^ (succ m) exponents-of-two-ordered 0 = ⋆ exponents-of-two-ordered (succ m) = transport₂ _<_ I II (multiplication-preserves-strict-order (2 ℕ^ m) (2 ℕ^ succ m) 1 IH) where IH : 2 ℕ^ m < 2 ℕ^ succ m IH = exponents-of-two-ordered m I : 2 ℕ^ m ℕ* 2 = 2 ℕ^ succ m I = mult-commutativity (2 ℕ^ m) 2 II : 2 ℕ^ succ m ℕ* 2 = 2 ℕ^ succ (succ m) II = mult-commutativity (2 ℕ^ succ m) 2 div-by-two' : (k : ℕ) → k +ℕ k /2 = k div-by-two' 0 = refl div-by-two' (succ k) = (succ k +ℕ succ k) /2 =⟨ ap _/2 (succ-left k (succ k)) ⟩ succ (succ (k +ℕ k)) /2 =⟨ refl ⟩ succ ((k +ℕ k) /2) =⟨ ap succ (div-by-two' k) ⟩ succ k ∎ \end{code} ## Integer order definitions and properties \begin{code} ℤ≤-decidable : (n m : ℤ) → (n ≤ m) + ¬ (n ≤ m) ℤ≤-decidable n m = Cases (ℤ-trichotomous m n) (inr ∘ ℤ-less-not-bigger-or-equal m n) (inl ∘ ℤ≤-attach n m) pred-shift : (a b : ℤ) → predℤ a ℤ- b = a ℤ- succℤ b pred-shift a b = ℤ-left-pred a (ℤ- b) ∙ ℤ-right-pred a (ℤ- b) ⁻¹ ∙ ap (a +ℤ_) (succℤ-lc (succpredℤ _ ∙ succpredℤ _ ⁻¹ ∙ ap succℤ (negation-dist b (pos 1)))) ℤ-less-not-equal : (a b : ℤ) → a <ℤ b → a ≠ b ℤ-less-not-equal a a (n , a<a) refl = γ γ' where γ' : 0 = succ n γ' = pos-lc (ℤ+-lc _ _ a (a<a ⁻¹ ∙ ℤ-left-succ-pos a n)) γ : 0 ≠ succ n γ () ≤-succℤ' : (x y : ℤ) → succℤ x ≤ succℤ y → x ≤ y ≤-succℤ' x y (n , e) = n , succℤ-lc (ℤ-left-succ x (pos n) ⁻¹ ∙ e) ℤ≤-succ-inj : (a b : ℤ) → a ≤ℤ b → succℤ a ≤ℤ succℤ b ℤ≤-succ-inj a b (n , refl) = n , ℤ-left-succ-pos a n ℤ≤-succⁿ-inj : (a b : ℤ) (n : ℕ) → a ≤ℤ b → (succℤ ^ n) a ≤ℤ (succℤ ^ n) b ℤ≤-succⁿ-inj = rec-to-monotone succℤ succℤ ℤ≤-succ-inj ℤ≤-pred-inj : (a b : ℤ) → a ≤ℤ b → predℤ a ≤ℤ predℤ b ℤ≤-pred-inj a b (n , refl) = n , ℤ-left-pred-pos a n ℤ≤-predⁿ-inj : (a b : ℤ) (n : ℕ) → a ≤ℤ b → (predℤ ^ n) a ≤ℤ (predℤ ^ n) b ℤ≤-predⁿ-inj = rec-to-monotone predℤ predℤ ℤ≤-pred-inj _≤ℤ_≤ℤ_ : ℤ → ℤ → ℤ → 𝓤₀ ̇ x ≤ℤ y ≤ℤ z = (x ≤ℤ y) × (y ≤ℤ z) ℤ≤²-refl : (k : ℤ) → k ≤ℤ k ≤ℤ k ℤ≤²-refl k = ℤ≤-refl k , ℤ≤-refl k ≤ℤ²-is-prop : {l u : ℤ} (x : ℤ) → is-prop (l ≤ℤ x ≤ℤ u) ≤ℤ²-is-prop {l} {u} x = ×-is-prop (ℤ≤-is-prop l x) (ℤ≤-is-prop x u) ℤ[_,_] : ℤ → ℤ → 𝓤₀ ̇ ℤ[ l , u ] = Σ z ꞉ ℤ , (l ≤ℤ z ≤ℤ u) ℤ[_,_]-succ : (l u : ℤ) → ℤ[ l , u ] → ℤ[ l , succℤ u ] ℤ[ l , u ]-succ (z , l≤z , z≤u) = z , l≤z , ℤ≤-trans z u (succℤ u) z≤u (1 , refl) ≤ℤ-antisym : (x y : ℤ) → x ≤ℤ y ≤ℤ x → x = y ≤ℤ-antisym x y (x≤y , y≤x) = Cases (ℤ≤-split x y x≤y) (Cases (ℤ≤-split y x y≤x) (λ y<x x<y → 𝟘-elim (ℤ-equal-not-less-than x (ℤ<-trans x y x x<y y<x))) (λ y=x _ → y=x ⁻¹)) id ≤ℤ-back : ∀ x y → x <ℤ y → x ≤ℤ predℤ y ≤ℤ-back x .(succℤ x +ℤ pos n) (n , refl) = ℤ≤-trans x (x +pos n) (predℤ (succℤ x +pos n)) (n , refl) (transport ((x +pos n) ≤ℤ_) (predsuccℤ (x +pos n) ⁻¹ ∙ ap predℤ (ℤ-left-succ x (pos n) ⁻¹)) (ℤ≤-refl (x +pos n))) ℤ-dich-succ : (x y : ℤ) → (( x <ℤ y) + (y ≤ℤ x)) → ((succℤ x <ℤ y) + (y ≤ℤ succℤ x)) ℤ-dich-succ x y (inl (0 , refl)) = inr (ℤ≤-refl _) ℤ-dich-succ x y (inl (succ m , refl)) = inl (m , ℤ-left-succ-pos (succℤ x) m) ℤ-dich-succ x y (inr (m , refl)) = inr (succ m , refl) ℤ-trich-succ : (x y : ℤ) → (( x <ℤ y) + ( x = y) + (y <ℤ x)) → ((succℤ x <ℤ y) + (succℤ x = y) + (y <ℤ succℤ x)) ℤ-trich-succ x y (inl (0 , sn+j=i)) = (inr ∘ inl) sn+j=i ℤ-trich-succ x y (inl (succ j , sn+j=i)) = inl (j , (ℤ-left-succ-pos (succℤ x) j ∙ sn+j=i)) ℤ-trich-succ x y (inr (inl n=i)) = (inr ∘ inr) (0 , ap succℤ (n=i ⁻¹)) ℤ-trich-succ x y (inr (inr (j , sn+j=i))) = (inr ∘ inr) (succ j , ap succℤ sn+j=i) ℤ-vert-trich-locate : ℤ → ℤ → ℤ → 𝓤₀ ̇ ℤ-vert-trich-locate z a b = (z <ℤ a) + (a ≤ℤ z ≤ℤ b) + (b <ℤ z) ℤ-vert-trich-succ : (z a b : ℤ) → a <ℤ b → ℤ-vert-trich-locate z a b → ℤ-vert-trich-locate (succℤ z) a b ℤ-vert-trich-succ z a b (k , η) (inl (succ n , ε)) = inl (n , (ℤ-left-succ-pos (succℤ z) n ∙ ε)) ℤ-vert-trich-succ z a b (k , η) (inl (0 , refl)) = (inr ∘ inl) ((0 , refl) , (succ k , (ℤ-left-succ-pos (succℤ z) k ⁻¹ ∙ η))) ℤ-vert-trich-succ z a b (k , η) (inr (inl ((n₁ , ε₁) , succ n₂ , ε₂))) = (inr ∘ inl) ((succ n₁ , (ap succℤ ε₁)) , (n₂ , (ℤ-left-succ-pos z n₂ ∙ ε₂))) ℤ-vert-trich-succ z a b (k , η) (inr (inl ((n₁ , ε₁) , zero , ε₂))) = (inr ∘ inr) (0 , ap succℤ (ε₂ ⁻¹)) ℤ-vert-trich-succ z a b (k , η) (inr (inr (n , refl))) = (inr ∘ inr) (succ n , refl) ℤ-vert-trich-all : (z a b : ℤ) → ℤ-vert-trich-locate z a b ℤ-vert-trich-all z a b = Cases (ℤ-trichotomous z a) inl λ a≤z → Cases (ℤ-trichotomous b z) (inr ∘ inr) λ z≤b → (inr ∘ inl) (ℤ≤-attach _ _ a≤z , ℤ≤-attach _ _ z≤b) ℤ-vert-trich-is-prop : (z a b : ℤ) → a <ℤ b → is-prop (ℤ-vert-trich-locate z a b) ℤ-vert-trich-is-prop z a b a<b = +-is-prop (ℤ<-is-prop z a) (+-is-prop (≤ℤ²-is-prop z) (ℤ<-is-prop b z) (λ (_ , z≤b) → ℤ-bigger-or-equal-not-less z b z≤b)) (λ z<a → cases (λ (a≤z , _) → ℤ-less-not-bigger-or-equal z a z<a a≤z) (ℤ-bigger-or-equal-not-less z b (<-is-≤ z b (ℤ<-trans z a b z<a a<b)))) ℤ≤-progress : (a b c : ℤ) → ((n , _) : a ≤ c) → a ≤ b → ((n₂ , _) : b ≤ c) → n₂ < succ n ℤ≤-progress a b c a≤c (n₁ , refl) (n₂ , refl) = transport (n₂ ≤_) (ℤ≤-same-witness a c (ℤ≤-trans a b c (n₁ , refl) (n₂ , refl)) a≤c) (≤-+' n₁ n₂) ≥-lemma : (a b c : ℤ) → a = b → (p : a ≥ c) → (q : b ≥ c) → pr₁ p = pr₁ q ≥-lemma a a c refl (n , refl) (m , γ) = pos-lc (ℤ+-lc _ _ _ (γ ⁻¹)) \end{code} ## Parity definitions and properties \begin{code} odd even : ℤ → 𝓤₀ ̇ odd (pos 0) = 𝟘 odd (pos 1) = 𝟙 odd (pos (succ (succ x))) = odd (pos x) odd (negsucc 0) = 𝟙 odd (negsucc 1) = 𝟘 odd (negsucc (succ (succ x))) = odd (negsucc x) even x = ¬ odd x even-or-odd? : (x : ℤ) → even x + odd x even-or-odd? (pos 0) = inl (λ x → x) even-or-odd? (pos 1) = inr ⋆ even-or-odd? (pos (succ (succ x))) = even-or-odd? (pos x) even-or-odd? (negsucc 0) = inr ⋆ even-or-odd? (negsucc 1) = inl (λ x → x) even-or-odd? (negsucc (succ (succ x))) = even-or-odd? (negsucc x) odd-is-prop : (x : ℤ) → is-prop (odd x) odd-is-prop (pos 0) = 𝟘-is-prop odd-is-prop (pos 1) = 𝟙-is-prop odd-is-prop (pos (succ (succ x))) = odd-is-prop (pos x) odd-is-prop (negsucc 0) = 𝟙-is-prop odd-is-prop (negsucc 1) = 𝟘-is-prop odd-is-prop (negsucc (succ (succ x))) = odd-is-prop (negsucc x) succ-odd-is-even : (x : ℤ) → odd x → even (succℤ x) succ-odd-is-even (pos 1) o = id succ-odd-is-even (pos (succ (succ x))) o = succ-odd-is-even (pos x) o succ-odd-is-even (negsucc 0) o = id succ-odd-is-even (negsucc (succ (succ (succ x)))) o = succ-odd-is-even (negsucc (succ x)) o succ-even-is-odd : (x : ℤ) → even x → odd (succℤ x) succ-even-is-odd (pos 0) e = ⋆ succ-even-is-odd (pos 1) e = e ⋆ succ-even-is-odd (pos (succ (succ x))) e = succ-even-is-odd (pos x) e succ-even-is-odd (negsucc 0) e = e ⋆ succ-even-is-odd (negsucc 1) e = ⋆ succ-even-is-odd (negsucc 2) e = e ⋆ succ-even-is-odd (negsucc (succ (succ (succ x)))) e = succ-even-is-odd (negsucc (succ x)) e odd-succ-succ : (x : ℤ) → odd x → odd (succℤ (succℤ x)) odd-succ-succ (pos x) = id odd-succ-succ (negsucc zero) = id odd-succ-succ (negsucc (succ (succ x))) = id even-succ-succ : (x : ℤ) → even x → even (succℤ (succℤ x)) even-succ-succ (pos x) = id even-succ-succ (negsucc zero) = id even-succ-succ (negsucc (succ (succ x))) = id negation-preserves-parity : (x : ℤ) → even x → even (ℤ- x) negation-preserves-parity (pos 0) = id negation-preserves-parity (pos (succ 0)) e = 𝟘-elim (e ⋆) negation-preserves-parity (pos (succ (succ 0))) e = id negation-preserves-parity (pos (succ (succ (succ x)))) e = negation-preserves-parity (pos (succ x)) e negation-preserves-parity (negsucc 0) e = 𝟘-elim (e ⋆) negation-preserves-parity (negsucc (succ 0)) e = id negation-preserves-parity (negsucc (succ (succ x))) e = negation-preserves-parity (negsucc x) (even-succ-succ (negsucc (succ (succ x))) e) even-lemma-pos : (x : ℕ) → even (pos x) → (pos x /2') ℤ* pos 2 = pos x even-lemma-pos 0 even-x = refl even-lemma-pos (succ 0) even-x = 𝟘-elim (even-x ⋆) even-lemma-pos (succ (succ x)) even-x = succℤ (pos x /2') +ℤ succℤ (pos x /2') =⟨ ℤ-left-succ (pos x /2') (succℤ (pos x /2')) ⟩ succℤ (succℤ ((pos x /2') ℤ* pos 2)) =⟨ ap (λ z → succℤ (succℤ z)) (even-lemma-pos x even-x) ⟩ pos (succ (succ x)) ∎ even-lemma-neg : (x : ℕ) → even (negsucc x) → (negsucc x /2') ℤ* pos 2 = negsucc x even-lemma-neg x even-x = (ℤ- pos (succ x /2)) ℤ- pos (succ x /2) =⟨ negation-dist (pos (succ x /2)) (pos (succ x /2)) ⟩ ℤ- (pos (succ x /2) +ℤ pos (succ x /2)) =⟨ ap ℤ-_ (even-lemma-pos (succ x) (negation-preserves-parity (negsucc x) even-x)) ⟩ negsucc x ∎ even-lemma : (x : ℤ) → even x → (x /2') ℤ* pos 2 = x even-lemma (pos x) = even-lemma-pos x even-lemma (negsucc x) = even-lemma-neg x odd-succ-succ' : (k : ℤ) → odd (succℤ (succℤ k)) → odd k odd-succ-succ' (pos x) = id odd-succ-succ' (negsucc zero) = id odd-succ-succ' (negsucc (succ (succ x))) = id even-succ-succ' : (k : ℤ) → even (succℤ (succℤ k)) → even k even-succ-succ' (pos 0) e = id even-succ-succ' (pos (succ 0)) e = 𝟘-elim (e ⋆) even-succ-succ' (pos (succ (succ x))) e = e even-succ-succ' (negsucc 0) e = 𝟘-elim (e ⋆) even-succ-succ' (negsucc (succ 0)) e = id even-succ-succ' (negsucc (succ (succ x))) e = e times-two-even' : (k : ℤ) → even (k +ℤ k) times-two-even' (pos (succ k)) odd2k = times-two-even' (pos k) (odd-succ-succ' (pos k +ℤ pos k) (transport odd I odd2k)) where I : pos (succ k) +ℤ pos (succ k) = pos k +ℤ pos (succ (succ k)) I = ℤ-left-succ (pos k) (pos (succ k)) times-two-even' (negsucc (succ k)) odd2k = times-two-even' (negsucc k) (transport odd I (odd-succ-succ (negsucc (succ k) +ℤ negsucc (succ k)) odd2k)) where I : succℤ (succℤ (negsucc (succ k) +ℤ negsucc (succ k))) = negsucc k +ℤ negsucc k I = succℤ (succℤ (negsucc (succ k) +ℤ negsucc (succ k))) =⟨ refl ⟩ succℤ (succℤ (predℤ (negsucc k) +ℤ predℤ (negsucc k))) =⟨ refl ⟩ succℤ (succℤ (predℤ (predℤ (negsucc k) +ℤ negsucc k))) =⟨ ap (λ a → succℤ a) (succpredℤ (predℤ (negsucc k) +ℤ negsucc k)) ⟩ succℤ (predℤ (negsucc k) +ℤ negsucc k) =⟨ ap succℤ (ℤ-left-pred (negsucc k) (negsucc k)) ⟩ succℤ (predℤ (negsucc k +ℤ negsucc k)) =⟨ succpredℤ (negsucc k +ℤ negsucc k) ⟩ negsucc k +ℤ negsucc k ∎ negsucc-lemma : (x : ℕ) → negsucc x +ℤ negsucc x = negsucc (x +ℕ succ x) negsucc-lemma x = negsucc x +ℤ negsucc x =⟨ refl ⟩ (ℤ- pos (succ x)) ℤ- pos (succ x) =⟨ negation-dist (pos (succ x)) (pos (succ x)) ⟩ ℤ- (pos (succ x) +ℤ pos (succ x)) =⟨ refl ⟩ ℤ- succℤ (pos (succ x) +ℤ pos x) =⟨ ap (λ z → ℤ- succℤ z) (distributivity-pos-addition (succ x) x) ⟩ ℤ- succℤ (pos (succ x +ℕ x)) =⟨ refl ⟩ negsucc (succ x +ℕ x) =⟨ ap negsucc (addition-commutativity (succ x) x) ⟩ negsucc (x +ℕ succ x) ∎ div-by-two : (k : ℤ) → (k +ℤ k) /2' = k div-by-two (pos k) = (pos k +ℤ pos k) /2' =⟨ ap _/2' (distributivity-pos-addition k k) ⟩ pos (k +ℕ k) /2' =⟨ ap pos (div-by-two' k) ⟩ pos k ∎ div-by-two (negsucc x) = (negsucc x +ℤ negsucc x) /2' =⟨ ap _/2' (negsucc-lemma x) ⟩ negsucc (x +ℕ succ x) /2' =⟨ refl ⟩ ℤ- pos (succ (x +ℕ succ x) /2) =⟨ ap (λ z → ℤ- pos (z /2)) (succ-left x (succ x) ⁻¹) ⟩ ℤ- pos ((succ x +ℕ succ x) /2) =⟨ ap (λ z → ℤ- pos z) (div-by-two' (succ x)) ⟩ negsucc x ∎ \end{code}