Que ne peut pas faire Idris en abandonnant la complétude de Turing?


35

Je sais qu'Idris a des types dépendants mais n'est pas complet. Que peut-il ne pas faire en abandonnant la complétude de Turing, et est-ce lié à avoir des types dépendants?

Je suppose que cette question est assez spécifique, mais je ne connais pas énormément les types dépendants et les systèmes de types associés.


2
Je suppose que vous cherchez un exemple concret? Je ne connais pas bien Idris, mais dans Isabelle / HOL vous ne pouvez pas écrire (ou plutôt compiler) des fonctions qui ne se terminent pas toujours (pire encore, vous devez fournir une preuve de résiliation ).
Raphaël

Quelque chose dans ce sens oui - je n'étais pas tout à fait sûr qu'il y aurait quelque chose d'assez spécial, comme vous ne pouvez pas encoder une langue avec certaines propriétés dans le système de types, ou si ce serait un peu plus général (par exemple, comme vous l'avez dit , toutes les fonctions doivent être prouvées pour se terminer)
Squidly

1
Je suppose que cette hypothèse erronée vient d’Edwin Brady qui dit qu’Idris est "Pacman complet". Je pense que son objectif principal en disant "Pacman complete" au lieu de "Turing complete", est qu'il veut souligner l'importance de la facilité de compilation des langues par le cerveau humain et pas seulement par les machines! ... des langages stupides comme BrainFuck sont sûrement turing complet, mais il peut prendre un cerveau humain un certain temps au code écrit en BrainFuck Comprendre, développant ainsi, et encore plus important maintenant , un programme Pacman dans BrainFuck prend tout à fait un effort ..
Michelrandahl

@Mitzh Pas vraiment. Je pense que c'est parce que j'ai mal compris quelque chose que je l'ai entendu dire dans un discours.
Squidly

Réponses:


50

Idris est Turing complet! Il vérifie la totalité (terminaison lors de la programmation avec données, productivité lors de la programmation avec codata) mais n'exige pas que tout soit total.

Fait intéressant, disposer de données et de codata suffit à modéliser la complétude de Turing, car vous pouvez écrire une monade pour des fonctions partielles. Je l’ai fait il ya des années dans Coq - c’est probablement le cas actuellement, mais ici, c’est néanmoins: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .

Vous avez besoin d’une seule évasion pour exécuter de telles choses, mais Idris vous permet de le faire.

Idris ne réduira pas les fonctions partielles au niveau du type, afin de maintenir la vérification du type décidable. En outre, seuls les programmes totaux peuvent raisonnablement être considérés comme des preuves.


4
L'homme lui-même. Qu'est-ce que la productivité dans ce contexte?
Squidly

5
Dualité à la terminaison: alors qu'une définition inductive doit se terminer (en consommant toutes ses données), une définition coinductive doit être productive - en pratique, cela signifie, bref, que tout appel récursif doit être gardé par un constructeur. J'ai trouvé que cette explication était la plus claire (ymmv): adam.chlipala.net/cpdt/html/Coinductive.html
Edwin Brady

14

Premièrement, je suppose que vous avez déjà entendu parler de la thèse de Church-Turing, selon laquelle tout ce que nous appelons le «calcul» peut être fait avec une machine de Turing (ou l’un des nombreux modèles équivalents). Ainsi, un langage complet de Turing est un langage dans lequel tout calcul peut être exprimé. Inversement, un langage incomplet de Turing est un langage dans lequel certains calculs ne peuvent être exprimés.

Ok, ce n'était pas très instructif. Laissez-moi vous donner un exemple. Il y a une chose que vous ne pouvez pas faire dans un langage Turing-incomplet: vous ne pouvez pas écrire un simulateur de machine de Turing (sinon, vous pourriez encoder n'importe quel calcul sur la machine de Turing simulée).

Ok, ce encore n'a pas été très instructif. La vraie question est: quel programme utile ne peut pas être écrit dans un langage incomplet? Eh bien, personne n’a proposé de définition de «programme utile» incluant tous les programmes écrits par quelqu'un dans un but utile, sans compter tous les calculs de la machine de Turing. Donc, concevoir un langage incomplet de Turing dans lequel vous pouvez écrire tous les programmes utiles reste un objectif de recherche à très long terme.

Maintenant, il existe plusieurs types très différents de langages Turing-incomplets, et ils diffèrent par ce qu'ils ne peuvent pas faire. Toutefois, il existe un thème commun: les langages Turing-complete doivent inclure un moyen de terminer conditionnellement ou de continuer à fonctionner pendant une durée qui n'est pas limitée par la taille du programme, et un moyen pour le programme d'utiliser une quantité de mémoire qui dépend de l'entrée . Concrètement, les langages de programmation les plus impératifs fournissent ces capacités via des boucles while et une allocation dynamique de la mémoire, respectivement. La plupart des langages de programmation fonctionnels fournissent ces capacités via la récursivité et l’imbrication de la structure de données.

Idris est fortement inspiré par Agda . Agda est un langage conçu pour prouver des théorèmes . Maintenant , prouvant théorèmes et les programmes en cours d' exécution sont très étroitement liés , de sorte que vous pouvez écrire des programmes en Agda comme vous prouvez un théorème. Intuitivement, une preuve du théorème «A implique B» est une fonction qui prend une preuve du théorème A comme argument et renvoie une preuve du théorème B.

Puisque le but du système est de prouver des théorèmes, vous ne pouvez pas laisser le programmeur écrire des fonctions arbitraires. Imaginez que le langage vous permette d’écrire une fonction récursive qui s’appelle tout simplement:

oops : A -> B
oops x = oops x

Vous ne pouvez pas laisser l’existence d’une telle fonction vous convaincre que A implique B, sinon vous seriez en mesure de prouver quoi que ce soit et pas seulement de vrais théorèmes! Ainsi, Agda (et des démonstrateurs de théorèmes similaires) interdisent la récursion arbitraire. Lorsque vous écrivez une fonction récursive, vous devez prouver qu'elle se termine toujours , de sorte que chaque fois que vous l'exécutez sur une preuve du théorème A, vous savez qu'elle construira une preuve du théorème B.

La limite pratique immédiate d'Agda est qu'il est impossible d'écrire des fonctions récursives arbitraires. Étant donné que le système doit pouvoir rejeter toutes les fonctions non terminantes, l'indécidabilité du problème bloquant (ou plus généralement du théorème de Rice ) garantit qu'il existe également des fonctions terminales qui sont également rejetées. Une difficulté pratique supplémentaire est que vous devez aider le système à prouver que votre fonction prend fin.

Il existe de nombreuses recherches en cours pour rendre les systèmes de preuve plus similaires à un langage de programmation sans compromettre leur garantie que si vous avez une fonction de A à B, c'est aussi bon que la preuve mathématique que A implique B. Elargir le système pour en accepter plus la terminaison des fonctions est l’un des sujets de recherche. Les autres directions d'extension comprennent la gestion de problèmes tels que les entrées / sorties et la simultanéité dans le «monde réel». Un autre défi consiste à rendre ces systèmes accessibles aux simples mortels (ou peut-être à convaincre les simples mortels de leur accessibilité).

Je ne connais pas Idris. C'est une réponse aux défis que je viens de mentionner. D'après ce que j'ai compris d'un simple coup d'œil à la pré - impression de 2013 , Idris est un logiciel complet, mais comprend un vérificateur de totalité. Le vérificateur de totalité vérifie que chaque fonction annotée avec le mot-clé se totaltermine. Le fragment de langue qui ne contient que des programmes Idris où chaque fonction est totale a un pouvoir expressif similaire à Arda (probablement pas une correspondance exacte en raison de différences dans la théorie des types, mais suffisamment proche pour que vous ne le remarquiez pas, à moins d’essayer délibérément).

Pour d'autres exemples de langages qui ne sont pas complets de Turing de différentes manières, voir Quelles sont les limitations pratiques d'un langage complet tel que le Coq? (dont cette réponse est dans une large mesure prise).


3
"quel programme utile ne peut pas être écrit dans un langage Turing-incomplet?" Une machine virtuelle Java.
David Richerby

@ David Richerby ne peut pas vous? La machine virtuelle Java est-elle vraiment complète? Il y a une limite à la taille d'un objet individuel. Pouvez-vous organiser l'allocation et l'accès à un nombre illimité d'objets? Par exemple, en C, la réponse semble être non car il n’ya que très peu de valeurs de pointeur.
Gilles 'SO- arrête d'être méchant'

Pour les lecteurs intéressés par cette partie, nous avons un autre article expliquant pourquoi il ne peut pas y avoir de langage de programmation pour les langues toujours terminales.
Raphaël

3
@Gilles Je comprends ce que vous dites, mais n'est-il pas plus ou moins équivalent à dire qu'aucun langage de programmation réel n'est Turing-complete? Après tout, toute mise en œuvre se heurtera au type d'obstacle que vous mentionnez. Cela semble être un assez gros éléphant à avoir dans la salle tout en considérant ce qu'Idris perd en n'étant pas complet. Est-ce qu'il perd plus que toute autre langue, par exemple? Si vous interdisez le stockage externe sans limite (par exemple, le programme s'arrête pour dire "insérez le disque suivant / précédent"), alors n'importe quelle langue est trivialement non complète de Turing, donc toute question à propos de ce cas est vide.
David Richerby

3
@DavidRicherby Mes commentaires (mais pas ma réponse) sont en mode geek de la théorie des langages de programmation. Si vous prenez la spécification formelle de SML (par exemple), il est possible de concevoir (mais bien sûr de ne pas implémenter dans le monde physique) une implémentation du langage capable de simuler tous les programmes calculables. Ce n'est pas le cas en C, car la fin de mémoire est intégrée au langage ( sizeof(void*)). Dans ma réponse, je traite les langues de manière idéalisée, donc SML ou C serait considéré comme Turing-complet.
Gilles 'SO- arrête d'être méchant'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.