Calculabilité Mémento Ensembles Fonctions

publicité
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
Téléchargement