1632
правки
Изменения
Квайны
,rollbackEdits.php mass rollback
{{Определение
|definition='''Квайном''' (англ. '''куайном, quine''') <ref name=quineName/> называется программа, которая выводит свой исходный код. При этом, программа не должна использовать внешние данные (например, читать файл со своим исходным кодом).
}}
Стоит отметить, что программы, использующие для чтения своего кода файловую систему, квайнами не считаются. Например, программа на BASIC вида <font size ==Происхождение названия==Название "квайн2em" было предложено [http:> 10 LIST</font>выводит на экран свой исходный код, поскольку команда <tex>\mathtt{LIST}</rutex> просит среду исполнения вывести в консоль текущую программу (эта функция была необходима для программистов, так как код программы зачастую не мог поместиться на консоль 80x25 символов).wikipedia Квайн состоит из двух сегментов: кода и данных.org/wiki/ХофштадтерДанные представляют собой текстовую версию кода, и, как правило,_Дуглас Дугласом Хофштадтером]получаются из кода простым добавлением обрамляющих кавычек. Код, в его известной книге "Гёдельсвою очередь, сначала использует данные, чтобы вывести код, Эшерсодержащийся в них, Бах: Эта бесконечная гирлянда" а затем просто выводит данные. Формально общий принцип написания квайнов содержится в честь американского логика и философа доказательстве [[http://ruТеорема о рекурсии|теоремы о рекурсии]].wikipediaДалее будет рассмотрено понятие мультиквайна.org ==Мультиквайны=====Связанные определения==={{Определение|definition='''Интроном''' (англ. ''intron'')<ref name=intronName/wiki/Куайн> называется часть сегмента данных, которая не используется для вывода кода,_Уиллард_Ван_Орман Уилларда Ван Ормана Квайна]но сохраняется в процессе саморепликации квайна.}}{{Определение|definition='''Биквайном''' (англ. ''biquine'') называется программа, который углублённо изучал явление [httpкоторая делает одно из двух://en*при обычном запуске она выводит свой исходный код,*при запуске с особым аргументом она выводит исходный код своего "брата" на другом языке программирования.wikipediaЕё "брат" делает то же самое: выводит свой код при запуске без аргументов и выводит код оригинальной программы при запуске с переданным специальным аргументом.org}}{{Определение|definition='''<tex>R</wikitex>-квайном''' (англ. <tex>R</Indirect_selftex>-reference косвенного самоупоминания]''quine'') называется программа, способная вывести исходный код <tex>R-1</tex> программ на других языках программирования в зависимости от переданного ей аргумента, а также свой исходный код при вызове без аргументов. в частности}}Заметим, что требование, чтобы программы были на разных языках программирования, это явление можно проиллюстрировать следующим парадоксальным утверждениемважно, известном как парадокс Квайна: иначе все программы смогут иметь один и тот же код.
{{
Теорема
|about=парадокс Квайнао существовании мультиквайнов|statement=На любом языке программирования можно написать мультиквайн."Становится ложным|proof= Докажем утверждение для биквайна. Для большего количества языков доказательство будет выглядеть аналогично. Рассмотрим программу с двумя параметрами на языке <tex>L_1</tex>, которая выводит первый параметр при обычном запуске и второй {{---}} при запуске со спец. аргументом. По [[Теорема о рекурсии|теореме о рекурсии]] мы можем зафиксировать первый параметр и сказать, что он будет равен исходному коду нашей программы. Таким образом, мы получим программу с одним параметром, которая выводит свой код при запуске без аргументов и выводит параметр при запуске со спец. аргументом. Проделаем то же самое для программы на языке <tex>L_2</tex>. И, когда добавляется к собственной цитате" становится ложнымнаконец, когда добавляется к собственной цитатезафиксируем как параметр первой программы исходный код второй и наоборот.
}}
== Ссылки =Принцип написания===Будем следовать доказательству и напишем мультиквайн для двух языков. Далее покажем, как добавить новый язык.* напишем для каждого языка "полуквайн":<table><tr><td><font size = "2em"> <tex>P_1(p,arg)</tex>: '''if''' (arg == "print second!") '''print'''(p) '''else''' '''print'''(getSrc()) </font></td><td><font size = "2em"> <tex>P_2(p,arg)</tex>: '''if''' (arg == "print first!") '''print'''(p) '''else''' '''print'''(getSrc()) </font></td></tr></table>* подставим код второй программы в первую:<font size = "2em"> <tex>P_1(p,arg)</tex>: '''if''' (arg == "print second!") '''print'''(<tex>P_2</tex>(p, arg).getSrc()) '''else''' '''print'''(getSrc()) </font>* применим [[Теорема о рекурсии|теорему о рекурсии]] и заменим параметр на исходный код программы: <font size = "2em"> <tex>P_1(arg)</tex>: '''if''' (arg == "print second!") '''print'''(<tex>P_2</tex>(getSrc(), arg).getSrc()) '''else''' '''print'''(getSrc()) </font>Вторая программа может быть получена запуском первой с нужным аргументом. Теперь добавим третий язык:* напишем для него "полуквайн", но уже с двумя параметрами и тремя возможными выводами:<font size = "2em"> <tex>P_3(p1,p2,arg)</tex>: '''if''' (arg == "print first!") '''print'''(p1) '''elseif''' (arg == "print second!") '''print'''(p2) '''else''' '''print'''(getSrc()) </font>* добавим параметр в два уже существующих квайна: <table><tr><td><font size = "2em"> <tex>P_1(p,arg)</tex>: '''if''' (arg == "print second!") '''print'''(<tex>P_2</tex>(p, getSrc(), arg).getSrc()) '''elseif''' (arg == "print third!") '''print'''(p) '''else''' '''print'''(getSrc()) </font></td><td><font size = "2em"> <tex>P_2(p,arg)</tex>: '''if''' (arg == "print first!") '''print'''(<tex>P_1</tex>(p, getSrc(), arg).getSrc()) '''elseif''' (arg == "print third!") '''print'''(p) '''else''' '''print'''(getSrc()) </font></td></tr></table> * подставим код первых двух в третью:<font size = "2em"> <tex>P_3(p1,p2,arg)</tex>: '''if''' (arg == "print first!") '''print'''(<tex>P_1</tex>(p1, arg).getSrc()) '''elseif''' (arg == "print second!") '''print'''(<tex>P_2</tex>(p2, arg).getSrc()) '''else''' '''print'''(getSrc()) </font> * применим [[Теорема о рекурсии|теорему о рекурсии]] и заменим оба параметра на исходный код программы:<font size = "2em"> <tex>P_3(arg)</tex>: '''if''' (arg == "print first!") '''print'''(<tex>P_1</tex>(getSrc(), arg).getSrc()) '''elseif''' (arg == "print second!") '''print'''(<tex>P_2</tex>(getSrc(), arg).getSrc()) '''else''' '''print'''(getSrc()) </font>Две оставшиеся программы будут выглядеть аналогично и смогут быть получены путём запуска третьей с каждым из возможных аргументов. == Примечания ==<references><ref name=quineName>Название "квайн" было предложено [http://ru.wikipedia.org/wiki/Хофштадтер,_Дуглас Дугласом Хофштадтером], в его известной книге "Гёдель, Эшер, Бах: Эта бесконечная гирлянда" в честь американского логика и философа [http://ru.wikipedia.org/wiki/Куайн,_Уиллард_Ван_Орман Уилларда Ван Ормана Квайна], который углублённо изучал явление [http://en.wikipedia.org/wiki/Indirect_self-reference косвенного самоупоминания].</ref><ref name=intronName>Название пришло из биологии, где интронами называются части ДНК, не участвующие в синтезе протеинов.</ref></references> == Источники информации ==* [http://www.madore.org/~david/computers/quine.html Madore.org — Quines (self-replicating programs)]* [http://habrahabr.ru/post/186782/ Хабрахабр — Эстафета из 50 квайнов]* [http://habrahabr.ru/post/188378/ Хабрахабр — Мультиязыковые квайны]* [http://habrahabr.ru/post/128191/ Хабрахабр — Как писать квайны]* [http://en.wikipedia.org/wiki/Quine_(computing)#Multiquines Wikipedia — Multi-quines] [[Категория: Теория формальных языков]][[Категория: Теория вычислимости]]