Sémantique dénotationnelle

Slides:



Advertisements
Présentations similaires
Fonctions & procédures
Advertisements

Calcul géométrique avec des données incertaines
Calculs de complexité d'algorithmes
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
La voie intuitionniste
Chap 1 Grammaires et dérivations.
Nicolas Bourbaki.
INTRODUCTION.
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme.
Chapitre II.Rappels mathématiques et complexité
Problèmes aux limites Généralités
CSI3525: Concepts des Langages de Programmation Notes # 11: Sous-Programmes ( Lire Chapitre 8 )
Principes de programmation (suite)
Points importants de la semaine Les commentaires. Les variables. Les instructions conditionnelles. Les instructions itératives (les boucles).
CPI/BTS 2 Programmation Web Introduction au PHP
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
Structures de données linéaires
OCaml - Les listes L3 MI.
Récursivité.
Points importants de la semaine Les boucles. Les types arithmétiques. Les opérateurs.
Géométrie vectorielle
Démarche de résolution de problèmes
Expressions et assignations
RESUMES Module II1 SOMMAIRE CYCLE 1 : Saisir – Afficher – Données
Sémantique axiomatique
Lambda-Calcul Sémantique de Montague
Etude dune bibliothèque: Permutations sur les listes.
Rappels de logique des prédicats du 1er ordre
Semaine #1 INF135 par Frédérick Henri.
Gestion de Fichiers Tri Interne Efficace et Tri Externe.
CSI3525: Concepts des Languages de Programmation
Chapitre 1 Le Sens des nombres
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
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.
Partie II Sémantique.
Programmation logique Le Langage PROLOG
Programmation non procédurale Le projet ECOLE 2000
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.
Programmation linéaire en nombres entiers : les méthodes de troncature
Les Opérateurs Ils régissent toutes les opérations ou transformations sur les valeurs des variables. Opérateur d'affectation Opérateurs arithmétiques Opérateurs.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
Animateur : Med HAIJOUBI
Le langage C Structures de données
Paradigmes des Langages de Programmation
Spécification de programmes et de systèmes
La Boucle Repeat Cours LCS N°1 Présenté par Mr: LALLALI.
Programmation fonctionnelle Lambda-calcul
INTRODUCTION.
Théorie du point fixe 1. Rappel Ensemble ordonné Majorant, Minorant
Un survol du language C.
Arbres binaires et tables de hachage
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)
2008/ Plan du cours 1.Introduction –Contenu du cours 2.Logique mathématique –Calcul propositionnel –Calcul des prédicats –Logique floue et aide à.
Programmation fonctionnelle Preuve
Leçon 4 NOTION DE FONCTION Fabienne BUSSAC.
Fonction carré.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction au langage C : Structures de contrôle 1 ère année Génie Informatique Dr Daouda Traoré Université de Ségou
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
Scripts et fonctions Instructions de contrôle
LOGIQUE ET PROGRAMMATION LOGIQUE
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Philippe Gandy - 22 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Philippe Gandy – 10 novembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
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.
Transcription de la présentation:

Sémantique dénotationnelle Idée : Le sens d’un programme est un objet mathématique (souvent, une fonction)

Notation lambda (l) But : une notation pour les fonctions Ex. : la fonction qui met au carré (sqr en Pascal) l x. x * x l est une déclaration de paramètre qui suit les règles de visibilité : l x . x + sqr ((lx. x + x) (x + 2)) On peut simplifier grâce aux règles : b : (l x . E) (A) se simplifie en E [A / x] E où toutes les occurrences libres de x sont remplacées par A h : (l x . E(x)) se simplifie en E, si E n’a aucune occurrence libre de x

Exemple de simplification l x. x + sqr ((lx . x + x) (x + 2)) portée : l x. x + (l x. x * x) ((l x. x + x) (x + 2)) Il y a deux endroit où b s’applique : 1 , 2 1 l x. x + ((lx. x + x) (x + 2)) * (lx. x + x) (x + 2) 3 l x. x + (((x + 2) + (x + 2)) * (lx. x + x) (x + 2)) 4 l x. x + (((x+ 2) + (x + 2)) * ((x + 2) + (x + 2))) = l x. 4x2 + 9x + 16 si on emploie les simplifications arithmétiques. On pourrait aussi appliquer les règles dans un autre ordre : on arrive au même résultat (Théorème de Church-Rosser) Ex. : 2 l x. x + (lx. x * x) (x+2 + x+2) 1 l x. x + (x+2 + x+2) * (x+2 + x+2) def. 1 2 3 4 4 1

Domaines sémantiques Quel objet mathématique représente le sens d’un programme ? Ceci dépend du langage considéré, et du sens qu’on lui accorde. Ex. : Pour Pascal, on convient habituellement que : - il devrait être déterministe (OK si on évite les effets de bord dans les fonctions) - on ne considère que les états initiaux et finaux des fichiers le sens est une fonction des états initiaux vers les états finaux. Ex. : Pour les langages concurrents (Ada, LOTOS, CSP, CCS,...) les opérations intermédiaires visibles comptent aussi : le sens est un objet plus compliqué (p.ex. des arbres)

Compositionnalité On veut donner un sens à chaque partie de façon à ce que le sens d’un composé se déduise du sens de ses composants. Avantages : Si deux composants ont le même sens, on peut toujours remplacer l’un par l’autre (p.ex. compilateur optimisant) La définition de la sémantique suivra la structure de la syntaxe.

Exemple : séquence en Pascal Le sens d'une instruction S, noté [[ S ]], est une fonction de l'état initial vers l'état final Alors le sens d'une séquence est la composition fonctionnelle du sens de ses composants: [[ S1 ; S2 ]] = l x. [[S2]] ([[ S1]] (x)) = [[ S2 ]] ° [[ S1 ]]

Non-terminaison Certains programmes bouclent pour certaines données Ex. : la fonction factorielle pour les nombres négatifs pour représenter cela, on ajoute une valeur spéciale ^ « bouclage » ou « bottom » à l’ensemble des résultats. Comme ce résultat peut être l’argument d’un autre appel, il faut aussi l’ajouter dans les données.

Strict Si un paramètre est nécessaire pour évaluer une fonction, dès que l'évaluation du paramètre ne termine pas, l'appel de fonction ne termine pas non plus. Def. : une fonction F est stricte dans son ième argument si F(x1, , …, xi-1, ^, xi+1, ...) = ^

Exemple: Pascal Presque toutes les fonctions de la sémantique de Pascal sont strictes, parce qu'on évalue tous les paramètres avant un appel. Exception: le sens de l'instruction if ne nécessite pas d'évaluer une des deux parties.

Etat On représente ici l'état d'un programme par une fonction des variables vers leur valeur

Sémantique des instructions Pascal [[ S1 ; S2 ]] = [[ S2 ]] ° [[ S1 ]] [[ skip ]] = l x. x [[ if E then S1 else S2 ]] = lx. if ([[ E ]] (x) = true) then [[ S1 ]] (x) else [[ S2 ]] (x) [[ V := E ]] = lx. li. if i = V then [[ E ]] (x) else x(i) [[ while E do S ]] = lx. if ([[ E ]] (x) = true) then [[while E do S]] ° [[ S ]](x) else x

Récursivité la définition du while est récursive, mais pas bien fondée. Comment calculer son sens ? Ce doit être une solution de: W = lx. if [[ E ]] (x) then W ° [[ S ]](x) else x. Cette équation peut avoir plusieurs solutions, mais une seule est intuitive. Les solutions sont appellées points fixes de: F = lW. lx. if [[ E ]] (x) then W ° [[ S ]](x) else x.

« Y contient au moins l’info de X » Ordre d’information Pour comparer les solutions et choisir la plus naturelle, on définit un ordre partiel  X Y se lit « Y contient au moins l’info de X  » ou « X approxime Y »

Bouclage  = +1 est alors la seule solution. Considérons le programme f(x) = f(x)+1 Cette équation n’a pas de solution dans les nombres Le programme boucle à l’exécution On ajoute une valeur spéciale  qui représente le fait qu’un programme boucle.  = +1 est alors la seule solution.

Ordre partiel Un ordre partiel est une relation: Réflexive: X X Transitive: X Y et YZ implique X Z Antisymétrique: XY et YX implique X=Y

s Maj(Y) et m Maj(Y), sm Supremum Un majorant de Y est un élément b plus grand que tous ceux d'Y: bMaj(Y) = yY, yb Un majorant plus petit que les autres est le supremum de Y s=sup(Y) ssi s Maj(Y) et m Maj(Y), sm

(xi)i N telle que xixi+1 Chaîne Une chaîne est une suite croissante (xi)i N telle que xixi+1

Domaine Un domaine ou ordre partiel complet (CPO) est un ensemble X muni d'un ordre partiel  X contient un minorant  Toute chaîne de X a un supremum Intuition: Un programme qui boucle ne fournit aucune info: X On peut représenter l’info accumulée par un programme par le supremum de ses calculs partiels

CPO plat Pour les valeurs classiques, on ajoute juste  en dessous: x y ssi x =  ou x =y Par exemple: les entiers avec , noté Z, est obtenu ainsi. -4 -3 -2 -1 0 1 2 3 4  Exercice: est-ce bien un CPO?

CPO Union disjointe Si on a deux CPOs A, B on forme le type union disjointe de A et B en rajoutant encore un  en-dessous: A B A B Indique une valeur inconnue de B A+B Indique une valeur inconnue

f DC g ssi xD, f(x) Cg(x) Ordre ponctuel Pour les fonctions, on emploie l’ordre ponctuel: f DC g ssi xD, f(x) Cg(x) L’élément minimum est la fonction qui renvoie toujours .

Fonction monotone Une application entre CPOs est monotone si elle préserve l'ordre : Si x  y alors f(x) f(y)

Théorème de Tarski Si F est une application monotone d’un CPO dans lui-même, elle a un plus petit point fixe, noté fix(F).

Continuité pour l’ordre Une fonction f est continue si elle préserve les suprémums: Pour toute chaîne C: f(sup (C) ) =sup(f (C)) Attention cette continuité n’est pas celle de la topologie usuelle sur les nombres rééls! Avec cette déf, toute fonction continue est monotone.

Théorème de Scott Si f est une application continue d’un CPO dans lui-même, son plus petit point fixe peut se calculer en itérant f à partir de  , f(), f(f()), f(f(f())), … et en prenant le supremum fix(f) = supi(fi()) où fi(x) note f(f(…f(x)))

Preuve Ce supremum est un point fixe  = f0()  f() puisque CPO fi()  fi+1() par monotonie (fi()) i N est une chaîne, donc a un supremum s = supi(fi()) f(s) =f(supi(fi())) = supi(f(fi())) = s

Preuve (2) Il est le plus petit: Soit v un autre point fixe  v puisque CPO fi()  fi(v) = v par monotonie càd v majorant s  v def. supremum

Exemple Quel est le sens de la fonction récursive ML: f b = if b then 3 else 2*f(b) f : bool  int C’est le plus petit point fixe de H: H f b = if b then 3 else 2*f(b) On le calcule par la chaîne:  H  = if b then 3 else  H(H ) = if b then 3 else  Donc,  i>0, Hi  = if b then 3 else  = fix H = [[f]]

Continuité Pour appliquer le théorème de Scott, il faut que la fonction soit « continue » En pratique: toute fonction écrite en ML, Pascal, … est continue. Schéma de preuve: Les fonctions de base sont continues La composition préserve la continuité Un point fixe d’une fonctionnelle continue est continu.

Exemple de point fixe Quel est le sens de f n = n+(if n=0 then 0 else f(f(n-1)) R: le plus petit point fixe de H f n = n+(if n=0 then 0 else f(f(n-1)) H0  n =  H1  n = n+(if n=0 then 0 else ) = if n=0 then 0 else  H2  n = n+(if n=0 then 0 else H1  (if n-1=0 then 0 else )) = n+(if n=0 then 0 else if n=1 then 0 else ) = if n=0 then 0 else if n=1 then 1 else  …

Exemple de point fixe H3  n = H(H2 ) n = n+(if n=0 then 0 else H2 (H2 (n-1)) = n+(if n=0 then 0 else H2 (if n-1=0 then 0 else if n-1=1 then 1 else )) = if n=0 then n+0 else if n=1 then n+ H2  0 else if n=2 then n+ H2  1 else  = if n=0 then 0 else if n=1 then 1 else if n=2 then 2+ H2  1 else  = if n=0 then 0 else if n=1 then 1 else if n=2 then 3 else 

Exemple de point fixe H4  n = H(H3 ) n = n+(if n=0 then 0 else H3 (H3 (n-1)) = n+(if n=0 then 0 else H3  (if n-1=0 then 0 else if n-1=1 then 1 else if n-1=2 then 3 else )) = if n=0 then 0 else if n=1 then n+ H3  0 else if n=2 then n+ H3  1 else if n=3 then n+ H3  3 else  = if n=0 then 0 else if n=1 then 1 else if n=2 then 3 else if n=3 then  else  = if n=0 then 0 else if n=1 then 1 else if n=2 then 3 else  = H3  n : le point fixe est atteint

Interprétation Abstraite W447 Interprétation Abstraite L’interprétation abstraite est une technique pour calculer des propriétés d’un programme. En principe ces propriétés se déduisent de la sémantique du programme, mais celle-ci est trop coûteuse à calculer. On ne calcule donc que les propriétés qui nous intéressent; Le plus souvent ceci amène à faire des approximations. La sémantique sert à trouver et prouver ces approximations.

Interprétation Abstraite: cadre W470 Interprétation Abstraite: cadre 1. Une sémantique dénotationnelle compositionnelle [[ . ]] : programme  Domaine standard A Chaque construction f du langage a sa sémantique fA 2. On veut construire une sémantique abstraite compositionnelle qui retient les propriétés à calculer Abs : programme  Domaine abstrait B avec une relation d «est représenté par » entre les deux domaines : - compatible : si a d b , alors fA(a) d fB(b) - continue : si supi(ai) = a, supi(bi) = b, iN ai d bi, alors a d b

Exemple: Signe On veut que le compilateur calcule, si possible, le signe des expressions entières Domaine standard = Z Domaine abstrait = {0, p, n, ?} 0 représente 0: 0 d 0 p représente les nombres positifs: z d p ssi z>0 n représente les nombres négatifs: z d n ssi z<0 ? représente tout le domaine abstrait: z d ? n 0 p ?

Exemple: Signe: fonctions abstraites On construit les meilleures approximations des 4 opérations: + p 0 n ? p p p ? ? 0 p 0 n ? n ? n n ? ? ? ? ? ? - p 0 n ? p ? p p ? 0 n 0 p ? n n n ? ? ? ? ? ? ? * p 0 n ? p p 0 n ? 0 0 0 0 0 n n 0 p ? ? ? 0 ? ? / p 0 n ? p p err n ? 0 0 err 0 0 n n err p ? ? ? err ? ? d est continue (les chaînes sont finies).

Exemple: Signe: point fixe while i<v do begin f := i*f; i := i+1; end Le compilateur utilise des états abstraits Si n est positif à l’entrée de ce programme, il calcule que f et n seront positifs à la sortie. Avant la boucle: Après la boucle, par point fixe: i f v p i f v p

D’autres applications de l’interprétation abstraite L’interprétation abstraite permet au compilateur de calculer des réponses approchées à des questions comme: Des variables sont-elles synonymes ? Des structures de pointeurs ont-elles des cellules partagées ? Une fonction est-elle stricte ? Une fonction a-t-elle des effets de bord ? Une variable a-t-elle un effet sur une autre ? Combien de temps prend un programme ? Calculs sur les grammaires (voir plus loin)

Sémantique des grammaires non contextuelles Le sens d’un non-terminal X dans une grammaire G = (S, VN, VT, P) est l’ensemble des textes corrects pour X, càd {w  VT* | X * w }. Les règles d'une grammaire sont récursives: la théorie du point fixe convient donc pour leur donner un sens. Si on suppose qu'on a donné un sens à chaque non-terminal (càd on a une fonction de VN  P(VT*) ) alors on peut l'utiliser dans les règles de la grammaire pour calculer un nouveau sens. Le plus petit point fixe donne la sémantique de chaque non-terminal. La sémantique du symbole initial donne le langage de la grammaire. L'ordre utilisé est l'ordre sur les vecteurs d'ensembles: A1 (X)  A2 (X) ssi  X  VN, A1 (X)  A2 (X)

Continuité çunion, . suivi de, a symbole terminal, e chaîne vide. Toutes les grammaires définissent une fonction "continue" pour l'inclusion. En effet, le supremum pour l'inclusion est simplement l'union (infinie). Les grammaires BNF sont écrites avec les 4 opérateurs: çunion, . suivi de, a symbole terminal, e chaîne vide. On peut montrer qu'ils sont continus, p.ex.: Donc (i Li ).M = {x.y | i. xLi et yM} = i ( Li .M) Donc le langage peut se calculer par point fixe.

Exemple La grammaire P  = {A=, B=, C=} A ::= a A c | B B ::= b B | C C ::=  | C  = {A=, B=, C=} [[P]]  = {A=, B=, C=} [[P]]2  = {A=, B= , C= } [[P]]3  = {A= , B= {,b}, C= } [[P]]4  = {A= {ac,,b}, B= {,b,bb}, C= } On généralise: [[P]]n  = { A = {ai bj ci | i+j  n-3}, B = { bj | j  n-2}, C= si n  1, C=  sinon } On fait la preuve par induction Puis le passage à la limite: fix [[P]] = { A = {ai bj ci }, B = { bj }, C=  }

Interprétation abstraite de grammaires Le calcul des k premiers symboles terminaux (voir chap.2) est une interprétation abstraite. L'opérateur . (suivi de) est donc abstrait en une concaténation bornée à k symboles. Les autres sont inchangés. Le domaine abstrait des langages bornés à k caractères a des chaînes finies, donc le calcul du point fixe converge finiment.