Les idées principales
Être reconnaissable signifie que vous pouvez créer un processus automatique (nous y reviendrons plus tard) qui prend un mot comme paramètre tel que
- Si le processus automatique se termine, il renvoie OUI ou NON.
- Ce processus automatique n'a pas à se terminer sur chaque entrée, mais il doit se terminer si le mot d'entrée est dans la langue.
Être co-reconnaissable signifie la langue w∈Σ∗,w∉L (ou, en anglais, l'ensemble de tous les mots qui ne sont pas en L, c'est-à-dire sa complémentarité) est reconnaissable.
Être décidable signifie que vous pouvez créer un processus automatique qui prend un mot en entrée, de telle sorte que
- Le processus automatique se termine toujours
- Il répond OUI ou NON. S'il répond OUI, le mot est dans la langue, s'il répond NON, le mot n'est pas dans la langue.
Un résultat important est que L est décidable si et seulement si L est reconnaissable et co-reconnaissable.
L'idée pour prouver ce résultat est que vous pouvez construire un processus automatique à partir des processus que la reconnaissance et la co-reconnaissance vous donnent, en alternant les étapes des deux processus, jusqu'à ce que l'une d'entre elles vous donne la réponse OUI. L'un d'eux doit le faire, car chaque mot est ou n'est pas dans la langue)
Processus automatiques
Sans être trop formels, de nombreux types de machines ont été conçus, et fondamentalement tous ont été liés à des types de langages (ces types dépendent des outils nécessaires pour définir ces langages. Pour plus d'informations, Chomsky Hierarchy peut vous aider).
Le sens habituel du processus automatique, en ce qui concerne la décidabilité, est une machine de Turing. Vous pouvez définir une machine de Turing de telle sorte qu'elle puisse:
- Recevoir des valeurs de l'entrée
- Enregistrer les valeurs
- Lisez les valeurs qu'il a stockées
- Calcul des opérations mathématiques de base sur les valeurs
- Testez les propriétés mathématiques de base sur ces valeurs et agissez en conséquence, en bouclant éventuellement.
Fondamentalement, une machine de Turing peut faire tout ce que vous pouvez définir dans un programme, sauf qu'il s'agit d'un objet mathématique, avec une mémoire infinie et du temps à consacrer à un calcul. Il ne se termine pas toujours.
Une autre propriété importante des machines de Turing, c'est que vous pouvez décrire une machine de Turing en un seul mot (c'est le codage), et il existe une machine de Turing qui, étant donnée en entrée le codage d'une machine M, et un mot w, peut simuler le calcul de M sur l'entrée w. Ce sera important dans un instant.
Disons simplement que les langages réguliers - qui sont (presque) le type de langage le plus simple auquel vous pouvez penser d'un point de vue mathématique - ont la propriété particulière d'être fermés sous complément. Cela signifie essentiellement que sur ces langues, les notions de reconnaissabilité et de décidabilité sont équivalentes. Cela ne tient pas lorsque vous montez dans la hiérarchie de Chomsky.
Exemple d'un langage indécidable
Nous étudierons le problème de l' arrêt . La question est, pouvons-nous construire une machine de Turing qui, étant donné l'encodage d'une autre machine de TuringM et un mot w, décide siM se termine en entrée w ?
Évidemment, cela est reconnaissable , car il suffit de simulerM sur wjusqu'à ce qu'il se termine, et quand c'est le cas, dites OUI. Toutefois, siMne se termine jamais, nous ne dirons pas NON, nous reconnaissons donc ce langage, mais ne le décidons pas. Il a été prouvé que ce langage ne peut pas être décidé par une machine de Turing. Cela implique un schéma mathématique habituel: un argument diagonal, que je n'appellerais pas intuitif. Vous pouvez vérifier ce croquis de preuve pour vous y habituer.
Pour résumer
Vous ne pourrez pas, étant donné une langue, indiquer simplement si elle est décidable ou non. Aucun algorithme ne peut le faire, et prouver qu'un langage n'est pas décidable demande une certaine réflexion et peut nécessiter des connaissances sur les machines de Turing, les arguments diagonaux, etc.
Cependant, voici ma façon personnelle de traiter cette question. Habituellement, lorsque j'étudie une langue, je suppose qu'elle est décidable, à moins qu'elle ne montre une forme de référence au fonctionnement de Turing Machine. Dans ce cas, je commence à me méfier et j'essaie de définir un algorithme pour décider de la langue. Si cela ne semble pas facile, il est parfois utile de diviser le travail à la fois dans un algorithme de reconnaissance et dans un algorithme de co-reconnaissance. Si je ne peux toujours pas le faire, j'essaierais d'établir un lien entre cette langue et une autre indécidable, comme "Si je peux décider de cette langue, je peux décider du problème d'arrêt". Il s'agit d'une réduction de Turing à un problème indécidable, donc le premier problème ne peut pas être décidable. Si tout cela échoue, je peux essayer d'utiliser des arguments diagonaux, mais cela peut être un peu délicat.