• Aucun résultat trouvé

S´erie d’exercices #2 IFT-2035 September 14, 2021

N/A
N/A
Protected

Academic year: 2022

Partager "S´erie d’exercices #2 IFT-2035 September 14, 2021"

Copied!
3
0
0

Texte intégral

(1)

S´erie d’exercices #2

IFT-2035 September 14, 2021

2.1 Grammaire micro-JS

Voici un exemple de programme dans un langage similaire `a Javascript:

var ackermann = function (m, n) { if (m == 0) {

return n + 1;

} else if (n == 0) {

return ackermann (m - 1, 1);

} else {

return ackermann (m - 1, ackermann (m , n - 1));

} };

print (ackermann (2, 2));

Voici une partie de la grammaire du langage en notation EBNF:

<program> ::= <instr>

<instr> ::= <expr> ";"

| <instr> <instr>

<expr> ::= "function" "(" <formals> ")" "{" <instr> "}"

| <expr> "==" <expr>

| <identifier> "(" <actuals> ")"

<formals> ::=

| <identifier> { "," <identifier> }

<actuals> ::= | <expr>

Compl´eter la grammaire pour qu’elle accepte le programme.

1

(2)

2.2 Filtrer des ´ el´ ements

Compl´eter la fonction less qui filtre les ´el´ements d’une liste pour n’en garder que les ´el´ements plus petits qu’une valeur seuila:

less ::Int→[Int]→[Int]

lessk . . .=. . .

less7 [1,7,2,5,9,3,10] [1,2,5,3]

Dans chacun des cas suivants, d´ecrire la valeur retourn´ee par l’expression et expliquer comment elle est calcul´ee (i.e. montrer les ´etapes de l’´evaluation).

1. less5 []

2. less5 [4,5,6]

3. less5 [7,3,6,2]

aLa notatione e0 s’utilise pour indique que l’expressionepeut ˆetre r´eduite `ae0 en un nombre non-sp´ecifi´e deβ-r´eductions

2.3 Quicksort

Implanter en Haskell une variante de quicksort pour des listes d’entiers. En clair, trier une liste comme suit:

1. choisir un ´el´ement, que l’on nommera le pivot.

2. partitionner la liste en deux sous-listes d’´el´ements plus petits resp. plus grands que le pivot.

3. trier les deux sous-listes.

4. combiner ces sous-listes tri´ees et le pivot en une liste tri´ee.

Le type sera: quicksort:: [Int]→[Int].

Il faudra peut-ˆetre d´efinir une ou plusieurs fonctions auxiliaires.

L’op´eration de concat´enation de deux listes s’´ecrit ++ en Haskell:

[1,2] ++ [4,5,6] ≡ (++) [1,2] [4,5,6] [1,2,4,5,6]

Finalement, g´en´eraliser la fonction de tri pr´ec´edente pour pouvoir l’appliquer

`

a des listes quelconques (pas seulement [Int]), en passant un argument suppl´ementaire qui indique l’op´eration de comparaison `a utiliser.

Donner aussi le type de cette fonction plus g´en´erale et de toutes les fonctions auxiliaires que vous avez d´efinies.

2.4 Micro optimizer

Soit le code Haskell ci-dessous:

2

(3)

data Exp = Enum Int -- Une constante

| Eplus Exp Exp -- e1 + e2

| Etimes Exp Exp -- e1 * e2 optimize :: Exp -> Exp

Expest un type qui repr´esente des expressions simples incluant uniquement des op´erateurs arithm´etiques. ´Ecrire la fonctionoptimizequi va essayer de simplifier une expression en ´eliminanttoutes les multiplications par 1 et 0, ainsi que les additions `a 0.

3

Références

Documents relatifs

Cette grammaire est récursive à gauche, ce qui pose problème pour cer- taines techniques d'analyse syntaxique : En eet, dans un parseur avec analyse descendante (top down), la

´ Ecrire la fonction optimize qui va essayer de simplifier une expression en ´ eliminant toutes les multiplications par 1 et 0, ainsi que les additions ` a

Comme d’habitude, vous pouvez pr´ esumer que toutes les entit´ es num´ eriques sont de type

Ces fonctions prennent deux arguments qui sont pass´ es de mani` ere

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

Ajouter un constructeur d’expression Elambda, un constructeur de valeur correspondante Vlambda, ainsi que les cas pour g´ erer ces con- structeurs dans

Comment faut-il changer ce code pour que l’´ evaluateur reproduise les r` egles de port´ ee utilis´ ees par le langage Haskell (i.e. que votre ´ evaluateur implante la port´

Votre première tâche sera d'écrire une fonction s2l qui va éliminer le sucre syntaxique, c'est à dire faire l'expansion des formes de gauche (présumément plus pratiques pour