Cours 5 : Sémantique

Sémantique

Ex :

Sémantique de C :

Projet CompCert :

Deux grands styles de sémantique :

  • Sémantiques opérationnelles :
    • un programme = un gigantesque automate / graphe, dont les sommets sont les configuration
      • ex: pour un ordinateur de 4GB de RAM, il y a environ 232.109 de configurations : beaucoup trop énorme pour représenter le graphe dans l’univers physique

⟶ on s’autorise des graphes dont les sommets sont des configurations en nombre infini dénombrable.

De plus : on définit une relation binaire notée :

CC

transition de la configuration C vers C

Attention : “relation”, et pas “fonction”, car le graphe n’est pas forcément déterministe.

ex concret : on lit des sockets ⟶ on ne peut pas prédire ce qui sera stocké dans la chaîne (on ne sait ce qu’on va recevoir, à part si on a modélisé tout les univers possibles : pas faisable)

  • Sémantiques dénotationnelles : les plus anciennes

Pour

  • une expression e, on décrit sa valeur e
  • une commande c, on décrit sa valeur c

NB : opérateur : sémantique des valeurs

Environnement :
𝜌{Varx𝜌(x)
x𝜌=𝜌(x)

NB : c’est du pipeau

Sémantique d’une commande :

on veut l’environnement à la fin de la commande.

𝜌[xv] :

c’est la fonction qui :

  • à x associe v
  • à tout yx associe 𝜌(y)

expression / environnements vers les environnements

OU

commandes / environnements vers les environnements

NB :

En logique : “frame problem” : on est obligé de préciser systématiquement “y n’a pas changé” ⟶ alourdit les preuve

MAIS : produit de séparation résout ça

Gros problème : while : par bien fondé !

while1doskip𝜌while1doskip(skip𝜌)=while1doskip(𝜌)

Comment on résout ce problème ? avec un théorème de point fixe fonctionnel.

Sémantique 0 (opérationnelle, petits pas)

Une configuration est :

  • un couple (c,𝜌) d’une commande et d’un environnement
  • OU : 𝜌 (si on a terminé l’exécution)

NB :

en fait,

  • commandes ci intervalles
  • environnements 𝜌 poteaux

NB :

aucun problème définitionnel, pour les sémantiques opérationnelles : ensemble de règles

Sémantique 1 (opérationnelle, petits pas)

Une configuration est :

  • un couple (C,𝜌) d’une liste de commandes et d’un environnement
    • NB : (𝜀,𝜌) est une configuration sans successeur : phénomène de terminaison
  • OU : (𝜀,𝜌) (si on a terminé l’exécution)

Deadlock : en programmation parallèle, on a deux threads qui manipulent une même variable x.

Pour éviter ça : systèmes de synchronisation :

  • ex: les sémaphores de Djikstra : P, V (en hollandais : “essayer d’acquérir, libérer”)
    • il n’y a pas deux processus qui peuvent acquérir le même sémaphore en même temps

Contrat : n’utiliser x que quand j’ai le sémaphore, puis je le passe aux autres.

Mais problème : 2 processus se battent pour deux sémaphores :

  • le premier veut A, puis B
  • le deuxième veut B, puis A

chacun des deux veut acquérir le sémaphore de l’autre et attend que l’autre le lâche : il reste des trucs à faire, mais bloqué ⟶ deadlock.

Sémantique opérationnelle à grands pas

Plutôt que décrire l’exécution étape par étape élémentaires, ça nous décrit directement comment passer de la configuration initiale à la configuration finale.

NB : ne parle QUE des programmes qui temrminent.

C’est même une caractérisation : un programme termine ssi il existe une dérivation pour ce programme


Ce qu’on prétend :

les sémantiques opérationnelles à petit pas et grand pas font la même chose.

Si

(C,𝜌)(𝜀,𝜌)

alors

𝜌C;𝜌

NB : attention, C est une liste de commandes, alors que C; est une commande ⟶ on “convertit” tous les “” en “;”, avec

  • 𝜀;=skip
  • (cC);=c;C;

HS : Lemme de Yoneda

Proposition :

Si (C1,ρ1)(C2,ρ2) dans la sémantique à petits pas, alors :

Pour tout environnement ρ tel que ρ2C2;ρ est dérivable en sémantique à grands pas, ρ1C1;ρ est aussi dérivable en sémantique à grands pas.

Adéquation :

Utiliser un lemme intermédiaire :

C,(cC,𝜌)(C,𝜌)

Par ex, pour (Seq) :

((c1;c2)C,𝜌)(c1c2CC)(C,𝜌)(C,𝜌)

Optimisations d’un compilateur : se font par des techniques d’analyse statique basées sur les sémantiques.

Unique point pénible : assurer la terminaison.


Retour sur la sémantique dénotationelle

x:=e𝜌=𝜌[xe𝜌]skip𝜌=𝜌whileedoc𝜌={whileedoc(c𝜌) si e𝜌0𝜌

On a vu que whileedoc𝜌 n’est pas bien fondé, en fait : en cas d’existence, c’est un point fixe de la fonction :

F:f{f(c𝜌) si e𝜌0𝜌

Treillis

Treillis :

Ensemble ordonné dans lequel toute paire (d’éléments) admet une borne sup et une borne inf. (cf. diagramme de Hasse qd x,y non comparables).

Treillis complet :

Si, de plus, pour toute partie FE, F admet un borne sup et une borne inf.

Supposer que l’existence d’une borne sup suffit : l’existence d’une borne inf est un théorème.

Dém :

Considérons le sup a0 de l’ensemble A des minorants d’une partie B.

Si a0A, a0 est une borne inf de B.

Montrons que c’est le cas : pour tout bB, mq a0b, i.e aA,ab.

Si aA, ab est bien, par définition de A (ensemble des minorants de B).

NB : Un treillis complet a un plus grand (resp. petit) élément, puisque EE a une borne sup (qui lui appartient ⟶ plus grand élément).

Ex:

1) (0,|) est un treillis (non complet, car seules les parties finies admettent une borne sup a priori (l’ensemble n’a pas de majorant)).

2) (𝒫(X),) est un treillis complet :

  • Borne sup de S𝒫(X) = YSY
  • Borne inf de S𝒫(X) = YSY

3) Pour une topologie, l’ensemble des ouverts est un treillis complet (l’union d’ouverts reste un ouvert (borne sup)).

L’inf d’une famille d’ouverts, c’est l’intérieur de l’intersection.


Point fixe d’une applcation f:EE :

Un élément x tq f(x)=x

Th de Knaster-Tarski : Soit (E,) un treillis complet, f:EE monotone.

Alors f admet un plus petit pt fixe, et un plus grand pt fixe.

NB :

  • fonction “monotone” : c’est un anglicisme (pour dire “croissante”).
  • en fait, on a même mieux : l’ensemble des points fixes est un treillis complet.
  • Heuristique :

    • (fn())n est une suite croissante.
    • si en on note f𝜔() le sup : on a f𝜔()f𝜔+1()
    • puis, avec les ordinaux : f𝜔k()f𝜔k+1()
    • particularité des ordinaux : le sup d’une famille est un ordinal
    • puis : paradoxe de Burali-Forti
      • l’ensemble de tous les ordinaux est un ordinal : bizarre car cet ordinal est alors strictement plus grand que lui-même (à la Russel)
      • en fait : il n’y a pas d’ensemble des ordinaux.
    • donc ici : comme on a bien a affaire à un ensemble, on ne peut pas avoir stricte croissance de la suite précédente ⟶ il y a un point fixe.

Dém :

On pose F{xE;xf(x)}

NB : un x tel que xf(x) s’appelle un post-point fixe (même déf pour “pré-point fixe”)

On remarque que F, donc F.

Comme (E,) est un treillis complet, F admet une borne sup y.

Mq yF :


Soit xF : xy, et donc (f monotone) f(x)f(y).

Ainsi xf(x)f(y)

Donc f(y) majore F, et donc yf(y) (y : + petit des majorants de F), donc yF (déf de F).


Par monotonie de f : f(F)F.

Donc f(y)F, et donc f(y)y, d’où y=f(y)

Comme F contient tous les pts fixes de f, alors y est le plus grand point fixe de f.

(dém analogue pour la borne inf)

Application : Th de Cantor-Bernstein

Dém :

Soient E,F deux ensembles, f:EF et g:FE injectives.

On pose H{𝒫(E)𝒫(E)XEg(Ff(X))

Cantor Bernstein

(H=G sur ce dessin)

1) Mq H est monotone.

Soient X,YE tq XY.

XYf(X)f(Y)Ff(Y)Ff(X)g(Ff(Y))g(Ff(X))H(X)=Eg(Ff(X))H(Y)=Eg(Ff(Y))

Par le th de Knaster-Tarski, H admet un point fixe Z.

Z=H(Z)=Eg(Ff(Z))EZ=g(Ff(Z))

On définit h{EFx{f(x) si xZg1(x) sinon. 

NB : Comme EZ=g(Ff(Z)), si xZ, uFf(Z);x=g(u), et u est unique par injectivité de g.

Mq h est injective :

Si x,yE;h(x)=h(y).

  • Si x,yZ : x=y par injectivité de f
  • Si x,yZ : x,y ont le même antécédent par g, donc x=y
  • Si xZ,yZ : h(x)=f(x)f(Z), h(y)=g1(y)Ff(Z), donc h(x)h(y).

Mq h est surjective :

Soit yF.

  • Si yf(Z),zZ;y=f(z), et y=f(z)=h(z)
  • Si yf(Z),y=g1(g(y))=h(g(y))

Langages algébriques

Langages reconnus par automates à piles.

Ex :

Grammaire :

  • S𝜀
  • aSb

⟹ Langage anbn,n

f(L)=LaLb

anbn,n est le plus petit point fixe de f.


Directed Complete Partial Order (DCPO) :

Un ensemble partiellement ordonné tel que toutes les familles dirigées aient des bornes sup.

Famille dirigée (xi)iI d’élément de X :
  • famille non vide
  • telle que : i,j,k;xi,xjxk
mon_graphe x_i x_i x_k x_k x_i--x_k x_j x_j x_j--x_k

Exs de DCPO :

  • tout treilis complet
  • L’ensemble de Scott

    {[a,b]|a,b,ab}

    muni de l’ordre

    NB : ça n’est pas un treillis complet, à cause de l’ensemble vide.

f:XY est Scott-continue ssi :
  • f monotone
  • (xi)iI dirigée dans X, supiIf(xi)=f(supiIxi)

Notation : L’ensemble des fonctions Scott-continues de X ) Y est noté [XY]

NB :

  • ça coïncide bien avec la continuité pour la topologie de Scott.
  • la famille (f(xi))i est dirigée, d’où l’existence du sup
  • pour vérifier cette égalité, on procède par double inégalité, sachant que supiIf(xi)f(supiIxi) est toujours vraie

    • seule chose à démontrer, sachant que f monotone : supiIf(xi)f(supiIxi)

Th de Kleene : Soit X un dcpo pointé (i.e avec un plus petit élément ).

Toute fonction Scott-continue f:XX a un plus point fixe :

lfp(f)supnfn()

(fn())n est une chaîne, donc dirigée.

Posons

x=supnfn()

Alors :

f(x)=f(supnfn())=supnfn+1()

(par Scott-continuité)

Donc :

x=f(x) et x est un point fixe.

Montrons que c’est le plus petit :

Si y est un autre point fixe :

yf()f(y)=yn,fn()yxy

(x est le sup = le plus petit des majorants) ___

Fait : Si X et Y sont des DCPO, alors X×Y reste un DCPO

où : (x,y)(x,y)(xXxyYy)

NB : Selon Gordon Plotkin : en théorie des domaines, soit

  • ça foire lamentablement
  • ça réussit magnifiquement

Preuve :

Soit ((xi,yi))iI une famille dirigée.

Montrons que son sup est

(x,y)(supixi,supjyj)

lequel existe car :

  • (xi)i, (yi)i sont dirigées

    • projeter sur la première composante le majorant exhibé par la définition de “((xi,yi))iI est une famille dirigée”
  • (x,y) est un majorant : par déf
  • c’est le plus petit :

    • Si iI,(x,y)(xi,yi), alors i,xxi et i,yyi.
    • Donc xsupixi et ysupiyi.
    • Donc (x,y)(supxi,supyi)=(x,y)

Proposition : Si X et Y sont des DCPO, l’ensemble des fonctions Scott-continues [XY] est un DCPO :

  • f[XY]g ssi xX,f(x)Yg(x)
  • Pour toute famille dirigée (fi)iI :
    • (supifi)(x)=supi(fi(x))

Dém :

Se déroule naturellement :

  • bonne définition : évidente en montrant que (fi(x))i est dirigée
  • monotonie de f : caractérisation du sup
  • Scott-continuité de f : en utilisant le fait que supisupj=supjsupi (on fait commuter les quantificateurs universels)
  • f est un majorant des fi : en utilisant x,i=i,x
  • f est plus petite que tout majorant g des fi : en utilisant x,i=i,x

Propriété : L’application

App:{[XY]×XY(f,x)f(x)

Dém :

  • App monotone
  • Soit (fi,xi)i dirigée dans [XY]×X.

On va avoir un problème : quantification sur i et j d’un côté, quantification que sur k de l’autre.

Il y a une inégalité claire.

L’autre vient du fait que la famille de couples considérée est dirigée.

NB : en topologie :

  • notion de continuité séparément et de continuité conjointement
  • Normalement : elles ne coïncident pas du tout (reprendre les exemples classiques d’analyse)
  • Mais ici, dans les DCPO avec la topologie de Scott : continuité séparément = continuité conjointement, ce qui est un miracle !

    • c’est pour ça que tout va marcher, en sémantique !
  • la catégorie des CPO avec la topologie de Scott est cartésienne close !

Lifting du DCPO X, noté X :

c’est X muni d’un minimum , et ça reste un DCPO.

DCPO obtenu à partir d’un ensemble E :

c’est le DCPO (E,=)

DCPO plat :

c’est un DCPO de la forme (E,=), où E est un ensemble.


Retour à la sémantique dénotationnelle

whileedoc𝜌={𝜌 si e𝜌=0 si e𝜌0c𝜌=whileedoc(c𝜌) si e𝜌0c𝜌

Donc en posant fwhileedoc :

f:𝜌Fe,c(f){𝜌 si e𝜌=0 si e𝜌0c𝜌=f(c𝜌) si e𝜌0c𝜌

Donc on pose :

whileedoc=lfp(Fe,c)

On se place dans le DCPO [EnvEnv] (on n’a pas à se préoccuper de la continuité des fonctions : elles sont toutes continues dans EnvEnv (DCPO plat)).

NB :

il faut montrer que la fonction Fe,c est Scott-continue.

  • en utilisant la cloture par composition des fonctions Scott-continues, et la continuité de la fonction App.

Miracle : en choisissant le plus petit point fixe, on va montrer l’équivalence des sémantiques dénotationnelle et opérationnelles.

NB :

  • le théorème de correction n’utilise que le fait que c’est un point fixe.


Équivalence contextuelle

Morris : deux programmes sont équivalents ssi on ne voit pas la différence : à toute entrée, ils donnent la même sortie.

Programme équivalents ⟺ ont le même comportement (i.e on observe les mêmes effets) dans le même contexte.

Mais dans notre cas : on prendra un critère beaucoup plus faible :

  • même comportement =

    • terminent sur les mêmes entrées
    • donnent zéro dans sur les mêmes entrées

⟶ mais par une réduction (en considérant les contextes qui plantent quand 0 est renvoyé), cela revient au même

Th (c,𝜌)(c,𝜌)c𝜌=c𝜌

  • :

De la sémantique dénotationnelle de la séquence, on déduit :

c𝜌=c𝜌c;C;𝜌=c;C;𝜌

Leave a comment