{-# OPTIONS --warning=error --safe --without-K #-} open import LogicalFormulae open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import Functions open import Numbers.Naturals.Definition open import Numbers.Naturals.Semiring open import Numbers.Naturals.Addition open import Numbers.Naturals.Order open import Numbers.Naturals.Multiplication open import Numbers.Naturals.Exponentiation open import Numbers.Naturals.Subtraction open import Semirings.Definition open import Monoids.Definition open import Orders.Total.Definition module Numbers.Naturals.Naturals where record subtractionNResult (a b : ℕ) .(p : a ≤N b) : Set where field result : ℕ pr : a +N result ≡ b subtractionNWellDefined : {a b : ℕ} → {p1 p2 : a ≤N b} → (s : subtractionNResult a b p1) → (t : subtractionNResult a b p2) → (subtractionNResult.result s ≡ subtractionNResult.result t) subtractionNWellDefined {a} {b} {inl x} {pr2} record { result = result1 ; pr = pr1 } record { result = result ; pr = pr } = canSubtractFromEqualityLeft {a} (transitivity pr1 (equalityCommutative pr)) subtractionNWellDefined {a} {.a} {inr refl} {pr2} record { result = result1 ; pr = pr1 } record { result = result2 ; pr = pr } = transitivity g' (equalityCommutative g) where g : result2 ≡ 0 g = canSubtractFromEqualityLeft {a} {_} {0} (transitivity pr (equalityCommutative (addZeroRight a))) g' : result1 ≡ 0 g' = canSubtractFromEqualityLeft {a} {_} {0} (transitivity pr1 (equalityCommutative (addZeroRight a))) -N : {a : ℕ} → {b : ℕ} → (pr : a ≤N b) → subtractionNResult a b pr -N {zero} {b} prAB = record { result = b ; pr = refl } -N {succ a} {zero} (inl ()) -N {succ a} {zero} (inr ()) -N {succ a} {succ b} (inl x) with -N {a} {b} (inl (canRemoveSuccFrom