Как может выглядеть квин на моем языке программирования? - PullRequest
5 голосов
/ 11 апреля 2010

Я создал язык программирования, полный по Тьюрингу (уже проверенный), поэтому для него должна быть возможность написать quine , верно?

Но все известные мне квины хранят свой исходный код в строке, а затем заменяют в ней специальный символ, используя что-то вроде chr и ord.

Мой язык имеет только следующие значения:

  • Базовая арифметика
  • Int и строковые типы
  • Переменные
  • == оператор
  • Условные слова

Я понятия не имею, как можно написать квинну, так как у меня нет реальных манипуляций со строками , я могу выводить только константы. Тем не менее, он на 100% завершен.

Ответы [ 3 ]

3 голосов
/ 11 апреля 2010

Если ваш язык завершен по Тьюрингу и существует одна квин, скорее всего, их бесконечно много. Вот способ построить только некоторые из них:

  1. Реализация Brainfuck (или другого простого языка Тьюринга) на вашем языке. Напишите вашу программу так, чтобы источник X1<brainfuck source>Y1 при запуске интерпретировал программу Brainfuck.
  2. Напишите алгоритм string f(string a, string b) на любом языке по вашему выбору, который при задании любых a и b выводит программу Brainfuck, которая при запуске выдает строку a, весь исходный код Brainfuck, затем строку b. Для этого вы можете адаптировать существующую квинфакскую квинну.
  3. Рассчитайте f(X1, Y1) и затем внедрите получившуюся программу Brainfuck в вашу программу с 1.

Шаг первый является самым сложным, но вы, возможно, уже сделали это, потому что один из самых простых способов доказать, что что-то является завершенным по Тьюрингу, - это реализовать интерпретатор для другого языка, который уже был доказан как завершенный по Тьюрингу.

Второй шаг уже возможен и не зависит от языка вашей программы.

Шаг третий - простой расчет.

3 голосов
/ 11 апреля 2010

Если у вас есть целые числа, вы можете кодировать или декодировать строки (достаточно простых схем, таких как A = 1, B = 2 и т. Д.). Вам нужно только уметь сравнивать константы или сравнивать int. Следовательно, кажется, нет фундаментальной проблемы.

Вы работаете с числами и пишете такие вещи, как

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

Могут быть некоторые практические трудности. Проблема со строками не в том, что в них есть символы, а в том, что они эквивалентны очень большим числам. Здесь вам нужно либо иметь доступ к числам с неограниченной точностью, либо к какому-либо массиву чисел с фиксированным размером, либо к другой большой структуре данных. Массив чисел сделает для вас то, что может сделать строка. Но если ваш язык завершен по Тьюрингу, у него должен быть способ легко получить доступ к некоторому большому фрагменту памяти

Жаль, что полный язык Тьюринга, ограниченный 32-битной лентой (или где вы должны дать новое имя каждому другому пространству памяти из 32 бит), был бы жаль, не уверен, что вы могли бы написать квинну с таким ограничением. Кстати, было бы интересно узнать, как вы доказали, что ваш язык завершен по Тьюрингу, если у вас нет массивов или подобной структуры. Обычный метод, который я обычно использую, - это реализация машины Тьюринга с использованием моего языка. Но для этого мне нужен какой-то массив для имитации полосы.

Этот вид кодирования - это, в основном, то, что Гедель сделал в своей теореме о незавершенности, найти способ кодировать логические выражения в виде целых чисел и затем обосновать это.

Если вы дадите еще несколько элементов синтаксиса, мы могли бы даже попытаться это сделать (если у вас нет функций, а есть только gotos, это также будет проблемой, но вы также можете смоделировать это). Основная проблема заключается в том, что вы должны найти способ «сжать» ваш кодированный исходный код. Если у вас есть длинная строковая константа, это может помочь.

0 голосов
/ 11 апреля 2010

Очевидно, что программа на вашем языке программирования является строкой. Вывод из quine - это программа.

Таким образом, выводом quine является строка. Если у вас нет никаких манипуляций со строками, их невозможно написать.

Вы должны либо закодировать вашу программу в числах (вместо простой кодировки текста, удобочитаемого для человека), либо реализовать манипулирование строками.

...