Listes en Caml

publicité
Listes en Caml
O Gense
29 janvier 2017
Table des matières
1 Les fonctions de base
1.1
1.2
1.3
1.4
Dénition formelle . . .
Remarque historique . .
Opérations de base . . .
Diérences avec Python
2 Fonctions complémentaires
2.1
2.2
2.3
2.4
2.5
Longueur . . . .
appartenance . .
Concaténation . .
La fonction map .
La fonction rev .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
2
2
3
3
3
4
4
4
4
3 Fonctions ensemblistes
5
4 Le tri fusion
5
3.1 Listes sans répétition . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
5
1 Les fonctions de base
1.1 Dénition formelle
Listes en Caml
Attention
Les listes Caml ont un comportement très diérents des listes en Python.
Dénition
Si 'a est un type Caml alors une 'a list peut
être la liste vide
un couple composé d'un élément de type 'a, appelé tête de la liste et d'une 'a list
, appelée queue de la liste
On peut écrire que le type liste est déni par la relation
liste = N il|element ∗ liste
1.2 Remarque historique
Remarque historique
Cette conception des listes est apparue avec le langage Lisp (∼ 1960), abréviation de
list processing .
Le langage Lisp a été utilisé, en autre, en intelligence articielle et pour des programmes de calcul symbolique.
On notera que le logiciel Emacs est écrit en Lisp.
Les programmes écrits en Lisp se reconnaissent à leur très grand nombre de parenthèses.
1.3 Opérations de base
Opérations de base
Il y a 4 éléments de base pour dénir les listes
1. La liste vide notée [ ].
2. le "cons" noté ::
Si x est de type 'a et q est une 'a liste alors x::q est la 'a list dont la tête
est x et la queue q
3. La fonction List.hd: 'a list -> 'a qui rend la tête d'une liste.
4. La fonction List.tl qui rend la queue de la liste
Remarque
Quand les fonction List.hd et List.tl sont appliquées à une liste vide, elles rendent
une exception.
2
Ecriture explicite
Dans le cas d'une liste de petite taille, il est possible d'écrire la liste entre [ ], les
éléments étant séparés par de ;.
exemple :
let a = [1;2;3;4];;
4.
Remarque Dans l'exemple précédent, le premier élément mis dans la liste est le
1.4 Diérences avec Python
Diérences avec Python
On notera que
1. Les listes Caml sont immuables
Un fois qu'une liste est crée, il n'est plus possible d'en modier les éléments.
2. Les listes Caml ne sont pas indexées,
on n'accède pas directement au i-ème élément d'une liste.
3. Par contre il est possible de faire une identication sur une liste.
On verra plus tard des structures modiables et indexées en Caml.
2 Fonctions complémentaires
Autres fonctions
Nous allons voir un certain nombres de fonctions Caml sur les listes, et voir comment
on peut les écrire à partie des fonctions de bases.
2.1 Longueur
Longueur
Pour calculer le nombre d'éléments dans une liste, on peut écrire la fonction suivante.
let rec longueur l =
match l with
[] -> 0
|x::q -> 1 + longueur q
;;
Beaucoup de fonctions sur les listes s'écriront selon le même plan.
On peut aussi utiliser les fonctions déjà dénies
List.length en Ocaml
list_length en CamlLight
3
2.2 appartenance
appartenance
Pour tester la présence d'un élément dans une liste
À compléter
let rec appartient e l =
match l with
[] ->
| x::q ->
;;
Remarque : L'évaluation des booléens est paresseuse et se fait de gauche à droite.
Fonction prédénie List.mem ou mem
2.3 Concaténation
concaténation
La concaténation de listes est réalisée en Caml par l'opérateur @.
Exercice
Écrire une fonction concat : 'a list -> 'a list -> 'a list qui réalise la concaténation de deux listes.
Votre fonction n'utilisera pas l'opérateur @
Exercice
Écrire une fonction aplatir : 'a list list -> 'a list qui concatène tous les
éléments d'une liste de listes.
Votre fonction utilisera la fonction concat.
2.4 La fonction map
map
Les fonctions List.map ou map prennent en arguments une fonction f et une liste
[a1;a2;..;an] et rend [f a1;f a2;..;f an]
La fonction List.map a pour type
let rec map f l =
match l with
[] ->
|x::q ->
;;
4
2.5 La fonction rev
rev
Les fonctions List.rev ou rev permettent de retourner une liste.
Pour cette fonction, la programmation change un peu
let rev l =
let rec transvase l1 l2 =
match l1 with
[] -> l2
|x::q -> transvase q (x::l2)
in transvase l []
;;
3 Fonctions ensemblistes
3.1 Listes sans répétition
Listes sans répétition
Pour représenter les ensembles, on peut utiliser des listes sans répétitions
Les opérations doivent respecter cette condition de non répétitions.
les principales fonctions sont
L'ajout sans répétition.
L'union , l'intersection et l'égalité d'ensembles
Le Produit cartésien.
La Liste des sous listes/
4 Le tri fusion
Tri fusion
Un problème classique de l'informatique est le tri des données.
Une méthode classique pour ce problème est le tri fusion
Le principe est le suivant
1. Séparer la liste à trier en deux listes de longueurs comparables
2. On trie chacune des sous listes
3. On fusionne les deux sous listes triées en une liste triée.
5
Téléchargement