Lois, structures, matrices en informatique
INFO2 - Semaines 43 & 45
Guillaume CONNAN
IUT de Nantes - Dpt d’informatique
Dernière mise à jour : 24 octobre 2013 à 14:48
(IUT de Nantes - Dpt d’informatique ) 1 / 109
Sommaire
1 Loi de composition 2 Groupes
3 Anneaux et corps
4 Aparté : ze Haskell Touch 5 Structure d’espace vectoriel 6 Les matrices
Loi de composition
Sommaire
1 Loi de composition 2 Groupes
3 Anneaux et corps
4 Aparté : ze Haskell Touch 5 Structure d’espace vectoriel 6 Les matrices
(IUT de Nantes - Dpt d’informatique ) 3 / 109
Loi de composition Définitions
Définition 1 (Loi de composition interne (LCI))
Une loi de composition interne définie sur un ensemble E est une fonction totale (ou application) deE⊗E dans E. On dit alors que E est un magma.
Loi de composition Définitions
Définition 2 (Stabilité)
Un ensemble E est stable par une opération? si, et seulement si :
³
∀〈x,y〉´³
¡〈x,y〉 ∈E⊗E¢→¡
x?y∈E¢´
(IUT de Nantes - Dpt d’informatique ) 5 / 109
Loi de composition Définitions
Définition 3 (Loi de composition externe (LCE))
Une loi de composition externe définie sur un ensemble E et à opérateurs dans un ensemble K est une fonction totale (ou application) de K⊗E dans E.
Loi de composition Définitions
Définition 4 (Morphisme)
Soit〈E,?〉 et〈F, †〉deux magmas etϕ une fonction totale deE dansF. On dit que ϕest un morphisme de E dans F si, et seulement si :
¡∀x¢¡∀y¢¡ϕ(x?y)=ϕ(x)†ϕ(y)¢
(IUT de Nantes - Dpt d’informatique ) 7 / 109
Loi de composition Définitions
Définition 5 (Isomorphisme)
Soit〈E,?〉 et〈F, †〉deux magmas etϕ une fonction totale deE dansF. On dit que ϕest un morphisme de E dans F si, et seulement si, c’est un morphisme BIJECTIF de E dans F.
Loi de composition Propriétés des lois (de composition interne)
Définition 6 (Commutativité)
Une LCI?sur E est commutative si, et seulement si (∀x)(∀y)(x?y=y?x)
(IUT de Nantes - Dpt d’informatique ) 9 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 7 (Associativité)
Une LCI?sur E est associative si, et seulement si (∀x)(∀y)(∀z)(x?(y?z)=(x?y)?z)
Un magma muni d’une loi associative est appelé... un magma associatif.
Loi de composition Propriétés des lois (de composition interne)
Définition 8 (Élément neutre)
Un élément neutre e d’une LCI?sur E est un élément e? qui vérifie : (∀x)(x?e?=e??x=x)
Un magma associatif admettant un élément neutre est unmonoïde (ou un magma associatif unifère).
Pouvez-vous démontrer que si l’élément neutre existe, il est unique ?
(IUT de Nantes - Dpt d’informatique ) 11 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 8 (Élément neutre)
Un élément neutre e d’une LCI?sur E est un élément e? qui vérifie : (∀x)(x?e?=e??x=x)
Un magma associatif admettant un élément neutre est unmonoïde (ou un magma associatif unifère).
Pouvez-vous démontrer que si l’élément neutre existe, il est unique ?
Loi de composition Propriétés des lois (de composition interne)
Définition 8 (Élément neutre)
Un élément neutre e d’une LCI?sur E est un élément e? qui vérifie : (∀x)(x?e?=e??x=x)
Un magma associatif admettant un élément neutre est unmonoïde (ou un magma associatif unifère).
Pouvez-vous démontrer que si l’élément neutre existe, il est unique ?
(IUT de Nantes - Dpt d’informatique ) 11 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 9 (Élément symétrisable)
Soitx un élément de E. Il est inversible (ou symétrisable) par? si, et seulement si,
(∃y)(x?y=y?x=e?)
Pouvez-vous démontrer que six admet un symétrique, alors ce symétrique est unique ?
Loi de composition Propriétés des lois (de composition interne)
Définition 9 (Élément symétrisable)
Soitx un élément de E. Il est inversible (ou symétrisable) par? si, et seulement si,
(∃y)(x?y=y?x=e?)
Pouvez-vous démontrer que six admet un symétrique, alors ce symétrique est unique ?
(IUT de Nantes - Dpt d’informatique ) 12 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 9 (Élément symétrisable)
Soitx un élément de E. Il est inversible (ou symétrisable) par? si, et seulement si,
(∃y)(x?y=y?x=e?)
Pouvez-vous démontrer que six admet un symétrique, alors ce symétrique est unique ?
Loi de composition Propriétés des lois (de composition interne)
Définition 10 (Régularité)
Un élément ade E est dit régulier à gauche (ousimplifiable à gauche) si, et seulement si :
¡∀x¢¡∀y¢¡(a?x=a?y)→(x=y)¢ On a une définition similaire de la régularité à droite.
Un élément à la fois régulier à gauche et à droite est dit régulier.
Une loi telle que tout élément soit régulier est dite régulière.
Un élément inversible est régulier (vérifiez-le). Un élément régulier est-il inversible ?
(IUT de Nantes - Dpt d’informatique ) 13 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 10 (Régularité)
Un élément ade E est dit régulier à gauche (ousimplifiable à gauche) si, et seulement si :
¡∀x¢¡∀y¢¡(a?x=a?y)→(x=y)¢ On a une définition similaire de la régularité à droite.
Un élément à la fois régulier à gauche et à droite est dit régulier.
Une loi telle que tout élément soit régulier est dite régulière.
Un élément inversible est régulier (vérifiez-le). Un élément régulier est-il inversible ?
Loi de composition Propriétés des lois (de composition interne)
Définition 10 (Régularité)
Un élément ade E est dit régulier à gauche (ousimplifiable à gauche) si, et seulement si :
¡∀x¢¡∀y¢¡(a?x=a?y)→(x=y)¢ On a une définition similaire de la régularité à droite.
Un élément à la fois régulier à gauche et à droite est dit régulier.
Une loi telle que tout élément soit régulier est dite régulière.
Un élément inversible est régulier (vérifiez-le). Un élément régulier est-il inversible ?
(IUT de Nantes - Dpt d’informatique ) 13 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 11 (Distributivité)
On dit que la loi ?définie sur E est distributive sur†définie sur E si, et seulement si :
³
∀x´³∀y´³∀z´³¡x?(y†z)=(x?y)†(x?z)¢∧¡
(y†z)?x=(y?x)†(z?x)¢´
Loi de composition Propriétés des lois (de composition interne)
Définition 12 (Élément absorbant)
Un élément absorbant d’une LCI ?sur E est un élémenta? qui vérifie : (∀x)(x?a?=a??x=a?)
Montrez que si un tel élément existe, il est unique.
(IUT de Nantes - Dpt d’informatique ) 15 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 12 (Élément absorbant)
Un élément absorbant d’une LCI ?sur E est un élémenta? qui vérifie : (∀x)(x?a?=a??x=a?)
Montrez que si un tel élément existe, il est unique.
Loi de composition Propriétés des lois (de composition interne)
Définition 12 (Élément absorbant)
Un élément absorbant d’une LCI ?sur E est un élémenta? qui vérifie : (∀x)(x?a?=a??x=a?)
Montrez que si un tel élément existe, il est unique.
(IUT de Nantes - Dpt d’informatique ) 15 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 13 (Élément involutif)
Soit?une loi sur un ensemble E admettant un élément neutre e?. Alorsx est involutif si, et seulement si,x?x=e?.
Définition 14 (Élément idempotent) Soit?une loi sur un ensemble E.
Alorsx est idempotentsi, et seulement si,x?x=x.
Loi de composition Propriétés des lois (de composition interne)
Définition 13 (Élément involutif)
Soit?une loi sur un ensemble E admettant un élément neutre e?. Alorsx est involutif si, et seulement si,x?x=e?.
Définition 14 (Élément idempotent) Soit?une loi sur un ensemble E.
Alorsx est idempotentsi, et seulement si,x?x=x.
(IUT de Nantes - Dpt d’informatique ) 16 / 109
Loi de composition Propriétés des lois (de composition interne)
Définition 13 (Élément involutif)
Soit?une loi sur un ensemble E admettant un élément neutre e?. Alorsx est involutif si, et seulement si,x?x=e?.
Définition 14 (Élément idempotent) Soit?une loi sur un ensemble E.
Alorsx est idempotentsi, et seulement si,x?x=x.
Groupes
Sommaire
1 Loi de composition 2 Groupes
3 Anneaux et corps
4 Aparté : ze Haskell Touch 5 Structure d’espace vectoriel 6 Les matrices
(IUT de Nantes - Dpt d’informatique ) 17 / 109
Groupes
Groupes
Définition 15 (Groupe)
Un groupe est un monoïde tel que tout élément est inversible.
Définition 16 (Sous-groupe)
〈H,?〉est un sous-groupe de 〈G,?〉 si, et seulement si, H est une partie de G et 〈H,?〉est un groupe.
(IUT de Nantes - Dpt d’informatique ) 19 / 109
Groupes
Définition 15 (Groupe)
Un groupe est un monoïde tel que tout élément est inversible.
Définition 16 (Sous-groupe)
〈H,?〉est un sous-groupe de 〈G,?〉 si, et seulement si, H est une partie de G et 〈H,?〉est un groupe.
Groupes
Définition 15 (Groupe)
Un groupe est un monoïde tel que tout élément est inversible.
Définition 16 (Sous-groupe)
〈H,?〉est un sous-groupe de 〈G,?〉 si, et seulement si, H est une partie de G et 〈H,?〉est un groupe.
(IUT de Nantes - Dpt d’informatique ) 19 / 109
Anneaux et corps
Sommaire
1 Loi de composition 2 Groupes
3 Anneaux et corps
4 Aparté : ze Haskell Touch 5 Structure d’espace vectoriel 6 Les matrices
Anneaux et corps Anneaux
(IUT de Nantes - Dpt d’informatique ) 21 / 109
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
(IUT de Nantes - Dpt d’informatique ) 22 / 109
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
(IUT de Nantes - Dpt d’informatique ) 22 / 109
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
(IUT de Nantes - Dpt d’informatique ) 22 / 109
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
Anneaux et corps Anneaux
Définition 17 (Anneau)
Soit A un ensemble muni de deux lois et.
On dit que 〈A,, 〉est un anneau si, et seulement si :
〈A,〉est un groupe commutatif ; est associative ;
est distributive sur.
Si est commutative, alors l’anneau est dit commutatif.
Si admet un élément neutre, l’anneau est ditunitaire.
Les éléments d’un anneau unitaire qui admettent un symétrique par sont dits inversibles. On note A∗ l’ensemble des éléments inversibles de A.
(IUT de Nantes - Dpt d’informatique ) 22 / 109
Anneaux et corps Corps
Définition 18 (Corps)
SoitK un ensemble muni de deux LCIet . Le triplet〈K,, 〉 possède une structure decorpssi, et seulement si,
〈K,, 〉a une structure d’anneau unitaire ;
〈K\ {e}, 〉a une structure de groupe.
Combien d’éléments a au minimum un corps ?
Anneaux et corps Corps
Définition 18 (Corps)
SoitK un ensemble muni de deux LCIet . Le triplet〈K,, 〉 possède une structure decorpssi, et seulement si,
〈K,, 〉a une structure d’anneau unitaire ;
〈K\ {e}, 〉a une structure de groupe.
Combien d’éléments a au minimum un corps ?
(IUT de Nantes - Dpt d’informatique ) 23 / 109
Anneaux et corps Corps
Définition 18 (Corps)
SoitK un ensemble muni de deux LCIet . Le triplet〈K,, 〉 possède une structure decorpssi, et seulement si,
〈K,, 〉a une structure d’anneau unitaire ;
〈K\ {e}, 〉a une structure de groupe.
Combien d’éléments a au minimum un corps ?
Anneaux et corps Corps
Définition 18 (Corps)
SoitK un ensemble muni de deux LCIet . Le triplet〈K,, 〉 possède une structure decorpssi, et seulement si,
〈K,, 〉a une structure d’anneau unitaire ;
〈K\ {e}, 〉a une structure de groupe.
Combien d’éléments a au minimum un corps ?
(IUT de Nantes - Dpt d’informatique ) 23 / 109
Anneaux et corps Corps
Définition 18 (Corps)
SoitK un ensemble muni de deux LCIet . Le triplet〈K,, 〉 possède une structure decorpssi, et seulement si,
〈K,, 〉a une structure d’anneau unitaire ;
〈K\ {e}, 〉a une structure de groupe.
Combien d’éléments a au minimum un corps ?
Anneaux et corps La classes numériques sur Haskell
class (Eq a, Show a) => Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a abs, signum :: a -> a fromInteger :: Integer -> a
À quelle structure algébrique peut-on associer la classeNum?
(IUT de Nantes - Dpt d’informatique ) 24 / 109
Anneaux et corps La classes numériques sur Haskell
class (Eq a, Show a) => Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a abs, signum :: a -> a fromInteger :: Integer -> a
À quelle structure algébrique peut-on associer la classeNum?
Anneaux et corps La classes numériques sur Haskell
class (Num a) =>Fractional a where (/) :: a -> a -> a recip :: a -> a
fromRational :: Rational -> a
À quelle structure algébrique peut-on associer la classeFrational?
(IUT de Nantes - Dpt d’informatique ) 25 / 109
Anneaux et corps La classes numériques sur Haskell
class (Num a) =>Fractional a where (/) :: a -> a -> a recip :: a -> a
fromRational :: Rational -> a
À quelle structure algébrique peut-on associer la classeFrational?
Aparté : ze Haskell Touch
Sommaire
1 Loi de composition 2 Groupes
3 Anneaux et corps
4 Aparté : ze Haskell Touch 5 Structure d’espace vectoriel 6 Les matrices
(IUT de Nantes - Dpt d’informatique ) 26 / 109
Aparté : ze Haskell Touch
John Backus (1924 - 2007)
Much of my work has come from being lazy
Aparté : ze Haskell Touch
John Backus (1924 - 2007)
Much of my work has come from being lazy
(IUT de Nantes - Dpt d’informatique ) 27 / 109
Aparté : ze Haskell Touch Les fonctions
Spécifier
SPÉCIFIER la fonction : c’est-à-dire parfois (on peut effectivement s’en passer au besoin) la nommer, donner sontype, i.e. son domaine et son codomaine : on parle designature de type et on explique ce qu’elle fait.
double :: Int -> Int
−− c a l c u l e l e d o u b l e d ’ un e n t i e r : l e r é s u l t a t e s t un e n t i e r
Aparté : ze Haskell Touch Les fonctions
Spécifier
SPÉCIFIER la fonction : c’est-à-dire parfois (on peut effectivement s’en passer au besoin) la nommer, donner sontype, i.e. son domaine et son codomaine : on parle designature de type et on explique ce qu’elle fait.
double :: Int -> Int
−− c a l c u l e l e d o u b l e d ’ un e n t i e r : l e r é s u l t a t e s t un e n t i e r
(IUT de Nantes - Dpt d’informatique ) 28 / 109
Aparté : ze Haskell Touch Les fonctions
Réaliser
RÉALISER la fonction c’est associer à la fonction spécifiée une expression.
Pour cela, on utilise desparamètres formels qui font abstraction des valeurs particulières qui leur seront ensuitesubstituées.
double n = 2 * n
Aparté : ze Haskell Touch Les fonctions
Réaliser
RÉALISER la fonction c’est associer à la fonction spécifiée une expression.
Pour cela, on utilise desparamètres formels qui font abstraction des valeurs particulières qui leur seront ensuitesubstituées.
double n = 2 * n
(IUT de Nantes - Dpt d’informatique ) 29 / 109
Aparté : ze Haskell Touch Les fonctions
Utiliser
UTILISER a fonction dans une expression en lui donnant desparamètres effectifs (arguments), c’est-à-dire liés à l’application particulière de la fonction :
*Main> (double 3) + (double 7) 20
Aparté : ze Haskell Touch Les fonctions
Utiliser
UTILISER a fonction dans une expression en lui donnant desparamètres effectifs (arguments), c’est-à-dire liés à l’application particulière de la fonction :
*Main> (double 3) + (double 7) 20
(IUT de Nantes - Dpt d’informatique ) 30 / 109
Aparté : ze Haskell Touch Curryfication
Haskell Curry (1900 - 1982)
Aparté : ze Haskell Touch Curryfication
(IUT de Nantes - Dpt d’informatique ) 32 / 109
Aparté : ze Haskell Touch Curryfication
Unefonction curryfiéeest une fonction de plusieurs variables transformée en une fonction d’une seule variable qui renvoie une fonction ayant une variable de moins...
Cela permet de créer des fonctions partielles.
Aparté : ze Haskell Touch Curryfication
Unefonction curryfiéeest une fonction de plusieurs variables transformée en une fonction d’une seule variable qui renvoie une fonction ayant une variable de moins...
Cela permet de créer des fonctions partielles.
(IUT de Nantes - Dpt d’informatique ) 33 / 109
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
(IUT de Nantes - Dpt d’informatique ) 34 / 109
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
(IUT de Nantes - Dpt d’informatique ) 34 / 109
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
(IUT de Nantes - Dpt d’informatique ) 34 / 109
Aparté : ze Haskell Touch Curryfication
plus x y = x + y
plus :: Integer -> Integer -> Integer
plus x y = x + y
Associativité
f = plus 3
Que vaut f(5)?
*Main> f 5 8
*Main> :t f
f :: Integer -> Integer
Aparté : ze Haskell Touch Curryfication
F(D,A)
plus∈F¡N,F(N,N)¢
(IUT de Nantes - Dpt d’informatique ) 35 / 109
Aparté : ze Haskell Touch Curryfication
F(D,A)
plus∈F¡N,F(N,N)¢
Aparté : ze Haskell Touch Un exemple
Exemple 19
Décrire une fonction qui étant donnés quatre flottants leur associe la moyenne des deux nombres parmi les quatre qui ne sont ni le plus grand ni le plus petit. Par exemple, la moyenne olympique de 10, 8, 12 et 14 est 11 et celle de 12, 12, 12 et 12 est 12.
(IUT de Nantes - Dpt d’informatique ) 36 / 109
Aparté : ze Haskell Touch Un exemple
Spécification
moyenne_olympique4 :: Float -> Float -> Float -> Float -> Float
−− r e n v o i e l a moyenne o l y m p i q u e de 4 f l o t t a n t s s o u s forme d ’ un f l o t t a n t
Aparté : ze Haskell Touch Un exemple
Réalisation
Nous allons par exemple additionner les quatre nombres, retirer le plus grand et le plus petit puis diviser par 2.
*Main> :t min
min :: Ord a => a -> a -> a
*Main> min ’a’ ’b’
’a’
*Main> min 5 3 3
*Main> min "Tralala" "Pouet Pouet"
"Pouet Pouet"
*Main> min True False False
(IUT de Nantes - Dpt d’informatique ) 38 / 109
Aparté : ze Haskell Touch Un exemple
Réalisation
Nous allons par exemple additionner les quatre nombres, retirer le plus grand et le plus petit puis diviser par 2.
*Main> :t min
min :: Ord a => a -> a -> a
*Main> min ’a’ ’b’
’a’
*Main> min 5 3 3
*Main> min "Tralala" "Pouet Pouet"
"Pouet Pouet"
*Main> min True False False
Aparté : ze Haskell Touch Un exemple
Réalisation
Nous allons par exemple additionner les quatre nombres, retirer le plus grand et le plus petit puis diviser par 2.
*Main> :t min
min :: Ord a => a -> a -> a
*Main> min ’a’ ’b’
’a’
*Main> min 5 3 3
*Main> min "Tralala" "Pouet Pouet"
"Pouet Pouet"
*Main> min True False False
(IUT de Nantes - Dpt d’informatique ) 38 / 109
Aparté : ze Haskell Touch Un exemple
Réalisation
moyenne_olympique4 a b c d =
(s - mini - maxi) / 2 −− l ’ e x p r e s s i o n c o r r e s p o n d a n t à l a mé t h o d e c h o i s i e
where s = a + b + c + d −− l a somme d e s 4 nombres
mini = min a (min b (min c d) ) −− l e p l u s p e t i t d e s 4 maxi = max a (max b (max c d) ) −− l e p l u s grand d e s 4
*Main> moyenne_olympique4 10 8 12 14 11.0
Aparté : ze Haskell Touch Un exemple
Réalisation
moyenne_olympique4 a b c d =
(s - mini - maxi) / 2 −− l ’ e x p r e s s i o n c o r r e s p o n d a n t à l a mé t h o d e c h o i s i e
where s = a + b + c + d −− l a somme d e s 4 nombres
mini = min a (min b (min c d) ) −− l e p l u s p e t i t d e s 4 maxi = max a (max b (max c d) ) −− l e p l u s grand d e s 4
*Main> moyenne_olympique4 10 8 12 14 11.0
(IUT de Nantes - Dpt d’informatique ) 39 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Exemple 20
Décrire une fonction qui étant donnée une liste d’au moins quatre nombres leur associe la moyenne des nombres parmi ceux de la liste qui ne sont ni le plus grand ni le plus petit. Par exemple, la moyenne olympique de 15, 7, 10, 8, 12 et 14 est 11.
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Min et Max polymorphes
minListe :: (Ord a) => [a] -> a
−− r e n v o i e l e m i n i d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
maxListe :: (Ord a) => [a] -> a
−− r e n v o i e l e maxi d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
extr_liste :: (Ord a) => (a -> a -> a) -> [a] -> a
−− r e n v o i e l e m i n i ou l e maxi ( on c h o i s i t en m e t t a n t l a n a t u r e de l ’ extremum en param è t r e ) d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
(IUT de Nantes - Dpt d’informatique ) 41 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Min et Max polymorphes
minListe :: (Ord a) => [a] -> a
−− r e n v o i e l e m i n i d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
maxListe :: (Ord a) => [a] -> a
−− r e n v o i e l e maxi d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
extr_liste :: (Ord a) => (a -> a -> a) -> [a] -> a
−− r e n v o i e l e m i n i ou l e maxi ( on c h o i s i t en m e t t a n t l a n a t u r e de l ’ extremum en param è t r e ) d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Min et Max polymorphes
minListe :: (Ord a) => [a] -> a
−− r e n v o i e l e m i n i d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
maxListe :: (Ord a) => [a] -> a
−− r e n v o i e l e maxi d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
extr_liste :: (Ord a) => (a -> a -> a) -> [a] -> a
−− r e n v o i e l e m i n i ou l e maxi ( on c h o i s i t en m e t t a n t l a n a t u r e de l ’ extremum en param è t r e ) d ’ une l i s t e d ’ é l é ments o r d o n n a b l e s
(IUT de Nantes - Dpt d’informatique ) 41 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
m_o4 :: (Fractional t, Ord t) => t -> t -> t -> t -> t
m_o4 a b c d =
(s - mini - maxi) / 2 where {
s = a + b + c + d ;
mini = min d (min c (min a b)) ; maxi = max d (max c (max a b))
}
(IUT de Nantes - Dpt d’informatique ) 43 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
som_liste :: (Num typ) => [typ] -> typ
som_liste [] =
error "Ta liste est vide !!"
som_liste (tete_de_liste : []) =
tete_de_liste
som_liste (tete_de_liste : liste_décapitée) = (+) tete_de_liste (som_liste liste_décapitée)
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
minListe :: ( Ord t)=> [t] -> t
minListe [] =
error "Ta liste est vide !!"
minListe (tete : []) =
tete
minListe (tete : liste_décapitée) =
min tete (minListe liste_décapitée)
(IUT de Nantes - Dpt d’informatique ) 45 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
maxListe [] =
error "Ta liste est vide !!"
maxListe (tete : []) =
tete
maxListe (tete : liste_décapitée) = max tete (maxListe liste_décapitée)
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
(IUT de Nantes - Dpt d’informatique ) 47 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
op_liste = foldl1 fold comme...
lcomme...
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
op_liste = foldl1 fold comme...
lcomme...
(IUT de Nantes - Dpt d’informatique ) 48 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
op_liste = foldl1 fold comme...
lcomme...
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
: :
: :
: Vide 7
2.5 3
2 4
min 4 min
2 min
3 min
2.5 7
(IUT de Nantes - Dpt d’informatique ) 49 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
*Main> :t opListe
opListe :: (a -> a -> a) -> [a] -> a
*Main> :t opListe min
opListe min :: Ord a => [a] -> a
*Main> opListe min [4, 2, 3, 2.5, 7]
2.0
*Main> opListe max [4, 2, 3, 2.5, 7]
7.0
*Main> opListe (+) [4, 2, 3, 2.5, 7]
18.5
*Main> opListe (*) [4, 2, 3, 2.5, 7]
420.0
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Longueur d’une liste ?
*Main> length [2,3,6,7]
4
(IUT de Nantes - Dpt d’informatique ) 51 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Longueur d’une liste ?
*Main> length [2,3,6,7]
4
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
*Main> (opListe (+) [2,3,6,7]) / (length [2,3,6,7])
<interactive>:27:25:
No instance for (Fractional Int) arising from a use of ‘/’
Possible fix: add an instance declaration for (Fractional Int) In the expression:
(opListe (+) [2, 3, 6, 7]) / (length [2, 3, 6, 7]) In an equation for ‘it’:
it = (opListe (+) [2, 3, 6, ....]) / (length [2, 3, 6, ....])
(IUT de Nantes - Dpt d’informatique ) 52 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
*Main> (opListe (+) [2,3,6,7]) / (length [2,3,6,7])
<interactive>:27:25:
No instance for (Fractional Int) arising from a use of ‘/’
Possible fix: add an instance declaration for (Fractional Int) In the expression:
(opListe (+) [2, 3, 6, 7]) / (length [2, 3, 6, 7]) In an equation for ‘it’:
it = (opListe (+) [2, 3, 6, ....]) / (length [2, 3, 6, ....])
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
*Main> :t length length :: [a] -> Int
*Main> :t (/)
(/) :: Fractional a => a -> a -> a
(IUT de Nantes - Dpt d’informatique ) 53 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
*Main> :t foldl1
foldl1 :: (a -> a -> a) -> [a] -> a
*Main> :t foldl
foldl :: (a -> b -> a) -> a -> [b] -> a
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
longListeFrac :: (Fractional nb) => [patates] -> nb
longListeFrac xs = foldl (\acc patate
-> 1 + acc) 0 xs
*Main> longListeFrac [’a’..’z’]
26.0
(IUT de Nantes - Dpt d’informatique ) 55 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
longListeFrac :: (Fractional nb) => [patates] -> nb
longListeFrac xs = foldl (\acc patate
-> 1 + acc) 0 xs
*Main> longListeFrac [’a’..’z’]
26.0
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
Alternative récursive :
LongListeFrac :: Fractional nb => [patates] -> nb
LongListeFrac [] = 0
LongListeFrac (tete : liste_décapitée) = 1 + (LongListeFrac liste_décapitée)
(IUT de Nantes - Dpt d’informatique ) 56 / 109
Aparté : ze Haskell Touch Polymorphisme - abstraction - récursion - listes
m_o :: (Ord t, Fractional t) => [t] -> t
m_o liste_notes =
if nb_notes <= 0 then error "Liste trop courte !"
else
(som_notes - note_mini - note_maxi) / nb_notes
where {
som_notes = som_liste liste_notes ; note_mini = minListe liste_notes ; note_maxi = maxListe liste_notes ;
nb_notes = (LongListeFrac liste_notes) - 2 }
Aparté : ze Haskell Touch Définition récursive d’un type
Qu’est-ce qu’un mot ?
(IUT de Nantes - Dpt d’informatique ) 58 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
« glop »
:+
:+
:+
:+
Vide p
o l
g
Aparté : ze Haskell Touch Définition récursive d’un type
« glop »
:+
:+
:+
:+
Vide p
o l
g
(IUT de Nantes - Dpt d’informatique ) 59 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
data Mot = Vide
| Char :+ Mot
Aparté : ze Haskell Touch Définition récursive d’un type
data Mot = Vide
| Char :+ Mot deriving (Show)
(IUT de Nantes - Dpt d’informatique ) 61 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
data Mot = Vide
| Char :+ Mot deriving (Show, Eq)
Aparté : ze Haskell Touch Définition récursive d’un type
*Main> let m = ’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
*Main> m
’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
<interactive>:44:9:
Couldn’t match expected type ‘Char’ with actual type ‘Mot’
In the first argument of ‘(:+)’, namely ’g’ :+ ’l’ :+ ’o’ :+ ’p’
In the expression: ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
In an equation for ‘m’: m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
(IUT de Nantes - Dpt d’informatique ) 63 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
*Main> let m = ’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
*Main> m
’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
<interactive>:44:9:
Couldn’t match expected type ‘Char’ with actual type ‘Mot’
In the first argument of ‘(:+)’, namely ’g’ :+ ’l’ :+ ’o’ :+ ’p’
In the expression: ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
In an equation for ‘m’: m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
Aparté : ze Haskell Touch Définition récursive d’un type
infixr :+
data Mot = Vide
| Char :+ Mot deriving (Show, Eq)
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
*Main> m
’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
(IUT de Nantes - Dpt d’informatique ) 64 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
infixr :+
data Mot = Vide
| Char :+ Mot deriving (Show, Eq)
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
*Main> m
’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
Aparté : ze Haskell Touch Définition récursive d’un type
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
*Main> m
’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
*Main> :t m m :: Mot
(IUT de Nantes - Dpt d’informatique ) 65 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
*Main> let m = ’g’ :+ ’l’ :+ ’o’ :+ ’p’ :+ Vide
*Main> m
’g’ :+ (’l’ :+ (’o’ :+ (’p’ :+ Vide)))
*Main> :t m m :: Mot
Aparté : ze Haskell Touch Définition récursive d’un type
Sélecteurs
tete :: Mot -> Char
−− r e n v o i e l e p r e m i e r c a r a c t è r e d ’ un mot a v e c un f i l t r a g e p a r m o t i f tete Vide = error "Mot vide !"
tete (t :+ q) = t
*Main> tete m
’g’
Et la queue ?
(IUT de Nantes - Dpt d’informatique ) 66 / 109
Aparté : ze Haskell Touch Définition récursive d’un type
Sélecteurs
tete :: Mot -> Char
−− r e n v o i e l e p r e m i e r c a r a c t è r e d ’ un mot a v e c un f i l t r a g e p a r m o t i f tete Vide = error "Mot vide !"
tete (t :+ q) = t
*Main> tete m
’g’
Et la queue ?