S´erie d’exercices #4
IFT-2035
4.1 Renommage α
Soit le code ci-dessous qui est ´ecrit en Haskell et utilise donc la port´ee lexicale:
λx -> λy ->
let f = λx -> x + 2 in let g x = λg -> f (g x) in let g (x, f) = f x
in λf -> g (x, f)
Renommer toutes les variables (e.g. en y ajoutant un 0, 1, 2, ...) pour que chaque variable ait un nom diff´erent des autres. Bien sˆur ce renommage ne doit pas changer la s´emantique du code.
4.2 Structure de donn´ ees fonctionelle
Soit le type suivant en Haskell qui d´efinit un arbre binaire que l’on peut utiliser pour repr´esenter une table associative (qui associe des cl´es de type Int `a des valeurs de typeβ):
data TreeMap b = Empty | Node Int b (TreeMap b) (TreeMap b) L’exercice est de d´efinir les op´erations typiques sur une telle structure de donn´ee.
Bien sˆur, pour ˆetre utile l’arbre doit ˆetre maintenu dans l’ordre: toutes les cl´es dans la branche de gauche d’un Node doivent ˆetre plus petites que la cl´e du noeud, et vice versa pour la branche de droite.
Il y a trois op´erations:
tmLookup: rechercher la valeur associ´ee `a une cl´e pass´ee en param`etre.
tmInsert: ajouter une entr´ee (donn´ee sous la forme d’une cl´e et de sa valeur) dans la table.
tmRemove: enlever une entr´ee (dont la cl´e est pass´ee en param`etre).
Ces fonctions doivent ˆetre totales (elles terminent toujours et ne doivent jamais signaler d’erreur).
1. Donner le type de ces trois fonctions.
1
2. Donner une liste, aussi concise et compl`ete que possible, d’axiomes formels auxquels ces op´erations doivent ob´eir. E.g. un de ces axiomes formalisera le fait qu’un tmLookup d’une cl´e xjuste apr`es un tmInsert de la mˆeme cl´e avec une valeurv devrait trouverv. La forme exacte d´ependra de vos choix au point 1, mais cela pourrait ressembler `a:
∀x, .., v. tmLookup (tmInsert .. x v).. x = v
3. Donner le code des trois fonctions.
Pour rendre l’exercice plus utile, il est important de faire ces ´etapes dans l’ordre:
i.e. ne pas ´ecrire le code avant d’avoir d´ecid´e du type des fonctions et de leurs sp´ecifications.
4.3 Tracer la port´ ee
Soit le code suivant dans un langage hypoth´etique dont la syntaxe est la mˆeme que celle de Haskell:
letx= 2
f1 y=z+x+y f2 x=f1 (x+ 1) f3 z=f2 (z+ 2) in f3 5
Montrer les ´etapes de l’´evaluation dans chacun des deux cas: le cas o`u le langage utilise la port´ee dynamique et le cas o`u il utilise la port´ee statique. De mˆeme avec l’exemple suivant:
letm f [] = []
m f (x:xs) =f x:m f xs i= 4
in m(λx→x+i) [2,3]
Utiliser une notation bas´ee sur des environnements d´enot´es {x17→v1, x27→v2, ...}.
2