Exercice 0 - Mise en œuvre des piles
Considérons la signature suivante pour structure de données représentant une pile :
module type Stack = sig
type 'a t
val empty : 'a t
val is_empty : 'a t -> bool
val push : 'a -> 'a t -> 'a t
val pop : 'a t -> 'a t option
val peek : 'a t -> 'a option
val size : 'a t -> int
end
où :
type 'a t
est un type dont les valeurs sont les suivantes représentent des piles contenant des éléments de type'a
.empty
est une constante représentant le type'a
. la pile vide.is_empty
est vrai lorsque la pile est vide (i.e. est égale àempty
).push
est une fonction qui empile un élément au sommet d'une pile.pop
est une fonction qui dépile un élément de la pile et renvoie la pile résultante (c'est-à-dire la pile dont l'élément du sommet a été enlevé).peek
est une fonction qui retourne la valeur de l'élément situé au sommet d'une pile.size
est une fonction qui renvoie le nombre d'éléments dans une pile.
-Problème 0 : Donnez un module conforme à la signature ci-dessus qui implémente les piles en utilisant des listes.
-Problème 1 : Donnez un module conforme à la signature ci-dessus qui implémente les piles en utilisant un type de données algébrique.
Exercice 1 - Quelques foncteurs sur les piles
-Problème 0 : Considérons l'extension suivante de la signature Stack
qui ajoute les fonctionnalités de conversion d'une liste en pile et vice-versa,
ainsi qu'une fonction map
qui effectue l'opération map sur les piles :
module type StackExtended = sig
include Stack
val from_list : 'a list -> 'a t
val to_list : 'a t -> 'a list
val map : 'a t -> ('a -> 'b) -> 'b t
end
Stack
et renvoie une
extension de celle-ci conforme à la signature StackExtended
.
-Problème 1 : Ecrire un foncteur qui
prend en entrée un module S
de signature Pile
et qui retourne
un module contenant des valeurs booléennes qui servent à tester ce qui suit :
- Pousser un élément
x
sur une pile vide et dépiler cette pile donnex
. - La pile est LIFO, c'est-à-dire que l'application de
peek
à une pile donne le dernier élément empilé dans celle-ci (s'il y en a).