alex_semenov (alex_semenov) wrote,
alex_semenov
alex_semenov

Category:

Лабораторная работа по теме: "Смысл жизни"

Топология пустоты

  Лента (или лист) Мебиуса - вещь известная. Топологи утверждают, что это поверхность с одной стороной и одним краем. Если вы попробуете представить себе плоский лист, у которого только одна сторона, то вы решите, что такое мог бы придумать только чокнутый. Лист Мебиуса наспех согнутый из простого листа у вас перед носом - мало убеждает. Всякий здравомыслящий человек сразу раскусит трюк. Стороны все равно две, как не крути! В любом месте такая поверхности будет двусторонней.
  Можно сказать еще определенней. В любой точке ленты Мебиуса можно вырезать такой кусочек поверхности, у которой будет один край и две стороны. То есть это будет вполне "нормальная" поверхность.
  Односторонность листа Мебиуса это - эпифеномен. Свойство, которое присущее всему объекту, но никакой части в отдельности. Вот если бы односторонняя поверхность была такой, что, вырезав из нее в любом месте произвольный кусочек, мы все равно получали бы односторонние кусочки-поверхности - вот это было бы чудо!

Видимо так понимает смысл односторонней поверхности человек, в первый раз столкнувшись с этой идеей. И ясно почему. Ведь обычный лист таким свойством обладает! В любом месте двустороннего листа можно вырезать кусочек, который тоже будет двусторонним. Аналогично и одностороння поверхность, должна быть такой. Именно поэтому трюк "хотите увидеть одностороннюю поверхность?..." непременно вызывает сначала интерес, а потом, легкое разочарование. Мол, какое же это чудо?
Почему людей не устраивает то, что устраивает математиков?
Это можно понять, зная природу математики.
Математики пользуются принципом: что не запрещено - то разрешено. Если аксиоматика теории позволяет им нечто определенным образом установить, то нет смысла накладывать на это нечто еще какие-то "а я думал что..." взятые с потолка аналогий. В топологии четко определено, что значит одна сторона. Любые две точки одной стороны можно соединить линией, не пересекая никакой край. Вот и все. Сколько таких вот множеств у поверхности наберется - столько и сторон. Односторонность лента Мебиуса под это определение четко попадает. Двусторонний тетрадный лист - тоже подходит. Все точки листа делятся ровно на два множества точек, которые можно соединить, не пересекая край.
А принцип равности свойства частей, свойству целого, что мы сформулировали выше - это уже другое свойство. Оно присуще тетрадному листу. Но не присуще ленте Мебиуса. Никто не спорит. Такое свойство разумно, и даже красиво, но к количеству сторон в топологии никакого отношения не имеет.
Требовать и его соблюдения - отсебятина.
В общем, что бы признать лист Мебиуса односторонне поверхность нужно сначала вывернуть наизнанку свои обыденные представления. Обычно на этом и заканчивают.
Но у нас это только вступление.

Необычная попытка программирования

Вот пример программы. Слева - ее код на Паскале, справа - результат работы этого кода (показан только конец распечатки)

program n_in_n;
const x=4;
Var       a: array[1..x] of byte;
      i,n,b: byte;
Procedure tree;
 var m : byte;
 begin
 For m:=1 to x do begin
     a[n]:=m;
     If n<x then begin
        n:=n+1;tree; n:=n-1  end
     else
      begin
        For i:=1 to x do Write(a[i]);
        Writeln;
      end;
 end;
end;
Begin
   n:=1;
   tree;
   Write('Ok!');
   Readln
end.

                  ... 
4331
4332
4333
4334
4341
4342
4343
4344
4411
4412
4413
4414
4421
4422
4423
4424
4431
4432
4433
4434
4441
4442
4443
4444
Ok!

Мы можем для наглядности распечатать код на одной стороне листа бумаги, а результат - на обратной. Таким образом, мы получим некий символический образ единства формы и содержания.
Однако такое творчество - отсебятина.
Распечатайте программу и ее выход на отдельных листах. По сути ничего не изменилось, а единство распалось. Конечно, на это можно глубокомысленно возразить, что край листа, это такая же пропасть, как и расстояние между двумя разными листами. И, мол, это только подтверждает, что всегда есть граница, которая делает любую программу "двусторонним" объектом. У любой программы будет некий внешний смысл или назначение. То ради чего она существует, результат ее работы. И внутренняя форма - структура. Собственно текст самой программы.
Программы пишут люди. Поэтому, судя по всему, программы навсегда останутся рабами нашего ума. Мы и только мы определяем, зачем они существуют и какими им быть. Мы разумные люди, и только мы можем соединить содержание и форму через, образно говоря, непреодолимый край.
"Человек - мерило всех вещей!"
Стоп!
Идиотизм конечно, но что если свернуть нашу двустороннюю распечатку в лист Мебиуса? Обойти наш "край" как это делают хитрые топологи? Тупо взять и "замкнуть" "смысл" на "содержание"?


...
4431
4432
4433
4434
4441
4442
4443
4444
Ok!
program n_in_n;
const x=4;
Var       a: array[1..x] of byte;
      i,n,b: byte;
Procedure tree;
 var m : byte;
 begin
 For m:=1 to x do begin
     a[n]:=m;
     If n<x then begin
        n:=n+1;tree; n:=n-1  end
     else
      begin
        For i:=1 to x do Write(a[i]);
        Writeln;
      end;
 end;
end;
Begin
   n:=1;
   tree;
   Write('Ok!');
   Readln
end.
1111
1112
1113
1114
1121
... 

Бред! Дел не в том, что мы получаем бесконечный, безначальный текст, который и компьютеру то не скормишь. Но даже если его где-нибудь разрезать и все же скормить, все равно такой трюк к "самозамыканию" не приведет.
Компилятор, например, выдаст ошибку:
Error 36: BEGIN expected

Это и будет результатом, новым смысл этой новой формы. Нигде в нашей распечатке программы такой строчки нет, а значит, смысл опять оказался "на другой стороне листа". Он выскользнул.
Наша скороспелая попытка скрестить программирование с топологией ничего путевого не дала.
Человек - мерило всех вещей.
Своей глупости - тоже.

Квайн

И все же ленты Мебиуса среди программных кодов существуют. Вот пример одной из них:


Program selfprint;
 var a: array[1..11]of string; i: integer;
 begin
a[1]:=' Program selfprint;';
a[2]:=' var a: array[1..11]of string; i: integer;';
a[3]:=' begin ';
a[4]:=' for i:=1 to 3 do writeln(a[i]);';
a[5]:=' for i:=1 to 11 do begin';
a[6]:='     write(chr(97), chr(91), i);';
a[7]:='     write(chr(93), chr(58), chr(61));';
a[8]:='     writeln (chr(39), a[i], chr(39),  chr(59));';
a[9]:=' end; ';
a[10]:=' for i:=4 to 11 do wtiteln(a[i]);';
a[11]:=' end. ';
 for i:=1 to 3 do writeln(a[i]);
 for i:=1 to 11 do begin
     write(chr(97), chr(91), i);
     write(chr(93), chr(58), chr(61));
     writeln (chr(39), a[i], chr(39),  chr(59));
 end;
 for i:=4 to 11 do wtiteln(a[i]);
 end.

Это так называемая квайн-программа.
Смотрите, что она делает.
Сначала (вторая строка), как положено, резервируются переменные в памяти.
Создается массив a для хранения цепочек символов (11 ячеек) и рабочая переменная i.
Далее идет тело программы. Сначала идет 11 строчек простого присвоения. В переменные массива a по порядку записываются цепочки символов, которые сами есть фрагменты этого же программного кода.
Теперь строчка 15:

for i:=1 to 3 do writeln(a[i]);

Она в цикле распечатывает содержимое трех первых элементов массива a :


Program selfprint;
 var a: array[1..11]of string; i: integer;
 begin

Далее начиная со строчки 16, программа в цикле 11 раз выполняет блок операторов:

write(chr(97), chr(91), i);
write(chr(93), chr(58), chr(61));
writeln (chr(39), a[i], chr(39), chr(59));

Фактически это три оператора распечатывают одну строку.
Секрет трюка в этом месте - оператор chr(Х), который берет из таблицы ASCII кодов символ с номером X.
И так, сначала печатается символ chr(97) - это символ "a", потом chr(91) - это символ "[", дальше печатается собственно номер текущего цикла i, скажем 1, за ним chr(93) - это "]", потом chr(58) - ":", chr(61) - "=" и chr(39)- " ' " (одинарная кавычка).
Далее печатается содержимое i- того элемента массива. Сейчас это a[1]. То есть строка символов, ранее присвоенная в 4-й строке программы: " Program selfprint;"
Но это еще не вся строка. К ней допечатывается два символа: chr(39) - знакомая нам кавычка, и chr(59) - ";". Вот что получается в итоге:

a[1]:=' Program selfprint;';

Все это повторяется еще 10 раз. Меняется только третий символ строки и собственно то, что стоит межу кавычками. Получается:


a[2]:=' var a: array[1..11]of string; i: integer;';
a[3]:=' begin ';
a[4]:=' for i:=1 to 3 do writeln(a[i]);';
a[5]:=' for i:=1 to 11 do begin';
a[6]:='     write(chr(97), chr(91), i);';
a[7]:='     write(chr(93), chr(58), chr(61))';
a[8]:='     writeln (chr(39), a[i], chr(39),  chr(59));';
a[9]:=' end; ';
a[10]:=' for i:=4 to 11 do wtiteln(a[i]);';
a[11]:=' end. ';

Далее работает строка 21:

for i:=4 to 11 do wtiteln(a[i]);

Она как и строка 15 распечатывает содержимое массива a

с 4 по 11-ю ячейки:


for i:=1 to 3 do writeln(a[i]);
 for i:=1 to 11 do begin
     write(chr(97), chr(91), i);
     write(chr(93), chr(58), chr(61))
     writeln (chr(39), a[i], chr(39),  chr(59));
 end;

Дале end.
Программ завершена.
Что напечатано в итоге?

Текст этой же самой программы.

Она напечатала саму себя!
Это и есть квайн- своего рода программная лента Мебиуса. Код и результат его работы неотличимы. Все как бы помещается "на одной стороне листа"! Программа абсолютно бессмысленная с позиции человека.
Забава, бесполезная пустышка.
Но это с позиции "мерила всех вещей".
Я хочу, чтобы вы вернулись и сами проанализировали код. Каждую строчку, каждый оператор.
Вы должны понять, как эта хитрая штука работает от начала до конца. Как из 11 строчек, которые запихиваются в массив, удалось получить программу на 22? Откуда берутся "лишние" строчки, учитывая, что в коде нет ни одной одинаковой строки? В каких местах и за счет чего? Как "выворачивается" в некотором месте программа используя функцию chr? А можно ли обойтись без этой функции? Сможете реализовать это?
В конце концов, попробуйте написать этот квайн по памяти. Просто поиграйте с ним.
Например, сможете ли вы добавить в код "грузовой отсек" и вписать туда, скажем, свое имя?
Возможно сразу вы не поймете хитрую логику квайна. Так и должно быть. Я даже могу попробовать объяснить почему.
Всякий раз, когда вы сосредотачиваетесь на каком-то фрагменте программы, вы как бы вырезаете кусочек ленты Мебиуса. Ничего особенного - поверхность как поверхность. Верно? Две стороны- один край. И в анализируемом вами фрагменте кода ничего особенного. Вы видите, как это работает, и что это дает. Код - результат. Ага, идем дальше. Смотрим следующий фрагмент кода. Тоже все ясно. Ничего необычного. Код - результат. И так происходит от начала до конца. Но вы так и не можете найти то место, где спрятан главный секстет. Изюминка. Потому что такого места нет.
В случае с реальной лентой Мебиуса вы видите все сразу своими глазами. Перекручиваем, сворачиваем. Готово! Поэтому никакого ощущения чуда. А с кодом квайна вы так легко работать не можете. У вас нет такого мощного "кодового воображения" как пространственного. Поэтому вы не видите трюка одним взглядом. А рассматривая код частями, вы как муравей на ленте Мебиуса. Вы что-то упускаете...
По отдельности - все верно, код как код, а вместе - не понятно как все так лихо получается.
Наш квайн чем-то напоминает шустрое, деловитое устройство, который у вас на глазах само себя разобрало и полностью собрало в новом месте, а вы не можете никак уловить когда это произошло. Он напоминает безопорный тяни-толкай, который по очереди, опираясь на сложнейшее сплетение своих рычажно-шатунных механизмов, в итоге ухитряется вытянуть из болота ... их все!
В общем, это - зрелище в которое оставляет ощущение чуда или ловкого фокуса.
Если вы этого не уловили, не почувствовали, мне жаль...

Конечно квайн можно было бы построить и проще. Написать исполнимый файл, который бы брал с диска свою копию и записывал ее туда же. Ничего особо сложного. Но тогда вы не увидите, как это происходит. Наш пример тем и хорош. Он достаточно прост и одновременно сложен. Весь код - в памяти, но мог бы быть в некой среде, скажем первородном бульоне. Он печатает фрагменты себя, но мог бы изготавливать. Фактически он очень сжатая, очень абстрактная модель жизни. То, что делает наш квайн и есть вся без остатка суть живого.
Больше ничего там нет!
Конечно, вы можете изучать устройство нуклеотидов, ДНК, РНК, рибосом, аминокислот, белков. Вы можете подробно анализировать длиннющие цепочки химических преобразований, например цикл лимонной кислоты. Но вы всегда будете видеть только фрагменты целого. Настолько большого целого, что глаза у вас никогда не зацепится за главное. Потому что вы этого не можете охватить даже на секунду.
Наша наука нам говорит: жизнь это молекулярная машина, которая печатает сама себя. И все . . . Или не все?
Можете ли вы ощутить суть жизни, изучив толстенный учебник биологии? Поставив серию экспериментов? Без конца рассматривать отдельные и сложные молекулярные механизмы, вырезая кусочки из этой гигантской ленты Мебиуса, то там то здесь, четко осознавая мертвую, машинную природу всех ее отдельных блоков? Ощутить своими мозгами эпифеномен жизни, топологию ее пустого, простого до тупости, математически чистого, невинного эгоизма вы так не сможете. А значит всегда остается лазейка подсознательно верить в некую мифическую жизненную силу. В некий дополнительный и тайный смысл ее бытия...

"...Но Ангар, настоящий Ангар, где-то существует в другом месте!"

Человек так устроен. Нам всем нужна вера в чудо, замысел божий.
Спешу признать. Я не обладаю достоверным знанием. Я могу вас обманывать. Я могу сам обманываться.
Но поймите меня правильно, я могу видеть "сущность Будды" в 22-х строчках предельно ясного программного кода. Мне этого маленького чуда - достаточно. И я хочу, чтобы это смогли и вы. Тот, кто не может ощутить страной, нечеловеческой эстетики квайна, будет очень тяжело принять правду механической пустоты жизни. Научную правду, от которой здравомыслящий человек не может теперь просто так взять и избавится.
И которая будет виться, виться, виться...
:)(

А Семенов

Tags: Смысл Жизни
Subscribe

  • Проза: "Ангар"

    "Агнар" - литературная миниатюра, которую я написал для конференции relcom.sci.philosophy 4.06.1998г. Но разыскать это послание спустя годы в…

  • (no subject)

    Продолжение I-й части конспекта доклада Владислава Голощапова "Научно-технический прогресс человечества, теоретические ограничения и…

  • (no subject)

    Перефразируя сказанное Тайлераном ("война слишком серьезное дело, чтобы доверять ее военным") я бы сказал, так: эволюция слишком серьезное…

  • 18 comments
  • 18 comments

Comments for this post were locked by the author

  • Проза: "Ангар"

    "Агнар" - литературная миниатюра, которую я написал для конференции relcom.sci.philosophy 4.06.1998г. Но разыскать это послание спустя годы в…

  • (no subject)

    Продолжение I-й части конспекта доклада Владислава Голощапова "Научно-технический прогресс человечества, теоретические ограничения и…

  • (no subject)

    Перефразируя сказанное Тайлераном ("война слишком серьезное дело, чтобы доверять ее военным") я бы сказал, так: эволюция слишком серьезное…