1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}
module Kata.AdditionCommutes ( ) where
import Kata.AdditionCommutes.Definitions ( Z, S , Natural(..), Equal(..) , (:+:))
reflexive :: Natural n -> Equal n n reflexive NumZ = EqlZ reflexive (NumS n) = EqlS $ reflexive n
symmetric :: Equal a b -> Equal b a symmetric EqlZ = EqlZ symmetric (EqlS a) = EqlS $ symmetric a
plus :: Natural a -> Natural b -> Natural (a :+: b) plus NumZ x = x plus (NumS x) a = NumS (plus x a)
transitive :: Equal a b -> Equal b c -> Equal a c transitive EqlZ EqlZ = EqlZ transitive (EqlS a) (EqlS b) = EqlS $ transitive a b
nPlusZero :: Equal n n -> Equal n (n :+: Z) nPlusZero EqlZ = EqlZ nPlusZero (EqlS n) = EqlS $ nPlusZero n
nPlusSm :: Natural n -> Natural m -> Equal (n :+: S m) (S (n :+: m)) nPlusSm NumZ m = EqlS $ reflexive m nPlusSm (NumS n) m = EqlS $ nPlusSm n m
:: Natural a -> Natural b -> Equal (a :+: b) (b :+: a) n NumZ = symmetric $ nPlusZero $ reflexive n n (NumS m) = transitive (nPlusSm n m) (symmetric (EqlS $ plusCommutes m n))
|
近期评论