TP noté de
Programmation Fonctionnelle


            Durée : 1h30

Avant de commencer, taper les
commandes unix suivantes :

$ chmod 700 .

$ mkdir TPNOTE

$ cd TPNOTE

Pour rendre votre copie :

mettre le fichier .ml
dans le répertoire courant (TPNOTE)

puis taper la commande :

$ /tmp/rendrecopie.sh

1)       Dans ce TP, on appelle "mot", une liste de caractères (de type char list)
dont tous les caractères sont des lettres de l'alphabet.

Ex.  ['E';'X';'E';'R';'C';'I';'C';'E'] est un mot.

Définir une fonction adjoint qui, étant données une lettre l et une liste de mots ms,
retourne la liste obtenue à partir de ms en ajoutant la lettre l au début de chaque mot.

Ex.  adjoint 'A' [['B';'C'];['T';'O';'U';'T']];;
     - : char list list =
[['A';'B';'C'];['A';'T';'O';'U';'T']]


2)       Dans la suite, on appelle "motif" une liste de caractères où chaque caractère est
soit une lettre, soit le caractère '?'.

On dira qu'un mot m a le motif p si et seulement si m peut être obtenu à partir de p
en remplaçant le caractère '?' par une lettre.

Ex.  ['A';'C';'C';'T';'G';'A'] a le motif ['?';'C';'C';'?';'G';'A'].
                (en remplaçant le premier '?' par la lettre 'A' et le deuxième '?' par 'T').

Définir une fonction filtre qui, étant donnés un motif p et un mot m,
détermine si m a le motif p.

Ex.  filtre ['A';'C';'C';'T';'G';'A'] ['?';'C';'C';'?';'G';'A'];;
          - : bool = true

3)      Définir une fonction extrait qui, étant donné un mot m et un entier naturel n,
retourne la liste de tous les "sous-mots" de m d'au plus n caractères.

Un sous-mot d'un mot m est un mot obtenu à partir de m en otant zéro, un ou plusieurs caractères.
(dans un sous-mot d'un mot m, les caractères sont dans le même ordre que dans m).

Ex.  extrait ['A';'B';'C';'D'] 2;;
          - : char list list = [[]; ['D']; ['C']; ['C'; 'D']; ['B']; ['B'; 'D'];
          ['B'; 'C']; ['A'];
['A'; 'D']; ['A'; 'C']; ['A'; 'B']]


Indication:
Les sous-mots en résultat de la fonction sont de deux catégories :
- ceux qui contiennent la première lettre :
  [['A']; ['A';'D']; ['A';'C']; ['A';'B']]
- ceux qui ne contiennent pas la première lettre :   
  [[]; ['D']; ['C']; ['C';'D']; ['B']; ['B';'D']; ['B';'C']]