Retour
Cours précédent

Calculabilité

Un calcul est un programme, algorithme.
Une fonction \(f:\mathbb{N} \to \mathbb{N}\) est calculable s’il existe un programme qui calcule f.

Cette pseudo-définition est floue : est-ce qu’il existe des fonctions “c-calculable”, mais pas “java-calculable” ? Est-ce qu’on doit faire une preuve de calculabilité à chaque fois qu’on change de langage ? ou d’ordinateur ?

Heureusement non : on admettra la thèse de Church-Turing, qui dit que tous les modèles “raisonnables” de calcul sont équivalents.

Il existe des fonctions non-calculables :

Ces ensembles sont non-dénombrables donc les problèmes sont non-calculables.

Un ensemble D est dit dénombrable s’il est en bijection avec \(\mathbb{N}\).
Un ensemble D fini ou dénombrable est dit au plus dénombrable.

Quelques ensembles non dénombrables :

LOOP, WHILE, GOTO

On commence par quelques “langages de programmation” basiques : LOOP, WHILE, GOTO
A chacun de ces langages on associe une classe de fonctions calculables par des programmes de ce langage.
On va montrer que WHILE-calculable est équivalent à GOTO-calculable. Par contre, LOOP-calculable est plus restrictif.
On va présenter un autre modèle de calcul, la machine de Turing, et montrer qu’elle définit la même classe de fonctions - qu’on va appeler la classe de fonctions calculables : WHILE-calculable = Turing-calculables

LOOP : on sait combien de tour de boucle on va faire.
WHILE : on ne sait pas combien de tour de boucle on va faire.

Programmes LOOP

Exemple :

x := y;
LOOP (z) DO x := x+1 OD;

calcule x = y + z

L’effet de LOOP (x) DO P OD; est d’itérer x fois le programme P.

LOOP-calculable

Soit P un programme LOOP utilisant les variables \(x_0 = res, x_1, ..., x_l\). L’entrée de P est un k-uplet stocké dans les variables x.
L’effet de P sur x est noté P(x).
La sortie de P est la valeur de la variables res à la fin du calcul de P. La fonction calculée par P est notée \(f_P\).

Une fonction \(f : \mathbb{N}^k \to \mathbb{N}\) est LOOP-calculable s’il existe un progamme LOOP-calculable qui la calcule. \(f(n) = f_p(0, n, 0, ..., 0)\).

Un progamme LOOP termine toujours, donc les fonctions LOOP-calculables sont totales.

Programmes WHILE

Les programmes WHILE sont définis à partir des programmes LOOP, en rajoutatn l’instruction “while” : WHILE (x != 0) DO P OD

Par définition, toute fonction LOOP-calculable est aussi WHILE-calculable.
Les fonction WHILE-calculables ne sont pas totales. (une fonction while peut ne jamais terminer).

Programmes GOTO

Syntaxe : Un pogramme \(P = l_1; ...; l_m\) est une séquence d’instructions.
Les intructions possibles sont :

Il est possible de réécrire un programme WHILE en un programme utilisant une seule boucle WHILE.

Machine de Turing

Une machine de Turing comporte :

Le nombre d’états d’une machine de Turing est fini.
La bande représente la mémoire infini de la machine.
L’accès à la mémoire est séquentiel : la machine peut bouger sa tête à droite ou à gauche d’une case à chaque étape.

Formalisation

Une machine de Turing (MT) à une bande \(M = (Q, q_0, F, \Sigma, \Gamma, \delta)\) est données par :

On supposera qu’aucune transition ne part d’unn état de \(F\).

On représente souvent une MT comme un automate, en changeant les étiquettes des transitions.

Fonctionnement d’une machine de Turing

Initialement, un mot \(w\) est écrit sur la bande entouré de \(\square\).
Un calcul d’une MT sur \(w\) est une suite de pas de calcul. Cette suite peut être finie ou infinie. Le calcul commence avec la tête de lecture-écriture sur la première lettre de \(w\) et dans l’état initial \(q_0\).
Chaque pas de calcul consiste à appliquer une transition, si possible. Le calcul ne s’arrête que si aucun transition n’est applicable.

Chaque pas consiste à appliquer une transition. Une transition de la forme \(p \overset{a, b, d}{\to} q\) est possible seulement si :

Dans ce cas l’application de la transition consiste à :

Configuration et calcul

Une configuration (état généralisé) représente un instantanné du calcul.
La configuration \(uqv\) signifie que l’état de contrôle est \(q\), le mot écrit sur la bande est \(uv\) entouré par des \(\square\), et la tête de lecture est sur la première lettre de \(v\).
La configuration initiale sur \(w\) est donc \(q_0w\).
Pour deux configurations \(C, C'\), on écrit \(C \vdash C'\) lorsqu’on obtient \(C'\) par application d’une transition à partir de \(C\). Le calcul d’une machine de Turing est une suite de configurations.

Il y a trois cas de calculs :

Langague acceptés

On peut utiliser une machine pour accepter des mots.

Le langage \(\mathfrak{L}(M) \subseteq \Sigma*\) des mots acceptés par une MT \(M\) est l’ensemble des mots \(w\) sur lesquels il existe une calcul fini.

On dit qu’une machine est déterministe si, pour tout \((p, a) \in Q \times \Gamma\), il existe au plus une transition de la forme \(p \overset{a, b, d}{\to} q\).
SI \(M\) est déterministe, elle n’admet qu’un calcul par entrée.


Retour
Cours précédent