Изменения

Перейти к: навигация, поиск

Квайны

1307 байт добавлено, 13:58, 6 января 2015
Мульти-квайны
|proof= Докажем утверждение для би-квайна, для большего количества языков доказательство будет выглядеть аналогично.
Рассмотрим программу с двумя параметрами на языке <tex>L_1</tex>, которая выводит первый параметр при обычном запуске и второй - при запуске со спец. аргументом. По [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8#.D0.A2.D0.B5.D0.BE.D1.80.D0.B5.D0.BC.D0.B0_.D0.BE_.D0.BD.D0.B5.D0.BF.D0.BE.D0.B4.D0.B2.D0.B8.D0.B6.D0.BD.D0.BE.D0.B9_.D1.82.D0.BE.D1.87.D0.BA.D0.B5 теореме о неподвижной точке] мы можем зафиксировать первый параметр и сказать, что он будет равен исходному коду нашей программы. Таким образом, мы получим программу с одним параметром, которая выводит свой код при запуске без аргументов и выводит параметр при запуске со спец. аргументом. Проделаем то же самое для программы на языке <tex>L_2</tex>. И наконец, зафиксируем как аргумент параметр первой исходник второй и наоборот.
}}
 
Таким образом, следуя нашему доказательству, чтобы написать мульти-квайн мы будем использовать интроны. У нас есть <tex>r</tex> программ, т.е. <tex>r</tex> сегментов кода (на каждом языке); кроме того, каждая из <tex>r</tex> программ имеет в дополнение к сегменту кода <tex>r</tex> сегментов данных, каждая из которых представляет собой код на определённом языке (т.е. <tex>r-1</tex> интрон + сегмент данных программы). Когда программу <tex>i</tex> (имеющую сегмент кода под номером <tex>i</tex> на языке <tex>L_i</tex>) просят вывести исходный код программы <tex>j</tex>, она использует один из своих интронов, чтобы вывести сегмент кода программы <tex>j</tex>, а затем использует все интроны и свой сегмент данных для вывода сегмента данных программы <tex>j</tex>.
 
==Принцип написания==
Будем следовать доказательству и напишем мульти-квайн для двух языков. Далее покажем, как добавить новый язык.
# напишем для каждого языка "полу-квайн": <tex>P(p,arg):
\left\{
\begin{array}{l l}
P(p,"shazam!") \rightarrow print(p); \\
P(p,null) \rightarrow print(|P|);
\end{array}
\right.
</tex>
# добавим код каждой из программ интроном в код другой
# модифицируем каждую из программ, чтобы вместо <tex>p</tex> она выводила интрон: <tex>P(arg):
\left\{
\begin{array}{l l}
P("shazam!") \rightarrow print(intron); \\
P(null) \rightarrow print(|P|);
\end{array}
\right.
</tex>
Теперь добавим третий язык:
# напишем для него "полу-квайн", но уже с двумя параметрами и тремя возможными выводами:<tex>P(p,arg):
\left\{
\begin{array}{l l}
P(p,"shazam!") \rightarrow print(p); \\
P(p,"a") \rightarrow print(|P|);
P(p,null) \rightarrow print(|P|);
\end{array}
\right.
</tex>
== Источники информации ==
262
правки

Навигация