\documentclass[10pt]{tpcaml}

\tp{9}{Cadavre(s) délicieux\\}

\usepackage{listings}
\lstset{language={Caml},basicstyle=\small}

\newenvironment{source}
  {\tt\small\begin{tabbing}%
  \hspace{10pt}\=\hspace{10pt}\=\hspace{10pt}\=\hspace{10pt}\=\hspace{10pt}\=\hspace{10pt}\=\\%
  %
  }
  {\end{tabbing}}

\renewcommand{\code}[1]{\lstinline{#1}}

\begin{document}

  \maketitle

  % \section{Programmation dynamique : distance de Hamilton}

  
  % \begin{question}
  %   En vous servant des méthodes de programmation dynamique décrites la
  %   semaine dernière, écrire une solution au problème suivant.
  
  %   \emph{Distance de Levenshtein : } étant donné deux chaînes de
  %   caractère \code{s1} et \code{s2}, calculer le nombre d'opérations
  %   nécessaires pour passer de \code{s1} à \code{s2}, parmi les
  %   opérations suivantes :
  %   \begin{itemize}
  %   \item effacer un des caractères de \code{s1}
  %   \item insérer un caractère de \code{s2} dans \code{s1}
  %   \item remplacer un caractère de \code{s1} par un caractère de \code{s2}
  %   \end{itemize}
  % \end{question}
  

  \section{Cadavre exquis : structure de la phrase}

  Connaissez-vous le jeu du cadavre exquis ? Il peut vous sauver la
  vie pendant certains cours traînant un peu en longueur, mais cela
  demande de la discrétion car il faut plusieurs participants. Pour
  éviter de vous faire surpendre pendant le passage de mains en mains
  de la précieuse feuille, vous pouvez décider de jouer seul, avec
  votre ordinateur. C'est ce que vous allez (devoir) faire maintenant.

  \vspace{12pt}

  La première approche, qui consiste à choisir des mots au hasard les
  uns à la suite des autres, ne produit pas des phrases ressemblant
  à du français. On va commencer par se fixer une structure
  grammaticalement correcte.

  Dans cette partie, on cherche à produire au hasard une liste du
  genre \code{[Nom; Verbe; Nom; Adjectif]} décrivant la nature des
  mots de la phrase. Il n'y aura plus, ensuite, qu'à remplacer chaque
  nature par un mot convenable pour obtenir une phrase
  grammaticalement correcte (ou presque). Pour prendre en compte les
  accords entre les différents mots (ici le dernier Nom et son
  Adjectif doivent être accordés), on stocke aussi les informations de
  genre et de nombre.\\

  Voici le type \caml{} qui sera utilisé pour représenter les
  natures. Recopiez-le dans votre code sans changer les noms ni mettre
  de minuscules, ce sera important ensuite. Pensez à mettre votre code
  dans un éditeur de texte (WordPad ou le bloc note, mais pas Word)
  à part, plutôt que directement dans CamlWin où il est difficile
  à récuperer et modifier ensuite, ce dont vous aurez sans doute
  besoin aujourd'hui.

  \begin{lstlisting}
    type genre = Masc | Fem ;;
    type nombre = Sing | Plur ;;

    type nature =
      | Nom of (genre * nombre)
      | Verbe of nombre
      | Adjectif of (genre * nombre)
      | Mot of string ;;
  \end{lstlisting}

  \vspace{6pt}

  \begin{question}
    Écrire des fonctions \code{choisir\_nombre : unit -> nombre} et
    \code{choisir\_genre : unit -> genre} qui choisissent un nombre et
    un genre au hasard. On pourra\footnote{On devra} pour cela écrire
    et utiliser une fonction \code{choisir : 'a vect -> 'a}
    choisissant au hasard un élément d'un tableau.
  \end{question}

  \vspace{6pt}

  \begin{question}
    Écrire une fonction \code{gn : (genre * nombre) -> nature list}
    générant un groupe nominal, c'est-à-dire un nom suivi avec une
    probabilité de 0.3 par un adjectif, respectant les accords (genre
    et nombre) donnés en paramètres.
  \end{question}

  \vspace{6pt}

  \begin{question}
    Écrire une fonction \code{structure_phrase : unit -> nature list}
    qui génère une phrase complète selon le schéma ``Sujet - Verbe -
    COD''. Attention à l'accord sujet-verbe.
  \end{question}

  \section{Mots au hasard}

  Pour passer d'une structure à une phrase complète, il faut remplacer
  chaque nature par un mot qui convient. On utilisera dans cette
  partie l'approche la plus simple possible : une table qui associe
  à chaque nature un tableau de mots (par exemple \code{Nom (Masc,
    Sing) -> [| "eleve" ; "retardataire" |]}).

  \vspace{6pt}

  \begin{question}
    Écrire une fonction \code{table_mots : nature -> string array}
    qui associe à chaque nature un tableau de mots (de la bonne
    nature). C'est à vous de choisir son contenu, essayez d'avoir
    environ 5 à 10 mots par nature.
  \end{question}

  \vspace{6pt}

  \begin{question}
    Écrire une fonction \code{remplir_mot : nature -> string} qui
    choisit un mot de la bonne nature dans la table.
    
    Adapter \code{remplir_mot} pour ajouter devant les noms un article
    convenablement accordé, en utilisant une fonction auxiliaire
    \code{choisir_article : string -> (genre * nombre) -> string} qui
    prend en paramètre le nom et son accord.
  \end{question}

  \vspace{6pt}

  \begin{question}
    Écrire une fonction \code{phrase_hasard () : unit -> unit} qui
    génère une phrase aléatoire (en utilisant \code{structure_phrase}
    et \code{remplir_mot}) et l'affiche.
  \end{question}


  \section{Prolongation}
  
  En utilisant le constructeur \code{Mot} du type \code{nature}, on
  peut imposer une partie de la structure de la phrase (en rajoutant
  par exemple ``qui'', ``quand'' ou ``avec'' directement dans la
  structure).

  \vspace{6pt}

  \begin{question}
    Écrire une nouvelle fonction \code{structure_phrase} qui ajoute
    une subordonnée relative ``qui'' au groupe nominal
    sujet. L'adapter pour que tous les groupes nominaux générés
    ajoutent des relatives avec une probabilité de 0.3.
  \end{question}

  \vspace{6pt}
  
  \begin{question}
    Mettre en place d'autres structures de votre choix (phrases
    interrogatives, compléments circonstanciels...) et tester les
    phrases générées.
  \end{question}

  \vspace{6pt}
  
  \begin{question}
    Adaptez votre code pour produire des phrases en anglais.
  \end{question}
\end{document}
