Calculabilité
Calculabilité
Calculabilité
CONTENU DU COURS
Chapitre 1. INTRODUCTION
1.1. Motivation
1.2. Les problèmes et programmes
1.3. La formalisation des problèmes
1.4. La description de langages
1.5. Les langages non réguliers
Chapitre 2. LES AUTOMATES FINIS
2.1. Introduction
2.2. Description
2.3. Formalisation
2.4. Représentation et exemples
2.5. Les automates finis non-déterministes
2.6. L’élimination du non déterminisme
2.7. Automates finis et expressions réguliers
Chapitre 3. LES GRAMMAIRES REGULIERES
3.1. Introduction
3.2. Les grammaires
3.3. Les grammaires régulières
3.4. Les langages réguliers
3.5. Au-delà des langages réguliers
3.6. Les applications des langages réguliers
Chapitre 4. AUTOMATES A PILE ET LANGAGES HORS-CONTEXTE
4.1. Les automates à pile
4.2. Les langages hors-contexte
4.3. Au-delà des langages hors-contexte
4.4. Les automates à pile déterministes
Chapitre 1. INTRODUCTION
1.1. MOTIVATION
L’objectif de la science informatique étant le calcul, mais le calcul au sens
large, c'est-à-dire non limité exclusivement à la manipulation des nombres,
mais de tout type d’informations formelles que l’on peut traiter de manière
systématique tel que : textes, couleurs, données, valeurs logiques.
Une connaissance élémentaire de la calculabilité fait maintenant partie du
bagage scientifique indispensable à l’informatique.
La calculabilité est une discipline qui fait partie de l’informatique théorique.
Son but est apprendre aux étudiants à reconnaître ce qui est calculable et ce qui
n’est le pas, par l’informatique.
Dans ce cours, nous allons étudier les limites qui sont indépendantes
de la réalisation physique des machines. Nous allons par exemple, démontrer
que certains problèmes ne sont pas solubles et ne le seront jamais, quel que soit
les développements technologiques futurs. Ainsi, notre approche sera basée sur
des principes fondamentaux indépendants de la technologie.
La calculabilité tire ses origines vers les années 1930 (avant l’apparition
des ordinateurs) dans le cadre de preuves formelles initiées par les logiciens et
les mathématiciens.
1.2. LES PROBLEMES ET PROGRAMMES
La question fondamentales que nous nous posons et celle de savoir, quels
problèmes sont solubles par un programme exécuté sur ordinateur.
Pour pouvoir répondre à cette question de façon rigoureuse, nous devons
préciser les deux notions qui y interviennent :
la notion de problème,
la notion de programme exécuté sur un ordinateur.
1.2.1. Notion de problème
Caractéristiques
- un problème est une question générique, c'est-à-dire une question qui
s’applique à un ensemble d’éléments.
- Chaque question posée qui constitue alors l’instance du problème, doit avoir
une réponse oui ou non.
- La notion de problème est indépendante de la notion de programme,
d’autant plus qu’on peut avoir un problème sans avoir un problème
le résolvant. De plus, il existe le plus souvent plusieurs programmes
permettant de résoudre un même problème.
Soit un problème binaire dont les instances sont encodées par les mots
définis sur un alphabet . L’ensemble de tous les mots définis sur peut être
partitionné en trois sous ensembles :
les mots représentant les instances du problème pour lesquelles
la réponse est oui, ce sont les instances positives ;
les mots représentant des instances du problème pour lesquelles
la réponse est non, ce sont les instances négatives ;
les mots qui ne représentent pas des instances du problème.
On regroupe souvent les deux dernières classes et on obtient ainsi
une partition de l’ensemble de tous les mots en deux sous-ensembles :
les instances positives et les instances négatives.
1.3.3. Langages
Définition 1.3. Un langage est un ensemble de mots définis sur le même
alphabet.
On peut donc dire qu’un problème est caractérisé par le langage
des encodages de ses instances positives et que résoudre un problème revient à
reconnaître les instances positives de ses encodages. C’est pourquoi, dans
ce qui suit, nous considérerons toujours le problème de reconnaître
des langages, c'est-à-dire de distinguer parmi tous les mots construits sur un
alphabet donné ceux qui font partie du langage de ceux qui n’en font pas partie.
De ce fait, on ne fera plus des distinctions entre résoudre un problème et
reconnaître le langage des encodages des instances positives du problème.
Exemple.
aab, aaaa,ε, a, b, ababababbb bbb , ε, aaa aaa,a, bbbbb et
(l’ensemble vide) sont des langages sur l’alphabet {a, b}.
Pour l’alphabet 0, 1 , , 0,1, 00,01,10,11,000,001,010011,101,110,111,... est
un langage (le langage contenant tous les mots). De même, l’ensemble de
toutes les représentations binaires de nombres pairs est un langage.
Le langage (langage vide ne contenant aucun mot) est différent
du langage {} (langage contenant le mot vide).
L’ensemble des mots représentant des programmes écrits en C qui s’arrêtent
toujours est un langage.
1.4. LA DESCRIPTION DE LANGAGES
Nous allons dans cette partie, introduire une notation qui nous permettra
de décrire certains langages.
2. ω bn et donc ω ε b* a * b
*
Ce qui montre que appartient bien au langage dénoté par a *b b*a .
* *
1.2. Montrer qu’il existe des langages L1 et L2 tels que L1 L2 * L*1 L*2 .
1.3. Montrer qu’il existe des langages L1 et L2 tels que L1. L2 * L*1. L*2 .
1.4. Soit R et S deux expressions régulières définies comme suit :
R = a a b* ba
S = a b* ba* a * b*
1. Trouver un mot appartenant au langage dénoté par R, mais pas
au langage dénoté par S.
2. Trouver un mot appartenant au langage dénoté par S, mais pas
au langage dénoté par R.
3. Trouver un mot appartenant au langage dénoté par R et au langage dénoté
par S.
4. Trouver un mot qui n’appartienne ni au langage dénoté par S, ni
au langage dénoté par R.
1.5. Soit l’alphabet = 0,1, 2, 3, 4, 5, 6, 7, 8, 9, et l’expression
E = 1 2 ... 90 1 2 ... 9* 0 1 ... 9* 0 1 ... 9*
Les mots 1998, 314, 71, 3140 appartiennent-ils au langage L(E) ?
1.6. Pour chacun des langages suivants, donner une expression régulière
représentant son complément.
1. a b* b
2. a ba b*
1.7. Simplifier les expressions régulières suivantes.
1. a * b* a b
*
2. a a b * b a b * b a *
2. a a b * b a b *
3. a * a *b* b a b *
*
2.1. INTRODUCTION
Dans ce chapitre nous allons étudier une première classe d’automates :
les automates finis. Le concept d’automate fini nous aidera à cerner
la notion de procédure effective, mais ne sera pas un choix final
de modélisation pour cette notion.
Pour bien comprendre en quoi le concept d’automate fini est
une modélisation de la notion de procédure effective, il suffit de comprendre,
qu’elle est dérivée de la notion de programme exécuté sur un ordinateur.
En effet, considérons un ordinateur qui exécute un programme fixé.
On peut supposer qu’il est composé :
d’un processeur auquel sont attachés un certain nombre de registres (dont le
compteur de programme, habituellement dénoté PC),
d’une mémoire contenant le programme (comme celui-ci est fixé,
cette mémoire pourrait être une mémoire morte ou ROM),
d’une mémoire servant à stocker les données.
Supposons qu’au départ, les données à traiter se trouvent dans la mémoire
de l’ordinateur. On peut alors schématiser l’exécution du programme par
une succession de cycles composés comme suit :
1. l’instruction indiquée par le compteur de programme est transférée
de la mémoire vers le processeur,
2. le processeur exécute cette instruction, ce qui a pour effet de modifier
le contenu des registres et/ou de la mémoire de donnée,
3. le PC est incrémenté (ou modifié si l’instruction exécutée est
une instruction de branchement).
Comment peut-on décrire cette succession de cycles d’exécution de façon
plus abstraite ? Pour pouvoir déterminer l’effet d’un cycle, il suffit
de connaître le contenu de la mémoire de données et des registres (dont
le PC).
A l’aide de cette information, on peut sans ambiguïté déterminer ce que sera
le contenu de la mémoire et des registres après l’exécution (d’une instruction).
On peut donc voir l’exécution d’une instruction comme une
transformation du contenu de la mémoire et des registres.
Nous appellerons le contenu de la mémoire et des registres de l’ordinateur,
son état. Chaque contenu de la mémoire et des registres définit un état différent.
2.2. DESCRIPTION
Un automate fini déterministe se compose des éléments suivants.
Un ruban d’entrée sur lequel on place le mot à traiter. Ce ruban est
divisé en casses et chaque case contient un seul caractère du mot à traiter
appelé le mot d’entrée. L’automate possède une tête de lecture qui
indique la position du caractère suivant à lire dans le mot d’entrée.
Ruban : b a a a b
Tête :
qo q1
a
représente l’automate défini par
: q (q, )
qo a qo
qo b q1 Q = q o , q1
q1 a qo = a, b
q1 b q1 s= q o
F = q1
qo q1 q2
b b
2.5.2. Formalisme
Formellement, un automate fini non-déterministe se définit presque comme
un automate fini déterministe. La différence est que nous avons maintenant une
relation de transition et non plus une fonction de transition, puisque on laisse la
possibilité à un état d’avoir plusieurs successeurs pour une même lettre se
trouvant sur le ruban d’entrée.
2.5.3. Exemples
1. Le langage accepté par l’automate M suivant
a aa
b
qo q1
a,b q2
b a
b
q3
bbb q4
est L(M) = a ab* bbbb* a ab* abb aa* a * .
2. Soit M l’automate ci-dessous.
a ab
a
qo q1 q2
a b a
q1 a q2
a a a
qo a
q3
b
q4
a
b
a
{q1, q2, q3 }
a b
{qo , q1, q3 } a
{q1, q3, q4 }
a
b
{q3, q4 }
b
b
Figure 2.4. Transformation selon l’exemple 2.
Dans la figure 2.4, nous n’avons pas représenté tous les 25 états
de l’automate M’. Nous avons uniquement représenté les états accessibles à
partir de l’état initial de M’. Intuitivement, un état p est accessible à partir d’un
état q s’il existe une exécution qui mène de p à q.
2.7. AUTOMATES FINIS ET EXPRESSIONS REGULIERS
Théorème 2.2. Un langage est régulier si et seulement si il est accepté par un
automate fini.
Pour déterminer ce théorème, nous utiliserons le fait qu’un langage est
régulier si et seulement si il est décrit par une expression régulière
(théorème 1.1).
Lemme 2.1. Si un langage est dénoté par une expression régulière, il est accepté
par un automate fini non-déterministe.
Lemme 2.2. Si un langage est accepté par un automate fini non-déterministe, il
est régulier.
3.1. INTRODUCTION
Dans ce chapitre, nous allons faire une parenthèse dans notre recherche
d’une formalisation de la notion de procédure effective. Nous nous
intéresserons de plus près à la notion de langage, non pas en tant que
formalisation de la notion de problème mais en tant qu’ensemble de mots
satisfaisant un certain nombre de règles
Cette vue de concept de langage a son origine dans des essais de
formalisation du langage naturel. Le but était de donner une description précise
des règles permettant de construire les phrases correctes d’une langue.
Une grammaire, est un ensemble de règles. Les grammaires donnent
une description générative d’un langage, c'est-à-dire qu’elles nous disent
comment construire des éléments appartenant au langage. Par contre, un
automate donne une description analytique d’un langage. C'est-à-dire qu’il nous
donne un procédé pour reconnaître les éléments du langage. Ces deux forment
de description de langages sont complémentaires et il est souvent utile de
disposer de l’une et de l’autre.
Exemple. Dans le cas d’un langage de programmation, on se sert d’une
description générative lorsque l’on écrit un programme et d’une description
analytique lorsque l’on en fait l’analyse syntaxique (lors de la compilation).
Dans ce chapitre, nous allons donner une description générative (autres que
les expressions régulières) des langages réguliers et montrer comment elle peut
être convertie en une description analytique (un automate fini) et vice-versa.
3.2. LES GRAMMAIRES
Principe. Le principe de base des grammaires et de données un ensemble de
règles qui permettent de générer les mots d’un langage. Ces règles sont des
formes de règles de réécriture, c'est-à-dire qu’elles indiquent qu’une
séquence de symboles peut être remplacée par une autre séquence de
symboles. Les mots générés par la grammaire sont alors ceux qui peuvent
être obtenus en appliquant ces règles à partir d’un symbole spécial appelé
symbole de départ.
Définition 3.1. Une grammaire est un quadruplet G = (V, , R, S). Ses éléments
sont les suivants :
V est un alphabet (ensemble fini de symboles)
V est l’ensemble des symboles terminaux
V - est l’ensemble des symboles non terminaux.
Les des symboles terminaux sont ceux qui fait partie de l’alphabet sur lequel
le langage généré par la grammaire est défini. Les symboles non terminaux
sont ceux qui n’apparaissent pas dans les mots générés mais qui sont utilisés au
cours de la génération.
R V x V* est un ensemble fini de règles aussi appelées productions.
La signification intuitive de ces règles est que le premier élément d’une
règle peut être remplacé par le deuxième élément de cette règle. des
symboles non terminaux.
S V - est le symbole de départ, c’est à partir de ce symbole que l’on
commencera la génération de mots au moyen de la grammaire.
Il y a quelques habitudes de notation lorsque l’on décrit une grammaire.
- Les éléments de V - sont représentés par des lettres majuscules : A, B,
- Les éléments de sont représentés par des lettres minuscules : a, b, …
- Les règles ou productions (, ) R sont notées ou encore par
G
si l’on veut explicitement indiquer que la règle fait partie
de la grammaire G.
- Le symbole de départ est souvent désigné par S.
- Comme dans le contexte des expressions régulières, le mot vide est
dénoté par .
Exemple 1. Les éléments suivants définissent une grammaire :
V S, A, B, a, b ,
a, b ,
R S A, S B, B b B, A aA, A , B ,
S est le symbole de départ.
Exemple 2. Le mot aaaa fait partie du langage défini par la grammaire
de l’exemple 1. En effet, il est obtenu comme suit :
S
A Règle S A
aA A aA
aaA A aA
aaaA A aA
aaaa A aA
A
aaaa A
Types de grammaires
Les grammaires sont habituellement classifiées en 4 types suivant les
restriction que l’on place sur la forme de leur règles. Cette classification a pour
but de définir des classes de grammaires suffisamment puissants pour être utiles
dans de nombreuses dans applications, mais plus faciles à traiter que les
grammaires générales (sans restriction sur les règles). Les types de grammaires
que nous considérons sont les suivants.
Type 0 : pas de restriction sur les règles.
Type 1 : grammaires sensibles au contexte. Les règles de ces grammaires
doivent satisfaire la condition α , c'est-à-dire leur membre de
droite doit contenir au moins autant de symboles que leur membre de
gauche. Pour permettre aux grammaires de type 1 de générer le mot vide, on
permet une expression à la restriction précédente : la production
S , où S est le symbole de départ, peut faire partie de la grammaire pour
autant que S n’apparaisse pas dans le membre de droite d’une production.
Type 2 : grammaires hors-contexte. Dans ces grammaires, toutes les
productions doivent avoir la forme où A V - et où il n’y a pas de
restriction sur . Une grammaire est donc hors-contexte si le membre de
gauche de chacune de ses productions est constitué d’un seul symbole non
terminal.
Type 3 : grammaires régulières. Une grammaire est régulière si toutes
ses productions ont une des formes : A B
A où A, B V - et ω * . Toute production d’une grammaire régulière
a donc un membre de gauche constitué d’un seul non-terminal et un membre
de droite constitué d’un mot de symboles terminaux suivi éventuellement
d’un seul non-terminal.
La relation entre les différents types de grammaires que nous venons de
définir est alors simplement la suivante :
type 3 type 2 type 1 type 0
4.1. INTRODUCTION
Il n’existe pas d’automate fini qui accepte le langage a n b n . Par contre,
chaque langage composé des mots contenant le même nombre de lettres a et b,
mais où ce nombre est borné, c’est à die chaque langage de la forme
Lk a n bn n k
est accepté par un automate fini. La situation est donc la suivante :
- chaque mot de la forme a n b n appartient à un langage Lk et ce mot peut donc
être reconnu par l’automate fini acceptant Lk ;
- par contre, il n’existe pas d’automate fini qui accepte tous les mots a n b n ,
c'est-à-dire l’union (infinie) de tous les langages Lk .
En termes intuitifs, chaque mot du langage a n b n peut être reconnu à l’aide
d’une mémoire finie, mais aucune mémoire finie ne permet de reconnaître
tous les mots a n b n . Est-ce une raison suffisante pour considérer que ce langage
ne peut être reconnu par une procédure effective ? Nous disons que non.
Donc, pour cerner la notion de procédure effective, il est nécessaire d’étudier
des automates dont la mémoire a une capacité illimitée.
Dans ce chapitre, nous allons introduire une première classe d’automates
de ce type. Ces automates sont des automates finis auxquels on a adjoint
une mémoire de capacité non bornée. Cette mémoire a la structure d’une pile,
c'est-à-dire d’une file à accès LIFO (las in first out, dernier arrivé premier parti).
4.2. LES AUTOMATES A PILE
4.2.1. Description
Un automate à pile non-déterministe se compose des mêmes éléments
qu’un automate fini, à savoir :
un ruban d’entrée, et une tête de lecture,
un ensemble d’états parmi lesquels on distingue un état initial et des états
accepteurs,
une relation de transition.
A cela, on ajoute une pile de capacité illimitée initialement vide.
L’exécution d’un automate à pile sur un mot donné est semblable à celle
d’un automate fini non-déterministe. Toutefois, à chaque étape, l’automate à
pile consulte une partie du sommet de sa pile et la remplace par une suite de
symboles.
4.2.2. Formalisation
Un automate à pile non-déterministe, ou simplement un automate à pile, est
défini par un septuplet M = (Q, , , , s, F) où
Q est un ensemble fini d’états,
est un alphabet d’entrée,
est un alphabet de pile,
Z est le symbole initial de pile,
s Q est l’état initial,
F Q est l’ensemble des états accepteurs,
Q x * x * x Q x * est la relation de transition (ensemble
fini).
L’alphabet de pile contient l’ensemble des symboles qui pourront
apparaître sur la pile. Il n’est pas nécessairement distinct de l’alphabet d’entrée
(on peut avoir ). Le symbole Z est le contenu initial de la pile. Les
transitions dans sont semblables à celles d’un automate fini non-déterministe,
à part qu’elles spécifient en plus la manipulation de la pile. Ainsi, une transition
, , , q,
signifie que l’automate peut passer de l’état à l’état q, pour autant que le mot
d’entrée commence par le préfixe u et que la chaîne se trouve au sommet de la
pile. Après la transition, l’automate a consommé le préfixe u du mot d’entrée et
a remplacé le sommet de la pile par la chaîne .
4.2.3. Exemples
Exemples 4.1. L’automate M = (Q, , , , Z, s, F) décrit ci-dessous accepte le
langage
a n
bn n 0
Q = s, , q ,
= a, b ,
= A ,
F = q , et contient les transitions
(s, a, ) (s, A)
(s, , Z) (q, )
(s, b, A) (, )
(, , Z) (q, )
4.3.2. Formalisation
Définition. Deux transitions 1 , μ1 , β1 , q1 , γ1 et 2 , μ2 , β2 , q2 , γ 2
sont compatibles si
1. 1 2
2. μ1 et μ2 compatibles (c'est-à-dire μ 1 est un préfixe de μ 2 ou μ 2 est
préfixe de μ 1 ).
3. β1 et β2 compatibles.
Un automate à pile déterministe est simplement un automate à pile n’a pas
de transitions compatibles distincts.
Définition. Un automate à pile est déterministe, si pour toute paire de transitions
compatibles, ces transitions sont identiques.
4.3.3. Les langages hors-contexte déterministes
Les langages hors-contexte déterministes sont ceux acceptés par un automate
à pile déterministe.
Définition. Soit L un langage défini sur un alphabet , le langage L est un
langage hors-contexte déterministe, si et seulement si il est accepté par un
automate à pile déterministe.
Exemple. Le langage L1 ω o ωR ω a, b * est déterministe hors-contexte.
Par contre, le langage L 2 ω ωR ω a, b * est hors-contexte, mais pas
déterministe hors-contexte. Intuitivement, cela s’explique par le fait qu’il
faut pouvoir deviner où est le milieu du mot pour reconnaître L2 . Par contre
pour L1 , le milieu du mot est indiqué par la lettre C.
4.4.4. Propriétés des langages hors-contexte déterministes.
Si L1 et L2 sont des langages hors-contexte déterministes, nous avons
les propriétés suivantes :
le langage * - L1 est aussi hors contexte déterministe. Intuitivement, cela
s’explique par le fait que pour complémenter le langage accepté par un
automate déterministe il suffit d’inverser les états accepteurs et non
accepteurs. En pratique, la démonstration est assez complexe car un
automate à pile peut avoir des transitions sur le mot vide,
il existe des langages hors-contexte qui ne sont pas déterministes hors-
contexte. En effet, si tous les langages hors-contexte étaient déterministes
hors-contexte, alors le complément d’un langage hors-contexte serait
toujours hors-contexte, ce que nous savons être faux,
les langages.
L1 L2 et L1 L2
ne sont pas forcement déterministes hors-contexte. Dans le cas de l’union,
cela se comprend intuitivement car, pour déterminer si un mot est dans
L1 L2 , il faut pouvoir décider s’il est dans L 1 ou s’il est dans L2 , ce qu’il
n’est pas toujours possible de faire de façon déterministe. La propriété
concernant l’intersection est alors une conséquence de la propriété
concernant l’union et celle concernant le complément.
4.4.5. Applications.
L’application principale des langages hors-contexte est la description de la
syntaxe des langages de programmation et l’analyse syntaxique correspondante.
Dans cette application, la syntaxe d’un langage de programmation est
donnée par une grammaire hors-contexte. Les programmes syntaxiquement
corrects sont alors tous ceux qui ont des mots générés par cette grammaire. Le
problème de l’analyse syntaxique est alors celui de déterminer si un mot (le
texte d’un programme) est dans le langage généré par la grammaire hors-
contexte et d’établir comment (c'est-à-dire à l’ide de quel arbre d’analyse) ce
mot a été généré.
1. a n bn Cm
2. a n Cm bn
1. a n bnm Cm avec n, m 0
2. L a n x n 0, x a, b* et x n
3. Le langage généré par la grammaire définie par les règles S SS, S
aSb, S .
4.4. Pour chacun des langages suivants, donner une grammaire hors-contexte
qui le génère.
1. a n bn Cm
2. a n Cm bn
3. a n bm Cnm
Q = { s, , q, f },
a, b, c ,
A ,
F s et
∆ contenant les transitions
2) L a n bn Cm n m 2 n
3) L a b *
4.8. Soit L un langage hors-contexte quelconque.
1. Le langage LR contenant les mots de L inversés est-il toujours contexte ?
Justifier.
2. L LR est-il toujours hors-contexte ? justifier
4.9. Décrire un automate à pile déterministe qui accepte le langage
R a, b * .
5.1. INTRODUCTION
Bien que disposant d’une mémoire non bornée, les automates à pile ne
peuvent reconnaître le langage
a n b n Cn .
Or, il semble tout à fait possible de reconnaître ce langage à l’aide d’une
procédure effective. On ne peut donc pas adopter les automates à pile comme
formalisation de cette notion et il est utile d’examiner d’autres classes
d’automates. C’est exactement le but du présent chapitre où sont introduites les
machines de Turing (Alan Turing (1912 – 1954) : mathématicien anglais qui
décrit ce type d’automate en 1936). La différence principale entre les automates
à pile et les machines de Turing est que ces dernières disposent d’une mémoire
non bornée dont l’accès n’est pas limité à une discipline LIFO. On se terminera
par un théorème permettant de montrer que certains langages intuitivement
reconnaissables par une procédure effectue effective ne peuvent être accepté par
une machine de Turing. Nous allons adopter les machines de Turing comme
formalisation de la notion de procédure effective.
5.2. DEFINITION
5.2.1. Définition
Une machine de Turing (déterministe est composé des éléments suivants) :
une mémoire infinie nous forme de ruban divisé en cases. Chaque case
du ruban peut contenir un symbole d’un alphabet de ruban,
une tête de lecture se déplaçant sur le ruban,
un ensemble fini d’écarts parmi lesquels on distingue un état initial et
un ensemble d’états accepteurs,
une fonction de transition qui pour chaque état de la machine et symbole se
trouvant sous la tête de lecture précise :
- l’état suivant,
- un caractère qui sera écrit sur le ruban à la place du caractère se trouvant
sous la tête de lecture,
- un sens de déplacement de la tête de lecture.
L’exécution d’une machine de Turing peut se décrire comme suit :
Initialement, le mot d’entrée se trouve au début du ruban. Les autres cases
du ruban contiennent toutes un symbole spéciale symbole blanc.
La tête de lecture est sur la première case du ruban et la machine se
trouve dans son état initial.
a b a b b a b b b b
q q’
Un mot est accepté par la machine lorsque l’exécution atteint un état
accepteur.
5.2.2. Formalisation
Une machine de Turing est formellement décrite par un septuplé
M = (Q , , ∑, , s, B, F),
où
Q est un ensemble fini d’états,
est l’alphabet de ruban (l’alphabet utilisé sur le ruban),
∑ est l’alphabet d’entrée (l’alphabet utilisé pour le mot d’entrée),
s Q est l’état initial,
F Q est l’ensemble des états accepteurs,
B – ∑ est le « symbole blanc » (souvent dénoté ≠),
S : Q x Q x x L, R est la fonction de transition (L et R) sont
utilisés pour représenter respectivement un déplacement de la tête de
lecture vers la gauche (left) et vers la droite (right).
Exemple. Soit la machine de Turing
M = (Q, , ∑, S, , s, B, F),
où :
Q = qo , q1 , q 2 , q 3 , q 4 ,
= { a, b, x, y, },
= a, b ,
s = qo ,
B = ,
F = q4
est donné par le tableau ci-dessous (le symbole « - » indique que la
fonction de transition n’est pas définie pour ces valeurs).
a b X Y
qo q1 , X, R - - q 3 , Y, L -
q1 q1 , a, R q2 , Y, L - q1 , Y, L -
q2 q2 , a, L - qo , X, R q2 , Y, L -
q3 - - - q 3 , Y, L ( q 4 , ,
R)
q4 - - - - -
Remarque
Pour les automates finis déterministes, les langages acceptés sont les mêmes
que les langages décidés.
Pour les automates finis non-déterministes, on ne peut pas parler de langages
décidés (non déterministe). Cependant, tout langage accepté peut être décidé
par un automate fini déterministe.
Le concept de langage décidé ne s’applique pas non plus aux automates à
pile non déterministe.
Un automate à pile déterministe décide un langage s’il n’y a pas d’exécution
infinie, ce qui est le cas si l’automate ne comporte de boucle sur des
transitoires (transitions sur le mot vide).
5.3. THESE DE TURING-CHURCH
La thèse de Turing-Church s’énonce comme suit. « Les langages reconnus
par une procédure effective sont ceux décidés par une machine de Turing ».
Cette thèse est la clé de voûte de notre étude des notions de calculabilité.
En effet, elle fournit l’élément qui nous manquant jusqu'à présent pour
démontrer que certaines langage ne peuvent pas être reconnus par une
procédure effective : une formalisation de cette notion. Notons encore une fois
que cette la thèse de Turing-Church est une thèse et non un théorème. Adopter
la thèse de Turing-church revient à choisir une modélisation du concept de
procédure effective.
Ce qui est décidé par une machine de Turning de simuler le fonctionnement
d’une machine de Turing à l’aide d’un crayon et de papier ou, de façon plus
moderne, à l’aide d’un programme tournant sur une machine réelle.
6.1. INTRODUCTION
Jusqu’à présent, nous avons abordé la formalisation du concept
de procédure effective par l’intermédiaire d’automates reconnaissant des
langages. D’autres approches peuvent être envisagées. Une possibilité est de
considérer les fonctions définies sur les nombres naturels et de caractériser
celles qui sont calculables par une procédure effective. Dans ce chapitre, nous
adoptions cette démarche.
Considérons donc les fonctions dont les arguments et la valeur sont des
nombres naturels par exemple, x + y, x x y, x y , x 2 y 2 sont des fonctions que
nous considérons comme calculables. Pourquoi ? On peut classer ces fonctions
en deux catégories.
1. Des fonctions de base (+, x) que nous considérons comme calculables parce
que nous connaissons un algorithme permettant de les calculer sur une
représentation (par exemple binaire ou décimale) des entiers naturels.
2. Des fonctions obtenues par composition de fonctions de base. Par exemple,
x x (y+z) est la composition d’une addition et d’une multiplication. Nous
considérons cette fonction comme calculable parce qu’elle peut se calculer
en effectuant d’abord l’addition et ensuite la multiplication.
Pour pouvoir définir un ensemble suffisamment large de fonctions sur
les naturels, il nous faut un mécanisme permettant la définition d’un nombre
variable de compositions de fonction de base. Celui que nous allons étudier est
la recuisions.
La factorielle peut, par exemple, être définie par
O!
(n+1) ! = (n+1) x n !
Cette définition nous donne une procédure de calcul pour la factorielle
puisqu’elle permet de ramener le calcul de cette fonction à une suite de
multiplications.
Exemple 6.9. La fonction différentielle (-) est définie suivant une convention
similaire à celle utilisée pour la fonction prédécesseur (nous dénotons cette
fonction par pour la distinguer de la différence usuelle).
0 si n m
n-m
n - m si n m
Cette fonction est définissable par récursion primitive :
n-0n
n - m 1 pred(n - m)
et est donc primitive récursive.
Exemple 6.10. La fonction signe (sg) a la valeur si son argument est 0. 1 sinon :
0 si m 0
sg (m)
1 si m 0
Cette fonction peut être définie par récursion primitive :
sg(1) = 0
sg (m+1) = 1
Exemple 6.11. Le produit borné par m d’une fonction g n, i est le produit de g
pour les m premières valeurs de i :
m
g n, i .
i 0
Exemple 6.16. Les prédicats obtenus à partir de prédicats primitifs récursifs par
les opérations booleennes sont aussi primitifs. Soit g1 n et g 2 n les
fonctions caractéristiques de deux prédicats primitifs récursifs g1 et g 2 .
Nous avons
et g1 n , g 2 n g1 n x g 2 n
ou g1 n , g 2 n sg g1 n g 2 n
nou g1 n 1 - g 2 n
Exemple 6.17. Les prédicats d’égalité (n = m) est aussi primitif récursif puisque
n = m si (n < m m < n) ce qui traduit au niveau des fonctions
caractéristiques par
egal n, m 1 - sg m - n sg n - m .
Exemple 6.18. La quantification bornée universelle (existentielle) permet de
préciser qu’un prédicat est vrai pour toutes les (pour des) valeurs d’un de ses
arguments inférieurs à une certaine borne. Précisément,
i m n, i .
est vrai si n, i est vrai pour tout i m. Similairement,
i m n, i est vrai si n, i est vrai pour au moins une i
m. Si est primitif récursif, alors i m n, i et i m n, i sont
aussi primitifs récursifs. En effet, la fonction caractéristique de
i m n, i est définie par
m
n, i
i 0
m
Vu que n, i vaut 1 uniquement si n, i =1 pour tout im.
i 0
1 - n, i .
m
1-
i 0
BIBLIOGRAPHIE
INTERROGATION DE CALCULABILITE
L1 ET L2 GENIE INFORMATIQUE
y x x
ADD1