Question 3 Ecrire une fonction correct qui ´etant donn´ee une liste de signatures et un arbre,
renvoie un bool´een indiquant s’il s’agit de l’arbre syntaxique d’une expression correcte.
On consid`ere maintenant le cas des types mutuellement r´ecursifs, comme par exemple les types:
#type ty1 = A|B of ty1*ty2 and ty2 = C|D of ty2*ty1;;
Type ty1 defined.
Type ty2 defined.
Question 4 Ecrire des fonctions tree of ty1 et tree of ty2 analogues `a la fonction tree of ty
de la question 1. On devra obtenir par exemple l’ex´ecution suivante:
#tree_of_ty1 (B(A,D(C,A)));;
- : string tree =
Tr ("B", [Tr ("A", []); Tr ("D", [Tr ("C", []); Tr ("A", [])])])
De tels types sont caract´eris´es par une liste de signatures, associant `a chaque constructeur son
type, et la liste des types des arguments. L’arit´e est inutile, ce n’est autre que la longueur de la
liste des types des arguments. Pour ty1 et ty2 on obtient:
#let sig2 = [("A",([],"ty1"));("B",(["ty1";"ty2"],"ty1"));("C",([],"ty2"));
("D",(["ty2";"ty1"],"ty2"))];;
sig2 : (string * (string list * string)) list = ...
Question 5 Ecrire une fonction get type qui ´etant donn´ee une liste de signatures et un construc-
teur renvoie la signature de ce constructeur en renvoyant ´eventuellement l’exception Sig error si
ce constructeur ne figure pas dans la liste.
Question 5 Ecrire une fonction typing qui ´etant donn´ee une liste de signatures et un arbre
renvoie le type de l’expression repr´esent´ee par l’arbre s’il est correct et une exception sinon. On
devra par exemple obtenir les ´evaluations suivantes:
#typing sig2 (Tr ("B", [Tr ("A", []); Tr ("D", [Tr ("C", []); Tr ("A", [])])]));;
- : string = "ty1"
#typing sig2 (Tr ("A", [Tr ("A", []); Tr ("D", [Tr ("C", []); Tr ("A", [])])]));;
Uncaught exception: Sig_error
Ici, le typage de ”A” n’est pas bon.
#typing sig2 (Tr ("E", [Tr ("A", []); Tr ("D", [Tr ("C", []); Tr ("A", [])])]));;
Uncaught exception: Sig_error
Ici, ”E” n’existe pas.
Question 6 Ecrire une fonction qui ´etant donn´ee une liste de signatures et une liste ld’arbres,
renvoie true si tous les arbres de la liste sont bien typ´es et false sinon.