{-# OPTIONS --warning=error --safe --without-K #-} open import LogicalFormulae open import Numbers.Naturals.Semiring open import Numbers.Naturals.Addition open import Numbers.Naturals.Order open import Numbers.Naturals.Multiplication open import Semirings.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