Les types dépendants Yves Bertot

Documents pareils
Une introduction rapide à Coq

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

Classes et Objets en Ocaml.

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

Recherche dans un tableau

LES TYPES DE DONNÉES DU LANGAGE PASCAL

1. Structure d'un programme FORTRAN 95

Représentation d un entier en base b

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

OCL - Object Constraint Language

Cours de Programmation 2

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Qualité du logiciel: Méthodes de test

Théorème du point fixe - Théorème de l inversion locale

Bases de données cours 4 Construction de requêtes en SQL. Catalin Dima

Algorithmique et programmation : les bases (VBA) Corrigé

TP : Gestion d une image au format PGM

Vérification formelle de la plate-forme Java Card

Premiers Pas en Programmation Objet : les Classes et les Objets

Cours Informatique Master STEP

Programmation linéaire

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

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

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

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

Découverte de Python

STAGE IREM 0- Premiers pas en Python

Programme Compte bancaire (code)

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

Arbres binaires de recherche

Les arbres binaires de recherche

Cours de Probabilités et de Statistique

Limites finies en un point

aux différences est appelé équation aux différences d ordre n en forme normale.

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Cours Fonctions de deux variables

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

Suites numériques 3. 1 Convergence et limite d une suite

SOCLE COMMUN - La Compétence 3 Les principaux éléments de mathématiques et la culture scientifique et technologique

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

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

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

Chapitre 10. Les interfaces Comparable et Comparator 1

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

1 Lecture de fichiers

Souad EL Bernoussi. Groupe d Analyse Numérique et Optimisation Rabat http ://

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

Conversion d un entier. Méthode par soustraction

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

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

III- Raisonnement par récurrence

Chapitre 2 Le problème de l unicité des solutions

Carl-Louis-Ferdinand von Lindemann ( )

TP: Représentation des signaux binaires. 1 Simulation d un message binaire - Codage en ligne

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

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

Spécification et certification d implantation chaînée avec des orbites : les hypercartes combinatoires

Chapitre 2. Classes et objets

Algorithmique & programmation

Plan du cours Cours théoriques. 29 septembre 2014

Paginer les données côté serveur, mettre en cache côté client

Manuel d'installation de GESLAB Client Lourd

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Création d objet imbriqué sous PowerShell.

Fonctions de plusieurs variables

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

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

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Cours 1 : La compilation

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

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Chapitre VI- La validation de la composition.

Algorithmique et Programmation, IMA

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

Exercices - Fonctions de plusieurs variables : corrigé. Pour commencer

Cours Bases de données 2ème année IUT

Présentation du PL/SQL

TP 1. Prise en main du langage Python

Circuits RL et RC. Chapitre Inductance

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

Programmation linéaire

Cours de Master Recherche

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

Résolution de systèmes linéaires par des méthodes directes

Continuité d une fonction de plusieurs variables


Pourquoi l apprentissage?

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

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

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

CHAPITRE V SYSTEMES DIFFERENTIELS LINEAIRES A COEFFICIENTS CONSTANTS DU PREMIER ORDRE. EQUATIONS DIFFERENTIELLES.

Le prototype de la fonction main()

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

MIS 102 Initiation à l Informatique

Matrice d accès. Master SEMS, Pierre Paradinas. October 16, 2013

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

OLYMPIADES ACADEMIQUES DE MATHEMATIQUES. 15 mars 2006 CLASSE DE PREMIERE ES, GMF

ASR1 TD7 : Un microprocesseur RISC 16 bits

Transcription:

Les types dépendants Yves Bertot

Familles de types I Représenter des collections de types A 1, A 2,... I Exemple : tableaux de longueur 1, 2,... I Aussi : nombres inférieurs à 1, 2,... I Utiliser des fonctions de type nat -> Type pour représenter ces familles I Zarray : nat -> Type I bound : nat -> Type I Choix arbitraire pour le type des indices I I Pas nécessairement un type de nombres N importe quel type déjà défini

Fonctions à type dépendant I Possibilité de définir des fonctions sur les types indicés I read2 : Zarray 2 -> bound 2 -> Z I permet par exemple de décrire l accès sans erreur entre les bornes d un tableau I Suggère l existence de familles de fonctions à type indicé I read3 : Zarray 3 -> bound 3 -> Z I read4 : Zarray 4 -> bound 4 -> Z I... I La famille de fonctions peut directement être représentée comme une fonction I Si i est un indice de type nat read i doit avoir le type Zarray i -> bound i -> Z I Besoin d une notation nouvelle pour le type de cette nouvelle fonction I read : forall i:nat, Zarray i -> bound i -> Z

Le type produit dépendant I Notation forall x : A, E x I Décrit le type d une fonction qui attend un argument de type A I Le type de retour dépend de la valeur en entrée I si f aletypeforall x : A, E x, si l expression b aletype A, alors l expression f b aletypee b I Exemple avec read I read : forall i:nat, Zarray i -> bound i -> Z I read 2 : Zarray 2 -> bound 2 -> Z

Bonne formation du produit dépendant I Conditions pour que l expression forall x : A, E x soit bien formée I Il faut que A soit un type (de type Set, Type, Prop), I Il faut que E x soit un type (de type Set, Type, Prop) dèsque x de type A I Si Zarray et bound ont le type Type I Dès que i a le type nat, Zarray i et bound i ont le type Type, I Alors Zarray i -> bound i -> Z a le type Type, I Alors forall i : nat, Zarray i -> bound i -> Z est bien formé I forall i : nat, Zarray i -> bound i -> Z a le type Type

Le polymorphisme Yves Bertot

Fonctions polymorphes I Le type des fonctions polymorphe s exprime avec un produit dépendant I Exemple de la fonction identité: Definition id := fun (A : Type) (x : A) => x. I Check id. I Le système répond id : forall A : Type, A -> A

Types de données polymorphes I Le type des listes est polymorphe en Coq: I list : Type -> Type I les constructions de base pour les listes sont polymorphes: I nil : forall A:Type, list A I cons : forall A: Type, A -> list A -> A I Attention, le premier argument de nil et cons est implicit.

Fonctions à types dépendants Yves Bertot

Introduction I Des fonctions à valeur dans des types différents I Des familles de types I Une nouvelle façon de noter le type des fonctions

Familles de types I Type d indices I I famille de type A i représentée par une fonction A de type I -> Type I A i est représenté par A i I Nouveauté: considérer une fonction f dont le type de départ est I et telle que f i aletypea i pour tout i dans I I Le type d arrivée n est pas toujours le même I Le type d arrivée dépend de la valeur en entrée

Nouvelle notation de type de fonction I Notation : f : forall i : I, A i I si x est une valeur de type I, f x aletypea x I Même notation que pour les formules logiques I Aussi appelé produit dépendant I Généralisation du produit cartésien

Généralisation du produit cartésien I un multiplet (x,y,z) : A 1 * A 2 * A 3 I Considérons la fonction de projection n (x, y, z) I I I si n = 1 elle retourne x : A1 si n = 2 elle retourne x : A2 si n = 3 elle retourne x : A3 I Le multiplet est comme une fonction, mais son type est dépendant

Exemple de famille de type I Si P : A -> Prop est un prédicat I Coq permet de définir le type {x : A P x} I Par exemple : Definition divides (x y : nat) := exists k, x = k * y. I on peut définir la famille de types: fun y => {x : nat divides x y} I {x : nat divides x 134} contient tous les multiples de 134 I C est un type: définir ce type ne veut pas dire que l on sait trouver tous les multiples de 134 I le type {x : nat divides x 134} est différent de nat

Exemples d utilisation : protection contre les débordements I Definition bound n := {x x < n}. le type des entiers entre 0 et n I array_z n le type des tableaux de taille n I Type d une fonction d accès : forall n, bound n -> array_int n -> Z I Evite les erreurs de dépassement de tableau I Détection des erreurs au moment de la vérification des types I pas d erreur à l exécution

Exemple d utilisation: Spécifications de programmes I Le type {x P x} -> {y Q y} est riche en informations I Cette fonction n accepte que des arguments qui satisfont P I Cette fonction ne produit que des résultats qui satisfont Q I le type forall x, {y R x y} peut spécifier le comportement I fournir une fonction de ce type, c est garantir que l on sait produire pour chaque x un y qui satisfait R x y I Si R est tel que y est unique la valeur retournée est entièrement spécifiée

Les propositions sont des types Yves Bertot

Introduction I Propositions vues comme des type de preuves I Utilisation dans des fonctions dépendantes I Utilisation avec la notation de sous-type

Types de preuves I Si P est une proposition, c est une collection dont les éléments sont des preuves de P I Si P est une proposition fausse, il n y a pas d élément I P -> Q est le type des fonctions qui expliquent le lien entre les preuves de P et les preuves de Q I Si P : Prop, on peut écrire fun x : P =>..., P -> nat, forall x : P,... I Si P : I -> Prop, le type forall i, P i dit que P est toujours satisfait I une preuve de forall i, P i est un procédé qui indique comment obtenir P i pour n importe quel i I Si th : forall i : I, P i et a : I,alorsth a : P a

Utilisation dans les spécifications I Décrire les fonctions qui ne peuvent être utilisées que pour des arguments qui satisfont P I forall x : A, P x ->... I Exemple pour la fonction de division: éviter la division par 0 I nat -> forall y, y <> 0 -> nat * nat I type minimal pour éviter la division par 0 I Spécification plus précise I forall x y, y <> 0 -> {p : nat * nat let (q,r) := p in x = q * y + r /\ r < y}

Construire des preuves comme des fonctions I Première méthode: Combiner les théorèmes comme des fonctions I Exemple : forall n, n <= S n I Utiliser le_s : forall n m, n <= m -> n <= S m le_n : forall n, n <= n I fun n => le_s n n (le_n n) : forall n, n <= S n

Utilisation de exist I {x : T P x} est une notation pour sig (fun x : T => P x) I Fonction existante de Coq exist : forall (A : Type)(P : A -> Type)(x : A), sig P I L argument A est implicite I Théorème existant: refl_equal : forall (A : Type)(x : A), x = x I A est un argument implicit, refl_equal 0 : 0 = 0 I Definition v0 : {b : bool if b then 0=0 else 0<>0} := exist _ true (refl_equal 0).

Utilisation de nat_rect I nat_rect : forall P : nat -> Type, P 0 -> (forall n, P n -> P (S n)) -> forall n, P n I nat_rect (fun n => {b : bool if b then n=0 else 0<>n}) v0 est bien formé

Construire les fonctions dépendantes comme des preuves I Poser le type de la fonction comme un énoncé de théorème I utiliser les tactiques pour construire l intérieur de la fonction I elim est équivalent à l utilisation de..._rect I case correspond à une construction de filtrage I apply correspond à l appel d une fonction I exact permet de donner la valeur retournée I exists correspond à l appel de la fonction exist

Filtrage et récursion dépendants Yves Bertot

Introduction I Construction de filtrage avec dépendance I Récursion avec dépendance I Construction de principes de récurrence

Filtrage avec dépendance I Par défaut, pas de dépendance dans les constructions de filtrage match e with p 1 => v 1 p 2 =>...end I Dépendance explicite ajoutée avec une clause as...return... I Chaque règle retourne dans un type qui dépend du motif I Compliqué à écrire, mais utilisation possible de tactiques

Exemple de filtrage dépendant I suppose l existence de O_S : forall n, 0 <> S n I or_introl : forall A B, A -> A \/ B I or_intror : forall A B, B -> A \/ B I Definition ex1 : forall n, O = n \/ O <> n := fun n => match n as x return O = x \/ O <> x with O => @or_introl (O = O) (O <> O) (refl_equal O) S p => @or_intror (O = S p) (O <> S p) (O_S p) end.

Filtrage dépendant générique I Même approche, mais avec une famille de types générale I Definition ex_gen (P : nat -> Type) (V0 : P 0) (fs : forall n, P (S n)) (n: nat) : P n := match n return P n with O => V0 S p => fs p end.

Ajout de la récursion I Si un motif de filtrage a la forme C...v... où C est un constructeur I Les appels récursifs sont autorisés sur v I Le type de l appel récursif dépend de v

Définition de nat_rect I Fixpoint nat_rect (P : nat -> Type) (V0 : P 0) (fs : forall n, P n -> P (S n)) (n : nat) : P n := match n return P n with O => V0 S p => fs p (nat_rect p) end. I Fonction similaire nat_ind où Prop remplace Type I nat_ind : forall P : nat -> Prop, P 0 -> (forall n, P n -> P (S n)) -> forall n, P n I Construit automatiquement par Coq, utilisé par la tactique elim

récurrence spécialisée I Principe de récurrence adapté pour un schéma de récursion I exemple pour la récursion en 2 étapes sur nat I Fixpoint nat_ind2 (P : nat -> Prop) (V0 : P 0) (V1 : P 1) (fs : forall n, P n -> P (S (S n))) (n : nat) : P n := match n return P n with 0 => V0 1 => V1 S (S p) => fs p (nat_ind2 p) end.

tactiques pour le filtrage dépendant I case fabrique un filtrage dépendant par défaut I fix fabrique un contexte d appel récursif I ajoute une nouvelle hypothèse utilisable comme fonction récursive I Attention aux restrictions d usage I refine permet de mélanger les genres

Types récursifs dépendants Yves Bertot

Introduction I Utilisation de types inductifs où les constructeurs ont des types dépendants I Définitions inductives de familles de types I Adaptation du filatrage et des principes de récurrence

Constructeurs à type dépendant I Imposer des propriétés de cohérence aux données I Inductive t4 : Type := ct4 : forall n : nat, n<>0 -> t4. I Pour construire un élément du type, il faut trouver des composantes cohérentes I Filtrer pour récupérer les composantes et leur cohérence

Filtrage sur un type à constructeurs dépendants I Permet de récupérer en plusieurs éléments les composantes du constructeur I fun x:t4 => match x with ct4 n p =>... end. I Dans... p est une preuve que n est non-nul I On ne peut pas extraire la deuxième composante sans la première.

Familles de types inductifs I Même approche que pour un type inductif, mais définit une fonction I Inductive sqrt (n : nat) : Type := csqrt (x : nat) (p1 : x * x <= n < (x + 1) * (x + 1)). I Tout élément de sqrt n contient un x qui est l approximation entière de la racine carrée de n I Inductive cmp (n m : nat) : Type := cmp1 (_ : n <= m) cmp2 (_ : m < n). I tout élément de cmp n m est soit cmp1 h lorsque n <= m, soit cmp2 h lorsque m < n I Le filtrage permet de récupérer les composantes

Cohérence interne des données I Inductive t5 (A :Type) : nat -> Type := t50 : t5 A 0 t51 : forall n, A -> t5 A n -> t5 A n -> t5 A (S n). I Le type t5 n décrit des arbres binaires I La longueur de toutes les branches est égale n I Même hauteur pour les deux sous-arbres d un noeud composite

Présentation alternative des arbres binaires équilibrés I Privilégier les types simples I Ajouter la cohérence sous forme de fonctions booléennes I Inductive bin (A : Type) : Type := L N (v : A) (t1 t2 : bin A). I Fixpoint bal (A : Type)(n:nat)(t : bin A) : bool := match t, n with L, 0 => true N _ t1 t2, S p => bal A p t1 && bal A p t2 _, _ => false end. I Inductive t6 (A : Type)(n:nat) : Type := ct6 (t : bin A) (_ : bal A n t = true).

Filtrage et récursion sur les familles inductives I Même fonctionnement que pour les types inductifs simples I Les fonctions récursives ont plusieurs arguments I Les derniers arguments dépendent des premiers I Traitements différents: paramètres ou non I Arguments paramètres non-fournis dans le filtrage I Ils peuvent être déterminés à partir du contexte

Utilisation de tactiques I Tactiques case, elim, destruct, induction I Ajoutent de nouvelles hypothèses dont le type dépend du contexte I Dépendance sur des valeurs existantes ou sur de nouvelles hypothèses I Expression de cas pas seulement sur l argument I Les indices sont également touchés I Parfois besoin de rendre le but plus général tactiques revert et generalize

Propositions inductives Yves Bertot

Introduction I Lecture logique du type des constructeurs I Interpretation logique du type inductif I Utilisation de familles inductifs avec des éléments vides I Vision concrète des raisonnements I Traitement par cas et inversion

Lecture logique du type des constructeurs I Inductive le (n : nat) : nat -> Prop := le_n : le n n le_s : forall m, le n m -> le n (S m). I Tous les éléments d un type le a b sont obtenus par les constructeurs I Le type le 3 4 contient un élément le_s 3 (le_n 3) I Le type le 1 0 ne contient aucun élément I Ni le_n ni le_s ne pourrait en construire I En Coq n <= m est une notation pour le n m

Conception de propriétés inductives I Les constructeurs doivent être des formules vraies I La combinaison des constructeurs doit suffir àprouvertoutes les instances I Le principe de récurrence exprime une caractéristique de minimalité I Principe de récurrence modifié par rapport aux autres types I non-pertinence des preuves I Exprime les conditions pour qu il existe une preuve pas les propriétés du terme de preuve

Propriétés inductives usuelles I Les connecteurs logiques I La quantification existentielle I L égalité I La contradiction I Ceci explique pourquoi les tactiques des connecteurs sont destruct et elim

Connecteur logique I Inductive and (A B : Prop) : Prop := conj : A -> B -> and A B. I Notation A /\ B pour and A B I Principe de récurrence associé and_ind : forall A B P : Prop, (A -> B -> P) -> A /\ B -> P I Traitement similaire pour or avec 2 constructeurs

Quantification existentielle I Inductive ex (A : Type) (P : A -> Prop) : Prop := ex_intro : forall x : A, P x -> ex A P. I Notation exists x:a, P pour ex A (fun x => P) I Principe de récurrence associé forall A P Q, (forall x, P x -> Q) -> ex A P -> Q

Egalité I Inductive eq (A : Type) (x : A) : A -> Prop := refl_equal : eq A x x. I Argument A implicite I Notation x = y pour eq x y I Principe de récurrence forall (A : Type) (x : A) (P : A -> Prop), P x -> forall (y : A), x = y -> P y I Exprime le remplacement de y par x dans l énoncé à prouver

Représentation inductive de la contradiction I Inductive False : :=. I Pas de constructeur: jamais prouvable I Principe de récurrence associé forall P, False -> P I Si on a une contradiction on peut construire une valeur dans n importe quel type