\begin{code} {-# OPTIONS --cubical --safe #-} module Data.Nat.Properties where open import Data.Nat.Base open import Agda.Builtin.Nat using () renaming (_<_ to _<ᴮ_; _==_ to _≡ᴮ_) public open import Prelude open import Cubical.Data.Nat using (caseNat; znots; snotz; injSuc) public pred : ℕ → ℕ pred (suc n) = n pred zero = zero correct-== : ∀ n m → Reflects (n ≡ m) (n ≡ᴮ m) correct-== zero zero = ofʸ refl correct-== zero (suc m) = ofⁿ znots correct-== (suc n) zero = ofⁿ snotz correct-== (suc n) (suc m) = map-reflects (cong suc) (λ contra prf → contra (cong pred prf)) (correct-== n m) discreteℕ : Discrete ℕ discreteℕ n m .does = n ≡ᴮ m discreteℕ n m .why = correct-== n m isSetℕ : isSet ℕ isSetℕ = Discrete→isSet discreteℕ +-suc : ∀ x y → x + suc y ≡ suc (x + y) +-suc zero y = refl +-suc (suc x) y = cong suc (+-suc x y) +-idʳ : ∀ x → x + 0 ≡ x +-idʳ zero = refl +-idʳ (suc x) = cong suc (+-idʳ x) +-comm : ∀ x y → x + y ≡ y + x +-comm x zero = +-idʳ x +-comm x (suc y) = +-suc x y ; cong suc (+-comm x y) infix 4 _<_ _<_ : ℕ → ℕ → Type₀ n < m = T (n <ᴮ m) infix 4 _≤ᴮ_ _≤ᴮ_ : ℕ → ℕ → Bool zero ≤ᴮ m = true suc n ≤ᴮ m = n <ᴮ m infix 4 _≤_ _≤_ : ℕ → ℕ → Type₀ n ≤ m = T (n ≤ᴮ m) infix 4 _≥ᴮ_ _≥ᴮ_ : ℕ → ℕ → Bool _≥ᴮ_ = flip _≤ᴮ_ \end{code} %<*plus-assoc> \begin{code} +-assoc : ∀ x y z → (x + y) + z ≡ x + (y + z) +-assoc zero y z i = y + z +-assoc (suc x) y z i = suc (+-assoc x y z i) \end{code} %</plus-assoc>