Institut Galilée L3 S6 – Année 2014–2015 Calculabilité Mémento Ensembles On dit qu’un ensemble X est un sous-ensemble d’un ensemble Y , ou est inclus ou contenu dans Y (notation : X ⊆ Y ) quand tout élément de X est aussi élément de Y . On dénote par ∅ l’ensemble vide, qui ne contient aucun élément. Dans le cas où X ⊆ Y on appelle Y \ X le complément de X par rapport à Y . On dit simplement “complément de X” et on écrit X, lorsque l’ensemble Y est clairement identifié par le contexte. Fonctions Fonctions totales Une fonction totale est définie par trois choses : 1. son ensemble de définition A, appelé également son ensemble de départ ou son domaine, 2. son ensemble d’arrivée B, appelé également son co-domaine, 3. et la donnée pour chaque élément a ∈ A de exactement une image de a, également appelée valeur de la fonction en a, dans l’ensemble d’arrivée B. De façon équivalente, une fonction totale f est un sous-ensemble de A × B tel que existence : pour tout a ∈ A, il existe au moins un b ∈ B tel que (a, b) ∈ f ; unicité : pour tout a ∈ A, il existe au plus un b ∈ B tel que (a, b) ∈ f . On dit que f est définie sur A et à valeurs dans B et on note f : A → B ; la valeur de f en a est notée f (a). Si besoin, on note A → B ou B A l’ensemble des fonctions totales de A vers B. Injection, surjection, bijection Étant donnée une fonction f : A → B, on dit que – f est injective si pour tout a, a0 ∈ A, f (a) = f (a0 ) implique a = a0 , – f est surjective si pour tout b ∈ B, il existe au moins un a ∈ A tel que f (a) = b, – f est bijective ssi f est injective et surjective. Composition. Soient f : A → B et g : B → C deux fonctions ; la composée de f et de g est la fonction g ◦ f : A → C définie par (g ◦ f )(a) = g(f (a)). Image d’un ensemble. Étant donnée une fonction f : A → B et un sous-ensemble E ⊆ A, l’image de E par f est l’ensemble des images des éléments de E : f (E) = {f (e) ; e ∈ E}. −1 De même, si F ⊆ B, on note f (F ) l’image réciproque de F , c’est à dire le sous-ensemble de A constitué des a ∈ A dont l’image est dans F : f −1 (F ) = {a ∈ A ; f (a) ∈ F }. Ensemble caractéristique. Tout sous-ensemble E d’un ensemble A détermine une unique fonction χE : A → {0, 1} appelée fonction caractéristique de E dans A et définie par : ( 1 si a ∈ E χE (a) = 0 si a ∈ /E Réciproquement étant donnée une fonction χ : A → {0, 1}, celle-ci détermine une unique partie Aχ de A définie par : Aχ = {a ∈ A ; χ(a) = 1}. Par conséquent, il y a une bijection entre l’ensemble des fonctions de A dans {0, 1} et P (A). Jean-Yves Moyen & Luc Pellissier 1 Institut Galilée L3 S6 – Année 2014–2015 Fonctions partielles Une fonction partielle est définie par trois choses : 1. son ensemble de départ A, 2. son ensemble d’arrivée B, ou co-domaine, 3. et la donnée pour chaque élément a ∈ A de au plus une image de a dans B. De façon équivalente, une fonction partielle f peut être vue comme un sous-ensemble de A×B tel que unicité : pour tous a ∈ A, il y a au plus un b ∈ B tel que (a, b) ∈ f . C’est-à-dire que la seule différence entre une fonction totale et une fonction partielle est que cette dernière ne doit pas satisfaire la propriété d’existence. On note f : A → B⊥ quand f est une fonction partielle de A dans B. Pour tout a ∈ A, on dit que f (a) converge, noté f (a) ↓, s’il existe b ∈ B tel que (a, b) ∈ f , sinon on dit que f (a) diverge, noté f (a) = ⊥ ou f (a) ↑. Le domaine d’une fonction partielle f : A → B⊥ est l’ensemble, noté dom(f ), d’éléments a ∈ A où f (a) converge : dom(f ) = {a ∈ A ; f (a) ↓}. Composition. La composition de deux fonctions partielles f : A → B⊥ et g : B → C⊥ est la fonction partielle (g ◦ f ) : A → C⊥ définie par ( g(f (a)) si f (a) ↓ et g(f (a)) ↓, (g ◦ f )(a) = ⊥ sinon. Cardinalité N est de cardinal infini ℵ0 (“Aleph 0”). C’est le plus petit cardinal infini. Les ensembles en bijection avec N sont de cardinal ℵ0 et sont dits dénombrables. N, Z, Q et D sont dénombrables. P (N) n’est pas dénombrable (Cantor, diagonalisation). C’est équivalent à R qui n’est donc pas dénombrable. le langage While : syntaxe. While a un seul type de données : le type D des arbres binaires, défini par la grammaire suivante. · D 3 d, e ::= nil | e d La syntaxe des programmes est donnée par la grammaire suivante : Expressions 3 E, F ::= X (variable) |d (constante) | cons E F (cons) | hd E (“tête” / fils gauche) | tl E (“queue” / fils droit) | =? E F (test d’équalité) Commandes 3 C, D ::= X:=E (affectation) | C;D (séquence) | while E do{C} Programmes 3 P ::=read X; C; write Y Jean-Yves Moyen & Luc Pellissier 2 Institut Galilée L3 S6 – Année 2014–2015 Sucre syntaxique – false ≡ nil – if E then C équivaut à Z:=E;while Z do{Z:=false;C} – if E then C else D équivaut à Z:=E;W:=true; while Z do{Z:=false;W:=false;C} while W do{W:=false;D} · – true ≡ nil nil Listes · · La liste des n éléments [d1 , · · · , dn ] de D est représentée par l’arbre d1 · d2 .. . · dn nil Entiers naturels Chaque entier n ∈ N est représenté par le “numéral” n ∈ D comme suit : 0 = nil ≡ [ ] · n+1= nil n ≡ [nil, · · · , nil] {z } | n + 1 fois Sémantique de While Évaluation des expressions Une mémoire σ (ou un état de la mémoire, en anglais store) est une fonction qui associe à chaque variable une valeur, c’est-à-dire un arbre binaire : σ : Variables → D La définition de EJEKσ est donnée par induction structurelle sur E selon les règles suivantes : · e si EJEKσ = EJtl EKσ = e d EJXKσ = σ(X) nil si EJEKσ = nil EJdKσ = d · · d EJcons E FKσ = si EJEKσ = EJhd EKσ = EJEKσ EJFKσ e d ( nil si EJEKσ = nil true si EJEKσ = EJFKσ EJ=? E FKσ = false sinon Jean-Yves Moyen & Luc Pellissier 3 Institut Galilée L3 S6 – Année 2014–2015 Sémantique des commandes L’évaluation d’une commande modifie la mémoire. On assocuie donc à chaque commande une fonction des mémoires vers les mémoires. Comme une commande peut ne pas terminer (boucle infinie), il s’agit d’une fonction partielle : J•K : Commandes → (Mémoires → Mémoires⊥ ) Quand elle est définie, l’évaluation des commandes vérifie les règles suivantes : ( X 7→ EJEKσ JX:=EK(σ) = Y 7→ σ(Y) si Y 6= X JC;DK(σ) = JDK(JCK(σ)) = JDK(σ 0 ) avec σ 0 = JCK(σ) si EJEKσ = nil Jwhile E do{C}K(σ) = σ Jwhile E do{C}K(σ) = JC;while E do{C}K(σ) = Jwhile E do{C}K JCK(σ) si EJEKσ 6= nil Sémantique des programmes La sémantique du langage While est la fonction : J•K : Programmes → (D → D⊥ ) associant à un programme P = read X; C; write Y une fonction partielle des entrées vers les sorties définie par JPK(d) = e si JCK(σdX ) = σ et σ(Y) = e où σdX est la mémoire initiale de P, qui associe d à X et nil à toutes les autres variables. Codage de While pC;Dq = [;, pCq, pDq] pwhile E do{C}q = [while, pEq, pCq] pVi q = [var, i] pVi :=Eq = [:=, [var, i], pEq] pdq = [quote, d] pcons E Fq = [cons, pEq, pFq] pread Vi ; C; write Vj q = [[var, i], pCq, [var, j]] phd Eq = [hd, pEq] ptl Eq = [tl, pEq] p=? E Fq = [=?, pEq, pFq] Calculabilité 1. Une fonction partielle f : D → D⊥ est While calculable si et seulement si il existe un programme While P tel que f = JPK, c’est-à-dire que pour tout d, e ∈ D : – f (d) =⊥, si et seulement si JPK(d) =⊥. – f (d) = e ∈ D, si et seulement si JPKd = e ∈ D. 2. Un ensemble A ⊆ D est While décidable si et seulement si il existe un programme While P tel que JPK(d) ↓ pour tout d ∈ D, et en plus d ∈ A si et seulement si JPK(d) = true. Dans ce cas, la fonction caractéristique χA est While calculable. 3. Un ensemble A ⊆ D est While semi-décidable si et seulement si il existe un programme While P tel que pour tout d ∈ D, d ∈ A si et seulement si JPK(d) = true (mais P peut diverger sur les entrées n’appartenant pas à A). 4. Un ensemble A ⊆ D est While énumérable si et seulement si soit A = ∅ soit il existe un programme While P tel que pour tout d ∈ D, JPK(d) ↓ et A = {JPK(d) ; d ∈ D}. “Semi-décidable” est équivalent à “énumérable”. C’est-à-dire qu’un ensemble est semi-décidable si et seulement si il est énumérable. Jean-Yves Moyen & Luc Pellissier 4 Institut Galilée L3 S6 – Année 2014–2015 Théorème de la Halte Soit halt la fonction (mathématique) qui a comme arguments un programme (ou du moins son encodage) P et un arbre d et qui indique si JPK(d) converge ou diverge. Théorème 1 (Théorème de la Halte, Turing 1936). halt n’est pas calculable. C’est-à-dire qu’il n’existe pas de programme While H tel que JHK = halt. La preuve se fait par diagonalisation. On suppose que H existe et on va utiliser la technique de la diagonale pour créer une absurdité. Preuves par réduction Pour faire d’autres preuves de non-calculabilité, on n’a pas besoin de revenir à la diagonalisation à chaque fois. L’idée est de construire une absurdité de la forme : Si f était calculable, alors halt serait aussi calculable. Une telle implication se construit en faisant une réduction de halt vers f . C’est-à-dire en trouvant une transformation calculable entre les entrées de halt et celles de f . C’est à dire · · )) = halt( ). Puisque halt n’est pas qu’il faut une fonction τ telle que f (τ ( d d pPq pPq calculable, on ne peut pas calculer le membre droit de cette égalité. Donc on ne peut pas calculer non plus le membre gauche. Ce qui implique que soit f soit τ n’est pas calculable. Autrement dit, si f est calculée par un programme read Xf ; Cf ; write Yf et que τ est calculée par read Xτ ; Cτ ; write Yτ , alors on pourrait calculer halt avec le programme : read Xτ ; Cτ ; Xf :=Yτ ; Cf ; write Yf Comme halt n’est pas calculable, c’est que soit f soit τ ne l’est pas non plus. Et donc si τ est calculable, f ne l’est pas. Ordre sur les fonctions La notion de réduction permet de définir un pré-ordre sur les fonctions. On dit que f est plus facile que g, et on note f v g, si il existe une transformation calculable τ telle que pour toute entrée x, on a f (x) = g(τ (x)). La notation v est faite pour rappeler ≤ mais en remplaçant le triangle par un carré. C’est pour indiquer que c’est un pré-ordre qui se comporte donc beaucoup comme ≤ (en particulier pour la transitivité). Pourquoi cette relation implique que f est plus facile que g ? parce que si τ calculable existe, on a alors la propriété suivante : si g est calculable, alors f est aussi calculable. f est donc plus facile au sens plus facilement calculable. À l’inverse, si f n’est pas calculable, alors g non plus (parce que τ est calculable). C’est exactement ce qu’on a fait au début. On a montré (en exhibant τ ) que halt v idem ; et puis, puisque halt n’est pas calculable, on a conclut que idem qui est encore plus dure ne peut pas l’être. Théorème de Rice Définition 1. Soit A un ensemble de programmes. On dit que A est non-trivial si A n’est pas vide et que A ne contient pas tous les programmes (A n’est pas vide). On dit que A est extensionnel si il ne sépare pas deux programmes calculant la même fonction : Si JPK = JQK alors soit P et Q sont tous les deux dans A, soit aucun des deux n’est dans A. Théorème 2 (Théorème de Rice). Soit A un ensemble de programmes non-trivial et extensionnel. A n’est pas calculable. Jean-Yves Moyen & Luc Pellissier 5 Institut Galilée L3 S6 – Année 2014–2015 Thèse de Church-Turing L’ensemble des fonctions calculable est le même quelque soit le langage de programmation choisi. Goto Définition Syntaxe : même expressions que While, Instructions et programme selon la grammaire suivante. N 3 l, l0 Instructions 3 I ::= X:=E| if E then goto l else goto l0 Programmes 3 P ::=read X ; {l : Il } write Y Sémantique : ( X 7→ EJEKσ – Si Il = X:=E alors on définit σ = Y 7→ σ(Y) si Y 6= X Et on a JIKG (σ, l) = JIKG (σ 0 , l + 1). – Si Il = if E then goto l0 else goto l00 alors ( JIKG (σ, l00 ) si EJEKσ = nil JIKG (σ, l) = JIKG (σ, l0 ) sinon 0 – Finalement, si Il n’existe pas (si l > n, autrement dit si on a atteint la fin du programme) alors JIKG (σ, l) = (σ, l) où σdX JPKG (d) = e JIKG (σdX , 1) = (σ, l) si et σ(Y) = e est la mémoire initiale de P, qui associe d à X et nil à toutes les autres variables. Compilation While vers Goto : hX:=E, liW G ={l : X:=E}, l + 1 hC1 ;C2 , liW G =E 0 ∪ E 00 , l00 avec E 0 , l0 = hC1 , liW G et E 00 , l00 = hC2 , l0 iW G hwhile E do{C}, liW G =E 0 ∪ {l : if E then goto l + 1 else goto l0 , l0 − 1 : if E then goto l else goto l}, l0 avec E 0 , l0 − 1 = hC, l + 1iW G hread X; C; write YiW G = read X; π1 (hC, 1iW G ); write Y où π1 (a, b) = a (première projection). Goto vers While : hl : X:=EiGW =if =? IP l then {X:=E;IP:=0;IP0 :=l + 1} hl : if E then goto l0 else goto l00 iGW =if =? IP l then {if E then IP0 :=l0 else IP0 :=l00 ;IP:=0} Soit P ≡ read X; I; write Y avec I = {1 : I1 , . . . , n : In }. On définit Q = hPiGW comme le programme suivant : read X ; IP:=1 while not =? IP n + 1 do Jean-Yves Moyen & Luc Pellissier 6 Institut Galilée { h1 : I1 iGW ; h2 : I2 iGW ; ... hn : In iGW ; IP:=IP0 ; } write Y L3 S6 – Année 2014–2015 Machines à Compteurs CM Sémantique des expressions. Mêmes instructions que Goto, expressions selon la grammaire suivante. EJnKC σ =n EJXKC σ =σ(X) EJE + FKC σ =EJEKC σ + EJFKC σ EJE ∗ FKC σ =EJEKC σ × EJFKC σ EJE/FKC σ =bEJEKC σ/EJFKC σc EJE − FKC σ = max(0, EJEKC σ − EJFKC σ) EJn ↑ EKC σ =n(EJEKC σ) 0 si EJEKC = 0 0 EJlogb EKC σ = sinon, le plus grand k tel qu’il existe m avec k b · m = EJEKC σ ExpressionsC 3 E, F ::= n| X | E + F| E − F | E ∗ F| E/F | n ↑ E| log0b E | =? E F EJ=? E FKC σ =1 si EJEKC σ = EJFKC σ et 0 sinon. Compilation depuis Goto hcons E FiGC =1 + (2 ↑ hEiGC ) ∗ (3 ↑ hFiGC ) · * =1 + 2 d hhd EiGC σ = log02 hEiGC hniliGC =0 + e htl EiGC σ = log03 hEiGC hdiGC heiGC ×3 h=? E FiGW ==? hEiGW hFiGW GC hXiGC =X Restrictions de CM Mêmes instructions que les CM, les expressions sont restreintes aux formes suivantes. VCM SCM ExpressionsV 3 E, F ::= n| X ExpressionsS 3 E, F ::= 0| 1| X | X + Y| X − Y | X + 1| X − 1 | X ∗ Y| X/Y | X ↑ n| log0b X | =? X Y Jean-Yves Moyen & Luc Pellissier 7 Institut Galilée L3 S6 – Année 2014–2015 Machines de Turing Une machine de Turing est définie par un alphabet Σ qui doit contenir le symbole blanc ’#’ et au moins un autre symbole, un ensemble d’états Q, un état initial q0 , un état acceptant (ou final) qf et un fonction de transition δ : Q × Σ → Q × Σ × {←, ↓, →} Une configuration d’une machine de Turing est un couple qui contient un état et un mot de Σ∗ (le ruban). Un des symbole du mot est marqué (position de la tête de lecture). L’exécution d’une machine de Turing est la suite des configurations rencontrées. Jean-Yves Moyen & Luc Pellissier 8