Les fonctions en Coq Yves Bertot

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

Une introduction rapide à Coq

Recherche dans un tableau

Classes et Objets en Ocaml.

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

STAGE IREM 0- Premiers pas en Python

Cours de Programmation 2

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

Compilation (INF 564)

Algorithmique et Programmation, IMA

Algorithmique et programmation : les bases (VBA) Corrigé

Utilisation d objets : String et ArrayList

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Initiation à la Programmation en Logique avec SISCtus Prolog

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

Cours 1 : La compilation

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

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

Présentation du PL/SQL

Premiers Pas en Programmation Objet : les Classes et les Objets

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

modules & compilation

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)

Introduction à MATLAB R

OCL - Object Constraint Language

Cours Informatique Master STEP

Chapitre VI- La validation de la composition.

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Programmation en Caml pour Débutants

Rappels d architecture

Découverte de Python

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

Rappel sur les bases de données

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

Logiciel Libre Cours 2 Fondements: Programmation

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

Logiciel Libre Cours 3 Fondements: Génie Logiciel

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

Présentation du langage et premières fonctions

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Chapitre 2. Eléments pour comprendre un énoncé

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Examen Médian - 1 heure 30

Une introduction à Java

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

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

Initiation à la programmation en Python

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

1. Structure d'un programme FORTRAN 95

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

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

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

2 Comment fonctionne un ordinateur, dans les grandes lignes

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

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

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

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

Organigramme / Algorigramme Dossier élève 1 SI

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Les chaînes de caractères

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Initiation à l algorithmique

TP1 : Initiation à Java et Eclipse

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Cours d algorithmique pour la classe de 2nde

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

Chapitre VIII. Les bases de données. Orientées Objet. Motivation

Langage SQL : créer et interroger une base

Notions fondamentales du langage C# Version 1.0

Les structures de données. Rajae El Ouazzani

Génie Logiciel avec Ada. 4 février 2013

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

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

Chapitre 2. Classes et objets

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

Conventions d écriture et outils de mise au point

I. Introduction aux fonctions : les fonctions standards

Chapitre 10. Les interfaces Comparable et Comparator 1

Programme Compte bancaire (code)

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Théorie de la Programmation

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Vérification formelle de la plate-forme Java Card

Définitions. Numéro à préciser. (Durée : )

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

Micro-ordinateurs, informations, idées, trucs et astuces utiliser le Bureau à distance

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

4. Groupement d objets

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

Algorithmique & programmation

Langage Java. Classe de première SI

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

ACTIVITÉ DE PROGRAMMATION

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Transcription:

Les fonctions en Coq Yves Bertot

Les fonctions: outil principal en Coq I Les fonctions sont les unités de base de la programmation en Coq I Les fonctions décrivent les opérations à effectuer dans un langage mathématique I Les fonctions permettent de s adapter à des données différentes en utilisant des variables I Les fonctions peuvent elles-mêmes être utilisées comme des données

Construire des fonctions simples I On définit une fonction en fournissant une expression bien formée et une variable spéciale I Utilisez fun et => pour indiquer la variable spéciale I Exemple: la fonction qui ajoute 2 à son entrée I Check fun x => x + 2. I Le système répond fun x : nat => x + 2 : nat -> nat I Le texte : nat -> nat indique que c est une fonction qui prend en entrée un nombre et retourne un nombre I Coq modifie l expression pour ajouter un type à la variable x I Les fonctions sont anonymes I Comme l expression 2 + 3, l expression fun x => x + 2 n a pas de nom I Pour donner un nom à une fonction il faut utiliser la commande Definition

Appliquer les fonctions I On utilise une fonction en l appliquant à une valeur I Il suffit d écrire la fonction sur la gauche de la valeur I on n ajoute des parenthèses que pour éviter les ambiguités, autour de la fonction, ou autour de l argument I Exemple: appliquer la fonction qui ajoute 2 au nombre 4, I Eval vm_compute in (fun x => x + 2) 4. I Le système répond 6 : nat I Quand la fonction est un nom, on peut se passer de parenthèses I Exemple: Definition add2 := fun x => x + 2. Check add2 4. I Le système répond add2 4 : nat

Les fonctions sont des valeurs I Les fonctions peuvent retourner des fonctions comme résultat I C est la représentation usuelle des fonctions à plusieurs arguments I Coq fournit une notation abrégée I Exemple: une fonction avec deux entrées I Check fun x => fun y => y + (x + 2). I Le système répond fun x y : nat => y + (x + 2) : nat -> nat -> nat I Quand on l applique à un seul argument cela retourne une fonction I La nouvelle fonction peut à son tour être appliquée à un autre argument I Check (fun x y => y + (x + 2)) 5. I Le système répond (fun x y : nat => y + (x + 2)) 5 : nat -> nat

Les fonctions peuvent être des arguments I Les fonctions d ordre supérieur I Check fun f => f (f 0). I Le système répond fun f : nat -> nat => f (f 0) : (nat -> nat) -> nat I Ceci indique que l argument f est une fonction I Exemple d utilisation I Eval vm_compute in (fun f => f (f 0)) ((fun x y => y + (x + 2)) 3). I Le système répond 10 : nat

Alpha-conversion I Dans une fonction le nom de la variable spéciale peut changer sans changer le sens de la fonction I fun x => x + 2 et fun y => y + 2 sont la même fonction, I Le changement du nom de variable est appelé alpha-conversion

Bêta-réduction I Dans les calculs, la variable spéciale est remplacée partout par l argument I Eval vm_compute in (fun x f => f (f x)) 2. I Le système répond fun f : nat -> nat => f (f 2) : (nat -> nat) -> nat I Cette étape élémentaire de calcul est appelée Beta-réduction

Variables liées, variables libres I L alpha-conversion et la beta-réduction sont reliées I Les variables touchées par les deux procédés sont des variables liées I l occurrence entre fun et => est l occurence liante I Lorsqu une variable dans une expression n est pas liée, elle doit avoir été définie par ailleurs

Utilisation de variables locales I La construction let v := e in F I Cette construction permet d écrire une seule fois e I La variable v aura la même valeur et le même type que e et pourra être utilisée dans F I Eval compute in let v := 3 in v + v. I Le système répond = 6 : nat

Les types en Coq Yves Bertot

Les types : outils principaux contre les fautes I Les types sont des ensembles de données I Ils permettent d observer les programmes avec moins de détail I Les erreurs les plus grossières se voient rapidement I La vérification des types peut être faite sans exécuter les programmes

Les types I Tout objet a un type, I Toute fonction attend un argument d un type précis, I Même lorsque l on ne donne pas de type à l argument d une fonction, le système en calcule un ou refuse, I La commande Check permet de trouver le type d une expression.

Quelques expressions et leur type I Check 1. I Le système répond: 1 : nat I Check 1 + 2. I Le système répond: 1 + 2 : nat I Check fun x => 1 + x. I Le système répond: fun x : nat => 1 + x : nat -> nat I Check (fun x => 1 + x) 2. I Le système répond: (fun x : nat => 1 + x) 2 : nat

Quelques erreurs de type I Check 1 + true. I Le système répond : The term "true" has type "bool" while it is expected to have type "nat". I Check fun x => x. I Le système répond : Error: Cannot infer the type of x. I Check 1 2. I Le système répond : Error: Illegal application (Non-functional construction): The expression "1" of type "nat" cannot be applied to the term "2" : "nat"

Règles de vérification des types I Typage des applications de fonctions I Si une fonction f a le type A -> B I Si l on veut construire l expression f e I Alors l expression e doit avoir le type A. I Typage des abstractions I Si l on veut construire l expression fun x : t => M I Dans l expression M, x doit avoir le type t I Si l on n écrit pas le type t, Coq essaie de deviner sa valeur

Polymorphisme I Le comportement de certaines fonctions est commun à tous les types let f := fun (A : Type) (x : A) => x in (f nat 3, f bool true) I Polymorphisme: fréquent dans les langages comme ML, OCaml, Haskell, I En Coq, le polymorphisme est explicite: l argument de type est ajouté à la fonction, I Notation liante: forall, I Notation plus lourde, compensée par un mécanisme d arguments implicites.

Arguments implicites I La valeur de certains arguments peut être devinée quand on connaît le type d autres arguments I Exemple Definition id := fun (A:Type) (x:a) => x. I Check id _ true. I Le système répond : id bool true : bool I Le système peut deviner bool I Implicit Arguments id. permet d utiliser cette capacité I On n écrit plus que id true, l autre argument est caché I On peut utiliser le préfixe @ pour désactiver. I Check @id bool. I Le système répond : id (A:=bool) : bool -> bool

Ordre supérieur I La notation fun _ => _ permet de construire des fonctions, I Des fonctions peuvent produire de nouvelles fonctions, I Des fonctions peuvent prendre des fonctions en argument, I Une fonction de premier ordre est une fonction qui prend en argument une donnée I nombres naturels, booléens, paires de données, etc. I Une fonction de second ordre prend en argument une fonction du premier ordre, I Une fonction d ordre supérieur prend en argument une fonction d ordre arbitraire, I En Coq la distinction entre les ordres n existe pas.

Notations pour l ordre supérieur I On écrit souvent des fonctions à un argument qui retournent une fonction à un argument, I Les parenthèses dans les applications sont évitées (à droite), I Les parenthèses dans le typage sont évitées, I Les mots clefs fun ne sont pas répétés.

Les structures de données en Coq Yves Bertot

Structures de données I Pour programmer il faut pouvoir définir de nouvelles structures de données I Il s agit de regrouper des données ou de décrire des alternatives I Des opérations sont fournies pour dégrouper et traiter les cas I La récursion permet d avoir dans le même type des objets de tailles différentes

Regrouper des données I Un type prédéfini de couples, notation A * B I Notation pour les données elles-mêmes (.,. ) I Check (3, fun x : nat => x + 3). I Le système répond (3, fun x => x + 3) : nat * nat -> nat I Besoin d une construction pour observer l intérieur d un couple I Observation par motif, syntaxe match... with... end I Eval compute in match (1, 3) with (a, b) => a + b end. I Le système répond = 4 : nat I Le calcul fonctionne en comparant (a, b) avec la valeur observée (1, 3) I a tombe en face de 1 I a alavaleur1 dans le calcul de a + b

Définir son propre type I Un mot-clef : Inductive I Inductive t1 : Type := ct1 (x y : nat) (b : bool). I Ceci définit deux nouveaux objets: t1 et ct1 I t1 est un type I ct1 est une fonction pour construire des éléments de t1 I observation par motif: I Check fun d : t1 => match d with ct1 u v w => u + v end. I Le système répond fun d : t1 => match d with ct1 u v w => u + v end : t1 -> nat I L observation par motif permet de connaître le type de u et v

Structures de données avec variantes I On peut avoir plusieurs cas de figure I Par exemple un calcul peut retourner deux entiers ou une chaine de caractères I Inductive t2 := ct2n (x y : nat) ct2s (s : string). I Toute donnée de t2 est soit ct2n n où n est entier soit tt ct2s s où s est une chaîne de caractères I L observation par motif devient un traitement par cas I Check fun c : t2 => match c with ctn n => n + n cts s => 0 end. I si c a été obtenu par ctn le premier calcul est effectué I si c a été obtenu par cts le deuxième calcul est effectué

Terminologie sur les structures de données I Dans la définition inductive suivante: Inductive t2 := ct2n (x y : nat) ct2s (s : string). I Les nouvelles fonctions ct2n et ct2s sont appelées des constructeurs I x, y, s sont des champs I les types nat et string sont des types de champs

Structures de données récursives I Les types de champs sont habituellement des types déjà définis I Le type en cours de définition est aussi autorisé I Exemple: Inductive t3 := ct3r (s:string)(r:t3) ct3e. I Ceci indique que I ct3e a le type t3 I ct3r "a" (ct3r "b" (ct3r "c" (ct3r "d" ct3e))) aussi I Tous les éléments de t3 contiennent ct3e précédé d un certain nombre d utilisations de ct3r

Programmation récursive I Pour observer le contenu d un élément d un type récursif I Une construction qui va s adapter aun nombre de fois où le type est utilisé de façon imbriquée I Forme générale: Fixpoint f (x : t) : t := B. I Le type t est le type de retour de la fonction I La fonction f peut être réutilisée dans le corps de la fonction, B I Seulement sur une variable obtenue par traitement par cas sur x

Exemples de types récursifs utilisés dans Coq I Inductive nat : Set := O : nat S : nat -> nat. I Inductive list (A : Type) : Type := nil : list A cons : A -> list A -> list A. I Check S (S (S O)). I Le système répond 3 : nat I La fonction S correspond à l operation ajouter 1

Exemples de programmation récursive I La fonction qui additionne tous les nombres plus petits que n: Fixpoint sum (n : nat) : nat := match n with O => O S p => p + sum p end. I La fonction qui calcule la suite de Fibonacci: Fixpoint fib (n:nat) : nat := match n with O => O 1 => 1 S (S q as p) => fib p + fib q end. I Notez l utilisation de as pour respecter la contrainte de variable

Fonctions récursives sur d autres types I La fonction qui concatène toutes les chaines d un objet de type t3 Fixpoint cat (x : t3) : string := match x with ct3e => "" ct3r s y => s ++ cat y end.

Violation de la contrainte I Message d erreur lorsque la contrainte n est pas respectée Fixpoint fib (n:nat) : nat := match n with O => O 1 => 1 S (S q) => fib (S q) + fib q end. I Le système répond Recursive call to fib has principal argument equal to "S q" instead of one of the following variables: n0 q.

Bibliothèque de base Yves Bertot

Les nombres I Par défaut les nombres utilisés en Coq sont des nombres naturels I Il s écrivent 0, 3, 47, 268 I Représentation interne naïve, 1 = S O, 2 = S (S O) I adaptée pour le raisonnement logique I Pas de nombres négatifs dans ce type I Check 3. I Le système répond: 3 : nat

Les opérations sur les nombres I addition, multiplication, soustraction I Notations infixes: I Check plus 1 2. I Le système répond: 1 + 2 : nat I Check mult 2 3. I Le système répond: 2 * 3 : nat I soustraction totale : résultat irrégulier dans certains cas I Eval vm_compute in minus 2 3. I Le système répond: = 0 : nat

Programmation par cas sur les entiers naturels I Les entiers naturels sont de deux formes I 0 I S p où p est un autre nombre naturel I Il est possible de définir une valeur de façon différente suivant la forme d une autre expression I match n with 0 => 1 S p => 3 end I La valeur de cette expression est 1 si n est 0, 3 si n est non nul

Exemple de calcul avec traitement par cas I Eval vm_compute in (fun n => match n with 0 => 1 S p => n + p end) (2+1). I Le système répond: = 5 : nat

Fonctions récursives sur les nombres naturels I Il est possible de définir une fonction qui s appelle elle-même I A condition que l appel se fasse sur un prédécesseur de l argument I Le prédecesseur doit être obtenu par traitement par cas I Cette contrainte garantit que le calcul s arrête toujours I Syntaxe particulière: Fixpoint fact (n : nat) : nat := match n with 0 => 1 S p => n * fact p end.

Calcul d une fonction récursive sur les entiers naturels I Exemple de calcul: Eval vm_compute in fact 6. I Le système répond: = 720 : nat I La représentation naïve des entiers naturels empêche de calculer des grandes valeurs.

Les valeurs de vérité I Un type bool contenant deux valeurs true et false I Une construction if... then... else... pour faire un calcul qui dépend d un test I Un certain nombre de fonction de test retournant une valeur booléenne I Search bool. I Le système répond leb : nat -> nat -> bool beq_nat : nat -> nat -> bool andb : bool -> bool -> bool orb : bool -> bool -> bool I beq_nat est un test d égalité pour les entiers naturels, leb un test de comparaison, andb calcule la conjonction, etc.

Mettre ensemble plusieurs données I (e 1, e 2 ) est bien formé dès que e 1 et e 2 le sont I si e 1 aletypet 1 et si e 2 aletypet 2 alors (e 1, e 2 ) aletypet 1 * t 2. I Lorsque l on a une expression e de type (t 1 * t 2 ) on peut récupérer chacune des composantes grâce à l observation de motif: match e with (a, b) => F end les deux variables a et b peuvent être utilisées dans l expression F, I les valeurs de a et b sont celles de la première composante de e et de la deuxième composante, respectivement.

Mettre ensemble un nombre quelconque de données I pour tout type t, on peut utiliser le type list t pour mettre ensemble des données de type t I La notation est... ::... ::... :: nil I Le traitement par cas sur cette structure de donnée s écrit aussi avec match, il permet d isoler le premier élément d une liste du reste, lorsque cet élément existe match l with a::l => F 1 nil => F 2 end

Programmation récursive sur les listes I Dans le cas...::... une liste contient une sous-liste I Si cette sous-liste est nommée par une variable, elle peut servir pour un appel récursif I On utilise encore Fixpoint pour définir les fonctions récursives I Fixpoint suml (l: list nat) : nat := match l with nil => 0 a::tl => a + suml tl end. I Cette fonction additionne toutes les valeurs d une liste d entiers.

Polymorphisme Yves Bertot

Des fonctions générales I Certains calculs sont indépendants du type des données I Par exemple, si A est un type, f est une fonction à deux arguments dans A et à valeur dans A et si x 1, x 2, et x 3 alors le calcul f x 1 (f x 2 x 3 ) atoujoursunsens I On peut le décrire par une fonction de A, f, x 1, x 2, et x 3 I Definition op3 (A : Type) (f : A -> A -> A) (x 1 x 2 x 3 : A) := f x 1 (f x 2 x 3 ). I Cette fonction prend le type A en argument et va s adapter à tous les types I C est une fonction polymorphe

Fonctions polymorphes : utilisation I Eval compute in op3 string append "a" "b" "c". I Le système répond = "abc" : string I Eval compute in op3 nat plus 1 2 3. I Le système répond = 6 : nat I Le système peut deviner l argument de type Check op3 _ plus 1 2 3. I Le système répond op3 nat plus 1 2 3 : nat

Le type des fonctions polymorphes I Dans une fonction polymorphe, le nom de l argument de type est réutilisé I La notation... ->... n est plus adaptée I Une nouvelle notation : forall A : Type,... I Check op3. I Le système répond op3 : forall A : Type, (A -> A -> A) -> A -> A -> A -> A. I En fixant les types, on retrouve des types habituels I Check op3 nat. I Le système répond op3 nat : (nat -> nat -> nat) -> nat -> nat -> nat -> nat

Arguments implicites I Quand une fonction est polymorphe on peut adopter la convention de ne pas écrire l argument de type I L argument manquant est deviné en observant le type de l argument suivant I La commande suivante met en place la convention pour une fonction Implicit Arguments op3. I A partir de là on ne donne plus l argument A à op3 I Check op3 plus. I Le système répond op3 plus : nat -> nat -> nat -> nat I le préfixe @ désactive le mécanisme d arguments implicites I @op3 nat est bien formé.

Structures de données polymorphes I Le type des couples est polymorphe I La notation (...,...) cache une fonction pair I Cette fonction a quatre arguments, deux types A et B et deux valeurs x et y I Les arguments A et B sont implicites I Le type de la fonction pair est pair : forall A B : Type, A -> B -> A * B I Le type des couples est défini de la façon suivante: Inductive prod (A B : Type) : Type := pair : A -> B -> prod A B. I A * B est une notation pour prod A B

Listes polymorphes I La notation...::... cache une fonction cons I cons : forall A : Type, A -> list A -> list A I L argument A est implicite I Le type des listes est défini par Inductive list (A : Type) : Type := nil : list A cons : A -> list A -> list A. I Un grand nombre des fonctions prédéfinies sur les listes sont polymorphes avec arguments implicites

Fonctions polymorphe sur les listes I length, nth, app I Check app. I Le système répond app: forall A Type, list A -> list A -> list A I Eval compute in app (1::2::nil) (3::nil). I Le système répond = (1::2::3::nil)