ajout de tous les cours et TP préparés cet été
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
## Calculabilité et décidabilité en informatique ##
|
||||
# Calculabilité et décidabilité en informatique
|
||||
|
||||
> À chaque problème sa non solution !
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
#### Introduction à la décidabilité
|
||||
|
||||
Il vous est deja arrivé de prendre des décisions en suivant une logique. Dans la vie vous suivez la votre, en prenant des conseils, ou de par ce que vous avez appris à l'école. C'est donc quelque chose général.
|
||||
Il vous est déjà arrivé de prendre des décisions en suivant une logique. Dans la vie vous suivez la votre, en prenant des conseils, ou de par ce que vous avez appris à l'école. C'est donc quelque chose général.
|
||||
|
||||
Cela vous semble simple de définir la logique, mais en réalité, mise en pratique, cela devient plus complexe à commenter :
|
||||
mathématiquement, la logique n'a pas grand chose à voir avec celle dont on use au quotidien.
|
||||
@@ -33,22 +33,19 @@ On peut par exemple prendre des problèmes assez élémentaires :
|
||||
|
||||
Dans notre premier cas, nous avons en **instance de départ :** un entier naturel, qui, après être traité via le **paramètre** choisi (Si reste = 0 après une division par 2, alors nombre est pair) dans **l'algorithme**, ressortira en une réponse simple : *Oui* ou *Non* selon la **décision** prise.
|
||||
|
||||
### Définition
|
||||
### Définition : Prédicat
|
||||
|
||||
En informatique ou mathématiques, on peut parler d'une **fonction algorithmique**. Quand le résultat de celle ci, c'est à dire ce qu'elle *renvoit*, est un boléen, on parle de ***prédicat***.
|
||||
En informatique ou mathématiques, on peut parler d'une **fonction algorithmique**. Quand le résultat de celle-ci, c'est-à-dire ce qu'elle *renvoie*, est un booléen, on parle de ***prédicat***.
|
||||
|
||||
Un ***prédicat*** est une fonction qui ne prendra que des valeurs booléennes:
|
||||
Un ***prédicat*** est une fonction qui ne prendra que des valeurs booléennes.
|
||||
|
||||
<p>
|
||||
> La réponse à un problème de décision est donc soit un booléen, soit une valeur qui permet de répondre à un prédicat.
|
||||
>
|
||||
> **Exemple** : Dans un graphe, connaître le nombre de sommets permet de répondre à la question : « Le chemin que j'ai choisi est-il le plus court passant par tous les sommets de ce graphe ? »
|
||||
>
|
||||
> Question dont la réponse est bel et bien un prédicat.
|
||||
|
||||
La réponse à un problème de décision est donc soit un booléen ou alors une valeur qui permet de répondre à un prédicat
|
||||
|
||||
|
||||
Exemple : Dans un graphe, connaitre le nombre de sommets permet de répondre à la question : le chemin que j'ai choisi est il le plus court passant par tous les sommets de ce graphe ?
|
||||
|
||||
Question dont la réponse est bel et bien un prédicat.
|
||||
|
||||
### Définition
|
||||
### Définition : Décidabilité
|
||||
|
||||
Si, pour réponse à un problème, on peut en écrire un algorithme permettant la prise de décision et donc amenant à la résolution du dit problème, on parlera de problème ***décidable*** ou de <u>**décidabilité**</u>
|
||||
|
||||
@@ -58,7 +55,7 @@ Et donc, par extension, si un problème n'est pas soluble, on utilisera le terme
|
||||
|
||||
## ~~La calcul habilité~~ La calculabilité
|
||||
|
||||
En informatique, plus précisemment dans la branche dite de programmation, nous utilisons un langage qui nous est propre afin de mettre en place nos idées dans un algorithme.
|
||||
En informatique, plus précisément dans la branche dite de programmation, nous utilisons un langage qui nous est propre afin de mettre en place nos idées dans un algorithme.
|
||||
|
||||
### Vocabulaire
|
||||
|
||||
@@ -100,7 +97,7 @@ Ici, en NSI, nous utilisons le langage Python, mais nous pourrions parfaitement
|
||||
|
||||
Revenons au prédicat : si une fonction renvoie un prédicat, et que celui là est dit calculable, alors la prise de décision est possible. Une fonction calculable permet donc l'emergence de décisions décidables.
|
||||
|
||||
Ce qui signifie qu'il existe un algorithme permettant la résolution de cette fonction, ou d'un problème ammené par la fonction, et si un algorithme existe, alors nous sommes en mesure de programmer la fonction dans n'importe quel langage.
|
||||
Ce qui signifie qu'il existe un algorithme permettant la résolution de cette fonction, ou d'un problème amené par la fonction, et si un algorithme existe, alors nous sommes en mesure de programmer la fonction dans n'importe quel langage.
|
||||
|
||||
--------
|
||||
|
||||
@@ -116,7 +113,9 @@ Pour un problème, c'est la même chose : si l'on peut écrire un programme qui
|
||||
|
||||
### Pourquoi est ce important ?
|
||||
|
||||
Imaginez, si votre programme, logiciel ou jeu vidéo favori rencontrait un problème d'execution et tournait en boucle quand vous l'utilisez. <br> Frustrant n'est ce pas ? Une personne qui souhaite développer des programmes doit s'assurer de la décidabilité de son travail.
|
||||
Imaginez, si votre programme, logiciel ou jeu vidéo favori rencontrait un problème d'execution et tournait en boucle quand vous l'utilisez.
|
||||
|
||||
Frustrant n'est ce pas ? Une personne qui souhaite développer des programmes doit s'assurer de la décidabilité de son travail.
|
||||
|
||||
### Et maintenant, des exemples !
|
||||
|
||||
@@ -177,7 +176,7 @@ Nous avons bien la preuve que le problème " Peut-on prouver qu'un nombre est pa
|
||||
|
||||
### Tous les problèmes sont ils décidables?
|
||||
|
||||
Et bien non ! Disons le tout de suite, il existe un nombre de problèmes que l'ont ne peut résoudre par un simple algorithme. On parlera de ***Problèmes Indécidables*** !
|
||||
Et bien non ! Disons le tout de suite, il existe un nombre de problèmes que l'on ne peut résoudre par un simple algorithme. On parlera de ***Problèmes Indécidables*** !
|
||||
|
||||
La question qui se pose à nous est de savoir comment reconnaitre un problème indécidable.
|
||||
|
||||
@@ -203,9 +202,9 @@ C'est à dire qu'on va partir d'une hypothèse qu'on supposera vraie, pour essay
|
||||
|
||||
Cela nous ramènera donc à des décisions logiques qui en découleront.
|
||||
|
||||
### Mais si le postulat de base est éronné ?
|
||||
### Mais si le postulat de base est erroné ?
|
||||
|
||||
C'est tout le principe : s'il est éronné, alors il faut tester son exact opposé : celà prend du temps.
|
||||
C'est tout le principe : s'il est erroné, alors il faut tester son exact opposé : cela prend du temps.
|
||||
|
||||
Et enfin, en testant l'opposé, on pourra savoir si notre problème est décidable ou pas !
|
||||
|
||||
@@ -215,7 +214,7 @@ Oui mais :En 1936, Alan Turing démontre son indécidabilité.
|
||||
|
||||
#### Attendez, le programme qui determine l'indécidabilité est lui même indécidable ??
|
||||
|
||||
Eeh oui, c'est incroyable mais juste : ironique n'est ce pas ? On peut même dire *absurde*
|
||||
Eh oui, c'est incroyable mais juste : ironique n'est ce pas ? On peut même dire *absurde*
|
||||
|
||||
En effet, on va user d'un raisonnement par l'absurde pour montrer que ce qu'on pense vrai est en réalité faux.
|
||||
|
||||
@@ -227,7 +226,7 @@ Supposons que l'on puisse écrire une fonction arret, capable de dire si une fon
|
||||
|
||||
Il n'est, dans notre exemple, absolument pas certain qu'une telle fonction existe.
|
||||
|
||||
Nous allons dans un premier temps, créer une fonction qui nous servira de cobaye dans notre fonction absurbe de programme d'arrêt.
|
||||
Nous allons dans un premier temps, créer une fonction qui nous servira de cobaye dans notre fonction absurde de programme d'arrêt.
|
||||
|
||||
|
||||
```python
|
||||
@@ -253,16 +252,23 @@ Maintenant, définissons notre fonction absurde
|
||||
|
||||
```python
|
||||
def absurde(programme):
|
||||
if arret_programme(programme,x):
|
||||
if arret_programme(programme, programme):
|
||||
# Si le programme s'arrête, on boucle à l'infini
|
||||
while True:
|
||||
continue
|
||||
else:
|
||||
return True
|
||||
pass
|
||||
else:
|
||||
# Si le programme boucle, on s'arrête
|
||||
return True
|
||||
```
|
||||
|
||||
Si on analyse ce que l'on vient d'écrire : Quand la fonction arret_programme peut s'arrêter, la fonction absurde va lui permettre de boucler à l'infini !
|
||||
Analysons ce que l'on vient d'écrire :
|
||||
- Si `arret_programme(programme, programme)` renvoie `True` (le programme s'arrête), alors `absurde` **boucle à l'infini**
|
||||
- Si `arret_programme(programme, programme)` renvoie `False` (le programme boucle), alors `absurde` **s'arrête** et renvoie `True`
|
||||
|
||||
Mais si le test se révèle négatif, on renvoit True et arretons donc la fonction!
|
||||
**Le paradoxe** : Que se passe-t-il si on appelle `absurde(absurde)` ?
|
||||
|
||||
- Si `arret_programme(absurde, absurde)` dit que `absurde(absurde)` s'arrête → alors `absurde(absurde)` boucle (contradiction !)
|
||||
- Si `arret_programme(absurde, absurde)` dit que `absurde(absurde)` boucle → alors `absurde(absurde)` s'arrête (contradiction !)
|
||||
|
||||
Nous venons donc de prouver l'impossible. Pas mal non ?
|
||||
|
||||
@@ -277,7 +283,7 @@ Si la machine ne peut nous aider, il vous faudra donc, en tant qu'humain, toujou
|
||||
|
||||
On peut retenir deux choses de notre exemple : Le fameux théorème de Kurt Gödel, qui traite de l'indécidabilité, n'est pas vérifiable puisque qu'on ne peut vérifier la décidabilité de tous les sytèmes, dès lors que la fonction qui doit nous y aider n'est elle même pas décidable !
|
||||
|
||||
Pour comprendre la démonstration de tout cela, il nous aura fallu analyser la démonstration en elle même, et non pas essayer de démontrer ce qu'elle prouve. Ce qui laisse perplexe quant à la veracité de certaines affirmations.
|
||||
Pour comprendre la démonstration de tout cela, il nous aura fallu analyser la démonstration en elle même, et non pas essayer de démontrer ce qu'elle prouve. Ce qui laisse perplexe quant à la véracité de certaines affirmations.
|
||||
|
||||
Enfin, on peut se demander une chose. Puisque nous avons une donnée en entrée d'une fonction, et une donnée en sortie...Une fonction ne serait-elle pas uniquement que données ?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user