AP1 - TP 5 - Manipulation d expressions arithmétiques

Documents pareils
# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Recherche dans un tableau

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Java Licence Professionnelle CISII,

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Classes et Objets en Ocaml.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours 1 : La compilation

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Algorithmique et Programmation, IMA

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Représentation d un entier en base b

STAGE IREM 0- Premiers pas en Python

Utilisation d objets : String et ArrayList

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

TP, première séquence d exercices.

TP 1. Prise en main du langage Python

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TD3: tableaux avancées, première classe et chaînes

Le prototype de la fonction main()

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Premiers Pas en Programmation Objet : les Classes et les Objets

Présentation du langage et premières fonctions

TP3 : Manipulation et implantation de systèmes de fichiers 1

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

ACTIVITÉ DE PROGRAMMATION

Cours d initiation à la programmation en C++ Johann Cuenin

INF 321 : mémento de la syntaxe de Java

OCL - Object Constraint Language

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Cours de Programmation 2

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

modules & compilation

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Cours de Systèmes d Exploitation

Solutions du chapitre 4

Cours 14 Les fichiers

Java 1.5 : principales nouveautés

Corrigé des exercices sur les références

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TP : Gestion d une image au format PGM

Chapitre 10. Les interfaces Comparable et Comparator 1

Maple: premiers calculs et premières applications

Chapitre 2. Classes et objets

Initiation à l algorithmique

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Tp 1 correction. Structures de données (IF2)

Plan. 1 Cycles de développement. 2 Méthodes agiles, principes généraux. 3 Comment se passe un Sprint?

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Architecture des ordinateurs

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

CM2 L architecture MIPS32

Principes des langages de programmation INF 321. Eric Goubault

Exercices sur les interfaces

Structures algébriques

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Arbres binaires de recherche

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Bases de programmation. Cours 5. Structurer les données

I. Introduction aux fonctions : les fonctions standards

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Conventions d écriture et outils de mise au point

Projet de programmation (IK3) : TP n 1 Correction

Flux de données Lecture/Ecriture Fichiers

UE C avancé cours 1: introduction et révisions

Cours d Algorithmique et de Langage C v 3.0

Fonctions de deux variables. Mai 2011

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Analyse de sécurité de logiciels système par typage statique

Chapitre I Notions de base et outils de travail

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Les structures. Chapitre 3

Master IMA - UMPC Paris 6 RDMM - Année Fiche de TP

Université Paris-Dauphine DUMI2E 1ère année, Applications

Les structures de données. Rajae El Ouazzani

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Utilitaires méconnus de StrataFrame

Plan du cours. Historique du langage Nouveautés de Java 7

Chapitre VI- La validation de la composition.

Algorithmique et programmation : les bases (VBA) Corrigé

Examen Médian - 1 heure 30

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Transcription:

AP1 - TP 5 - Manipulation d expressions arithmétiques Le langage des expressions arithmétiques (avec variables) a été défini en cours de la façon suivante : type expr = Var of string Nb of int Plus of expr * expr Mult of expr * expr;; 1. Représenter l expression x + 2y. Corrigé : Plus (Var "x", Mult (Nb 2, Var "y")) Elle est nommée ex dans la suite 2. Ecrire une fonction vars qui calcule la liste des noms des variables qui apparaissent dans une expression. La liste pourra être avec ou sans doublons. Par exemple vars (Plus (Var "x", Mult ("y", Nb 1))) retourne la liste ["x";"y"]. Corrigé : # (*interface vars type : expr -> string list args e tests : vars (Var "x") (résultat attendu = ["x"]) vars (Plus (Var "x", Mult (Var "y", Var "y"))) (résultat attendu = ["x";"y";" y"] ou dans un ordre ordre) vars (Nb 3) (résultat attendu []) let rec vars e = match e with Var x -> [x] Nb _ -> [] Plus(e1,e2) -> (vars e1) @ (vars e2) Mult(e1,e2) -> (vars e1) @ (vars e2);; val vars : expr -> string list = <fun> ou solution récursive terminale : #(*interface vars_aux type : string list -> expr -> string list args l e concaténée à la liste l let rec vars_aux l e = match e with Var x -> x::l Nb _ -> l Plus(e1,e2) -> (vars_aux (vars_aux l e1) e2) Mult(e1,e2) -> (vars_aux (vars_aux l e1) e2);; val vars_aux : string list -> expr -> string list = <fun> #(*interface vars type : expr -> string list 1

args e tests : vars (Var "x") (résultat attendu = ["x"]) vars (Plus (Var "x", Mult (Var "y", Var "y"))) (résultat attendu = ["x";"y";" y"] ou dans un ordre ordre) vars (Nb 3) (résultat attendu []) let vars = vars_aux [];; val vars : expr -> string list = <fun> Attention à la postcondition de vars aux est : vars aux l e = liste des variables de e concaténée avec l. 3. Ecrire une fonction evaluer qui évalue une expression. Cette fonction prend en argument un environnement qui associe des valeurs aux variables. Le calcul échouera si l une des variables n était pas valuée dans l environnement. On représentera un contexte par une liste d association c est-à-dire une liste de couples de la forme (nom de variable, valeur). Commencer par écrire la fonction assoc qui prend en paramètre un nom de variable et un environnement et retourne la valeur associée à cette varaible dans l environnement. Elle échouera si la variable n est pas présente dans l environnement. Par exemple assoc("x", [("y",4);("x",5)]) retourne la valeur 5. Mais assoc("z", [("y",4);("x",5)]) n est pas définie. Puis écrire la fonction évaluer. (*interface assoc arg (s,l) preconsition : s est le premier composant d un couple de l postcondition : retourne y tel que (s,y) apparteint à l raises : échoue avec le message "assoc : non trouve" si il n existe pas de couple (s, _) dans l tests : assoc (3, [(1,2) ; (3, 4) ; (5;6)] ) (résultat attendu = 4) assoc (2, [(1,2) ; (3, 4) ; (5;6)] ) (échec) let rec assoc (s,l) = match l with [] -> failwith "assoc : non trouve" (x,y)::r -> if s=x then y else assoc (s, r);; (*interface evalue type : expr * string*int list -> int arg e (une expression) c (un contexte) precondition : les varaibles de e sont toutes valuées dans c postcondition : retourne la valeur entière de e raises : échoue avec le message "assoc : non trouve" si une des variaables de e n est pas valuée dans c tests : tester avec une expression de chaque sorte et une expression où une variable au moins ne figure pas dans c let rec evalue (e,c) = match e with Nb n -> n Var s -> assoc (s, c) 2

Plus (e1,e2) -> (evalue (e1, c)) + (evalue (e2, c)) Mult (e1,e2) -> (evalue (e1, c)) * (evalue (e2, c));; 4. Ecrire la fonction simplifie qui simplifie une expression. Ces simplifications consistent à effectuer toute opération sur deux nombres et prennent en compte le fait que 0 est élément neutre pour l addition et élément absorbant pour la multiplication, et que 1 est élément neutre pour la multiplication. Ces simplifications sont bien sûr faites autant que faire se peut : par exemple, (3 2) x +(y 0) se simplifie en appliquant les remarques précédentes sur chaque sous-expression, en (1 x) + 0. La première sous-expression se simplifie encore en x, donnant l expression x + 0 qui se simplifie en x. (* interface simplifier type expr -> expr postcondition : simplifie au maximun l expresson e en appliquant les regles de l enoncé tests : passer au moins une fois partout let rec simplifier e = match e with (* Opérations sur deux nombres Plus (Nb n1, Nb n2) -> Nb (n1+n2) Mult (Nb n1, Nb n2) -> Nb (n1*n2) (* 0 neutre pour Plus Plus (Nb 0, e) -> simplifier e Plus (e, Nb 0) -> simplifier e (* 0 absorbant pour Mult Mult (Nb 0, _) Mult (_, Nb 0) -> Nb 0 (* 1 neutre pour Mult Mult (Nb 1, e) -> simplifier e Mult (e, Nb 1) -> simplifier e (* Simplification de sous-expressions: une simplification de l expression peut ^etre nécessaire après simplification des deux sous-expressions; pour éviter que la fonction ne boucle, on teste si au moins une des sous-expressions a été modifiée sinon on exécute exactement le m^eme appel à la fonction simplification et on boucle Plus (e1, e2) -> let e 1 = simplifier e1 and e 2 = simplifier e2 in if e 1 <> e1 e 2 <> e2 then simplifier (Plus (e 1, e 2)) else Plus (e 1, e 2) Mult (e1, e2) -> let e 1 = simplifier e1 and e 2 = simplifier e2 in if e 1 <> e1 e 2 <> e2 then simplifier (Mult (e 1, e 2)) else Mult (e 1, e 2) e -> e;; 5. Ecrire une fonction qui transforme l expression en une chaîne de caractères, i.e. une fonction de type expr -> string. Rappel : la fonction string of int transforme un entier en une chaîne de caractères. Mettez le minimum de parenthèses. 1ère solution : let rec string_of_expr e = match e with Nb n -> string_of_int n 3

Var s -> s Plus(e1,e2) -> (string_of_expr e1)^"+"^(string_of_expr e2) Mult(e1,e2) -> (string_of_expr e1)^"*"^(string_of_expr e2);; Ne convient pas car elle produit des expressions ambiguës. Ainsi string of expr (Mult (Plus (Var "x", Nb 3), Nb 5)) produit le résultat x+3*5. Est-ce l expression x+(3x5) ou l expression (x+3)x5? 2ème solution : paraenthéser chaque expression binaire. let ouv = "(" and ferm = ")";; let rec string_of_expr e = match e with Nb n -> string_of_int n Var s -> s Plus(e1,e2) -> ouv^(string_of_expr e1)^"+"^(string_of_expr e2)^ferm Mult(e1,e2) -> ouv^(string_of_expr e1)^"*"^(string_of_expr e2)^ferm;; # string_of_expr (Mult (Plus (Var "x", Nb 3), Nb 5));; - : string = "((x+3)*5)" C est correct mais laid. 3ème solution : on utilise les règles de priorités usuelles et on ne parenthèse que lorsque c est nécessaire. * est plus prioritaire que +. On pose priorité de + = 1 et priorité de * = 2. La fonction prio expr donne la priorité d une expression : par convention la priorité d une variable ou d une constante est 3 (la plus grande), la priorité d une expression où l opérateur principal est + est 1 et celle d une expression où l opérateur principal est * est 2. let prio_expr e = match e with Plus(_,_) -> 1 Mult(_,_) -> 2 _ -> 3;; let rec string_of_expr e = match e with Var s -> s Nb n -> string_of_int n Plus(e1,e2) -> let p = prio_expr e in (if prio_expr e1 <= p then ouv^(string_of_expr e1)^ferm else string_of_expr e1) ^"+"^ (if prio_expr e2 <= p then ouv^(string_of_expr e2)^ferm else string_of_expr e2) Mult(e1,e2) -> let p = prio_expr e in (if prio_expr e1 <= p then ouv^(string_of_expr e1)^ferm else string_of_expr e1) ^"*"^ (if prio_expr e2 <= p then ouv^(string_of_expr e2)^ferm 4

else string_of_expr e2);; # string_of_expr (Mult (Plus (Var "x", Nb 3), Nb 5));; - : string= "(x+3)*5" # string_of_expr (Plus (Var "x", Mult (Nb 3, Nb 5)));; - : string = "x+3*5" # string_of_expr (Plus (Var "x", Plus (Nb 3, Nb 5)));; - : string = "x+(3+5)" # string_of_expr (Mult (Var "x", Plus (Nb 3, Nb 5)));; - : string = "x*(3+5)" # string_of_expr (Plus (Mult (Var "x", Nb 3), Nb 5));; - : string = "x*3+5" On peut certes écrire la fonction d une autre façon mais la solution est ici la technique générale qui marche chaque fois qu un jeu d opérateurs avec priorité est utilisée. 5