• Aucun résultat trouvé

Principes de Programmation TD1

N/A
N/A
Protected

Academic year: 2022

Partager "Principes de Programmation TD1"

Copied!
3
0
0

Texte intégral

(1)

Principes de Programmation TD1

11 février 2019

Exercice 1 (Fold).

Les fonctions foldl et foldr sont définies sur les listes comme suit :

foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ x [] = x

foldr f x (y:l) = f y (foldr f x l)

foldl :: (b -> a -> b) -> b -> [a] -> b foldl _ x [] = x

foldl f x (y:l) = foldl f (f x y) l

1. Que calculent les programmes suivant :

1

sum :: [Int] -> Int

sum l = foldl (+) 0 l

calculatrice :: Int

calculatrice = foldr (\f x -> f x) 16 [(-9),(*9),(-3)]

calculatriceL :: Int

calculatriceL = foldl (\x f -> f x) 16 [(-9),(*9),(-3)]

2. Quelle est la diférence entre foldl et foldr ? 3. Prouvez que pour toute liste finie on a l’égalité :

foldl (+) x l ~= foldr (+) x l

4. Prouvez que la traduction suivante est correcte.

foldr’ f x l = foldl (\g z -> g . (f z)) id l x

5. (Bonus) Prouvez que la traduction suivante de foldl à partire de foldr est correcte.

foldl’ f x l = foldr (\x g y -> g (f y x)) id l z

1. L’opérateur (++) : : [a]->[a]->[a] est la concaténation de listes et l’opérateur ($) :: (a->b)->a->b est l’application.

1

(2)

Exercice 2 (Bind (Bonus)).

L’operateur =<< et la fonction foldlM sont définis sur les listes comme suit :

(=<<) :: (a -> [b]) -> [a] -> [b]

_ =<< [] = []

f =<< (x:l) = (f x) ++ (f =<< l)

foldlM :: (b -> a -> [b]) -> b -> [a] -> [b]

foldlM f x [] = [x]

foldlM f x (y:l) = (\u -> foldM f u l) =<< (f x y)

1. Que calculent les programmes suivant : sansCarres :: [Int]

sansCarres = (\n-> [((exp n 2) +1)..((exp (n+1) 2) -1)]) =<< [1..]

concat :: [[a]] -> [a]

concat = id =<<

2. Ecrivez (=<<) à l’aide de foldl.

3. Prouvez votre traduction.

4. Que font les programmes suivant : parties :: [a] -> [[a]]

parties = foldlM (\l x -> [x:l,l]) []

insertions :: a -> [a] -> [[a]]

insertions x (y:l) = (x:y:l): (map (y:) (insert x l)) insertions x [] = [x]

shufle :: [a] -> [[a]]

shufles = foldM (\l x -> insertions x l) []

5. Ecrivez foldM à l’aide de (=<<) et foldl.

6. Prouvez votre traduction.

7. Que font les programmes suivant :

evalNDaux :: String -> EtatND -> Bool evalNDaux [] (NoeudND b f) = b

evalNDaux (c:w) (NoeudND _ f) = evalND w (f c)

evalND :: String -> AutomateND -> Bool evalND w a = forall (map (evalNDaux w) a)

evalAPNDaux :: String -> EtatAPND a -> [a]

evalAPNDaux [] (NoeudAPND l f) = l

evalAPNDaux (c:w) (NoeudAPND _ f) = evalAPND w (f c)

2

(3)

evalAPND :: String -> ArbrePrefND a -> [a]

evalAPND w = (evalAPNDaux w) =<<

où l’arbre préfix non-déterministe ArbrePrefND sera définit dans un pro- chain TP

data EtatAPND a = NoeudAPND [a] (Char -> NoeudAPND a) type ArbrePrefND = [EtatAPND]

8. Définissez evalND à l’aide de =<<.

3

Références

Documents relatifs

– Vous devez soumettre l’implémentation de la phase intégré dans le code choisi sur le serveur de dépôt du projet.. (Ne s’applique pas à la

(?) une fonction d’insertion d’un intervalle : on dispose de deux entier (début et fin de l’intervalle) et on doit insérer tous les éléments dans cet intervalle, de

Polymorphisme Les ABRI que l’on a fait ne sont définis que sur les entiers, mais on peut les définir sur n’importe quel type a qui dispose d’un ordre discret (avec prédécesseur

En vous inspirant de la correction du TP2, écrire une version non déter- ministe AutomateFiniND du type des automates finis ; on doit pouvoir représenter plusieurs transitions depuis

Attention, cette nouvelle fonction de reconnaissance n’est vraiment efficace que si on a accès à plus de coeur de calcul qu’il n’y a d’état dans l’automate... (en pratique un

Les automates backtraquants sont des auto- mates qui peuvent revenir en arrière s’ils se sont trompés ; cela veut dire qu’à chaque transition il peuvent :.. — renvoyer une

Celà est due au fait que le projet est ou bien trop avancé ou bien pas assez : on peut s’arrêter à la phase 4 avec des jolies automates UTF8 et implémenter un Grep UTF8 avec, ou

qui utilise un arbre préfixes pour lire une phrase, rendant une liste des élé- ments (de types a) ; en effet, puisque les clefs sont des préfixes, une phrase ne peut être