26/10/2004 P. Van Roy, InfoT4, S6 1 Informatique T4 (FSAC1450) Récursion sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL

Slides:



Advertisements
Présentations similaires
Fonctions & procédures
Advertisements

Calculs de complexité d'algorithmes
INTRODUCTION.
8. Les tableaux P. Costamagna – ISEN N1.
CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme.
Chapitre IV. Structures linéaires (piles, files, listes chaînées)
FSAB1402: Informatique 2 Techniques de Programmation Orientée Objet
18/10/2004 P. Van Roy, InfoT4, S5 1 Informatique T4 Solutions au Test du 18 octobre Peter Van Roy Département dIngénierie Informatique, UCL
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
OCaml - Les listes L3 MI.
Calcul et programmation au lycée avec Scilab
Récursivité.
12/10/2004 P. Van Roy, InfoT4, S4 1 Informatique T4 (FSAC1450) Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique, UCL
Démarche de résolution de problèmes
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 La Concurrence Déclarative Peter Van Roy Département dIngénierie Informatique, UCL
Calcul Relationnel Chapitre 4, Section 4.3.
Programmation fonctionnelle Le langage LISP
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Sémantique Formelle Peter Van Roy Département dIngénierie Informatique, UCL
© 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 LEtat et lAbstraction de Données Peter Van Roy Département dIngénierie Informatique,
© 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Algorithmes sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
2/11/2004 P. Van Roy, InfoT4, S7 1 Informatique T4 (FSAC1450) Sémantique Peter Van Roy Département dIngénierie Informatique, UCL
© 2007 P. Van Roy. All rights reserved. 1 FSAB 1402: Informatique 2 Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique, UCL
LINF1251: Concurrence et Systèmes Multi-Agents
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
IFT Complexité et NP-complétude
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Récursion sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Enregistrements et Arbres Peter Van Roy Département dIngénierie Informatique, UCL
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Programmer avec des Types Abstraits Peter Van Roy Département dIngénierie Informatique,
FSAB1402: Informatique 2 L’État et l’Abstraction de Données
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Programmer avec lEtat Peter Van Roy Département dIngénierie Informatique, UCL
P. Van Roy, LINF LINF1251: Algorithmes sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
© 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Enregistrements et Arbres Peter Van Roy Département dIngénierie Informatique, UCL
29/9/2005 © 2005 P. Van Roy. All rights reserved. 1 FSAB 1402: Informatique 2 Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique,
Peter Van Roy Département d’Ingénierie Informatique, UCL
P. Van Roy, LINF1251 LINF1251: Le Langage Java Peter Van Roy Département dIngénierie Informatique, UCL
P. Van Roy, LINF LINF1251: Enregistrements et Arbres Peter Van Roy Département dIngénierie Informatique, UCL
1 CSI3525: Concepts des Languages de Programmation Notes # 4: Description Semantique des Languages.
CSI3525: Concepts des Languages de Programmation
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Chapitre 9 Les sous-programmes.
Chapitre 3 Syntaxe et sémantique.
Partie II Sémantique.
Sémantique dénotationnelle
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Modélisation des opérations Spécifier les transformations détat que lon attend des services de la machine Létat dune machine entièrement déterminée par.
P. Van Roy, LINF LINF1251: Sémantique Formelle Peter Van Roy Département d’Ingénierie Informatique, UCL
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
Paradigmes des Langages de Programmation
Paradigmes des Langages de Programmation
INTRODUCTION.
Un survol du language C.
CSI3525: Concepts des Langages de Programmation Notes # 13: Introduction au SmallTalk.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
D.E ZEGOUR Ecole Supérieure d’Informatique. Problèmes de décision Concepts de base Expressions régulières Notation particulière pour exprimer certaines.
Le langage Racket (Lisp)
LINF 1251: Introduction à l’Algorithmique et la Programmation II
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
2005/2006 Structures de Données Introduction à la complexité des algorithmes.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
6/10/2005 © 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Récursion sur les Listes Peter Van Roy Département d’Ingénierie Informatique,
LINF 1251: Récursion sur les Listes
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Initiation aux bases de données et à la programmation événementielle
Algorithmique Boucles et Itérations
1 Spécifications de Problèmes. 2 Plan Définition Motivation Qualités attendues Types de formalismes Rappels du cours de programmation Spécifications structurées.
Chap. 3 Récursion et induction. Les définitions par récurrence consistent à construire des objets finis, à partir d'autres, selon certaines règles. Les.
L ES INSTRUCTIONS DE L ECTURE, E CRITURE ET A FFECTATION Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université.
IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.
Transcription de la présentation:

26/10/2004 P. Van Roy, InfoT4, S6 1 Informatique T4 (FSAC1450) Récursion sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL

26/10/2004P. Van Roy, InfoT4, S62 Ce quon va voir aujourdhui Debriefing du test du 18 octobre Résumé du dernier cours Récursion sur les listes Introduction à la sémantique

26/10/2004P. Van Roy, InfoT4, S63 Debriefing du test Bon résultat! Parmi les participants, 74% de réussites (10/20) Moyenne de 11.9/20 Quelques erreurs fréquentes: Fonctions locales Listes: 1|2|3|nil nest pas [1 2 3 nil]! Pourquoi? Listes: L.N ne donne pas le Nième élément! Modèle déclaratif: Pourquoi est-ce un avantage? Modèle déclaratif: le style marche bien en Java! Identificateur libre Variable libre

26/10/2004 P. Van Roy, InfoT4, S6 4 Résumé du dernier cours

26/10/2004P. Van Roy, InfoT4, S65 Principes Une fonction récursive est comme une boucle dans un langage impératif, mais plus générale Attention: si vous avez deux boucles imbriquées, vous avez besoin de deux fonctions récursives! Pourquoi plus générale? (tuyau: regardez mergesort) Si lappel récursif est le dernier appel, alors la fonction récursive est exactement comme une boucle Espace mémoire constante, temps proportionnel au nombre ditérations La programmation avec accumulateurs est recommandée Pour assurer que lappel récursif soit le dernier appel On peut utiliser un invariant pour dériver un accumulateur Comment trouver un bon invariant?

26/10/2004P. Van Roy, InfoT4, S66 Comment trouver un bon invariant? Principe des vases communicants Une formule en deux parties Une partie disparaît; lautre accumule le résultat Exemple: calcul efficace des nombres de Fibonacci Invariant: le triplet (n-i,F i-1,F i ) Invariant parce que les trois parties du triplet doivent toujours être dans cette relation Un pas de lexécution: (k,a,b) devient (k-1,b,a+b) Valeur initiale: (n-1,0,1)

26/10/2004P. Van Roy, InfoT4, S67 Calcul efficace des nombres de Fibonacci Raisonnement sur linvariant Invariant: le triplet (n-i,F i-1,F i ) Un pas de lexécution: (k,a,b) devient (k-1,b,a+b) Valeur initiale: (n-1,0,1) Valeur finale: (0,F n-1,F n ) Définition de la fonction: fun {Fibo K A B} if K==0 then B else {Fibo K-1 B A+B} end end Appel initial: {Fibo N-1 0 1}

26/10/2004P. Van Roy, InfoT4, S68 Environnement contextuel dune procédure (1) Quand on définit une procédure, on fait deux choses Déclaration de lidentificateur Création de la procédure en mémoire Quel est lenvironnement contextuel de cette procédure? declare fun {Iterate Si} if {IsDone Si} then Si else {Iterate {Transform Si}} end end

26/10/2004P. Van Roy, InfoT4, S69 Environnement contextuel dune procédure (2) Pour bien distinguer la déclaration de lidentificateur et la création de la fonction en mémoire, on peut écrire: declare Iterate = fun {$ Si} if {IsDone Si} then Si else {Iterate {Transform Si}} end end La syntaxe fun {$ Si} … end représente une fonction en mémoire (sans identificateur; une fonction anonyme) Lenvironnement contextuel contient donc {IsDone, Iterate, Transform}

26/10/2004 P. Van Roy, InfoT4, S6 10 Récursion sur les listes

26/10/2004P. Van Roy, InfoT4, S611 Pourquoi les listes Dans le dernier cours, on a vu la récursion sur les entiers Mais un entier est assez limité On voudrait faire des calculs avec des structures plus complexes et avec beaucoup dentiers en même temps! La liste Une collection ordonnée déléments (une séquence) Une des premières structures utilisées dans les langages symboliques (Lisp, dans les années 50) La plus utile des structures composées

26/10/2004P. Van Roy, InfoT4, S612 Définition intuitive Une liste est la liste vide, ou une paire (un cons) avec une tête et une queue La tête est le premier élément La queue est une liste (les éléments restants)

26/10/2004P. Van Roy, InfoT4, S613 La syntaxe dune liste Avec la notation EBNF: ::= nil | T | représente une liste déléments de type T et T représente un élément de type T Attention à la différence entre | et |

26/10/2004P. Van Roy, InfoT4, S614 Notation pour les types représente un entier; plus précisément lensemble de tous les entiers > représente lensemble de toutes les listes dentiers T représente lensemble de tous les éléments de type T; nous disons que T est une variable de type Ne pas confondre avec une variable en mémoire!

26/10/2004P. Van Roy, InfoT4, S615 Syntaxe pour les listes (1) Liste vide: nil Liste non-vide: H|T Lopérateur infixe | nil, 5|nil, 5|6|nil, 5|6|7|nil nil, 5|nil, 5|(6|nil), 5|(6|(7|nil)) | 5| 6| 7nil

26/10/2004P. Van Roy, InfoT4, S616 Syntaxe pour les listes (2) Il existe un sucre syntaxique plus court Sucre syntaxique = raccourci de notation qui na aucun effet sur lexécution nil, [5], [5 6], [5 6 7] Attention: pour le système, [5 6 7] et 5|6|7|nil sont identiques! | 5| 6| 7nil

26/10/2004P. Van Roy, InfoT4, S617 Au-delà des listes Une liste est un cas particulier dun tuple Syntaxe préfixe (lopérateur | devant) nil |(5 nil) |(5 |(6 nil)) |(5 |(6 |(7 nil))) Syntaxe complète nil, |(1:5 2:nil) |(1:5 2:|(1:6 2:nil)) |(1:5 2:|(1:6 2:|(1:7 2:nil)))

26/10/2004P. Van Roy, InfoT4, S618 Exemple dune exécution declare X1=5|X2 X2=6|X3 X3=7|nil X1 | 5| 6| 7nil X2 X3

26/10/2004P. Van Roy, InfoT4, S619 Résumé des syntaxes possibles On peut écrire X1=5|6|7|nil qui est un raccourci pour X1=5|(6|(7|nil)) qui est un raccourci pour X1=|(5 |(6 |(7 nil))) La plus courte X1=[5 6 7]

26/10/2004P. Van Roy, InfoT4, S620 Calculer avec les listes Attention: une liste non vide est une paire! Accès à la tête X.1 Accès à la queue X.2 Tester si la liste X est vide: if X==nil then … else … end

26/10/2004P. Van Roy, InfoT4, S621 La tête et la queue On peut définir des fonctions fun {Head Xs} Xs.1 end fun {Tail Xs} Xs.2 end

26/10/2004P. Van Roy, InfoT4, S622 Exemple avec Head et Tail {Head [a b c]} donne a {Tail [a b c]} donne [b c] {Head {Tail {Tail [a b c]}}} donne c Dessinez les arbres!

26/10/2004P. Van Roy, InfoT4, S623 Exemple de récursion sur une liste On a une liste dentiers On veut calculer la somme de ces entiers Définir la fonction Sum Définition inductive sur la structure de liste Sum de la liste vide est 0 Sum dune liste non vide L est {Head L} + {Sum {Tail L}}

26/10/2004P. Van Roy, InfoT4, S624 Somme des éléments dune liste (méthode naïve) fun {Sum L} if L==nil then 0 else {Head L} + {Sum {Tail L}} end

26/10/2004P. Van Roy, InfoT4, S625 Somme des éléments dune liste (avec accumulateur) fun {Sum2 L A} if L==nil then A else {Sum2 {Tail L} A+{Head L}} end

26/10/2004P. Van Roy, InfoT4, S626 Transformer le programme pour obtenir laccumulateur Arguments: {Sum L} {Sum2 L A} Appels récursifs {Head L} + {Sum {Tail L} } {Sum2 {Tail L} A+{Head L} } Cette transformation marche parce que laddition est associative Sum fait (1+(2+(3+4))), Sum2 fait ((((0+1)+2)+3)+4)

26/10/2004P. Van Roy, InfoT4, S627 Méthode générale pour les fonctions sur les listes Il faut traiter les listes de façon récursive Cas de base:la liste est vide (nil) Cas inductif:la liste est une paire (cons) Une technique puissante et concise Le pattern matching Fait la correspondance entre une liste et une forme (pattern) et lie les identificateurs dans la forme

26/10/2004P. Van Roy, InfoT4, S628 Sum avec pattern matching fun {Sum L} case L of nil then 0 [] H|T then H+{Sum T} end

26/10/2004P. Van Roy, InfoT4, S629 Sum avec pattern matching fun {Sum L} case L of nil then 0 [] H|T then H+{Sum T} end Une clause nil est la forme (pattern) de la clause

26/10/2004P. Van Roy, InfoT4, S630 Sum avec pattern matching fun {Sum L} case L of nil then 0 [] H|T then H+{Sum T} end Une clause H|T est la forme (pattern) de la clause

26/10/2004P. Van Roy, InfoT4, S631 Pattern matching La première clause utilise of, les autres [] Les clauses sont essayées dans lordre Une clause correspond si sa forme correspond Une forme correspond, si létiquette (label) et les arguments correspondent À ce moment, les identificateurs dans la forme sont affectées aux parties correspondentes de la liste La première clause qui correspond est exécutée, pas les autres

26/10/2004P. Van Roy, InfoT4, S632 Longueur dune liste Définition inductive Longueur dune liste vide est 0 Longueur dune paire est 1 + longueur de la queue fun {Length Xs} case Xs of nil then 0 [] X|Xr then 1+{Length Xr} end

26/10/2004P. Van Roy, InfoT4, S633 Pattern matching en général Le pattern matching peut être utilisé pour beaucoup plus que les listes Toute valeur, y compris nombres, atomes, tuples, enregistrements Les formes peuvent être imbriquées Certains langages connaissent des formes encore plus générales (expressions régulières) Dans ce cours nous ne verrons que les listes

26/10/2004P. Van Roy, InfoT4, S634 Résumé des listes Une liste est une liste vide ou une paire avec une tête et une queue Un calcul avec une liste est un calcul récursif Le pattern matching est une bonne manière dexprimer de tels calculs

26/10/2004P. Van Roy, InfoT4, S635 Fonctions sur les listes (1) Nous allons définir la fonction {Pascal N} Cette fonction prend un entier N et donne la Nième rangée du triangle de Pascal, représentée comme une liste dentiers Une définition classique est que {Pascal N} est la liste des coefficients dans lexpansion de (a+b) n (0)

26/10/2004P. Van Roy, InfoT4, S636 Fonctions sur les listes (2) Calculez la fonction {Pascal N} 1. Pour la rangée 1, cela donne [1] 2. Pour la rangée N, déplacez à gauche la rangée N-1 et déplacez à droite la rangée N-1 3. Alignez les deux rangées déplacées et additionnez-les élément par élément pour obtenir la rangée N (0) [ ] [ ] Déplacez à droite: Déplacez à gauche:

26/10/2004P. Van Roy, InfoT4, S637 Fonctions sur les listes (3) AddList ShiftLeftShiftRight Pascal N-1 Pascal N

26/10/2004P. Van Roy, InfoT4, S638 Fonctions sur les listes (4) declare fun {Pascal N} if N==1 then [1] else {AddList {ShiftLeft {Pascal N-1}} {ShiftRight {Pascal N-1}}} end AddList ShiftLeftShiftRight Pascal N-1 Pascal N

26/10/2004P. Van Roy, InfoT4, S639 Fonctions sur les listes (5) fun {ShiftLeft L} case L of H|T then H|{ShiftLeft T} else [0] end fun {ShiftRight L} 0|L end

26/10/2004P. Van Roy, InfoT4, S640 Fonctions sur les listes (6) fun {AddList L1 L2} case L1 of H1|T1 then case L2 of H2|T2 then H1+H2|{AddList T1 T2} end else nil end end

26/10/2004P. Van Roy, InfoT4, S641 Développement descendant (top-down) Ce que nous avons fait avec Pascal est un exemple de développement descendant (top-down) Dabord, il faut comprendre comment résoudre le problème à la main On résoud le problème en le décomposant en de tâches plus simples La fonction principale (Pascal) est résolue en utilisant des fonctions auxiliaires (ShiftLeft, ShiftRight et AddList) On complète la solution en définissant les fonctions auxiliaires

26/10/2004 P. Van Roy, InfoT4, S6 42 Introduction à la sémantique

26/10/2004P. Van Roy, InfoT4, S643 Votre programme est-il correct? Un programme est correct quand il fait ce quon veut quil fasse Comment se rassurer de cela? Il y a deux points de départ : La spécification du programme: une définition du résultat du programme en termes de lentrée (typiquement une fonction ou relation mathématique) La sémantique du langage: un modèle précis des opérations du langage de programmation On doit prouver que la spécification est satisfaite par le programme, quand il exécute selon la sémantique du langage

26/10/2004P. Van Roy, InfoT4, S644 Induction mathématique Pour les programmes récursifs, la preuve utilisera linduction mathématique Un programme récursif est basé sur un ensemble ordonné, comme les entiers et les listes On montre dabord lexactitude du programme pour les cas de base Ensuite, on montre que si le programme est correct pour un cas donné, alors il est correct pour le cas suivant Pour les entiers, le cas de base est souvent 0 ou 1, et pour un entier n le cas suivant est n+1 Pour les listes, le cas de base est nil ou une liste avec un ou plusieurs éléments, et pour une liste T le cas suivant est H|T

26/10/2004P. Van Roy, InfoT4, S645 Exemple: exactitude de la factorielle La spécification de {Fact N} (purement mathématique) 0!=1 n!=n * ((n-1)!) si n>0 Le programme (en langage de programmation) fun {Fact N} if N==0 then 1 else N*{Fact N-1} end end Où est la sémantique du langage? On la verra la semaine prochaine! Aujourdhui le raisonnement sera intuitif

26/10/2004P. Van Roy, InfoT4, S646 Raisonnement pour la factorielle Il faut démontrer que lexécution de {Fact N} donne n! pour tout n Cas de base: n=0 La spécification montre 0!=1 Lexécution de {Fact 0} avec la sémantique montre {Fact 0}=1 Cas inductif: (n-1) n Lexécution de {Fact N}, selon la sémantique, montre que {Fact N} = N*{Fact N-1} Avec lhypothèse de linduction, on sait que {Fact N-1}=(n-1)! Si la multiplication est exacte, on sait donc {Fact N}=N*((n-1)!) Selon la définition mathématique de la factorielle, on peut déduire {Fact N}=n! Pour finir la preuve, il faut la sémantique du langage!

26/10/2004P. Van Roy, InfoT4, S647 Machine abstraite Comment peut-on définir la sémantique dun langage de programmation? Une manière simple et puissante est la machine abstraite Une construction mathématique qui modélise lexécution Nous allons définir une machine abstraite pour notre langage Cette machine est assez générale; elle peut servir pour presque tous les langages de programmation Plus tard dans le cours, nous verrons par exemple comment définir des objets et des classes Avec la machine abstraite, on peut répondre à beaucoup de questions sur lexécution On peut prouver lexactitude des programmes ou comprendre lexécution des programmes compliqués ou calculer le temps dexécution dun programme

26/10/2004P. Van Roy, InfoT4, S648 Concepts de la machine abstraite Mémoire à affectation unique = x 1 =10,x 2,x 3 =20} Variables et leurs valeurs Environnement E = {X x, Y y} Lien entre identificateurs et variables en mémoire Instruction sémantique (,E) Une instruction avec son environnement Pile sémantique ST = [(,E 1 ), …, (,E n )] Une pile dinstructions sémantiques Exécution (ST 1, (ST 2, (ST 3, … Une séquence détats dexécution (pile + mémoire)

26/10/2004P. Van Roy, InfoT4, S649 Environnement Environnement E Correspondance entre identificateurs et variables Un ensemble de paires X x Identificateur X, variable en mémoire x Exemple dun environnement E={X x, Y y} E(X)=x E(Y)=y

26/10/2004P. Van Roy, InfoT4, S650 Lenvironnement pendant lexécution Prenons une instruction: (E 0 ) local X Y in (E 1 ) X=2 Y=3 local X in (E 2 ) X=Y*Y {Browse X} end (E 3 ) end E 0 ={Browse b} E 1 ={X x 1, Y y, Browse b} E 2 ={X x 2, Y y, Browse b} E 3 =E 1

26/10/2004 P. Van Roy, InfoT4, S6 51 Résumé

26/10/2004P. Van Roy, InfoT4, S652 Résumé Listes Récursion sur les listes Pattern matching Fonctions sur les listes Développement descendant (top-down) Lexactitude des programmes Spécification, sémantique du langage, programme Induction mathématique pour un programme récursif Machine abstraite Construction mathématique qui modélise lexécution La semaine prochaine on verra comment elle marche