Martin Escardo, started 5th May 2018

\begin{code}

{-# OPTIONS --safe --without-K #-}

module Naturals.Subtraction where

open import MLTT.Spartan hiding (_^_)

open import Naturals.Addition renaming (_+_ to _+'_)
open import Naturals.Order
open import Naturals.Properties
open import Notation.Order

subtraction : (m n : )  m  n  Σ k   , k +' m  n
subtraction 0        n        l = n , refl
subtraction (succ m) 0        l = 𝟘-elim l
subtraction (succ m) (succ n) l = pr₁ IH , ap succ (pr₂ IH)
 where
  IH : Σ k   , k +' m  n
  IH = subtraction m n l

cosubtraction : (m n : )  (Σ k   , k +' m  n)  m  n
cosubtraction 0        n                (.n , refl) = 
cosubtraction (succ m) 0                (k , p) = positive-not-zero (k +' m) p
cosubtraction (succ m) (succ .(k +' m)) (k , refl) =
 cosubtraction m (k +' m) (k , refl)

subtraction' : (x y : )  x < y  Σ z   , (z +' x  y)
subtraction' 0        0        l = 𝟘-induction l
subtraction' 0        (succ y) l = (succ y) , refl
subtraction' (succ x) (succ y) l = pr₁ IH , ap succ (pr₂ IH)
 where
  IH : Σ z   , z +' x  y
  IH = subtraction' x y l

subtraction'' : (x y : )  x < y  Σ z   , (succ z +' x  y)
subtraction'' x 0               l = 𝟘-elim l
subtraction'' 0        (succ y) l = y , refl
subtraction'' (succ x) (succ y) l = pr₁ IH , ap succ (pr₂ IH)
 where
  IH : Σ z   , (succ z +' x  y)
  IH = subtraction'' x y l

\end{code}