Что значит счётность в Теории Систем
Вопрос, оставленный предыдущей главой
Глава III.2 построила рациональные числа — координатную разметку с соразмерным шагом — и в конце оставила вопрос, который сама лишь обозначила. Рациональные числа суть позиции соразмерной разметки, и разметка эта не завершена: за всякой достигнутой позицией есть следующая, всякий отрезок делим ещё тоньше. Можно ли тогда говорить о рациональных числах как о списке — перечислить их одно за другим так, чтобы всякое было достигнуто?
Этот вопрос — о счётности рациональных чисел — и есть предмет настоящей главы. Но прежде чем отвечать на него, нужно условиться, что в ToS вообще значит слово <<счётность>>. Стандартная математика и ToS понимают его по-разному, и разница не словесная.
Счётность в стандартном изложении
Стандартное определение таково. Множество называется счётным, если существует биекция — взаимно однозначное соответствие между натуральными числами и элементами . Множество счётно, если такая функция существует.
В этом определении две вещи приняты как сами собой разумеющиеся. Первая: и берутся как готовые множества — завершённые совокупности, лежащие наготове, между которыми устанавливается соответствие. Вторая: счётность есть существование функции — факт о том, что функция в принципе есть, безотносительно к тому, предъявлена ли она.
Для стандартной математики оба допущения привычны и работают. И стоит сразу сказать прямо: ToS не объявляет стандартное определение неприменимым. Само свойство счётности вполне можно выразить и формально — как утверждение об инъективности и сюръективности некоторой функции; именно в таком виде оно и доказывается в Rocq, и ToS этим доказательством пользуется. Различие ToS со стандартным изложением не в том, что стандартное понятие неприложимо, а в том, какой методологической формы ToS от счётности требует. Как показала уже Часть II, ToS не берёт бесконечные совокупности готовыми (принцип ): натуральный ряд не есть завершённое множество, а потенциально продолжаемый ряд; и рациональные числа, как показала Глава III.2, не суть завершённое множество, а потенциальная разметка. Поэтому ToS требует от счётности не просто утверждения о существовании соответствия, а более сильной формы: явного обхода, который можно вычислить, проследить шаг за шагом и обратить. Не <<функция в принципе есть>>, а <<вот процедура, и она работает>>. Счётность в ToS читается операционально — и эту операциональную форму глава далее и выстраивает.
Счётность как процедура обхода
ToS переопределяет счётность операционально.
Совокупность счётна, если существует конструктивная процедура, которая по всякому натуральному числу строит -й элемент обхода, и обратная процедура, которая по всякому элементу находит его номер.
Это не <<факт о множестве>>, а рабочая возможность. Счётность в этом смысле означает: можно начать обход и обход дойдёт до любого элемента за конечное число шагов. Не <<биекция между двумя готовыми совокупностями существует>>, а <<есть процедура, и она работает>>: предъявлен номер — процедура строит элемент; предъявлен элемент — процедура находит номер.
Стоит оговорить, что это — усиленная форма счётности. Обычная счётность в стандартной математике может задаваться по-разному — сюръекцией , инъекцией , биекцией либо перечислением, — и не всякая из этих форм требует уметь эффективно находить номер по предъявленному элементу. Требование обратной процедуры — <<по элементу найти его номер>> — сильнее минимального: это эффективная индексация с вычислимым обращением. ToS в этой главе берёт именно сильную, операциональную форму: не только процедуру , но и обратную к ней. Это — рабочее усиление, и оно избрано не случайно: для рациональных чисел такая усиленная форма, как покажет глава, доступна — обход дерева Калкина–Уилфа обратим, и обратный ход тоже строится явно.
Разница с стандартным определением — не в строгости, а в том, о чём идёт речь. Стандартное определение говорит о соответствии между множествами; операциональное — о процедуре, которую можно запустить и проследить. Стандартное спрашивает <<существует ли функция>>; операциональное — <<есть ли обход, и доходит ли он>>. Для совокупности, которая не есть завершённое множество, а есть потенциальная разметка, осмысленно лишь второе: нельзя установить соответствие с тем, что не собрано в готовое целое, — но можно задать процедуру, которая это потенциальное обходит.
Что предстоит показать
Счётность рациональных чисел означает, стало быть, не существование биекции с готовым множеством, а наличие работающей процедуры обхода — такой, что всякое рациональное число достижимо ею за конечное число шагов, и всякому рациональному числу она сопоставляет номер.
Настоящая глава такую процедуру предъявит. Она не сошлётся на теорему существования, а построит обход явно — проследит его устройство и покажет, что он доходит до всякого рационального числа. Сперва, однако, нужно сказать, почему явное построение здесь необходимо, а ссылки на существование недостаточно. Этим глава и продолжается.
Зачем нужна явная биекция
Стандартное доказательство счётности
Что рациональные числа счётны, стандартная математика доказывает, и доказывает коротко. Ход таков. Всякое рациональное число есть пара — числитель и знаменатель, — то есть рациональные числа суть подмножество произведения целых чисел на ненулевые целые. Произведение двух счётных совокупностей счётно — это известная теорема. Значит, и подмножество его счётно. Следовательно, рациональные числа счётны.
Доказательство верное, и в рамках стандартной математики ему нечего возразить. Стоит лишь заметить, чем именно оно доказывает счётность. Оно доказывает её через общие теоремы: ссылается на теорему о счётности произведения и подмножеств, та — на свои основания, и в итоге утверждается, что биекция между натуральными и рациональными числами существует. Такой маршрут корректен — но он скрывает сам механизм обхода: какова биекция, как она устроена, что она даёт на входе или , из доказательства через общие теоремы прямо не видно. Стоит, впрочем, не впасть в карикатуру: стандартная математика не ограничена этим абстрактным маршрутом — учебные доказательства нередко дают и явное диагональное перечисление пар, и обходы вроде дерева Калкина–Уилфа или Штерна–Броко. ToS не упрекает стандартный подход в недостатке строгости. Она лишь выбирает из двух возможных маршрутов не абстрактный, а явный: не сослаться на теорему о счётности произведения, а построить конкретную функцию перечисления и её обратный ход.
Почему этого недостаточно для Теории Систем
Для ToS такое доказательство неудовлетворительно — и неудовлетворительно не по строгости, а по существу.
Счётность в ToS (§ 3.1) есть не существование биекции, а наличие работающей процедуры обхода. Сказать <<биекция существует>> значит ответить не на тот вопрос. Операциональное понимание счётности спрашивает: есть ли обход, и доходит ли он до всякого элемента? Ответ <<функция, осуществляющая обход, в принципе существует>> этого вопроса не закрывает: существование функции и наличие процедуры, которую можно запустить и проследить, — не одно и то же.
Сослаться на теорему существования значит совершить ход, который ToS повсюду оговаривает особо: уйти от вопроса <<как построить>> к вопросу <<есть ли по теореме>>. ToS такой ход не запрещает в стандартной математике, но сама им не довольствуется: для неё существовать значит быть построенным, актуализированным конкретным актом, а не быть выводимым из теоремы как отвлечённая возможность. Счётность, доказанная ссылкой на существование, остаётся утверждением о том, что обход мог бы быть; счётность в смысле ToS требует, чтобы обход был предъявлен.
Требуется явная процедура
Отсюда — что настоящая глава должна сделать. Не сослаться на теорему, а предъявить обход: задать конкретную процедуру, которую можно вычислить, проследить шаг за шагом и проверить, что она доходит до всякого рационального числа.
И такая процедура есть. Она называется перечислением Калкина–Уилфа, и устроена так, что по всякому номеру строит рациональное число, а по всякому рациональному числу — его номер, причём строит вычислимо: всякий шаг есть конкретное действие, которое можно совершить и проверить. ToS формализует это перечисление полностью — и формализует, что важно, конструктивно: без ссылок на отвлечённые теоремы существования, одним лишь построением.
Стандартное доказательство счётности рациональных чисел ссылается на теоремы существования: биекция между натуральными и рациональными числами существует. ToS этим не довольствуется: счётность для неё есть наличие работающей процедуры обхода, а не существование функции. Поэтому глава не ссылается на теорему, а предъявляет обход явно — конкретную, вычислимую процедуру, которая строит рациональное число по номеру и номер по рациональному числу. Эта процедура — перечисление Калкина–Уилфа.
К построению перечисления
Перечисление Калкина–Уилфа опирается на одну изящную структуру — на дерево, в котором рациональные числа размещаются так, что обход его становится прямым и наглядным. С этого дерева глава и начинает построение.
Дерево Калкина–Уилфа
Положительные рациональные числа как пары
Построение обхода начинается с положительных рациональных чисел — с позиций соразмерной разметки по одну сторону опоры. На них обход и будет задан; распространение его на все рациональные числа, вместе с нулём и отрицательной стороной, прибавляется потом и просто (§ 3.5).
Положительное рациональное число берётся здесь через пару натуральных чисел — числитель и знаменатель.1 В Rocq это записывается так:
Definition QPos := (positive * positive)%type.Тип QPos есть тип всех положительных пар :
первая составляющая — числитель, вторая — знаменатель. Здесь
нужны две оговорки. Первая — о типе positive. В стандартной
библиотеке Rocq positive — это отдельный технический
тип положительных натуральных значений в двоичной записи; он не
тождествен типу nat с условием и не есть тот
первичный ряд от единицы, о котором говорила Часть II. Роль его
в этой главе проста и чисто служебная: он гарантирует, что числитель и
знаменатель положительны, а знаменатель в особенности не равен нулю.
Вторая оговорка — о соотношении пар и рациональных значений.
Тип QPos содержит все пары, в том числе сократимые:
и — разные элементы QPos. Но дерево
Калкина–Уилфа, как покажет глава, перечисляет именно те пары, где
числитель и знаменатель взаимно просты; эти несократимые пары
и служат каноническими представителями положительных
рациональных чисел. Брать положительное рациональное число через пару
удобно тем, что устраняет с самого начала заботу о знаке и о нуле:
пара positive ни того, ни другого не допускает по устройству
типа.
Корень и два ребёнка
Дерево Калкина–Уилфа размещает положительные рациональные числа по узлам так, что каждое попадает в дерево ровно один раз. Устроено оно тремя правилами.
Корень дерева есть дробь :
Definition cw_root : QPos := (1, 1).Левый ребёнок узла есть дробь ; правый ребёнок — дробь :
Definition cw_left (ab : QPos) : QPos :=
let (a, b) := ab in (a, a + b).
Definition cw_right (ab : QPos) : QPos :=
let (a, b) := ab in (a + b, b).От корня влево лежит , вправо — . От влево — , вправо — . От влево — , вправо — . И так без конца: всякий узел даёт двух детей, дерево ветвится бесконечно.
Три свойства дерева
Дерево Калкина–Уилфа — не произвольная раскладка дробей по узлам, а структура с тремя свойствами, и в этих свойствах вся его сила.
Первое: всякое положительное рациональное число стоит в дереве, и стоит ровно один раз. Здесь нужна точность в том, что считать <<тем же>> числом. Если рациональное число понимать как значение, то каждое положительное рациональное значение появляется в дереве ровно один раз — ни пропусков, ни повторов. Если же понимать дробь как сырую пару числителя и знаменателя, то дерево перечисляет не все пары, а только несократимые: сократимая запись вроде в дереве не появляется — она уже представлена узлом . Иначе говоря, дерево обходит несократимые пары как канонических представителей, и в этом смысле каждое положительное рациональное значение достигается единожды.
Второе: всякая дробь в дереве несократима. В каждом узле числитель и знаменатель взаимно просты — не имеют общего делителя больше единицы. Дерево не порождает или ; оно порождает сразу , в несократимом виде. Это свойство не привнесено проверкой, а вытекает из устройства дерева: корень несократим, а оба правила — левый ребёнок и правый — несократимость сохраняют. ToS доказывает это формально — теоремой о том, что наибольший общий делитель числителя и знаменателя в каждом узле равен единице.2
Третье: дерево бинарно. У всякого узла ровно два ребёнка — левый и правый. Это и делает дерево пригодным для обхода: путь к любому узлу есть конечная череда выборов <<влево или вправо>>, а такую череду, как покажет следующий раздел, можно записать числом.
Дерево Калкина–Уилфа размещает положительные рациональные числа по узлам: корень есть , левый ребёнок узла есть , правый — . Дерево обладает тремя свойствами: всякое положительное рациональное число стоит в нём ровно один раз; всякая дробь в нём несократима (что ToS доказывает формально); дерево бинарно — у всякого узла два ребёнка. Эти свойства и делают дерево основой обхода рациональных чисел.
От дерева к обходу
Дерево построено, и три его свойства названы. Но дерево само по себе — ещё не обход: оно размещает рациональные числа по узлам, но не выстраивает их в ряд, занумерованный натуральными числами. Чтобы получить обход — процедуру, которая по номеру даёт -е рациональное число, — нужно пройти узлы дерева в некотором порядке. Как этот порядок задаётся и как он связывает натуральные числа с узлами, разбирает следующий раздел.
Обход дерева: навигация двоичным путём
Путь к узлу есть череда выборов
Дерево Калкина–Уилфа размещает положительные рациональные числа по узлам (§ 3.3). Чтобы получить из него обход, нужно связать узлы с натуральными числами — так, чтобы по всякому номеру отыскивался узел, а по всякому узлу — номер. Сделать это позволяет одно простое наблюдение об устройстве дерева.
К всякому узлу дерева ведёт единственный путь от корня. Дерево бинарно: из всякого узла два выхода — влево и вправо. Значит, путь от корня к любому узлу есть конечная череда выборов: влево, вправо, снова влево, и так до нужного узла. Корень — путь пустой, череда из нуля выборов. Его левый ребёнок — череда из одного выбора <<влево>>; его правый — из одного <<вправо>>. И так далее: всякому узлу отвечает своя, ему одному принадлежащая череда выборов, и всякой конечной череде выборов отвечает свой узел.
Череда выборов записывается числом
Конечную череду выборов <<влево или вправо>> можно записать числом — и это ключ ко всему обходу.
Натуральное число в двоичной записи есть не что иное, как конечная
череда двоичных знаков. ToS пользуется этим прямо. Путь к узлу
кодируется натуральным числом по трём правилам: число есть путь к
корню; если число кодирует путь к некоторому узлу, то число,
записанное как с приписанным двоичным нулём, кодирует путь к его
левому ребёнку, а с приписанной двоичной единицей — к
правому. В Rocq, где натуральное число типа positive
само построено из двоичных конструкторов, это записывается прямо:
Fixpoint cw_node (p : positive) : QPos :=
match p with
| xH => cw_root (* 1 = root *)
| xO p' => cw_left (cw_node p') (* left child *)
| xI p' => cw_right (cw_node p') (* right child *)
end.Функция cw_node читает число как путь и проходит дерево от
корня до нужного узла.3
Конструктор xH — единица — даёт корень. Конструкторы
xO и xI интуитивно соответствуют добавлению к уже
заданному пути ещё одного двоичного шага — перехода к левому либо к
правому ребёнку: xO ведёт к левому ребёнку того узла, к
которому ведёт остаток пути, xI — к правому. Технические
подробности порядка битов в индуктивном представлении типа
positive здесь не важны; важно одно: каждый из двух
конструкторов однозначно кодирует следующий переход по дереву. Так
всякое число типа positive прочитывается как маршрут по
дереву, а всякому маршруту отвечает узел — положительное
рациональное число.
Перечисление
Остаётся связать с узлами не числа типа positive, а
натуральные числа обхода — , — чтобы
обход начинался с нуля, как положено перечислению. Это делается сдвигом
на единицу:
Definition enum_QPos (n : nat) : QPos :=
cw_node (Pos.of_nat (S n)).Перечисление enum_QPos берёт натуральное число
, прибавляет к нему единицу и читает результат как путь по дереву.
Сдвиг на единицу нужен затем, что пути нумеруются с единицы (путь
есть корень), а обход — с нуля.
Проследим первые его шаги. Номер : путь , корень — дробь . Номер : путь , что есть двоичный нуль при единице, — левый ребёнок корня, дробь . Номер : путь , двоичная единица при единице, — правый ребёнок корня, . Номер : путь — левый ребёнок узла с путём , то есть левый ребёнок дроби , — . Номер : путь — правый ребёнок дроби , — . Обход выстраивает положительные рациональные числа в ряд:
Это и есть перечисление Калкина–Уилфа: процедура, которая по всякому номеру строит -е положительное рациональное число, и строит его вычислимо — всякий шаг есть конкретное действие: прибавить единицу, прочитать двоичные знаки, пройти дерево.
Путь от корня дерева к любому узлу есть конечная череда выборов
<<влево или вправо>>, а такая череда записывается натуральным числом в
двоичном виде: единица — корень, приписанный двоичный нуль — левый
ребёнок, приписанная единица — правый. Функция cw_node читает число как путь и находит узел; перечисление
enum_QPos сдвигает нумерацию к нулю и строит по
номеру положительное рациональное число. Первые члены обхода —
. Это вычислимая процедура: всякий
шаг есть конкретное действие.
Чего недостаёт до биекции
Половина дела сделана: есть процедура, которая по номеру строит рациональное число. Но счётность в смысле ToS (§ 3.1) требует и обратного — процедуры, которая по рациональному числу находит его номер, — и требует доказательства, что обе процедуры точно обращают друг друга. Этим — обратной процедурой и доказательством биекции — глава занимается дальше.
Обратная процедура и биекция
От дроби к её номеру
Перечисление строит по номеру дробь (§ 3.4). Счётность в смысле ToS требует и обратного: по дроби — её номер. Эта обратная процедура устроена так же прозрачно, как прямая, и опирается на ту же связь узла с путём.
Дано положительное рациональное число . Найти его номер значит проследить путь от его узла назад к корню. Делается это по устройству дерева. Если , дробь есть — сам корень, путь пуст. Если , дробь есть левый ребёнок некоторого узла: левый ребёнок узла есть , значит узел-родитель восстанавливается как . Если , дробь есть правый ребёнок, и родитель есть . Повторяя этот шаг, мы поднимаемся от узла к родителю, от родителя к его родителю, и так до корня, записывая по дороге, левым или правым ребёнком был всякий узел. В Rocq это записывается так:
Fixpoint path_to_node_fuel (fuel : nat) (a b : positive)
: positive :=
match fuel with
| O => xH
| S fuel' =>
if (a =? b) then xH
else if (a <? b)
then xO (path_to_node_fuel fuel' a (b - a))
else xI (path_to_node_fuel fuel' (a - b) b)
end.Подъём к корню всегда конечен — число шагов ограничено суммой числителя и знаменателя, — и эта сумма передаётся первым аргументом.4 Пройденный путь, прочитанный как число, и есть искомое; вычесть из него единицу — получить номер в обходе:
Definition index_of_QPos (ab : QPos) : nat :=
Pos.to_nat (path_to_node ab) - 1.Две процедуры обращают друг друга
Есть, стало быть, две процедуры: прямая — от номера к дроби, и обратная — от дроби к номеру. Чтобы они вместе составляли биекцию, нужно, чтобы они точно обращали друг друга: пройдя номер в дробь и обратно, вернуться к тому же номеру; пройдя дробь в номер и обратно, вернуться к той же дроби.
ToS доказывает и то, и другое — двумя теоремами о круговом обходе. Первая: для всякого пути, проложенного по дереву, обратная процедура восстанавливает в точности этот путь. Вторая: для всякой несократимой дроби, проведённой в номер и обратно, восстанавливается в точности эта дробь.5 Условие несократимости во второй теореме существенно: обратная процедура восстанавливает дробь верно лишь для несократимых дробей, — но дерево, как показал § 3.3, иных и не содержит, так что условие выполнено для всякого его узла.
Главная теорема
Отсюда — главная теорема главы: перечисление положительных рациональных чисел есть биекция.
Theorem Q_positive_countable :
(forall n m, enum_QPos n = enum_QPos m -> n = m) /\
(forall a b, Z.gcd (Z.pos a) (Z.pos b) = 1%Z ->
exists n, enum_QPos n = (a, b)).Теорема утверждает о перечислении две вещи. Первая половина: оно инъективно — разным номерам отвечают разные дроби, обход не повторяется. Вторая: оно сюръективно — всякая несократимая дробь достигается обходом, ни одна не пропущена. Инъективность и сюръективность вместе и означают, что перечисление есть взаимно однозначное соответствие натуральных чисел и положительных рациональных. Счётность положительных рациональных чисел доказана — и доказана не ссылкой на существование, а предъявлением работающего обхода.
Об этом доказательстве нужно сказать особо одно. Оно полностью конструктивно: проведено одним построением, без единой ссылки на отвлечённые принципы существования. В частности, оно не пользуется законом исключённого третьего — ни в каком виде. Для ToS это существенно: счётность здесь не только утверждена, но и построена — и построение это есть полноценное доказательство истинности. Конструктивное доказательство не менее доказательство, чем всякое иное: предъявлена процедура, всякий шаг которой можно вычислить и проверить, и доказано — строго, — что процедура эта обходит все положительные рациональные числа, ничего не пропуская и не повторяя. Истинность утверждения о счётности обеспечена самим предъявленным обходом и доказательствами его свойств; <<построена>> здесь не противопоставлено <<доказана>>, а есть способ, каким ToS доказывает.
Все рациональные числа
Доказанное — и доказанное формально, теоремой
Q_positive_countable — касается положительных
рациональных чисел в несократимом представлении. Распространение обхода
на все рациональные числа — вместе с нулём и отрицательной
стороной — теперь тоже закреплено теоремами: и прямой ход (сюръекция),
и обратный (по рациональному — его номер), а с ними и полная биекция
. Глава приводит формулу обхода и указывает
теоремы, её замыкающие.
Отрицательные рациональные числа суть те же положительные позиции, взятые по другую сторону опоры (Глава III.2, § 2.7); нуль есть сама опора. Обход всех рациональных чисел получается из обхода положительных так. Нулю даётся номер ; далее номера чередуются — нечётные несут положительную копию обхода, чётные (кроме нуля) — отрицательную. В явной записи, если есть построенный выше обход положительных рациональных, полный обход задаётся так:
Всякое рациональное число — положительное, отрицательное или нуль — получает в этом чередовании свой номер, и всякому номеру отвечает ровно одно рациональное число.
{
Здесь нужно быть точным относительно статуса этого шага — и теперь он
замкнут. В файле Countability_Q.v приведённая формула
реализована буквально: функция enum_Q задаёт
, нечётному номеру сопоставляет
положительную копию обхода, чётному (кроме нуля) — отрицательную. К
ней построена обратная функция index_of_Q: по
произвольному рациональному — через приведение к несократимому виду и
обратный ход для положительных — она находит его номер, разбирая нуль,
плюс и минус. Обе доказаны взаимно обратными — теоремами
enum_Q_index_id
() и
index_of_Q_enum_id
(), — а соединяет их
теорема Q_bijection:
(forall n, index_of_Q (enum_Q n) = n) /\ (forall q, enum_Q (index_of_Q q) == q).
Это полная биекция с вычислимым
обращением — уже не только для положительных, а для всего ,
конструктивно и без единой аксиомы (Print Assumptions Q_bijection: <
Остаётся единственная точность формулировки — не ограничение, а
правильная мера. Биекция связывает с , взятым с
точностью до Qeq: обратный ход проходит через приведение
Qred, так что и получают один номер. Иначе и
нельзя — на сырых записях дробей биекции нет, ибо и суть
разные записи одного числа (§ 2.5). Потому index_of_Q_enum_id
точна на (равенство номеров), а enum_Q_index_id — с
точностью до Qeq на ; вместе это и есть биекция
рациональных значений.}
Обратная процедура path_to_node по дроби прослеживает
путь от её узла к корню и находит номер. Две теоремы о круговом обходе
доказывают, что прямая и обратная процедуры точно обращают друг друга.
Главная теорема Q_positive_countable утверждает, что
перечисление инъективно и сюръективно, — то есть есть биекция для
положительных рациональных чисел. Доказательство полностью
конструктивно, без закона исключённого третьего: счётность не просто
утверждена, а построена — и построение есть способ её доказать.
Обход всех рациональных чисел — с нулём и отрицательной стороной —
реализован функцией enum_Q по формуле ,
, ; к
ней построен обратный ход index_of_Q, и теорема
Q_bijection доказывает их взаимную обратность — полную
биекцию (с точностью до Qeq, 0
аксиом) уже для всего .
Что доказано
Счётность рациональных чисел доказана — построением явного, вычислимого, конструктивно обоснованного обхода. Остаётся понять, что этот результат означает онтологически: чем оказываются рациональные числа, коль скоро их можно так обойти. К этому глава обращается в следующем разделе.
Что счётность значит онтологически
Рациональные числа имеют достижимый обход
Счётность рациональных чисел доказана построением обхода (§ 3.5). Стоит теперь сказать, что этот результат означает по существу — чем оказываются рациональные числа, коль скоро их можно так обойти.
Прежде всего — то, чего счётность не означает. Она не означает, что все рациональные числа собраны в готовую завершённую совокупность, которую обход <<пересчитывает>>. Глава III.2 показала: рациональные числа суть потенциальная разметка, не завершённое множество, и Глава III.3 этого не отменяет. Обход не собирает рациональные числа в готовое целое; он их достигает.
И вот что счётность означает положительно. Рациональные числа имеют достижимый обход — их можно представить как потенциально продолжаемый список, заданный процедурой обхода, а не как готовый, завершённый список, лежащий наготове. Всякое отдельное рациональное число достижимо: запусти обход — и за конечное число шагов он дойдёт до этого числа, назовёт его номер, построит его дробь. Не нужно держать наготове бесконечную совокупность; довольно процедуры, которая до всякого её члена доходит. Счётность есть свойство этой процедуры — того, что она доходит, — а не свойство собранного множества.
Обычная бесконечность
Из счётности следует и то, какова бесконечность рациональных чисел.
Натуральный ряд бесконечен потенциально: за всяким числом есть следующее (, Часть II). Рациональные числа, на первый взгляд, устроены богаче: они не только тянутся в стороны, как натуральный ряд, но и сгущаются — между всякими двумя из них лежит ещё одно (Глава III.2). Может показаться, что эта двойная неисчерпаемость — и вдаль, и вглубь — делает рациональных чисел <<больше>>, чем натуральных, что их бесконечность как-то превосходит бесконечность ряда.
Счётность показывает, что это не так. Раз есть обход, ставящий натуральные числа и рациональные во взаимно однозначное соответствие, — всякая рациональная позиция имеет конечный номер обхода, достигается за конечное число шагов. Сгущённость разметки не делает рациональные числа менее достижимыми: между двумя позициями лежит ещё одна — но и она получает свой конечный номер, и обход до неё доходит. Рациональные числа суть обычная бесконечность — та же, что у натурального ряда: потенциальная, достижимая, перечислимая. ToS не описывает это языком <<большей>> или <<меньшей>> бесконечности, языком сравнения размеров: такой язык ToS как раз переосмысляет. Точное утверждение проще и сильнее — сгущённость не выводит рациональные числа за пределы достижимого обходом; всякое из них перечислимо, имеет конечный номер. Никакой бесконечности, которая превосходила бы бесконечность ряда, у рациональных чисел нет.
Это — важный для ToS итог, и важен он тем, что очерчивает границу. Всё, что глава прошла до сих пор — натуральные числа, целые, рациональные, — укладывается в один род бесконечности: потенциальной и перечислимой. Существует ли бесконечность иного рода — и где проходит граница перечислимого, — вопрос, который рациональными числами ещё не ставится; он встанет дальше.
Счётность и режим рассмотрения
Стоит связать сказанное с тем, как ToS вообще говорит о бесконечных совокупностях.
Часть II установила: <<множество всех натуральных чисел>> не есть завершённый объект, лежащий готовым; это — список, схема построения, взятая в отвлечении от порядка и времени. То же и с рациональными числами. <<Поле всех рациональных чисел>> не есть собранное целое; говорить о рациональных числах как о целом значит брать их в особом режиме рассмотрения — отвлекаться от того, что разметка не завершена, и рассматривать список её позиций как если бы он был дан весь сразу.
Счётность проясняет, на чём этот режим держится и почему он законен. Брать незавершённый список <<как целое>> позволительно ровно постольку, поскольку есть процедура, доходящая до всякого его члена. Счётность и есть наличие такой процедуры. Она не превращает потенциальное в завершённое — рациональные числа не становятся от неё готовой совокупностью, — но она оправдывает режим, в котором о них говорят как о целом: за этим <<целым>> стоит не собранная бесконечность, а работающий обход. Счётность есть операционное основание того режима рассмотрения, в котором о потенциальной разметке говорят как о списке.
Счётность не собирает рациональные числа в завершённую совокупность — она означает, что всякое рациональное число процессуально достижимо: обход доходит до него за конечное число шагов. Из счётности следует, что рациональные числа суть обычная бесконечность — та же, что у натурального ряда: сгущённость разметки не делает их бесконечность большей. И счётность оправдывает режим, в котором о незавершённой разметке говорят как о списке: за этим списком стоит не собранная бесконечность, а работающий обход.
К следующему различению
Рациональные числа оказались перечислимы — обычной, достижимой бесконечностью. Но глава отметила и границу: вопрос о том, всякая ли бесконечность такова, ещё не поставлен. Подступ к нему — в одном различении, которое перечисление Калкина–Уилфа делает видимым: в различении между данными и поведением. Им глава и продолжается.
Данные и поведение
Почему рациональные числа удалось обойти
Глава обошла рациональные числа — предъявила процедуру, доходящую до всякого из них. Стоит спросить, почему это удалось, — что именно в устройстве рационального числа сделало обход возможным. Ответ на этот вопрос очерчивает границу перечислимого и подводит к тому, что лежит за ней.
Рациональное число обходимо потому, что оно есть конечный объём данных. Всё рациональное число без остатка задаётся парой натуральных чисел — числителем и знаменателем (§ 3.3). Пара эта конечна: числитель есть конкретное натуральное число, знаменатель — конкретное натуральное число, и всё. Записать рациональное число значит записать два числа — выражение конечной длины, которое можно выписать полностью и иметь перед собой целиком.
Это и есть условие обходимости — но назвать его нужно точно, иначе оно прозвучит сильнее, чем верно. Не всякая <<совокупность конечных данных>> перечислима: если бы <<данными>> могли быть конечные объекты над несчётным запасом — скажем, одноэлементные списки, чей единственный элемент взят из несчётной совокупности, — то и совокупность таких конечных данных была бы несчётной. Конечность объёма данных сама по себе перечислимости не даёт. Точное условие иное: перечислима всякая совокупность конечных выражений над счётным алфавитом — конечных записей, составленных из счётного запаса знаков или из конечного набора конструкторов. Вот такие совокупности всегда поддаются обходу: их можно упорядочить по длине и по знакам и пройти подряд, как глава прошла пары дробей по дереву. Рациональные числа — именно таковы: каноническая запись рационального числа есть конечная пара натуральных чисел, конечное выражение над счётным запасом. Перечислимость рациональных чисел есть частный случай этого общего: совокупность конечных выражений счётного типа поддаётся обходу.
Процесс есть бесконечное поведение
Но не всё, о чём говорит математика, есть конечный объём данных. Есть предметы иного рода — и ToS встретит их в следующей части.
Возьмём процесс — скажем, бесконечную последовательность рациональных приближений, шаг за шагом уточняющих некоторую величину. Здесь нужна точность, иначе сказанное войдёт в противоречие с тем, что процесс часто можно задать конечно. Различить нужно три вещи. Отдельный вычислимый процесс вполне может иметь конечное описание — конечное правило, программу: <<на шаге выдай такую-то дробь>>. Но процесс как поведение не тождествен этой конечной записи: он разворачивается как бесконечная последовательность ответов — , , и так без конца, — и весь его ход, весь его график есть объект бесконечный. И, наконец, процесс как произвольная функция вообще не обязан иметь конечного описания: вычислимые процессы суть лишь часть всех функций .
Различие это — между данными и поведением — и проходит здесь. Данные суть нечто записанное, конечное, имеющееся целиком. Поведение есть способ отвечать, развёрнутый на всю бесконечность шагов; отдельное вычислимое поведение задаётся конечным правилом, но само поведение как бесконечная последовательность ответов конечной записью не исчерпывается. И решающее: тогда как совокупность конечных выражений — конечных программ — перечислима наравне с прочими конечными данными, совокупность всех функций к совокупности конечных программ не сводится: функций больше, чем конечных правил, и не всякая задаётся правилом. Рациональное число есть данные. Процесс есть поведение; и совокупность всех процессов-функций — не то же, что перечислимая совокупность конечных данных.
Граница перечислимого
Здесь — граница, к которой глава вела, и здесь же — задел к тому, что разворачивается за рациональными числами.
Совокупности конечных выражений счётного типа перечислимы — это глава показала и объяснила: их члены суть конечные записи над счётным запасом, а такие записи поддаются обходу. Натуральные числа, целые, рациональные — все суть конечные данные, и все перечислимы (§ 3.6). Но совокупность всех процессов — всех функций, отвечающих рациональным числом на всякий шаг, — устроена иначе. Отдельный вычислимый процесс задаётся конечной программой, и программы, как конечные выражения, перечислимы; но совокупность всех функций к совокупности конечных программ не сводится, и оснований, по которым перечислимы конечные данные, к ней не приложить. Перечислима ли совокупность всех процессов — настоящая глава не решает; она лишь отмечает, что вопрос этот иной и оснований для утвердительного ответа здесь нет.6
Этим очерчена граница. По одну её сторону — конечные данные: натуральные, целые, рациональные числа, обычная перечислимая бесконечность. По другую — бесконечное поведение, процессы; и бесконечность их, быть может, иного рода. Часть IV возьмётся именно за эту, другую сторону: построит процессы как самостоятельный предмет и разберёт, перечислимы ли они. Настоящая глава границу лишь называет, не переходя её. В терминах E/R/R здесь граница между конечными данными (рациональное — элемент) и бесконечным поведением (процесс); разбор § 3.8.3.
Рациональные числа удалось обойти потому, что всякое из них есть конечный объём данных — пара натуральных чисел, выражение конечной длины. Перечислима всякая совокупность конечных выражений над счётным алфавитом или конечным набором конструкторов; рациональные числа именно таковы. Процесс — правило, отвечающее рациональным числом на всякий шаг без конца, — задаётся конечной программой как отдельное вычислимое поведение, но совокупность всех функций к совокупности конечных программ не сводится. Здесь проходит граница: конечные данные (натуральные, целые, рациональные числа) перечислимы; перечислима ли совокупность всех процессов — вопрос Части IV.
К итогу главы
Глава прошла счётность рациональных чисел — от операционального смысла счётности до явного обхода и до его онтологического значения — и очертила границу, за которой лежат процессы. Остаётся свести пройденное и наметить переход к следующей главе. Этим глава и завершается.
Итог. Переход к аномалиям рациональных чисел
Что прошла глава
Глава прошла счётность рациональных чисел.
Начала она с того, что уточнила саму счётность. Стандартное понимание — существование биекции — можно воспроизвести и формально, как утверждение об инъективности и сюръективности функции; ToS этим пользуется, но требует более сильной, операциональной формы: не утверждения о существовании соответствия, а явного обхода, который можно вычислить, проследить и обратить (§ 3.1). Отсюда следовало требование: не сослаться на теорему существования, а предъявить обход явно (§ 3.2). Глава его и предъявила — через дерево Калкина–Уилфа, размещающее всякое положительное рациональное число в единственном узле, и всякую дробь в несократимом виде (§ 3.3); через навигацию двоичным путём, связывающую узлы с натуральными числами (§ 3.4); через обратную процедуру и доказательство, что прямой и обратный обход точно обращают друг друга, — доказательство полностью конструктивное, без закона исключённого третьего (§ 3.5). Затем глава показала, что счётность означает онтологически: рациональные числа суть процессуально достижимый список, обычная перечислимая бесконечность — та же, что у натурального ряда (§ 3.6). И очертила границу: конечные данные перечислимы, процессы — бесконечное поведение — лежат по другую сторону (§ 3.7).
Рациональные числа перечислимы
Итог главы сводится к одному. Рациональные числа перечислимы — и перечислимы не по теореме существования, а на деле: есть обход, который до всякого из них доходит за конечное число шагов, и обход этот построен, выписан и конструктивно обоснован.
Этим завершается прохождение рациональных чисел как числовой системы. Часть III построила их как координатную разметку с соразмерным шагом (Глава III.2), показала, почему в стандартной алгебраической оболочке они образуют поле (там же), и показала их перечислимость (настоящая глава). Рациональные числа — упорядоченное, плотное, счётное поле: между всякими двумя из них лежит ещё одно, и при том все они укладываются в один достижимый обход.
Разбор E/R/R: счётность как операциональный обход
{
Пройденную счётность стоит разобрать по E/R/R (Часть I): разбор
закрепляет, чем операциональная счётность ToS богаче
существования биекции. Опорный файл — Countability_Q.v
(776 строк, без единой аксиомы, даже без закона исключённого
третьего): дерево Калкина–Уилфа, перечисление enum_QPos и
обратная index_of_QPos, теорема Q_positive_countable;
а для всего — функция enum_Q, обратная
index_of_Q и теорема Q_bijection. Оговорка о статусе
теперь снята: для всего доказана полная биекция
с вычислимым обращением — две круговые
теоремы enum_Q_index_id и index_of_Q_enum_id,
0 аксиом — с единственной точностью, что берётся до Qeq
( и получают один номер), иначе биекции и быть не может. Ведём
разбор в онтологическом порядке Rules Roles Elements.}
Rules — правила (закон ). Конституция —
построение дерева: корень и два правила ветвления
(cw_left/cw_right), § 3.3. К нему — навигация:
двоичный путь узел, узел номер
(§ 3.4), и обратимость прямого и обратного обхода
(enum_injective и enum_surjective дают
Q_positive_countable, § 3.5). И правило канона:
несократимость (enum_coprime) — всякое рациональное
значение встречается ровно раз, не появляется отдельно от
(§ 3.3). По обход есть процесс: до всякого
рационального он доходит за конечное число шагов, а не
предъявляет завершённый список.
Roles — значимость позиций (закон ). Роль,
которую обход присваивает каждому рациональному, — его номер:
место в перечислении, выдаваемое функцией index_of_QPos.
Узел дерева играет роль рационального значения (несократимый
представитель), двоичный путь — роль адреса. Счётность здесь —
не свойство <<совокупности>>, а роль-номер, назначаемая каждому
элементу процедурой.
Elements — носители (закон и принцип
). Элементы — узлы дерева (пары QPos, их
представители — несократимые) и натуральные номера. По всякий
узел тождествен себе. По всякое рациональное есть
конечный объект — пара числитель/знаменатель, выражение
конечной длины, — и потому поддаётся обходу; <<все рациональные>> при
этом суть потенциальный обход, не готовая совокупность.
Сведём разбор в таблицу.
| Компонент | Что фиксирует | E/R/R |
|---|---|---|
дерево: корень + cw_left/cw_right | конституция обхода | Rule |
| навигация номер; обратимость | биекция nat QPos | Rule |
несократимость (enum_coprime) | каждое значение однажды | Rule |
номер обхода (index_of_QPos) | роль рационального | Role |
| узлы-пары / несократимые представители | носители (конечны, ) | Element |
| законы – (здесь ) | универсальный слой | Rule (универс.) |
{ Хорошая сформированность. Обход сформирован верно: он биективен (прямой и обратный обращают друг друга, доказано) и каноничен по несократимости — ни одно значение не сосчитано дважды (нет рядом с ). И здесь разбор оборачивается диагностикой, двоякой. Первое: счётность ToS читает как правило-обход — процедуру, которую можно вычислить, проследить и обратить, — а не как голое существование соответствия; операциональная форма строго сильнее (§ 3.1). Второе, и главное для дальнейшего: нельзя смешивать данные и поведение. Рациональное — конечные данные (пара, элемент), и потому перечислимо; процесс приближения — бесконечное поведение (функция ), и к совокупности конечных программ он не сводится (§ 3.7). Считать процессы так же, как точки, — смешение категорий: элемент-данные и роль-поведение суть разные уровни.}
Что даёт разбор. Счётность предстаёт не свойством готового множества, а правилом: обход, дающий каждому рациональному конечный номер. Этим замыкается арка чисел-позиций Части III — натуральные, целые, рациональные — все суть конечные данные, уложимые в обход. И тем же разбор ставит порог Части IV: данные перечислимы, поведение — открытый вопрос. Процессы приближения, не завершающиеся рациональной позицией (§ 3.8.4), и есть то поведение; перечислимы ли они — разберёт Часть IV (несчётность процессов).
Чего рациональным числам недостаёт
И всё же рациональными числами числовой ряд не завершается. В них есть нечто, что при ближайшем рассмотрении оказывается недостачей, — и недостача эта откроется не как изъян, а как указание на следующий шаг.
Рациональные числа плотны: между всякими двумя лежит третье, разметка сгущается без предела. Казалось бы, такая разметка не оставляет пробелов — куда ни укажи, там рациональная позиция. Но это не так. На соразмерной разметке возникают процессы приближения — последовательности рациональных позиций, которые описывают некоторую величину всё точнее, чьи рациональные стадии становятся сколь угодно близкими друг к другу, — но которые не завершаются ни на какой рациональной позиции, не стабилизируются ни на одном рациональном числе. Глава не говорит здесь о <<точках, которых нет>>, как о готовых точках некой завершённой прямой: ToS будет читать эти предметы прежде всего как процессы, а не как заранее данные точки. Именно такие процессы в стандартной математике ведут к иррациональным числам. Плотное и счётное поле рациональных чисел, при всей густоте своей разметки, оставляет место таким незавершающимся процессам приближения — и в этом смысле соразмерная разметка не самодостаточна.
Разобрать эти процессы — эти аномалии рациональных чисел — и значит сделать следующий шаг. Они покажут, чего соразмерной разметке недостаёт, и тем укажут, что разворачивается за рациональными числами.
Переход к следующей главе
Рациональные числа построены, показаны как поле в стандартной алгебраической оболочке и показаны перечислимыми. Следующая глава вглядится в их аномалии — в те процессы приближения, которые рациональные числа описывают всё точнее, но которые ни на какой рациональной позиции не завершаются. Аномалиям рациональных чисел посвящена Глава III.4.
Часть: Часть III. От натуральных к рациональным · Том: «Математика»
Понятия: Формализация
Навигация: ← Глава 2. Рациональные числа · Глава 4. От позиции к процессу →
Footnotes
-
Здесь и далее формальные конструкции этой главы — тип пар, дерево, функции обхода, теоремы — приводятся по файлу
Countability_Q.vRocq-репозитория ToS. Имена файлов репозитория даются для справки. ↩ -
Сохранение несократимости доказано в файле
Countability_Q.v: леммы о левом и правом ребёнке (наибольший общий делитель сохраняется при каждом из двух правил) и теоремаcw_node_coprime— что во всяком узле дерева числитель и знаменатель взаимно просты. ↩ -
Функция
cw_nodeи перечислениеenum_QPosопределены в файлеCountability_Q.vRocq-репозитория ToS. ↩ -
Функции
path_to_nodeиindex_of_QPos, а также теоремы этого раздела определены и доказаны в файлеCountability_Q.vRocq-репозитория ToS. Первый аргументfuel— технический приём Rocq: он несёт заведомо достаточное число шагов, чтобы рекурсия была явно конечной.fuelне означает, что процедура требует внешнего, непроверенного ограничения: это стандартный способ сделать рекурсию структурной для проверяющей системы Rocq, и затем доказывается теоремой, что выбранного топлива всегда достаточно — что результат не зависит от того, сколько лишних шагов отпущено сверх нужного. ↩ -
Теоремы о круговом обходе —
path_cw_node_roundtripиcw_node_path_roundtrip— доказаны в файлеCountability_Q.v. ↩ -
Этот контраст уже намечен в комментариях к файлу
Countability_Q.v: рациональные точки перечислимы как конечные объекты — пары числителя и знаменателя, — тогда как рациональные процессы (последовательности приближений) имеют иной статус и требуют отдельного разбора. Файл прямо отмечает, что совокупность функций так не перечисляется. ↩