On cherche à écrire une interface pour les files (queue, structure de données FIFO).
On travaillera dans un fichier queue.mli
Empty_queue.
fold qui itère sur les éléments d'une file dans l'ordre dans lequel ils ont été insérés.
Pour implémenter les files de façon fonctionnelle, on peut utiliser des couples de liste : la première permet de récupérer les éléments, si elle n'est pas vide sa tête sera donc l'élément le plus ancien. La deuxième sert à stocker les éléments, sa tête sera donc le dernier élément inséré.
Ainsi, le couple [1; 2], [4; 3] est un pile dans laquelle on a inséré les élements 1 2 3 4 dans cet ordre.
Pour retirer un élément quand la première liste est vide, il faudra inverser la deuxième pour récupérer son élément le plus ancien ; on utilisera alors la suite de la liste inversée comme première liste.
Ainsi, pour la pile représentée par [], [4; 3; 2; 1], on retournera 1 comme élément et [2; 3; 4], [] comme nouvelle pile.
On travaillera dans un fichier queue.ml
Empty_queue.
fold qui itère sur les éléments d'une file dans l'ordre dans lequel ils ont été insérés. On pourra utiliser List.fold_left et List.fold_right.
On considère des dépendances entre tâches (ici représentées par des entiers). On peut par exemple penser à des dépendances dans un Makefile. On souhaite afficher un ordonnancement des ces tâches qui respecte les dépendances (c.-à.-d. si i est affiché avant j, alors i ne dépend pas de j).
On complétera le fichier deps.ml.
Les dépendances seront représentées par une liste de couples a, l où a est une tâche et l est la liste de tâches dont elle dépend.
add_no_dep qui prend en paramètre une file et une liste de dépendances, et qui retourne une file et une liste de dépendance telles que on a retiré de la liste de dépendances tous les couples i, [] et on a alors ajouté i dans la file.
order_aux qui prend en paramètre une file et une liste de dépendances. Si la file est vide on s'arrête. Sinon retire alors un élément i de la file. On affiche i sur la sortie standard. On retire i de la liste l de chacun des couples j, l de la liste de dépendances. On applique add_no_dep sur la file et la nouvelle liste de dépendances, et on s'appelle récursivement sur les nouvelles file et liste de dépendances.
order qui prend en paramètre une liste de dépendances. On part d'une file vide et de la liste de dépendances et on y applique add_no_dep pour obtenir la file et la liste de dépendances initiales. On applique alors order_aux à celles-ci.
fold pour afficher l'état de la file à chaque appel récursif à order_aux.