• Aucun résultat trouvé

Structures algébriques / Classes en Haskell INFO1 - Semaine 48 Guillaume CONNAN

N/A
N/A
Protected

Academic year: 2022

Partager "Structures algébriques / Classes en Haskell INFO1 - Semaine 48 Guillaume CONNAN"

Copied!
47
0
0

Texte intégral

(1)

Guillaume CONNAN

IUT de Nantes - Dpt d’informatique

Dernière mise à jour : 24 novembre 2013 à 23:23

(2)

1 Calcul modulaire sans arithmétique... 2 Rationnels

(IUT de Nantes - Dpt d’informatique ) 2 / 28

(3)

1 Calcul modulaire sans arithmétique... 2 Rationnels

(4)

Bounded

,

Eq

,

Show

)

Prelude

>

minBound

:: Romain O

Prelude

>

maxBound

:: Romain V

Prelude> minBound :: Int -9223372036854775808 Prelude> maxBound :: Int 9223372036854775807

(IUT de Nantes - Dpt d’informatique ) 4 / 28

(5)

Prelude

>

data

Romain = O | I | II | III | IV | V

deriving

(

Enum

,

Bounded

,

Eq

,

Show

)

Prelude

>

minBound

:: Romain O

Prelude

>

maxBound

:: Romain V

Prelude

>

minBound

::

Int

-9223372036854775808

Prelude

>

maxBound

::

Int

9223372036854775807

(6)

Bounded

,

Eq

,

Show

)

Prelude

>

minBound

:: Romain O

Prelude

>

maxBound

:: Romain V

Prelude

>

minBound

::

Int

-9223372036854775808

Prelude

>

maxBound

::

Int

9223372036854775807

(IUT de Nantes - Dpt d’informatique ) 4 / 28

(7)

Prelude

>

data

Romain = O | I | II | III | IV | V

deriving

(

Enum

,

Bounded

,

Eq

,

Show

)

Prelude

>

minBound

:: Romain O

Prelude

>

maxBound

:: Romain V

Prelude

>

minBound

::

Int

-9223372036854775808

Prelude

>

maxBound

::

Int

9223372036854775807

(8)

Prelude

>

succ

II III

Prelude

>

pred

V IV

Prelude

>

succ

V

*** Exception:

succ

{Romain}: tried to

take

succ

of last

tag

in

enumeration

Prelude> [II .. V]

[II,III,IV,V]

(IUT de Nantes - Dpt d’informatique ) 5 / 28

(9)

Prelude

>

succ

II III

Prelude

>

pred

V IV

Prelude

>

succ

V

*** Exception:

succ

{Romain}: tried to

take

succ

of last

tag

in

enumeration

Prelude

> [II .. V]

[II,III,IV,V]

(10)

Prelude

>

succ

II III

Prelude

>

pred

V IV

Prelude

>

succ

V

*** Exception:

succ

{Romain}: tried to

take

succ

of last

tag

in

enumeration

Prelude

> [II .. V]

[II,III,IV,V]

(IUT de Nantes - Dpt d’informatique ) 5 / 28

(11)

Prelude

>

succ

II III

Prelude

>

pred

V IV

Prelude

>

succ

V

*** Exception:

succ

{Romain}: tried to

take

succ

of last

tag

in

enumeration

Prelude

> [II .. V]

[II,III,IV,V]

(12)

Prelude

> :t

fromEnum

fromEnum

::

Enum

a

=>

a ->

Int

Prelude

>

fromEnum

II 2

Prelude

>

toEnum

5 :: Romain V

(IUT de Nantes - Dpt d’informatique ) 6 / 28

(13)

Prelude

> :t

fromEnum

fromEnum

::

Enum

a

=>

a ->

Int

Prelude

>

fromEnum

II 2

Prelude

>

toEnum

5 :: Romain V

(14)

Prelude

> :t

fromEnum

fromEnum

::

Enum

a

=>

a ->

Int

Prelude

>

fromEnum

II 2

Prelude

>

toEnum

5 :: Romain V

(IUT de Nantes - Dpt d’informatique ) 6 / 28

(15)

data

ClasseMod t = (

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

> Zn t

data

LesZ5 = O5 | I5 | II5 | III5 | IV5

deriving

(

Eq

,

Show

,

Bounded

,

Enum

)

type

Z5 = ClasseMod LesZ5

instance

(

Show

t)

=

>

Show

(ClasseMod t)

where

show

(Zn x) =

show

x

(16)

data

ClasseMod t = (

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

> Zn t

data

LesZ5 = O5 | I5 | II5 | III5 | IV5

deriving

(

Eq

,

Show

,

Bounded

,

Enum

)

type

Z5 = ClasseMod LesZ5

instance

(

Show

t)

=

>

Show

(ClasseMod t)

where show

(Zn x) =

show

x

(IUT de Nantes - Dpt d’informatique ) 7 / 28

(17)

data

ClasseMod t = (

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

> Zn t

data

LesZ5 = O5 | I5 | II5 | III5 | IV5

deriving

(

Eq

,

Show

,

Bounded

,

Enum

)

type

Z5 = ClasseMod LesZ5

instance

(

Show

t)

=

>

Show

(ClasseMod t)

where

show

(Zn x) =

show

x

(18)

*CalMod> Zn II5 II5

(IUT de Nantes - Dpt d’informatique ) 8 / 28

(19)

succZn :: (ClasseMod t) -> (ClasseMod t)

succZn (Zn x) =

if

(x ==

maxBound

)

then

(Zn

minBound

)

else

( Zn (

succ

x))

*CalMod> succZn (Zn III5) IV5

*CalMod> succZn (Zn IV5) O5

predZn ? ?

(20)

succZn :: (ClasseMod t) -> (ClasseMod t)

succZn (Zn x) =

if

(x ==

maxBound

)

then

(Zn

minBound

)

else

( Zn (

succ

x))

*CalMod> succZn (Zn III5) IV5

*CalMod> succZn (Zn IV5) O5

predZn ? ?

(IUT de Nantes - Dpt d’informatique ) 9 / 28

(21)

succZn :: (ClasseMod t) -> (ClasseMod t)

succZn (Zn x) =

if

(x ==

maxBound

)

then

(Zn

minBound

)

else

( Zn (

succ

x))

*CalMod> succZn (Zn III5) IV5

*CalMod> succZn (Zn IV5) O5

predZn ? ?

(22)

succZn :: (ClasseMod t) -> (ClasseMod t)

succZn (Zn x) =

if

(x ==

maxBound

)

then

(Zn

minBound

)

else

( Zn (

succ

x))

*CalMod> succZn (Zn III5) IV5

*CalMod> succZn (Zn IV5) O5

predZn ? ?

(IUT de Nantes - Dpt d’informatique ) 9 / 28

(23)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Enum

(ClasseMod t)

where

succ

= succZn

*CalMod>

succ

(Zn III5) IV5

(24)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Enum

(ClasseMod t)

where

succ

= succZn

*CalMod>

succ

(Zn III5) IV5

(IUT de Nantes - Dpt d’informatique ) 10 / 28

(25)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Enum

(ClasseMod t)

where

succ

= succZn

pred

= predZn

*CalMod>

pred

(Zn III5) II5

(26)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Enum

(ClasseMod t)

where

succ

= succZn

pred

= predZn

*CalMod>

pred

(Zn III5) II5

(IUT de Nantes - Dpt d’informatique ) 11 / 28

(27)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=> Enum

(ClasseMod t)

where

succ

= succZn

pred

= predZn

fromEnum

(Zn x) =

fromEnum

x

*CalMod>

fromEnum

IV5 4

(28)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=> Enum

(ClasseMod t)

where

succ

= succZn

pred

= predZn

fromEnum

(Zn x) =

fromEnum

x

*CalMod>

fromEnum

IV5 4

(IUT de Nantes - Dpt d’informatique ) 12 / 28

(29)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Enum

(ClasseMod t)

where

succ

= succZn

pred

= predZn

fromEnum

(Zn x) =

fromEnum

x

toEnum

n = Zn (

toEnum

n)

*CalMod>

toEnum

4 :: Z5 IV5

(30)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Enum

(ClasseMod t)

where

succ

= succZn

pred

= predZn

fromEnum

(Zn x) =

fromEnum

x

toEnum

n = Zn (

toEnum

n)

*CalMod>

toEnum

4 :: Z5 IV5

(IUT de Nantes - Dpt d’informatique ) 13 / 28

(31)

instance

(

Eq

t)

=

>

Eq

(ClasseMod t)

where

(Zn x) == (Zn y) = x == y

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Bounded

(ClasseMod t)

where

maxBound

= Zn (

maxBound

)

minBound

= Zn (

minBound

)

(32)

instance

(

Eq

t)

=

>

Eq

(ClasseMod t)

where

(Zn x) == (Zn y) = x == y

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Bounded

(ClasseMod t)

where

maxBound

= Zn (

maxBound

)

minBound

= Zn (

minBound

)

(IUT de Nantes - Dpt d’informatique ) 14 / 28

(33)

plusZn x y =

if

(

fromEnum

x == 0)

then

y

else

succ

(plusZn (

pred

x) y)

Multiplication ? ?

(34)

plusZn x y =

if

(

fromEnum

x == 0)

then

y

else

succ

(plusZn (

pred

x) y)

Multiplication ? ?

(IUT de Nantes - Dpt d’informatique ) 15 / 28

(35)

foisZn x y =

if

(

fromEnum

x == 0)

then

(

toEnum

0)

else

if

(

fromEnum

x == 1)

then

y

else

plusZn y (foisZn (

pred

x) y)

(36)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=> Num

(ClasseMod t)

where

(IUT de Nantes - Dpt d’informatique ) 17 / 28

(37)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Num

(ClasseMod t)

where

(+) = plusZn

(38)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=

>

Num

(ClasseMod t)

where

(+) = plusZn (*) = foisZn

(IUT de Nantes - Dpt d’informatique ) 19 / 28

(39)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=> Num

(ClasseMod t)

where

(+) = plusZn (*) = foisZn

fromInteger

= classeOfInt

(40)

instance

(

Eq

t,

Show

t,

Enum

t,

Bounded

t)

=> Num

(ClasseMod t)

where

(+) = plusZn (*) = foisZn

fromInteger

= classeOfInt

negate

x =

toEnum

(- (

fromEnum

x) + (

fromEnum

(

maxBound

::

ClasseMod t)) + 1)

(IUT de Nantes - Dpt d’informatique ) 21 / 28

(41)

*CalMod> 2 :: Z5 II5

(42)

*CalMod> 2 :: Z5 II5

*CalMod> 17 :: Z5 II5

(IUT de Nantes - Dpt d’informatique ) 23 / 28

(43)

*CalMod> 2 :: Z5 II5

*CalMod> 17 :: Z5 II5

*CalMod> (-3) :: Z5 II5

(44)

*CalMod> 2 :: Z5 II5

*CalMod> 17 :: Z5 II5

*CalMod> (-3) :: Z5 II5

*CalMod> (-3) + 9 :: Z5 I5

(IUT de Nantes - Dpt d’informatique ) 25 / 28

(45)

*CalMod> 2 :: Z5 II5

*CalMod> 17 :: Z5 II5

*CalMod> (-3) :: Z5 II5

*CalMod> (-3) + 9 :: Z5 I5

*CalMod> 3 * 7 :: Z5 I5

(46)

*CalMod> 2 :: Z5 II5

*CalMod> 17 :: Z5 II5

*CalMod> (-3) :: Z5 II5

*CalMod> (-3) + 9 :: Z5 I5

*CalMod> 3 * 7 :: Z5 I5

*CalMod> 301 * 7157 :: Z5 II5

(IUT de Nantes - Dpt d’informatique ) 27 / 28

(47)

1 Calcul modulaire sans arithmétique... 2 Rationnels

Références

Documents relatifs

This treatment of nan ensures that compare defines a total ordering relation. (IUT de Nantes - Dpt d’informatique ) 11

induction mathématique (raisonnement par récurrence) fonction récursive, type récursif. (IUT de Nantes - Dpt d'informatique ) 20

Ce qui va nous intéresser informatiquement, c'est une fonction qui crée une partition d'un ensemble selon une propriété, par exemple pour regrouper les entiers pairs parmi les

Vous disposez de deux interrupteurs commandant une même ampoule : comment modéliser le système de va-et-vient. (IUT de Nantes - Dpt d'informatique ) 33

3 la durée moyenne des parcours allant d'un état au bord (le temps moyen d'absorption) est la moyenne des longueurs des parcours de ce sommet au bord pondérée par les probabilités

5 Quelques lois discrètes classiques Loi uniforme (discrète) Loi de Bernoulli Loi binomiale Loi de Pascal Loi de Poisson.. (IUT de Nantes - Dpt d’informatique ) 2

Formez les couples (x , y) tels que x soit le grand-père de y. Formez les couples (x , y) tels que x soit le frère

En Python, import module va charger et exécuter le fichier désigné, en général module.py ou dans le cas d’un module complexe, un fichier __init__.py. module.__file__ renvoie