@@ -180,6 +180,9 @@ toIntNat n = toIntNat' n 0 where
180 toIntNat' Z x = x
180 toIntNat' Z x = x
181 toIntNat' (S n) x = toIntNat' n (x + 1)
181 toIntNat' (S n) x = toIntNat' n (x + 1)
183+(-) : (m : Nat) -> (n : Nat) -> {auto smaller : LTE n m} -> Nat
184+(-) m n {smaller} = minus m n
183--------------------------------------------------------------------------------
186--------------------------------------------------------------------------------
184-- Type class instances
187-- Type class instances
185--------------------------------------------------------------------------------
188--------------------------------------------------------------------------------
@@ -200,11 +203,8 @@ instance Ord Nat where
201instance Num Nat where
204instance Num Nat where
202 (+) = plus
205 (+) = plus
204 (*) = mult
206 (*) = mult
208 fromInteger = fromIntegerNat
208 fromInteger = fromIntegerNat
210instance MinBound Nat where
210instance MinBound Nat where
@@ -307,7 +307,7 @@ modNatNZ left (S right) _ = mod' left left right
307 if lte centre right then
307 if lte centre right then
310− mod' left (centre - (S right)) right
310+ mod' left (minus centre (S right)) right
313modNat : Nat -> Nat -> Nat
313modNat : Nat -> Nat -> Nat
@@ -323,7 +323,7 @@ divNatNZ left (S right) _ = div' left left right
323 if lte centre right then
323 if lte centre right then
326− S (div' left (centre - (S right)) right)
326+ S (div' left (minus centre (S right)) right)
329divNat : Nat -> Nat -> Nat
329divNat : Nat -> Nat -> Nat
@@ -544,34 +544,34 @@ multOneRightNeutral (S left) =
546total minusSuccSucc : (left : Nat) -> (right : Nat) ->
546total minusSuccSucc : (left : Nat) -> (right : Nat) ->
547− (S left) - (S right) = left - right
547+ minus (S left) (S right) = minus left right
548minusSuccSucc left right = Refl
548minusSuccSucc left right = Refl
550−total minusZeroLeft : (right : Nat) -> 0 - right = Z
550+total minusZeroLeft : (right : Nat) -> minus 0 right = Z
551minusZeroLeft right = Refl
551minusZeroLeft right = Refl
553−total minusZeroRight : (left : Nat) -> left - 0 = left
553+total minusZeroRight : (left : Nat) -> minus left 0 = left
554minusZeroRight Z = Refl
554minusZeroRight Z = Refl
555minusZeroRight (S left) = Refl
555minusZeroRight (S left) = Refl
557−total minusZeroN : (n : Nat) -> Z = n - n
557+total minusZeroN : (n : Nat) -> Z = minus n n
558minusZeroN Z = Refl
558minusZeroN Z = Refl
559minusZeroN (S n) = minusZeroN n
559minusZeroN (S n) = minusZeroN n
561−total minusOneSuccN : (n : Nat) -> S Z = (S n) - n
561+total minusOneSuccN : (n : Nat) -> S Z = minus (S n) n
562minusOneSuccN Z = Refl
562minusOneSuccN Z = Refl
563minusOneSuccN (S n) = minusOneSuccN n
563minusOneSuccN (S n) = minusOneSuccN n
565−total minusSuccOne : (n : Nat) -> S n - 1 = n
565+total minusSuccOne : (n : Nat) -> minus (S n) 1 = n
566minusSuccOne Z = Refl
566minusSuccOne Z = Refl
567minusSuccOne (S n) = Refl
567minusSuccOne (S n) = Refl
569−total minusPlusZero : (n : Nat) -> (m : Nat) -> n - (n + m) = Z
569+total minusPlusZero : (n : Nat) -> (m : Nat) -> minus n (n + m) = Z
570minusPlusZero Z m = Refl
570minusPlusZero Z m = Refl
571minusPlusZero (S n) m = minusPlusZero n m
571minusPlusZero (S n) m = minusPlusZero n m
573total minusMinusMinusPlus : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
573total minusMinusMinusPlus : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
574− left - centre - right = left - (centre + right)
574+ minus (minus left centre) right = minus left (centre + right)
575minusMinusMinusPlus Z Z right = Refl
575minusMinusMinusPlus Z Z right = Refl
576minusMinusMinusPlus (S left) Z right = Refl
576minusMinusMinusPlus (S left) Z right = Refl
577minusMinusMinusPlus Z (S centre) right = Refl
577minusMinusMinusPlus Z (S centre) right = Refl
@@ -581,7 +581,7 @@ minusMinusMinusPlus (S left) (S centre) right =
583total plusMinusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) ->
583total plusMinusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) ->
584− (left + right) - (left + right') = right - right'
584+ minus (left + right) (left + right') = minus right right'
585plusMinusLeftCancel Z right right' = Refl
585plusMinusLeftCancel Z right right' = Refl
586plusMinusLeftCancel (S left) right right' =
586plusMinusLeftCancel (S left) right right' =
587 let inductiveHypothesis = plusMinusLeftCancel left right right' in
587 let inductiveHypothesis = plusMinusLeftCancel left right right' in
@@ -589,7 +589,7 @@ plusMinusLeftCancel (S left) right right' =
591total multDistributesOverMinusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
591total multDistributesOverMinusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
592− (left - centre) * right = (left * right) - (centre * right)
592+ (minus left centre) * right = minus (left * right) (centre * right)
593multDistributesOverMinusLeft Z Z right = Refl
593multDistributesOverMinusLeft Z Z right = Refl
594multDistributesOverMinusLeft (S left) Z right =
594multDistributesOverMinusLeft (S left) Z right =
595 rewrite (minusZeroRight (plus right (mult left right))) in Refl
595 rewrite (minusZeroRight (plus right (mult left right))) in Refl
@@ -601,7 +601,7 @@ multDistributesOverMinusLeft (S left) (S centre) right =
603total multDistributesOverMinusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
603total multDistributesOverMinusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
604− left * (centre - right) = (left * centre) - (left * right)
604+ left * (minus centre right) = minus (left * centre) (left * right)
605multDistributesOverMinusRight left centre right =
605multDistributesOverMinusRight left centre right =
606 rewrite multCommutative left (minus centre right) in
606 rewrite multCommutative left (minus centre right) in
607 rewrite multDistributesOverMinusLeft centre right left in
607 rewrite multDistributesOverMinusLeft centre right left in
@@ -658,7 +658,7 @@ total predSucc : (n : Nat) -> pred (S n) = n
658predSucc n = Refl
658predSucc n = Refl
660total minusSuccPred : (left : Nat) -> (right : Nat) ->
660total minusSuccPred : (left : Nat) -> (right : Nat) ->
661− left - (S right) = pred (left - right)
661+ minus left (S right) = pred (minus left right)
662minusSuccPred Z right = Refl
662minusSuccPred Z right = Refl
663minusSuccPred (S left) Z =
663minusSuccPred (S left) Z =
664 rewrite minusZeroRight left in Refl
664 rewrite minusZeroRight left in Refl