Limites de l’informatique
En informatique, on dit
qu’une opération est « complexe » si elle est logiquement
possible mais irréalisable en pratique.
Une première forme de
« complexité » informatique provient de la représentation des
nombres dans la mémoire de l’ordinateur. Celle-ci ne pouvant contenir
qu’une quantité limitée de chiffres, les calculs informatisés portent sur
un sous-ensemble des nombres rationnels, approximations des nombres réels. La
précision des calculs est donc limitée même si le nombre de chiffres que
contient la mémoire est élevé. Il en résulte de grandes difficultés mathématiques.
Une deuxième forme de
« complexité » informatique est liée au nombre de calculs élémentaires
que nécessite une opération. En notant n le cardinal de l’ensemble sur
lequel on travaille, on dira que la « complexité » est linéaire si
elle demande de l’ordre de n calculs élémentaires, quadratique si elle en
demande de l’ordre de n2, « exponentielle » si elle en
demande de l’ordre de en ou, pire, de nn.
Si par exemple il faut réaliser
le calcul élémentaire sur chaque couple d’éléments de l’ensemble, la
« complexité » est quadratique car le nombre des couples est égal
à n(n -1)/2. S’il faut calculer sur chacune des parties de l’ensemble, la
« complexité » est exponentielle car le nombre des parties est égal
à 2n. Enfin, si l’on doit calculer sur chacune des permutations
des éléments de l’ensemble dont le nombre est n ! (factorielle de n),
la « complexité » est alors de l'ordre de nn car n! ~ (2πn)½(n/e)n
(formule de Stirling).
Certains problèmes à la
formulation simple peuvent exiger une durée de calcul de l’ordre de l’âge
de l’univers : c’est le cas du « problème du commis voyageur »
dès que n atteint quelques dizaines
(pour trouver l’itinéraire optimal passant par plusieurs villes il faut
calculer la longueur de n! itinéraires).
La « complexité »
permet d’évaluer la faisabilité d’un calcul : si n dépasse quelques
centaines (c’est le cas de la plupart des bases de données d’une
entreprise), un calcul linéaire sera facile, un calcul quadratique difficile et
un calcul exponentiel impossible. Le programmeur qualifié arrive parfois à
rendre possible un traitement qui, programmé de façon sommaire, aurait été
impossible ou difficile : s’il s’agit par exemple de faire un tri, un
calcul rustique sera quadratique mais un calcul bien conçu sera d’ordre nLog(n)
seulement.
Ces deux formes de « complexité »
informatique n’ont rien à voir avec la complexité du réel qu’aucun système
fini ne peut décrire.
En effet, même si l’opération qui consiste à répéter un grand nombre de
fois un calcul élémentaire demande un temps très long, elle n’est pas au
plan logique plus complexe que le calcul élémentaire lui-même, et celui-ci
est aussi simple que l’idée qui a guidé sa conception. Il en est de même
pour les difficultés mathématiques liées à la représentation des nombres réels
par des nombres rationnels. La « complexité » informatique est un
homonyme de la complexité du réel. C’est pourquoi nous avons utilisé les
guillemets pour la noter.
Par contre la troisième
forme de « complexité » informatique provient des limites de la
logique elle-même : comme l'a démontré Gödel, aucun système logique ne peut
contenir la démonstration de toutes les vérités. Le domaine de la pensée
pure est lui aussi complexe puisque aucun système fini ne peut en rendre compte
(il résulte du théorème de Gödel qu'il est impossible de mettre au point un
programme capable de vérifier tous les programmes).
Théorème
de Gödel
Gödel
a démontré que si l’on construit un système logique pour formaliser la théorie
des nombres entiers, ce système contient au moins une formule A telle que ni A,
ni sa négation non-A ne peuvent être démontrées dans le cadre du système.
Russell et Whitehead avaient tenté de fonder l'ensemble de la logique sur une
base axiomatique.
Le théorème de Gödel
prouve que ce but est hors d'atteinte : quel que soit le nombre (fini) des
axiomes retenus pour fonder un système logique, il existera toujours des
propositions vraies qu’il sera impossible de démontrer dans le cadre de ce
système.
La démonstration
de Gödel est technique. Voici une description schématique de son raisonnement
:
1)
Supposons qu’il existe une Théorie Complète (TC) fondée sur un nombre fini
d'axiomes et permettant, si l’on considère une phrase quelconque, de décider
sans jamais se tromper si cette phrase est vraie ou non.
2) Considérons
la phrase « TC ne dira jamais que la présente phrase est vraie ».
Nommons cette phrase G, ce que nous noterons : G = « TC ne dira jamais que
G est vraie ».
3) Soumettons
G à TC et demandons à TC de dire si G est vraie ou non.
4) Si
TC dit que G est vraie, alors G est fausse. Mais alors comme TC a dit que G était
vraie, TC a commis une erreur. Cependant par hypothèse TC ne se trompe jamais.
Donc TC ne dira jamais que G est vraie.
5) Si
« TC ne dit jamais que G est vraie », G est vraie. Mais d'après ce
que nous venons de voir TC ne pourra jamais le dire.
6) Il
ne peut donc pas exister de Théorie Complète, c’est-à-dire de théorie
permettant, quelle que soit la phrase que l'on considère, de dire si elle est
vraie ou non.
Ce
raisonnement rappelle le paradoxe fameux qui met en scène un Crétois disant :
« Les Crétois ne disent que des mensonges ».
Application du théorème de Gödel à
l'informatique
Un des résultats les plus
importants de la théorie de l'informatique, c'est qu'il est
impossible de concevoir un programme capable de vérifier tous les programmes.
Supposons en effet qu'un tel
programme P existe.
1) Si le programme A est juste,
P(A) = v (v pour « vrai »).
2) Soumettons à P le programme
G = « P(G) = f » (f pour « faux »).
3) Si P(G) = v, le programme
P(G) = f est faux ; donc P[P(G) = f ] = P(G) = f, ce qui est contraire à
l'hypothèse. Si P(G) = f, alors on a P[P(G) = f ] = P(G) = v, ce qui est
encore contraire à l'hypothèse.
4) Ainsi G ne peut pas être vérifié
par P.
Il ne peut donc pas exister de
programme capable de vérifier tous les programmes. Certes on peut définir des
méthodes de vérification efficaces et les outiller de sorte qu'elles soient
faciles à utiliser. Mais ces méthodes, aussi efficaces soient-elles, ne
garantissent pas que tous les programmes qu'elles valident soient corrects :
« Program testing can be used to show the presence of bugs, but never to
show their absence ».
|