2010-05-17 2 views
9

возможно ли написать программу, которая печатает свой собственный исходный код, используя «функцию генерации последовательности»?Можно ли написать программу, которая печатает свой собственный исходный код, используя «функцию генерации последовательности»

То, что я называю функцией генерации последовательности, является просто функцией, которая возвращает значение из определенного интервала (то есть печатаемых ascii-charecters (32-126)). теперь дело в том, что эта сгенерированная последовательность должна быть программным исходным кодом. как вы видите, реализация функции, которая возвращает произвольную последовательность, действительно тривиальна, но поскольку возвращаемая последовательность должна содержать реализацию самой функции, это очень нетривиальная задача.

это как такая программа (и его соответствующий выход) может выглядеть следующим образом

#include <stdio.h> 

int fun(int x) { 
    ins1; 
    ins2; 
    ins3; 
    . 
    . 
    . 
    return y; 
} 

int main(void) { 
    int i; 
    for (i=0; i<size of the program; i++) { 
     printf("%c", fun(i)); 
    } 
    return 0; 
} 

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

+0

Проверьте код, который я разместил ниже. Это то, что вы хотите? Я не уверен на 100%, каковы ваши правила. – sigfpe

ответ

1

Что вы имеете в виду, это QUINE. Статья Wiki о нем довольно хороша, с некоторыми полезными ссылками. http://en.wikipedia.org/wiki/Quine_%28computing%29

+0

Я уже отметил мой вопрос с помощью «quine», вы видите: P. Я думаю, что «общий» quine работает совершенно иначе. если я ошибаюсь, то, пожалуйста, покажите мне тот, который работает точно так, как я описал. Я, для себя, не повезло найти его еще ... – guest

+0

Не понимаю, почему не смог. Если ваша функция сохранила массив символов с источником программы в нем, это будет работать нормально. На самом деле это было бы очень похоже на первый пример C на странице вики. – corsiKa

+0

Дело в том, что функция выводит результат «математически», не сохраняя ничего! поэтому, когда я вызываю функцию с восходящими значениями: fun (0) = 35 = '#', fun (1) = 105 = 'i', fun (2) = 110 = 'n' и т. д. – guest

2

Если вы знаете, как закодировать массив как функцию (вы, кажется, говорите, что уже знаете, как это сделать), то Kleene Recursion theorem гарантирует, что это можно сделать.

Но для сомневающихся томасов, here - пример. Он имеет функцию генерации программ, которая использует только +, -, *,/или вызывает другие функции, которые их используют.

Куинс всегда возможен, если у вас есть полнота и свобода печатать то, что вам нравится.