Известная апория Зенона[0] о том, что Ахиллес не сможет догнать черепаху, потому что за время, когда он достигнет её исходного положения, она успеет отползти дальше, после чего всё повторится — это очередная логическая загадка, которая до сих пор вводит в заблуждение многих людей, но оказывающаяся неприлично простой, если для её рассмотрения использовать язык программирования[1].
Если бы нас интересовало время, за которое Ахиллес должен догнать черепаху, то мы бы просто записали так:
MODULE Overtaking;
PROCEDURE Time*(vt, va, d0: REAL) : REAL;
RETURN
d0 / (va - vt)
END Time;
END Overtaking.
Этим вопрос был бы исчерпан, но если следовать размышлениям Зенона, то расчёт времени следует разбить на этапы, в которых Ахиллес оказывается на месте, которое занимала бы черепаха, если бы не двигалась. Тогда код усложнится[2] до следующего.
MODULE Zeno;
PROCEDURE Run*(vt (* скорость черепахи *),
va (* скорость Ахиллеса *),
d0 (* расстояние между ними *): REAL
) : REAL;
VAR d1, t0, t: REAL;
BEGIN
t := 0.0;
REPEAT
(* время достижения Ахиллесом исходного места черепахи *)
t0 := d0 / va;
(* расстояние, на которое удалится черепаха за это время *)
d1 := t0 * vt;
t := t + t0;
(* на следующем шаге рассмотрения смещение черепахи становится
исходным расстоянием между черепахой и Ахиллесом *)
d0 := d1
UNTIL d0 = 0.0
RETURN
t
END Run;
END Zeno.
Такая функция несмотря на свою неэффективность вполне вычислима на компьютере, поскольку дроби, используемые в компьютерных вычислениях, имеют ограниченную точность, из-за чего вычисляемое расстояние между бегунами неизбежно достигнет 0 даже в таком рассмотрении.
Для соответствия кода размышлениям Зенона мы не будем использовать дроби неограниченной точности, а произведём тождественную замену, позволяющую избавиться от зависимости от ограничения точности, а заодно позволяющую лучше понять суть подхода Зенона. Можно заметить, что в нём нас интересует не столько расстояние, сколько соотношение конечного расстояния к начальному в каждом шаге рассмотрения. Заменим условие завершения с d0 = 0.0 на d1 / d0 = 0.0
REPEAT
t0 := d0 / va;
d1 := t0 * vt;
k := d1 / d0;
t := t + t0;
d0 := d1
UNTIL k = 0.0
Устраним t0, подставив его в вычисление d1 напрямую без промежуточной переменной.
REPEAT
d1 := d0 / va * vt;
k := d1 / d0;
d0 := d1
UNTIL k = 0.0
Подставим вычисление d1 в вычисление k
REPEAT
k := d0 / va * vt / d0
UNTIL k = 0.0
Упростим вычисление k, сократив d0 и перенеся vt
REPEAT
k := vt / va
UNTIL k = 0.0
Поскольку скорости не меняются, то и соотношение между ними тоже, поэтому его вычисление можно вынести из повторения.
k := vt / va;
REPEAT
UNTIL k = 0.0
Исходя из того, что по условию задачи va ≠ vt, можно завершить тождественное преобразование:
REPEAT
UNTIL FALSE
Это и есть суть апории про Ахиллеса и черепаху, если очистить её от словесной шелухи, создающей иллюзию изменений. На самом деле она сводится к пустому повторению проверки ложного условия завершения повторения, а остальное лишь отвлекает внимание. Вычислительный Ахиллес никогда не догонит вычислительную черепаху, потому что вычисление составлено таким образом, чтобы этого в вычислении не произошло. Только это не вывод, а закладываемое свойство. В этом и заключается подмена понятий в апории Зенона, ведь в ней заложенное свойство подаётся как вывод.
Второй логической ошибкой в апории является подразумеваемая правомерность переноса псевдовывода о невозможности догнать черепаху в специально составленном для этого вычислении на действительность, где подтвердилось бы обратное, из чего и следует мнимое противоречие.
Нет никакого противоречия в том, что зацикленный код не способен завершиться, выполнив исходную задачу. Но если программисту понятно, что зацикленное вычисление — это ошибка, которую нужно исправить, и что зацикленность не означает ничего, кроме этого, то для некоторых философов зацикленность мысленного опыта — это повод для далеко идущих выводов о свойствах пространства и времени. И вряд ли какое-либо правильное объяснение сможет этого исправить. Вот пример такого[0]:
Довольно часто появлялись (и продолжают появляться) попытки математически опровергнуть рассуждения Зенона и тем самым «закрыть тему». Например, построив ряд из уменьшающихся интервалов для апории «Ахиллес и черепаха», можно легко доказать, что он сходится, так что Ахиллес обгонит черепаху. В этих «опровержениях», однако, подменяется суть спора. В апориях Зенона речь идёт не о математической модели, а о реальном движении, и поэтому бессмысленно ограничить анализ парадокса внутриматематическими рассуждениями — ведь Зенон как раз и ставит под сомнение применимость к реальному движению идеализированных математических понятий.
Серьёзные исследования апорий Зенона рассматривают физическую и математическую модели совместно. Одно из возможных объяснений апории: ложность представления о бесконечной делимости расстояния и времени.
Всегда можно будет сказать, что соотношение расстояний из-за свойства пространства не является постоянной величиной, поэтому такие замены нельзя было сделать. Мы-то знаем, что пространство не непрерывно, но это известно из широкого физического опыта, и такой вывод нельзя сделать на основе мысленного. Если бы пространство и время были бы бесконечно масштабируемы, это, определённо, был бы необычный мир, но мысленный опыт от этого не изменился бы. Иными словами, апория Зенона говорит не о том, как (не) устроено пространство и время, а о том, как можно огранизовать размышление о пространстве и времени.
[0] Апория Зенона на wikipedia и в архиве этой страницы.
[1] Смотрите язык программирования для людей как средство понимания.
[2] Само по себе усложнение кода являетя тревожным признаком, ведь в сложном коде проще спрятать ошибку, чем в простом. Именно это здесь и происходит.
[3] Рассмотрение парадокса лжеца через код


Комментариев нет:
Отправить комментарий