Programmation Avancée

TP10: CDuce

Dans ce TP nous allons utiliser CDuce. La version précise n'a pas d'importance. Pour utiliser cduce, le plus rapide est de jouer en ligne avec le langage. Pour une utilisation plus confortable, vous pouvez installer l'interprète via opam install cduce. Dans tous les cas, il est recommandé d'avoir la documentation en ligne sous la main, notamment cet aide-mémoire.

Exercice 1: comparaisons de types

Pour chacune des paires de types suivantes, comparer les types: sont-ils égaux, inclus, disjoints? Dans tous les cas, justifier votre réponse par du code.

Exercice 2: conversion sexiste

On considère les définitions suivantes, où l'on décrit des personnes avec un attribut décrivant leur genre:

type Person   = FPerson | MPerson 
type FPerson  = <person gender = "F">[ Name Children ]
type MPerson  = <person gender = "M">[ Name Children ]
type Children = <children>[ Person* ]
type Name     = <name>[ PCDATA ]

Dans la variante suivante le genre est directement exprimé par le nom de l'élément utilisé, et les enfants sont rangés par ordre de galanterie:

type Man       = <man name=String>[ Daughters Sons ]
type Woman     = <woman name=String>[ Daughters Sons ]
type Sons      = <sons>[ Man* ]
type Daughters = <daughters>[ Woman* ]

Question

Ecrire une fonction qui convertisse du premier au second style, avec un type aussi précis que possible. On utilisera la capture de (sous-)séquences par pattern-matching.

On pourra tester sur l'exemple suivant:

let test : Person =
  <person gender="M">[
    <name>"Pierre"
    <children>[
       <person gender="M">[ <name>"Jacques" <children>[] ]
       <person gender="F">[
         <name>"Paule"
         <children>[
           <person gender="M">[ <name>"Jacob" <children>[] ]
         ]
       ]
    ]
  ]

let [] = dump_xml (conv test)

Exercice 3: c'est foo

On considère le code suivant, où S et T sont pour l'instant inconnus:

let foo (S -> T)
  | (l1 & [Any*], l2) -> (foo l1) @ (foo l2)
  | (e, l2) -> (e, foo l2)
  | [] -> []

Question 1

Que fait cette fonction?

Question 2

Instantier les types S et T de façon correcte et aussi précise que possible.

Question 3

On considère maintenant le type x = [] | [ 'a' x 'b' ], que peut-on dire de l'ensemble des résultats de foo sur les valeurs de x? ceci peut-il s'exprimer comme un type?

Exercice 4: les membres du LSV

Le fichier lsv.html contient une version (très rapidement) nettoyée de la page des membres du LSV. La fonction load_xml permet de la charger en tant que valeur CDuce. Comme il ne s'agit pas de HTML valide on n'essaiera pas de la typer mieux que AnyXml.

Question 1

Ecrire une fonction persons qui analyse la page et extrait les balises td ayant pour attribut itemtype="http://schema.org/Person", avec leur contenu.

Question 3

Calculer la liste des enseignants-chercheurs parmi les membres du labo, i.e. ceux pour lequel le jobTitle contient professor, éventuellement avec un p majuscule.

Question 4

Chaque description de personne contient l'URL d'une photo. L'utiliser pour produire un trombinoscope des enseignants-chercheurs du labo. Pour faire cela dans les règles de l'art, récupérer le fichier xhtml1-strict.cd qui contient les définitions de type correspondant à la DTD du XHTML 1.1 strict, et produire votre page sous la forme d'une valeur de type html qui sera ensuite sérialisés par dump_xml en un fichier XML valide par construction.