File: Associates.hs

package info (click to toggle)
haskell-algebra 2.1.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 420 kB
  • sloc: haskell: 4,758; makefile: 2
file content (54 lines) | stat: -rw-r--r-- 2,610 bytes parent folder | download
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
module Numeric.Decidable.Associates 
  ( DecidableAssociates(..)
  , isAssociateIntegral
  , isAssociateWhole
  ) where

import Data.Function (on)
import Data.Int
import Data.Word
import Numeric.Algebra.Unital
import Numeric.Natural.Internal

isAssociateIntegral :: (Eq n, Num n) => n -> n -> Bool
isAssociateIntegral = (==) `on` abs

isAssociateWhole :: Eq n => n -> n -> Bool
isAssociateWhole = (==)

class Unital r => DecidableAssociates r where
  -- | b is an associate of a if there exists a unit u such that b = a*u
  --
  -- This relationship is symmetric because if u is a unit, u^-1 exists and is a unit, so
  -- 
  -- > b*u^-1 = a*u*u^-1 = a
  isAssociate :: r -> r -> Bool

instance DecidableAssociates Bool where isAssociate = (==)
instance DecidableAssociates Integer where isAssociate = isAssociateIntegral
instance DecidableAssociates Int where isAssociate = isAssociateIntegral
instance DecidableAssociates Int8 where isAssociate = isAssociateIntegral
instance DecidableAssociates Int16 where isAssociate = isAssociateIntegral
instance DecidableAssociates Int32 where isAssociate = isAssociateIntegral
instance DecidableAssociates Int64 where isAssociate = isAssociateIntegral

instance DecidableAssociates Natural where isAssociate = isAssociateWhole
instance DecidableAssociates Word where isAssociate = isAssociateWhole
instance DecidableAssociates Word8 where isAssociate = isAssociateWhole
instance DecidableAssociates Word16 where isAssociate = isAssociateWhole
instance DecidableAssociates Word32 where isAssociate = isAssociateWhole
instance DecidableAssociates Word64 where isAssociate = isAssociateWhole

instance DecidableAssociates () where isAssociate _ _ = True

instance (DecidableAssociates a, DecidableAssociates b) => DecidableAssociates (a, b) where
  isAssociate (a,b) (i,j) = isAssociate a i && isAssociate b j

instance (DecidableAssociates a, DecidableAssociates b, DecidableAssociates c) => DecidableAssociates (a, b, c) where
  isAssociate (a,b,c) (i,j,k) = isAssociate a i && isAssociate b j && isAssociate c k

instance (DecidableAssociates a, DecidableAssociates b, DecidableAssociates c, DecidableAssociates d) => DecidableAssociates (a, b, c, d) where
  isAssociate (a,b,c,d) (i,j,k,l) = isAssociate a i && isAssociate b j && isAssociate c k && isAssociate d l

instance (DecidableAssociates a, DecidableAssociates b, DecidableAssociates c, DecidableAssociates d, DecidableAssociates e) => DecidableAssociates (a, b, c, d, e) where
  isAssociate (a,b,c,d,e) (i,j,k,l,m) = isAssociate a i && isAssociate b j && isAssociate c k && isAssociate d l && isAssociate e m