{-# OPTIONS --without-K --exact-split --safe #-}
module Fragment.Extensions.CSemigroup.Nat where
open import Relation.Binary.PropositionalEquality as PE using (_≡_)
data ℕ⁺ : Set where
one : ℕ⁺
suc : ℕ⁺ → ℕ⁺
infixl 6 _+_
_+_ : ℕ⁺ → ℕ⁺ → ℕ⁺
one + x = suc x
suc x + y = suc (x + y)
+-suc : ∀ x y → x + suc y ≡ suc (x + y)
+-suc one y = PE.refl
+-suc (suc x) y = PE.cong suc (+-suc x y)
+-one : ∀ x → x + one ≡ suc x
+-one one = PE.refl
+-one (suc x) = PE.cong suc (+-one x)
+-assoc : ∀ x y z → (x + y) + z ≡ x + (y + z)
+-assoc one _ _ = PE.refl
+-assoc (suc x) y z = PE.cong suc (+-assoc x y z)
open PE.≡-Reasoning
+-comm : ∀ x y → x + y ≡ y + x
+-comm one one = PE.refl
+-comm one (suc y) = begin
one + (suc y) ≡⟨⟩
suc (suc y) ≡⟨ PE.sym (PE.cong suc (+-one y)) ⟩
suc (y + one) ≡⟨ PE.sym PE.refl ⟩
suc y + one ∎
+-comm (suc x) y = begin
suc x + y ≡⟨⟩
suc (x + y) ≡⟨ PE.cong suc (+-comm x y) ⟩
suc (y + x) ≡⟨ PE.sym (+-suc y x) ⟩
y + suc x ∎