1 -- | 
    2 -- Module      : Data.Semiring.Properties
    3 -- Copyright   : Sebastian Fischer <mailto:mail@sebfisch.de>
    4 -- License     : BSD3
    5 -- 
    6 -- This library provides properties for the 'Semiring' type class that
    7 -- can be checked using libraries like QuickCheck or SmallCheck.
    8 -- 
    9 module Data.Semiring.Properties (
   10 
   11   module Data.Semiring, module Data.Semiring.Properties
   12 
   13   ) where
   14 
   15 import Data.Semiring
   16 
   17 -- | > a .+. b  ==  b .+. a
   18 plus'comm :: Semiring s => s -> s -> Bool
   19 plus'comm a b  =  a .+. b  ==  b .+. a
   20 
   21 -- | > zero .+. a  ==  a
   22 left'zero :: Semiring s => s -> Bool
   23 left'zero a  =  zero .+. a  ==  a
   24 
   25 -- | > (a .+. b) .+. c  ==  a .+. (b .+. c)
   26 add'assoc :: Semiring s => s -> s -> s -> Bool
   27 add'assoc a b c  =  (a .+. b) .+. c  ==  a .+. (b .+. c)
   28 
   29 -- | > one .*. a  ==  a
   30 left'one :: Semiring s => s -> Bool
   31 left'one a  =  one .*. a  ==  a
   32 
   33 -- | > a .*. one  ==  a
   34 right'one :: Semiring s => s -> Bool
   35 right'one a  =  a .*. one  ==  a
   36 
   37 -- | > (a .*. b) .*. c  ==  a .*. (b .*. c)
   38 mul'assoc :: Semiring s => s -> s -> s -> Bool
   39 mul'assoc a b c  =  (a .*. b) .*. c  ==  a .*. (b .*. c)
   40 
   41 -- | > a .*. (b .+. c)  ==  (a .*. b) .+. (a .*. c)
   42 left'distr :: Semiring s => s -> s -> s -> Bool
   43 left'distr a b c  =  a .*. (b .+. c)  ==  (a .*. b) .+. (a .*. c)
   44 
   45 -- | > (a .+. b) .*. c  ==  (a .*. c) .+. (b .*. c)
   46 right'distr :: Semiring s => s -> s -> s -> Bool
   47 right'distr a b c  =  (a .+. b) .*. c  ==  (a .*. c) .+. (b .*. c)
   48 
   49 -- | > zero .*. a  ==  zero
   50 left'ann :: Semiring s => s -> Bool
   51 left'ann a  =  zero .*. a  ==  zero
   52 
   53 -- | > a .*. zero  ==  zero
   54 right'ann :: Semiring s => s -> Bool
   55 right'ann a  =  a .*. zero  ==  zero