TP n o 7 : Types récursifs et arbres

Documents pareils
modules & compilation

Classes et Objets en Ocaml.

Recherche dans un tableau

Présentation du langage et premières fonctions

Algorithmique et Programmation, IMA

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

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

Cours de Programmation 2

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

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

TP 1. Prise en main du langage Python

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

Programme Compte bancaire (code)

# 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>

TP1 : Initiation à Java et Eclipse

Compression de Données - Algorithme de Huffman Document de Conception

L exclusion mutuelle distribuée

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

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

Consigne : je remplis le tableau en tenant compte des informations de la ligne supérieure et de la colonne de gauche (droite pour les gauchers)

Probabilités. I Petits rappels sur le vocabulaire des ensembles 2 I.1 Définitions... 2 I.2 Propriétés... 2

Introduction à l algorithmique et à la programmation M1102 CM n 3

UE Programmation Impérative Licence 2ème Année

Le menu du jour, un outil au service de la mise en mémoire

Dossier exclusif : le grand test de la NB4 LE GRAND TEST DE LA NEUF BOX 4

Cours 1: Java et les objets

TP : Gestion d une image au format PGM

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

Table des matières. Introduction

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Cours 1 : Qu est-ce que la programmation?

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

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

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

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)

Plus petit, plus grand, ranger et comparer

Quelques éléments de compilation en C et makefiles

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

Conventions d écriture et outils de mise au point

Les arbres binaires de recherche

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Le match par quatre en

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

BAREME sur 40 points. Informatique - session 2 - Master de psychologie 2006/2007

Les structures de données. Rajae El Ouazzani

Maple: premiers calculs et premières applications

Publipostage et étiquettes

Chap III : Les tableaux

Les chaînes de caractères

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

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

Ni tout noir, ni tout blanc Consignes Thème I - Observer

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

PHP. PHP et bases de données

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte


Résolution du Problème du Voyageur de Commerce Métaheuristique

Exercices de dénombrement

L informatique en BCPST

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

Olivier Mondet

1 Introduction et installation

Fiche pédagogique : ma famille et moi

PROJET ALGORITHMIQUE ET PROGRAMMATION II

COMMUNICATION TECHNIQUE N TCV060 Ed. 01. OmniVista 4760 Nb de pages : 18 Date : URGENTE NON URGENTE TEMPORAIRE DEFINITIVE

Initiation à la Programmation en Logique avec SISCtus Prolog

TP, première séquence d exercices.

Fiche d animation n 1 : Pêle-mêle

NF26 Data warehouse et Outils Décisionnels Printemps 2010

Rappels Entrées -Sorties

Plan. École Supérieure d Économie Électronique. Plan. Chap 9: Composants et systèmes de sécurité. Rhouma Rhouma. 21 Juillet 2014

Plateforme PAYZEN. Définition de Web-services

Programmation C. Apprendre à développer des programmes simples dans le langage C

Mon aide mémoire traitement de texte (Microsoft Word)

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Aide - mémoire gnuplot 4.0

Structurer ses données : les tableaux. Introduction à la programmation

Les couleurs. Un peintre distrait a oublié les noms des couleurs de sa palette : tu peux l aider à reconstituer l ordre correct (de gauche à droite)?

Java Licence Professionnelle CISII,

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

CRÉER UN COURS EN LIGNE

ALGORITHMIQUE ET PROGRAMMATION En C

Chapitre 2 Devine mon nombre!

Microsoft Excel Présentation du tableur Excel

S initier aux probabilités simples «Question de chance!»

Faites connaissance avec votre Rubik s Cube Étape 1

Solutions du chapitre 4


Arbres binaires de recherche

De la tablette d'argile à la tablette tactile

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Transcription:

TP n o 7 : Types récursifs et arbres Pour sauver un arbre, mangez un castor Henri Prades 1 Types sommes en CAML Nous avons rencontré les types de base en CAML (unit, bool, int, float, char, string) ainsi que des types prédéfinis pour des structures de données ( a list, a ref, a vect). En CAML, on a également la possibilité de définir nos propres types personnalisés. 1.1 Types sommes Imaginons par exemple que nous souhaitions ajouter aux booléens vrai et faux une valeur qui permette de représenter l indécision. On peut alors définir un type : type trileen = Vrai Faux PeutEtre CAML nous répond Type trileen defined. La phrase type nom_du_type =... permet de définir un nouveau type. Le caractère se lit «ou» comme pour le filtrage ou pour les définitions par cas. Les constructeurs Vrai, Faux et PeutEtre sont alors définis et sont les (seules) valeurs possibles du type trileen. Vrai - : trileen = Vrai PeutEtre - : trileen = PeutEtre Faux = PeutEtre - : bool = false (* Booléen standard! *) http://carnot.cpge.info 1

On appelle un type défini de cette manière un type somme. Intuitivement on réalise effectivement une «somme» ou une union de constructeurs simples. Les noms de constructeurs commencent par une majuscule. Par convention, à respecter absolument, les noms de variables ou de fonctions ne doivent donc jamais commencer par une majuscule. Si prop est de type trileen, on réalise un filtrage pour agir selon les cas. Par exemple : (* Réalise le "non" en logique triléenne *) let non_trileen prop = match prop with Vrai -> Faux PeutEtre -> PeutEtre Faux -> Vrai non_trileen : trileen -> trileen = <fun> let prop = Vrai prop : trileen = Vrai non_trileen prop - : trileen = Faux CAML détecte automatiquement que tous les cas ont bien été considérés et renvoie un message d avertissement si ce n est pas le cas : let hesiter prop = match prop with Vrai -> PeutEtre Faux -> PeutEtre Warning: this matching is not exhaustive. C est un trait très puissant de CAML. Ne pas avoir traité tous les cas est détecté 1 avant même d exécuter le programme! QUESTION 1 Imaginer ce que peut être un «et» en logique triléenne et écrire une fonction et_trileen : trileen -> trileen -> trileen qui le réalise. 1.2 Constructeurs avec paramètres Jusqu ici les trois constructeurs étaient des constantes. On peut également définir des constructeurs paramétrés qui dépendent d un autre type avec la syntaxe NomConstructeur of un_type. Par exemple, on peut définir un jeu de cartes avec : type couleur = Pique Coeur Carreau Trefle 1. À condition de ne pas prendre la mauvaise habitude de systématiquement ajouter une clause _ ->... en fin de filtrage. http://carnot.cpge.info 2

type carte = Joker As of couleur Roi of couleur Dame of couleur Valet of couleur Nombre of int * couleur On peut alors définir des cartes avec la syntaxe NomConstructeur (expr : un_type) : let carte1 = As Pique carte1 : carte = As Pique let carte2 = Nombre (3, Carreau) carte2 : carte = Nombre (3, Carreau) QUESTION 2 Définir le roi de cœur, la dame de pique et le neuf de trèfle. QUESTION 3 Prévoir et expliquer ce que renvoient les expressions suivantes : carte1 = carte2 carte2 = (3, Carreau) Pique Joker As Nombre Une fois que l on a bien compris cela, la syntaxe pour créer une valeur avec un constructeur devient limpide! Cependant, un constructeur est plus qu une simple fonction : on peut faire un filtrage de motif. let est_carreau carte = match carte with Joker -> PeutEtre As Carreau -> Vrai Roi Carreau -> Vrai Dame Carreau -> Vrai Valet Carreau -> Vrai Nombre (_, Carreau) -> Vrai _ -> Faux est_carreau : carte -> trileen = <fun> QUESTION 4 Écrire une fonction est_figure : carte -> trileen qui indique si la carte reçue en entrée est une figure ou non. On pourrait, sans difficultés mais avec beaucoup de temps, programmer le jeu de belote. Par exemple pour compter les points à la fin de la partie on peut écrire : http://carnot.cpge.info 3

let valeur carte atout = match carte with Joker -> failwith "Carte impossible" Nombre (n, _) when n < 7 -> failwith "Carte impossible" As _ -> 11 Nombre (10, _) -> 10 Roi _ -> 4 Dame _ -> 3 Valet color when color = atout -> 20 Valet _ -> 2 Nombre (9, color) when color = atout -> 14 Nombre _ -> 0 QUESTION 5 À quoi peut servir le type suivant? type mixte = Reel of float Int of int QUESTION 6 Définir un type reel_etendu permettant de représenter la droite numérique achevée R = R {, + } et une fonction float -> reel_etendu qui permet de plonger R dans R. 1.3 Types récursifs Il est possible de définir des types récursifs, c est-à-dire dont leur définition fait appel à eux-même. Par exemple, on peut définir les couleurs par synthèse soustractive : type coloration = Cyan Magenta Jaune Melange of coloration * coloration QUESTION 7 Définir en CAML le rouge (mélange de magenta et de jaune) puis l orange (mélange de rouge et de jaune). QUESTION 8 Que fait la fonction suivante? http://carnot.cpge.info 4

let rec cmj color = match color with Cyan -> (1., 0., 0.) Magenta -> (0., 1., 0.) Jaune -> (0., 0., 1.) Melange (color1, color2) -> let c1, m1, j1 = cmj color1 in let c2, m2, j2 = cmj color2 in ((c1 +. c2) /. 2., (m1 +. m2) /. 2., (j1 +. j2) /. 2.) 2 Retour sur les listes On peut maintenant définir notre propre type CAML pour créer des listes chaînées. Une liste chaînée est soit la liste vide (Nil), soit une tête et une queue. 1 2 3 FIGURE 1 Une représentation possible de la liste [1; 2; 3]. On peut par exemple choisir le type CAML suivant : type a liste = Nil TeteEtQueue of a * a liste On a construit ici un type paramétré qui dépend d un type a. QUESTION 9 Définir avec ce type la liste [1; 2; 3], représentée sur la figure 1. On peut alors écrire une fonction cons : a -> a liste -> a liste et qui est l analogue de :: en notation postfixe : let cons tete queue = TeteEtQueue (tete, queue) QUESTION 10 Ajouter 0 en tête de la liste précédente. http://carnot.cpge.info 5

QUESTION 11 Écrire les fonctions tete : a liste -> a et queue : a liste -> a liste qui renvoient la tête et la queue d une liste si possible et un message d erreur sinon. QUESTION 12 Écrire la fonction taille : a liste -> int qui renvoie la longueur d une liste. On pourra, pour s entraîner, essayer de réécrire toutes les fonctions que nous avons vues jusqu ici sur les listes, avec ce type personnalisé. Bien entendu, nous continuerons principalement à utiliser les listes CAML, puisqu elles sont faites pour cela. 3 Arbres On peut voir les arbres comme une généralisation de la structure de liste. À une tête (que l on appelle plutôt nœud) on associe non pas une queue, mais deux (que l on appelle sous-arbres) : type a arbre = Vide Noeud of a * a arbre * a arbre 3 5 FIGURE 2 Un exemple d arbre avec deux nœuds. La racine d étiquette 3 possède deux sous-arbres : son fils gauche qui est un sous-arbre vide et son fils droit qui est un sous-arbre de taille 1 (une feuille), dont l étiquette est 5. Un arbre non vide est de la forme Noeud (etiquette, fils_gauche, fils_droit). Le nœud est appelée racine de l arbre (l analogue de la tête d une liste) et on dit alors que etiquette est l étiquette de ce nœud. Les sous-arbres fils_gauche et fils_droits sont respectivement le fils gauche et le fils droit de l arbre (l analogue de la queue de la liste, mais il y en a deux). On appelle feuille un nœud dont les deux fils sont des arbres vides. QUESTION 13 Définir en CAML l arbre représenté sur la figure 2. QUESTION 14 Écrire une fonction nb_noeuds : a arbre -> int qui renvoie le nombre de nœuds d un arbre (c est l analogue de la fonction list_length). QUESTION 15 Écrire une fonction nb_feuilles : a arbre -> int qui renvoie le nombre de feuilles d un arbre. http://carnot.cpge.info 6

QUESTION 16 Écrire une fonction imprime : int arbre -> unit qui imprime les étiquettes d un arbre, dans l ordre que vous voulez, mais une et une seule fois chacune. QUESTION 17 Écrire une fonction somme_etiquettes : int arbre -> int qui renvoie la somme des étiquettes des nœuds de l arbre. QUESTION 18 Écrire une fonction max_etiquettes : a arbre -> a qui renvoie la somme des étiquettes des nœuds de l arbre. QUESTION 19 Écrire une fonction somme_feuilles : int arbre -> int qui renvoie la somme des étiquettes de toutes les feuilles. QUESTION 20 Écrire une fonction max_min_arbre : int arbre -> int * int qui renvoie le minimum et le maximum des étiquettes d un arbre. QUESTION 21 Une branche est un chemin de la racine vers une feuille. Le poids d une branche est la somme des étiquettes des nœuds qui la composent. Écrire une fonction max_somme_branche : int arbre -> int qui renvoie le poids de la branche de poids maximal. http://carnot.cpge.info 7