70 votes

Quelles sont les limites pratiques de non-turing langue comme le Coq?

Comme il y a des non-Turing langues, et étant donné que je n'ai pas d'étude Comp Sci à l'université, quelqu'un pourrait expliquer quelque chose que Turing-incomplète de la langue (comme le Coq) ne peut pas faire?

Ou est la complétude/incomplétude de pas de réelle pratique de l'intérêt (c'est à dire qu'il ne ferait pas beaucoup de différence dans la pratique)?

EDIT - je suis à la recherche d'une réponse, le long des lignes de vous ne peut pas construire une table de hachage dans un non-Turing langue à cause de X, ou quelque chose comme ça!

110voto

Gilles Points 37537

Tout d'abord, je suppose que vous avez déjà entendu parler de la thèse de Church-Turing, qui stipule que tout ce que nous appelons le "calcul" est quelque chose qui peut être fait avec une machine de Turing (ou l'un des nombreux autres modèles équivalents). Ainsi, une Turing-complet de la langue est celui dans lequel tout calcul peut être exprimé. À l'inverse, une Turing-incomplète de la langue est un calcul qui ne peut pas être exprimé.

Ok, ce n'était pas très instructif. Permettez-moi de donner un exemple. Il y a une chose que vous ne pouvez pas faire quelque Turing-incomplète de la langue: vous ne pouvez pas écrire un simulateur de machine de Turing (sinon, vous pouvez encoder n'importe quel calcul sur la simulation de machine de Turing).

Ok, qui encore n'était pas très instructif. la vraie question est, est ce utile de programme ne peut pas être écrit dans un de Turing-incomplète de la langue? Eh bien, personne n'est venu avec une définition de "programme" qui comprend tous les programmes de quelqu'un, quelque part, a écrit à des fins utiles, et qui ne comprennent pas tous les machine de Turing calculs. De sorte que la conception d'une Turing-incomplète de la langue dans laquelle vous pouvez écrire tous les programmes utiles, est encore très long terme but de la recherche.

Maintenant il ya plusieurs différents types de Turing-incomplète langues, et ils diffèrent en ce qu'ils ne peuvent pas le faire. Cependant, il ya un thème commun. Si vous êtes à la conception d'une langue, il existe deux moyens principaux pour s'assurer que le langage Turing-complet:

  • exiger que la langue est arbitraire des boucles (while) et de l'allocation dynamique de la mémoire (malloc)

  • exiger que la langue prend en charge arbitraire des fonctions récursives

Regardons quelques exemples de non-Turing langues que certaines personnes pourraient néanmoins appel langages de programmation.

  • Les premières versions de FORTRAN n'ont pas d'allocation dynamique de la mémoire. Vous avez eu à déterminer à l'avance la quantité de mémoire de votre calcul besoin et allouer que. En dépit de cela, le FORTRAN était une fois la plupart des langage de programmation largement utilisé.

    L'évidente limitation pratique est que vous devez prévoir les besoins en mémoire de votre programme avant de l'exécuter. Cela peut être difficile, et peut-être impossible si la taille de l'entrée de données n'est pas limité à l'avance. À l'époque, la personne de l'alimentation de l'entrée de données est souvent la personne qui a écrit le programme, de sorte qu'il n'était pas une grosse affaire. Mais ce n'est pas vrai pour la plupart des programmes écrits aujourd'hui.

  • Coq est un langage conçu pour prouver des théorèmes. Maintenant prouver des théorèmes et des programmes en cours d'exécution sont très étroitement liés, de sorte que vous pouvez écrire des programmes en Coq comme vous démontrer un théorème. Intuitivement, une preuve du théorème "A implique B" est une fonction qui prend une preuve d'Un théorème comme argument et retourne une preuve du théorème B.

    Étant donné que l'objectif du système est de prouver des théorèmes, vous ne pouvez pas laisser le programmeur d'écrire des fonctions arbitraires. Imaginez la langue vous a permis de vous écrire un idiot en fonction récursive, qui vient d'appeler lui-même (choisir la ligne qui utilise votre langue préférée):

    theorem_B boom (theorem_A a) { return boom(a); }
    let rec boom (a : theorem_A) : theorem_B = boom (a)
    def boom(a): boom(a)
    (define (boom a) (boom a))
    

    Vous ne pouvez pas laisser l'existence d'une telle fonction vous convaincre que A implique B, ou autre chose qui vous serait en mesure de prouver quoi que ce soit et pas seulement vrai théorèmes! Afin de Coq (et des démonstrateurs) l'interdiction de l'arbitraire de la récursivité. Lorsque vous écrivez une fonction récursive, vous devez prouver qu'il se termine toujours, de sorte que chaque fois que vous l'exécutez sur présentation de la preuve du théorème de Un vous de savoir qu'il va construire une preuve de théorème B.

    La pratique immédiate de la limitation de Coq, c'est que vous ne pouvez pas écrire arbitraire des fonctions récursives. Depuis que le système doit être en mesure de rejeter tous les non-terminaison des fonctions, l'indécidabilité du problème de l'arrêt (ou plus généralement de Riz le théorème de) assure qu'il y mettent fin à des fonctions qui sont rejetés en tant que bien. Un ajout pratique de la difficulté, c'est que vous devez aider le système à prouver que votre fonction ne se terminent.

    Il y a beaucoup de recherches en cours sur la fabrication de systèmes d'épreuves plus de la programmation de langue-comme sans compromettre leur garantir que si vous avez une fonction de A vers B, il est aussi bon comme une preuve mathématique que A implique B. l'Extension du système à accepter plus de résiliation de fonctions est l'un des sujets de recherche. Une autre extension directions notamment faire face à un tel "monde réel" des préoccupations en entrée/sortie et de la concurrence. Un autre défi est de faire de ces systèmes accessibles au commun des mortels (ou peut-être convaincre le commun des mortels qu'ils sont en fait accessibles).

  • Programmation synchrone, les langues sont des langues conçu pour la programmation des systèmes temps-réel, c'est-à-dire où le programme doit répondre en moins de n cycles d'horloge. Ils sont principalement utilisés pour les systèmes essentiels tels que les contrôles de véhicules ou de signalisation. Ces langages offrent de solides garanties sur la durée d'un programme à exécuter et la quantité de mémoire qu'il peut allouer.

    Bien sûr, la contrepartie de ces garanties solides, c'est que vous ne pouvez pas écrire des programmes dont la consommation de la mémoire et temps d'exécution que vous n'êtes pas en mesure de prévoir à l'avance. En particulier, vous ne pouvez pas écrire un programme dont la consommation de mémoire ou de temps d'exécution dépend de la saisie des données.

  • Il y a beaucoup de langues spécialisées qui ne sont même pas essayer d'être langages de programmation et peuvent donc rester confortablement loin de Turing à l'exhaustivité: les expressions régulières, les données de langues, la plupart des langages de balisage, ...

Par la voie, Douglas Hofstadter a écrit plusieurs très intéressants ouvrages de vulgarisation scientifique sur le calcul, en particulier Gödel, Escher, Bach: an Eternal Golden Braid. Je ne me souviens pas s'il traite explicitement des limites de Turing-l'inachèvement, mais la lecture de ses livres sera certainement vous aider à comprendre plus de matériel technique.

6voto

slebetman Points 28276

La plus directe, la réponse est: une machine ou d'une langue qui n'est pas Turing ne peut pas être utilisé pour exécuter/simuler les machines de Turing. Cela vient de la définition de base de Turing complet: une machine/langue est turing complet s'il peut exécuter/simuler les machines de Turing.

Alors, quelles sont les implications pratiques? Eh bien, il est une preuve que tout ce qui peut être montré pour être turing peut résoudre tous les calculable problèmes. Qui, par définition, signifie que tout ce qui n'est pas turing a le handicap qu'il y a quelques calculable problèmes qu'il ne peut pas résoudre. Ce sont ces problèmes dépend de quelles fonctionnalités sont manquantes qui rend le système non-Turing.

Par exemple, si une langue n'a pas de support de boucle ou de la récursivité ou implicitement boucles ne peuvent être Turing parce que les machines de Turing peut être programmé pour s'exécuter à jamais. Par conséquent, que la langue ne peut résoudre des problèmes exigeant des boucles.

Un autre exemple est que si une langue ne prend pas en charge les listes ou des tableaux (ou de vous permettre de les imiter, par exemple en utilisant le système de fichiers), alors il ne peut pas mettre en œuvre une machine de Turing parce que les machines de Turing besoin arbitraire, aléatoire l'accès à la mémoire. Par conséquent, que la langue ne peut résoudre des problèmes nécessitant l'arbitraire, aléatoire l'accès à la mémoire.

Ainsi, la fonctionnalité qui manque, qui permet de classer une langue non-Turing est la même chose que pratiquement les limites de l'utilité de la langue. Donc la réponse est: ça dépend: en quoi le langage non-Turing?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X