2010-04-11 25 views
4

J'ai créé un langage de programmation complet (déjà prouvé) donc il doit être possible d'écrire un quine, non?Comment un quine dans mon langage de programmation pourrait-il ressembler?

Mais toutes les quines que je connais stockent leur code source dans une chaîne et y remplacent un caractère spécial en utilisant quelque chose comme chr et ord.

Ma langue ne dispose que les suivantes

  • Arithmétique de base
  • Int et types de chaînes
  • Variables
  • opérateur ==
  • de GOTO conditionnelles

Je ne sais pas comment je pourrais écrire un quine comme je l'ai aucune manipulation de chaîne réelle disponible, je ne peux sortir que des chaînes constantes. Pourtant, il est 100% turing-complet.

+2

Vous ne comprenez pas ce que Turing signifie. Cela ne signifie pas que vous pouvez écrire n'importe quel programme. –

+0

@Neil, je poserais la question d'une manière différente: un tel encodage d'une machine de Turing existe-t-il, de sorte qu'il est impossible d'écrire un quine pour cela? (Cependant, il appartient à mathoverflow) –

+0

@PAvel: pas sûr de ce que vous entendez par "encodage" d'une machine de Turing. @Neil: bien sûr, cela signifie que vous pouvez écrire ** n'importe quel programme **, même si le résultat peut être difficile à lire. C'est la définition d'un ordinateur universel. – kriss

Répondre

1

Si vous avez des entiers, vous pouvez encoder ou décoder des chaînes (des schémas aussi simples que A = 1, B = 2, etc. suffisent pour cela). Vous devez seulement être capable de comparer des chaînes constantes ou de comparer int. Par conséquent, il semble n'y avoir aucun problème fondamental.

Vous travaillez avec des chiffres et écrire des choses comme

if (n == 1) print "A" 
if (n == 2) print "B" 
... 

Il peut y avoir quelques difficultés pratiques. La chose avec des cordes n'est pas que vous ayez des caractères, mais qu'ils sont équivalents à de très grands nombres. Ce dont vous avez besoin ici, c'est d'avoir accès à des nombres de précision illimités ou à une sorte de tableau de nombres de taille fixe, ou à d'autres grandes structures de données. Un tableau de nombres fera pour vous ce qu'une chaîne peut faire. Mais si votre langue est complète, Turing devrait avoir un moyen d'accéder facilement à une grande partie de la mémoire

Un langage complet de Turing limité à une bande de 32 bits (ou où vous devez donner un nouveau nom à chaque espace mémoire de 32 bits) serait dommage, pas sûr que vous pourriez écrire un quine avec une telle restriction. En passant, il serait intéressant de savoir comment vous avez prouvé que votre langue était complète si vous n'aviez pas de tableaux ou une structure similaire. La méthode courante que j'utilise habituellement consiste à implémenter une machine de Turing en utilisant mon langage. Mais pour ce faire, j'ai besoin d'une sorte de tableau pour simuler le groupe.

Ce type d'encodage est fondamentalement ce que Gödel a fait dans son théorème d'incomplétude, trouver un moyen d'encoder des expressions logiques comme des entiers, puis raisonner sur cela. Si vous donnez plus d'éléments de syntaxe, nous pourrions même essayer de le faire (si vous n'avez pas de fonctions mais seulement des gotos, cela posera également un problème, mais vous pouvez aussi simuler cela). Le problème de base est que vous devez trouver un moyen de "compresser" votre code source codé. Si vous avez une longue chaîne de caractères disponible, cela peut probablement vous aider.

+0

Soit vous avez besoin d'un programme illimité (pour imprimer toutes les chaînes finies possibles), soit vous devez utiliser plusieurs impressions (c'est la concaténation de chaînes), ou vous avez besoin de quelque chose qui fonctionne comme un tableau.Et comment appellent-ils un tableau de caractères codés en nombres entiers? ;-) –

+0

@PAvel: l'OP a également dit qu'il a l'arithmétique de base disponible, d'où le n dans mon exemple ci-dessus peut être extrait d'un certain nombre plus grand. Je propose d'appeler une fonction qui imprime un caractère (ou de simuler un avec gotos, l'idée de base est ici de passer au point de retour, comme lors de la programmation en utilisant Continuation Passing Style pour les langues qui le supportent). De cette fonction je peux écrire une autre qui imprime une chaîne encodée en grand nombre (ou un tableau). Je suis d'accord que ce que vous faites sur ces nombres est isomorphe à la manipulation de chaînes, mais vous n'avez pas besoin que cela soit supporté par les chaînes du langage. – kriss

3

Si votre langue est complète et qu'il y a un quine, il y en a probablement une infinité. Voici une façon de construire quelques-uns d'entre eux:

  1. Mettre en oeuvre un interprète Brainfuck (ou un autre langage simple complet de Turing) dans votre langue.Ecrivez votre programme de sorte que la source X1<brainfuck source>Y1 lors de l'exécution, interprète le programme Brainfuck.
  2. Ecrire un algorithme string f(string a, string b) dans toutes les langues de votre choix que lorsque donné de sorties a et b un programme Brainfuck que lorsque l'exécution envoie la chaîne a, l'intégralité du code source de Brainfuck, la chaîne b. Vous pouvez adapter un quine Brainfuck existant pour ce faire.
  3. Calculer f(X1, Y1) puis intégrer le programme Brainfuck résultant dans votre programme de 1.

La première étape est la plus difficile, mais vous pouvez déjà avoir fait parce que l'un des moyens les plus faciles à prouver que quelque chose est Turing complete est de mettre en place un interprète pour une autre langue dont Turing a déjà prouvé qu'elle était complète.

La deuxième étape est déjà prouvée possible et est indépendante de la langue de votre programme.

L'étape trois est un calcul simple.

0

Apparemment, un programme dans votre langage de programmation est une chaîne. Une sortie d'un quine est un programme. Par conséquent, une sortie d'un quine est une chaîne. Si vous n'avez aucune manipulation de chaîne, il est impossible d'en écrire une.

Vous devez soit encoder votre programme en chiffres (au lieu d'un simple codage de texte lisible par humen), soit implémenter une manipulation de chaîne.

+1

Ce n'est pas vrai; voir la réponse de Kriss. Fondamentalement, vous pouvez simuler la manipulation de chaînes en utilisant des constantes de chaînes et des GOTO conditionnels qui les impriment. – SLaks

+0

@SLaks, il n'y a rien dans la réponse de Kriss ce qui contredit le mien. Je sais que les chaînes de caractères sont encodées en entiers (c'est vrai pour n'importe quel ordinateur de nos jours), mais l'implémentation de ce serait l'implémentation de la "manipulation de chaînes". –

+0

@Pavel: l'OP a déclaré qu'il avait ** des constantes de chaîne **. C'est suffisant pour implémenter toutes les manipulations de chaînes. Votre réponse serait exacte s'il avait seulement des nombres entiers ou une sortie limitée. (Je me demande si quelqu'un a déjà essayé de mettre en œuvre un Quine in Intercal [http://en.wikipedia.org/wiki/INTERCAL] ... les sorties ne sont que des chiffres codés en chiffres romains). Là, nous devrions considérer que la sortie est codée. – kriss