mirror of
https://github.com/Smaug123/agdaproofs
synced 2025-10-11 14:48:42 +00:00
48 lines
2.6 KiB
Agda
48 lines
2.6 KiB
Agda
{-# OPTIONS --warning=error --safe --without-K #-}
|
||
|
||
open import LogicalFormulae
|
||
open import Numbers.Naturals.Definition
|
||
|
||
module Numbers.Naturals.Addition where
|
||
|
||
infix 15 _+N_
|
||
_+N_ : ℕ → ℕ → ℕ
|
||
zero +N y = y
|
||
succ x +N y = succ (x +N y)
|
||
|
||
addZeroRight : (x : ℕ) → (x +N zero) ≡ x
|
||
addZeroRight zero = refl
|
||
addZeroRight (succ x) rewrite addZeroRight x = refl
|
||
|
||
succExtracts : (x y : ℕ) → (x +N succ y) ≡ (succ (x +N y))
|
||
succExtracts zero y = refl
|
||
succExtracts (succ x) y = applyEquality succ (succExtracts x y)
|
||
|
||
succCanMove : (x y : ℕ) → (x +N succ y) ≡ (succ x +N y)
|
||
succCanMove x y = transitivity (succExtracts x y) refl
|
||
|
||
additionNIsCommutative : (x y : ℕ) → (x +N y) ≡ (y +N x)
|
||
additionNIsCommutative zero y = equalityCommutative (addZeroRight y)
|
||
additionNIsCommutative (succ x) zero = transitivity (addZeroRight (succ x)) refl
|
||
additionNIsCommutative (succ x) (succ y) = transitivity refl (applyEquality succ (transitivity (succCanMove x y) (additionNIsCommutative (succ x) y)))
|
||
|
||
addingPreservesEqualityRight : {a b : ℕ} (c : ℕ) → (a ≡ b) → (a +N c ≡ b +N c)
|
||
addingPreservesEqualityRight {a} {b} c pr = applyEquality (λ n -> n +N c) pr
|
||
addingPreservesEqualityLeft : {a b : ℕ} (c : ℕ) → (a ≡ b) → (c +N a ≡ c +N b)
|
||
addingPreservesEqualityLeft {a} {b} c pr = applyEquality (λ n -> c +N n) pr
|
||
|
||
additionNIsAssociative : (a b c : ℕ) → ((a +N b) +N c) ≡ (a +N (b +N c))
|
||
additionNIsAssociative zero b c = refl
|
||
additionNIsAssociative (succ a) zero c = transitivity (transitivity (applyEquality (λ n → n +N c) (applyEquality succ (addZeroRight a))) refl) (transitivity refl refl)
|
||
additionNIsAssociative (succ a) (succ b) c = transitivity refl (transitivity refl (transitivity (applyEquality succ (additionNIsAssociative a (succ b) c)) refl))
|
||
|
||
succIsAddOne : (a : ℕ) → succ a ≡ a +N succ zero
|
||
succIsAddOne a = equalityCommutative (transitivity (additionNIsCommutative a (succ zero)) refl)
|
||
|
||
canSubtractFromEqualityRight : {a b c : ℕ} → (a +N b ≡ c +N b) → a ≡ c
|
||
canSubtractFromEqualityRight {a} {zero} {c} pr = transitivity (equalityCommutative (addZeroRight a)) (transitivity pr (addZeroRight c))
|
||
canSubtractFromEqualityRight {a} {succ b} {c} pr rewrite additionNIsCommutative a (succ b) | additionNIsCommutative c (succ b) | additionNIsCommutative b a | additionNIsCommutative b c = canSubtractFromEqualityRight {a} {b} {c} (succInjective pr)
|
||
|
||
canSubtractFromEqualityLeft : {a b c : ℕ} → (a +N b ≡ a +N c) → b ≡ c
|
||
canSubtractFromEqualityLeft {a} {b} {c} pr rewrite additionNIsCommutative a b | additionNIsCommutative a c = canSubtractFromEqualityRight {b} {a} {c} pr
|