• Aucun résultat trouvé

Type de donn´ee abstrait et Listes Programmation Fonctionnelle Master 2 I2L apprentissage

N/A
N/A
Protected

Academic year: 2022

Partager "Type de donn´ee abstrait et Listes Programmation Fonctionnelle Master 2 I2L apprentissage"

Copied!
34
0
0

Texte intégral

(1)

Programmation Fonctionnelle Master 2 I2L apprentissage

S´ebastien Verel verel@univ-littoral.fr

http://www-lisic.univ-littoral.fr/~verel

Universit´e du Littoral Cˆote d’Opale Laboratoire LISIC Equipe OSMOSE

(2)

Objectifs de la s´ eance

Savoir diff´erencier une structure de donn´ee d’un type de donn´ee abstrait

Savoir d´efinir le type de donn´ee abstrait liste Savoir utiliser les listes en Haskell

Connaitre le sch´ema r´ecursif du traitement d’une liste Connaitre les algorithmes classiques relatifs aux listes Savoir ´ecrire une fonction de calcul avec accumulateur, de cr´eation, de modification, de filtre avec une liste.

Question principale du jour : La tˆete ou la queue ?

(3)

Exemple de donn´ ees

Liste de tˆaches `a effectuer :

Suite finie de tˆaches `a effectuer dans l’ordre Base de donn´ees clients

G´enome : suite finie de bases ATCG

(4)

Introduction Liste Les classiques

D´ efinitions

Donn´ee

Information ´el´ementaire primitive

Donn´ees

Ensemble d’informations ´el´ementaires primitives Traiter les donn´ees consiste `a :

Passer d’informations, appel´ees donn´ees

`

a d’autres informations, appel´ees r´esultats

Comment acc´eder (lire, ´ecrire) `a ces donn´ees ?

Description des fonctions admissibles sur les donn´ees (et non pas directement sur les structures de donn´ees)

(5)

D´ efinitions

Donn´ee

Information ´el´ementaire primitive

Donn´ees

Ensemble d’informations ´el´ementaires primitives Traiter les donn´ees consiste `a :

Passer d’informations, appel´ees donn´ees

`

a d’autres informations, appel´ees r´esultats

Comment acc´eder (lire, ´ecrire) `a ces donn´ees ?

Type de Donn´ees Abstrait (TDA)

Description des fonctions admissibles sur les donn´ees (et non pas directement sur les structures de donn´ees)

(6)

Structure de donn´ ees

Structure de donn´ees

Structure logique destin´ee `a contenir les donn´ees

Type de Donn´ees Abstrait (TDA)

Description des fonctions admissibles sur les donn´ees (et non pas directement sur les structures de donn´ees) Une structure de donn´ees impl´emente un TDA

(7)

Fonctions sur les TDA

Op´erations ´el´ementaires d’un TDA Cr´eation de donn´ees de base Construction de nouvelles donn´ees Lecture de donn´ees

(8)

Classification

Les structures logiques contenant les donn´ees peuvent ˆetre : Lin´eaire / non lin´eaire

Index´ee / non index´ee Ordonn´ee / non ordonn´ee

(9)

Traiter une liste de tˆ aches

Comment traiter une liste de tˆaches ? Faire les tˆaches les unes apr`es les autres

traitement s´equentiel Quelle tache ?

Pas de pr´ef´erence (priorit´e), la premi`ere Comment ajouter une nouvelle tˆache ?

Pas de pr´ef´erence, en premier Retirer une tˆache

celle qui vient d’ˆetre lue Savoir s’il reste une tˆache

(10)

Algorithme du traitement d’une liste de tˆ ache

Algorithme traiter(liste) : rien d´ebut

siliste est vide alors Ne rien faire sinon

Ex´ecuter la premi`ere tˆache Traiter le reste de la liste fin si

fin

Remarques :

Algorithme r´ecursifs ?

Terminaison si la liste est de taille finie (j’esp`ere...)

(11)

D´ efinition informelle

D´efinition

Une liste est une suite finie de donn´ees, appel´ee aussi ´el´ement, o`u il est seulement possible d’ajouter et de lire une donn´ee en tˆete de la suite.

Notation : la tˆete est `a gauche et la queue `a droite Exemple

[23,1,67,29,12]

La tˆete est ´egale `a 23

La queue est ´egale `a la liste [1,67,29,12]

(12)

TDA liste

5 primitives sont n´ecessaire pour d´efinir le TDA : listeVide : ()→liste

retourne la liste vide

listeCons :element×liste →liste ajoute un ´el´ement `a une liste listeTete :liste →element

retourne l’´el´ement en tˆete de la liste (si elle n’est pas vide !) listeQueue :liste →liste

retourne la queue de la liste (si elle n’est pas vide !) listeEstVide?:liste →boolean

teste si la liste est vide

(13)

En Haskell

listeVide : ()→liste [ ]

listeCons :element×liste →liste h:t

listeTete :liste →element head liste

listeQueue :liste →liste tail liste

listeEstVide?:liste →boolean liste == []

Et surtout ne pas oublier le ”pattern matching” (filtrage) ! h : tl = list

Tester !

(14)

Algorithme du traitement d’une liste de tˆ ache

Algorithme traiter(liste) : rien d´ebut

siliste est vide alors Ne rien faire sinon

Ex´ecuter la premi`ere tˆache Traiter le reste de la liste fin si

fin

(15)

Algorithme du traitement d’une liste de tˆ ache

Admettons que nous avons une fonction ”executer” qui ex´ecute la tache.

Algorithme traiter(liste) : rien d´ebut

silisteEstVide ?(liste) alors executer(’fin de tache’) sinon

executer( listeTete(liste) ) traiter( listeQueue(liste) ) fin si

fin

(16)

Sch´ ema de traitement r´ ecursif des listes

Algorithme traiter(liste) : rien d´ebut

silisteEstVide ?(liste) alors ....

sinon ....

traiter( ... listeQueue(liste) ... ) fin si

fin

(17)

Introduction Liste Les classiques

En Haskell

traiter :: [ String ] -> IO ()

traiter [] = putStrLn "fin des t^aches."

traiter (h : t) = do executer h traiter t

(18)

En Haskell

traiter :: [ String ] -> IO ()

traiter [] = putStrLn "fin des t^aches."

traiter (h : t) = do executer h traiter t

executer tache = putStrLn (tache ++ " [Done]")

(19)

Introduction Liste Les classiques

Longueur d’une liste

longueur [] = 0

longueur (h:t) = longueur t + 1

(20)

Longueur d’une liste

longueur :: [ a ] -> Int longueur [] = 0

longueur (h:t) = longueur t + 1

(21)

Introduction Liste Les classiques

Somme des ´ el´ ements d’une liste d’entiers

mysum [] = 0

mysum (h:t) = mysum t + h

(22)

Somme des ´ el´ ements d’une liste d’entiers

mysum :: Num a => [ a ] -> a mysum [] = 0

mysum (h:t) = mysum t + h

(23)

Introduction Liste Les classiques

Doubler tous les nombres d’une liste d’entiers

double [] = []

double (h:t) = ( 2*h : double t )

(24)

Doubler tous les nombres d’une liste d’entiers

double :: Num a => [ a ] -> [ a ] double [] = []

double (h:t) = ( 2*h : double t )

(25)

Introduction Liste Les classiques

Concat´ enation des mots d’une liste de mots

concatenationMots [] = ""

concatenationMots (h:t) = h ++ concatenationMots t

(26)

Concat´ enation des mots d’une liste de mots

concatenationMots :: [ String ] -> String concatenationMots [] = ""

concatenationMots (h:t) = h ++ concatenationMots t

(27)

Introduction Liste Les classiques

Filtrer une liste : extraire les nombres pairs

pair [] = []

pair (h:t) | mod h 2 == 0 = (h : (pair t))

| otherwise = pair t

(28)

Filtrer une liste : extraire les nombres pairs

pair :: Integral a => [ a ] -> [ a ] pair [] = []

pair (h:t) | mod h 2 == 0 = (h : (pair t))

| otherwise = pair t

(29)

Introduction Liste Les classiques

Concat´ enation de 2 listes

myconcat [] l = l

myconcat (h:t) l = ( h : (myconcat t l) )

(30)

Concat´ enation de 2 listes

myconcat :: [ a ] -> [ a ] -> [ a ] myconcat [] l = l

myconcat (h:t) l = ( h : (myconcat t l) )

(31)

Introduction Liste Les classiques

Ajouter un ´ el´ ement ` a une position donn´ ee

ajouter elem 0 l = (elem : l)

ajouter elem n (h:t) = (h : (ajouter elem (n-1) t))

(32)

Ajouter un ´ el´ ement ` a une position donn´ ee

ajouter :: a -> Int -> [ a ] -> [ a ] ajouter elem 0 l = (elem : l)

ajouter elem n (h:t) = (h : (ajouter elem (n-1) t))

(33)

Introduction Liste Les classiques

Supprimer un ´ el´ ement ` a une position donn´ ee

supprimer _ [] = [] supprimer 0 (h:t) = t

supprimer n (h:t) = ( h : (supprimer (n-1) t) )

(34)

Supprimer un ´ el´ ement ` a une position donn´ ee

supprimer :: Int -> [ a ] -> [ a ] supprimer _ [] = []

supprimer 0 (h:t) = t

supprimer n (h:t) = ( h : (supprimer (n-1) t) )

Références

Documents relatifs

´ el´ ements plus petit que l’´ etiquette sont dans l’arbre gauche et tous les ´ el´ ements plus grand que l’´ etiquette sont dans l’arbre droit. searchOrd _ Empty

L’insertion et la suppression utilisent la rotation ` a gauche et ` a droite d’un arbre lorsqu’il est trop d´ es´ equilibr´ e :.

´ el´ ements plus petit que l’´ etiquette sont dans l’arbre gauche et tous les ´ el´ ements plus grand que l’´ etiquette sont dans l’arbre droit. searchOrd :: (Ord a) =>

Motif : expression compos´ e de variables libres ou li´ ees, ainsi que des valeurs litt´ erales (atomes, entiers ou chaines) Expression : expression compos´ e de structures de

Est-il possible de r´ esoudre le probl` eme ` a l’aide de la r´ esolution du probl` eme portant sur une (des) ”plus petite(s)” valeur(s) du param` etre. Si oui,

Connaitre le sch´ ema r´ ecursif du traitement d’une liste Connaitre les algorithmes classiques relatifs aux listes Savoir ´ ecrire une fonction de calcul avec accumulateur, de

Calcul consiste en l’´ evaluation d’une fonction pour ´ eviter toute modification ”d’´ etats”.. R´ esultat d´ epend seulement des entr´ ees et non pas de l’´ etat

Dans le module lists, plusieurs fonctions de premier ordre sont d´ ej` a d´ efinies car ultra-classiques et tr` es utiles.. Nous allons en d´ ecouvrir quelques unes par