262
правки
Изменения
Квайны
,Нет описания правки
|definition='''Квайном''' (англ. ''quine'')<ref name=quineName/> называется программа, которая выводит свой исходный код. При этом, программа не должна использовать внешние данные (например, читать файл со своим исходным кодом).
}}
Стоит отметить, что программы, использующие для чтения своего кода файловую систему, квайнами не считаются. Например, программа на BASIC вида
<code><font size = "2em">
10 LIST
</font></code>
выводит на экран свой исходный код, поскольку команда <tex>\mathtt{LIST}</tex> просит среду исполнения вывести в консоль текущую программу (эта функция была необходима для программистов, т.к. код программы зачастую не мог поместиться на консоль 80x25 символов)
Квайн состоит из двух сегментов: <b>кода</b> и <b>данных</b>. Данные представляют собой текстовую версию кода, и, как правило, получаются из кода простым добавлением обрамляющих кавычек. Код, в свою очередь, сначала использует данные, чтобы вывести код(содержащийся в них), а затем, просто выводит данные.
Формально общий принцип написания квайнов содержится в доказательстве [[Теорема о рекурсии|теоремы о рекурсии]]. Далее будет рассмотрено понятие мульти-квайна.
==Мульти-квайны==
{{Определение
}}
Заметим, что требование, чтобы программы были на разных языках программирования важно, т.к. иначе все программы смогут иметь один и тот же код.
===Связанные определения==={{Определение|definition='''Интроном''' (англ. ''intron'')<ref name=intronName/> называется часть сегмента данных, которая не используется для вывода кода, но сохраняющаяся в процессе саморепликации квайна.}}===Принцип написания===
{{
Теорема
* напишем для каждого языка "полу-квайн":
<table>
<tr>
<td><code><font size = "2em">
<tex>P_1(p,arg)</tex>: '''if ''' (arg == "print second!") '''print'''(p) '''else''' '''print'''(getSrc())
</font></code></td>
<td><code><font size = "2em"> <tex>P_2(p,arg)</tex>: '''if ''' (arg == "print first!") '''print'''(p) '''else''' '''print'''(getSrc())
</font></code></td>
</tr>
* модифицируем каждую из программ, чтобы вместо <tex>p</tex> она выводила интрон:
<table>
<tr>
<td><code><font size = "2em">
<tex>P_1(arg)</tex>: '''if ''' (arg == "print second!") '''print'''(p2_intron) '''else''' '''print'''(getSrc())
</font></code></td>
<td><code><font size = "2em">
<tex>P_2(arg)</tex>: '''if ''' (arg == "print first!") '''print'''(p1_intron) '''else''' '''print'''(getSrc())
</font></code></td>
</tr>
<code><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></code>
* добавим третье условие в два уже существующих квайна:
<table>
<tr>
<td><code><font size = "2em">
<tex>P_1(p,arg)</tex>: '''if ''' (arg == "print second!") '''print'''(p2_intron) '''elseif ''' (arg == "print third!") '''print'''(p) '''else''' '''print'''(getSrc())
</font></code></td>
<td><code><font size = "2em">
<tex>P_2(p,arg)</tex>: '''if ''' (arg == "print first!") '''print'''(p1_intron) '''elseif ''' (arg == "print third!") '''print'''(p) '''else''' '''print'''(getSrc())
</font></code></td>
</tr>
* подставим код первых двух интронами в третью, а код третьей - вторым интроном в каждую из двух первых:
<table>
<tr>
<td><code><font size = "2em">
<tex>P_1(arg)</tex>: '''if ''' (arg == "print second!") '''print'''(p2_intron) '''elseif ''' (arg == "print third!") '''print'''(p3_intron) '''else''' '''print'''(getSrc())
</font></code></td>
<td><code><font size = "2em">
<tex>P_2(arg)</tex>: '''if ''' (arg == "print first!") '''print'''(p1_intron) '''elseif ''' (arg == "print third!") '''print'''(p3_intron) '''else''' '''print'''(getSrc())
</font></code></td>
<td><code><font size = "2em">
<tex>P_3(arg)</tex>: '''if ''' (arg == "print first!") '''print'''(p1_intron) '''elseif ''' (arg == "print second!") '''print'''(p2_intron) '''else''' '''print'''(getSrc())
</font></code></td>
</tr>