{-# 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