Universit´e de Provence
M1 Informatique- Logique, D´eduction, Programmation 2008 – 2009
TD 5
Solange Coupet-Grimal
S´emantique op´erationnelle et points fixes
On se donne, `a partir de l’environnement initial Caml E0, les efinitions suivantes:
let a =3;;
let rec liste = fun n -> if n = 0 then [] else a::(liste (n-1));;
let a = 1;;
1. Donner l’´etat de l’environnement courant apr`es chaque d´efinition.
2. ecrire avec pr´ecision chaque ´etape de l’´evaluation de liste (a+a) dans le dernier environ-
nement obtenu `a la question pr´ec´edente.
3. Quelle est la eponse affich´ee par Caml apr`es:
let resultat() = liste (a+a);;
puis apr`es : resultat;; puis enfin apr`es : resultat();;
4. efinir une fonctionnelle Fdont liste est point fixe.
5. Reprogrammer liste comme point fixe de F.
6. ecrire les ´etapes de l’´evaluation de liste (a+a) avec cette nouvelle d´efinition.
Aspects Imp´eratifs
Question 1 Ecrire une fonction qui imprime `a l’´ecran une liste d’entiers, s´epar´es par une virgule
suivie d’un caract`ere blanc. Plus pr´ecis´ement on devra obtenir:
#print_list [12; 187; 0];;
12, 187, 0
- : unit = ()
Question 2 Ecrire une fonction qui imprime `a l’´ecran une matrice d’entiers, repr´esent´ee sous
forme de listes de listes. On ´ecrira deux fonctions, produisant les effets suivants:
print_matrice [[1;23;251]; [12;4; 975]; [4321; 11; 0]; [0;0;0]];;
1 23 251
12 4 975
4321 11 0
0 0 0
- : unit = ()
print_matrice’ [[1;23;251]; [12;4; 975]; [4321; 11; 0]; [0;0;0]];;
1 23 251
12 4 975
4321 11 0
0 0 0
- : unit = ()
Termes Formels
On consid`ere dans cet exercice le type tree des arbres quelconques d´efini par:
type ’a tree = Tr of ’a* ’a tree list;;
On s’ineresse, dans un premier temps, `a des expressions efinies par un type ecursif simple,
dont les constructeurs s’appliquent sur un certain nombre d’arguments du mˆeme type. Le type ty
suivant en est un exemple:
type ty = A | B of ty | C of ty*ty;;
Question 1 Ecrire la fonction tree of ty qui calcule l’arbre syntaxique d’une expression de type
ty. Par exemple, on devra obtenir l’´evaluation suivante:
#tree_of_ty (C(B(C(A, A)), B(A)));;
- : string tree =
Tr
("C",
[Tr ("B", [Tr ("C", [Tr ("A", []); Tr ("A", [])])]);
Tr ("B", [Tr ("A", [])])])
R´eciproquement, on se propose de d´eterminer si un arbre donn´e est, ou n’est pas, l’arbre syntaxique
d’une expression d’un certain type ecursif simple. Il faut en particulier v´erifier si le nombre de fils
d’un noeud correspond bien `a l’arit´e de l’´etiquette. Pour cela on se donne une liste de signatures,
qui indique le nombre d’arguments de chaque constructeur. Avec l’exemple du type ty, la liste des
signatures est la suivante:
#let sig1=[("A",0);("B",1);("C",2)];;
sig1 : (string * int) list = ["A", 0; "B", 1; "C", 2]
De fa¸con g´en´erale, une signature pour un type r´ecursif simple sera du type a*int list.
Question 2 Ecrire une fonction arity qui ´etant donn´e un constructeur et une liste de signatures,
permet de rechercher l’arit´e d’un constructeur. Si le constructeur ne figure pas dans la liste, on
devra lever une exception Sig error que l’on aura d´efinie au pr´ealable.
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 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.
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !