Пример. «Интервал
Пример. «Является ли
Пример. «Каков ряд Фурье для
А вот ещё более глупые примеры.
Пример. «Является ли прямоугольник простым?»
Пример. "
Пример. «Каков ряд Фурье для пустого множества?»
Объединяет все эти примеры то, что они являются ошибками типизации: это попытки применения некого математического процесса к математическому объекту, который никак не может быть входными данными для него. Если для ответа на эти вопросы вы попытаетесь написать программу на каком-нибудь высоко математическом языке программирования, то она (я надеюсь!) не скомпилируется.
Математические объекты обычно не воспринимаются явно как имеющие типы в том же смысле, что и объекты в языках программирования с системой типов. Предполагается, что обычная математика должна формализироваться в системе Цермело — Френкеля (ZF), возможно, с аксиомой выбора, а в ZF каждый математический объект конструируется как множество. В этом смысле все эти объекты имеют одинаковый тип. (В частности, вопрос "
Вместо того, чтобы рассуждать с точки зрения теории множеств, стоит считать математические объекты как имеющие типы, что позволит нам импортировать в математику различные полезные концепции, такие как понятия типобезопасности, приведения типов, субтипирования и перегрузки, что позволит нам более конкретно определять «грамматическую ошибочность» математических предложений. В оставшейся части поста я буду расслабленно обсуждать то, как эти и другие связанные с типами концепции применимы к математике в целом. В статье будет много категорийных понятий, но ради простоты понимания я ограничусь тем, что сделаю их примечаниями в скобках.
Неформальное описание математических типов
Неформально можно сказать, что тип математического объекта описывает разновидность этого объекта.
Пример. Объект
Пример. Объект
Пример. Объект
Пример. Объект
Пример. Объект
Пример. Объект
Пример. Объект
А вот менее простые примеры:
Пример. Объект
Пример. Объект
Пример. Объект
Типы помогают понять, какие действия мы можем совершать с набором математических объектов.
Пример. Можно взять два объекта типа
Пример. Можно взять два объекта типа
Пример. Можно взять объект типа
Пример. Если
Тип
Пример. Можно взять натуральное число и спросить, является ли оно простым. Другими словами, существует функция
Пример. Если
которую мы также можем записать с помощью знака равенства
Пример. Можно взять два целых числа и спросить, больше ли первое или равно второму. Другими словами, существует функция
Как следует из этих примеров, существует множество способов комбинирования типов для создания новых типов; они называются конструкторами типов.
Пример. Объект, имеющий тип-произведение
Пример. Объект, имеющий тип-сумму
Пример. Объект функционального типа
(Эти конструкции могут показаться знакомыми любителям теории категорий: в ней все они являются просто произведением, копроизведением и экспоненциалом. Другими словами, категории типов являются бидекартово замкнутыми категориями.)
С помощью представленных выше простых конструкторов типов мы можем создавать более сложные конструкторы типов. Например, имея тип
(где
Система обозначений
Выше мы использовали запись
Типобезопасность и ошибки типизации
Кроме того, что они помогают понять, что мы можем сделать с набором математических объектов, типы также позволяют понять, что мы не можем сделать. Давайте рассмотрим представленные в начале поста примеры, приняв во внимание эту идею.
Пример. «Является ли
Пример. «Каков ряд Фурье для
Пример. «Интервал
Пример. «Является ли
Пример. «Каков ряд Фурье для
Более глупые примеры можно проанализировать аналогично.
Поиск ошибок типизации, или проверка типов помогает в отладке математических вычислений так же, как компилятор ищет ошибки типизации для отладки кода. Например, когда мы видим выражение в виде
Проверка типов также является способом понимания новых математических тем. Если вы пока не можете пока произносить правильно типизированные предложения по нужной теме (что могут определить другие люди, знающие предмет), то вы ещё не разобрались в типах основных объектов или функций этой области. Например, если вы говорите «фундаментальная группа...», то вам нужно закончить предложение или фразой «точечного топологического пространства» или «линейно-связанного топологического пространства». В противном случае, вы не понимаете важного аспекта определения фундаментальной группы, а именно роли базовых точек.
Приведение типов, создание подтипов и перегрузка
Проверку типов нетривиальной задачей может сделать то, что большинство математических объектов естественным образом считаются имеющими несколько типов. Например, выше мы сказали, что число
которые преобразуют объекты в разные типы. Если есть оператор приведения типа
Ещё один способ описания этой ситуации заключается в том, что некоторые типы являются подтипами других типов; другими словами, вместо набора функций приведения типов вышеуказанная ситуация описывает цепочку включений подтипов. Создание подтипов позволяет объектам иметь одновременно несколько типов, а не быть определённого типа в определённой точке каких-нибудь вычислений.
Подтипы имеют интересную связь с функциональными типами. Если
(И это тоже должно быть знакомо любителям теории категорий: это явление отражает тот факт, что создание экспоненциальных объектов ковариантно функториально в конечных объектах, но контравариантно функториально в исходных объектах.)
Третий способ описания этой ситуации заключается в том, что функции в математике перегружены, и это описание наверно ближе всего к математической практике. Перегрузкой называется практика задания функций, имеющих одинаковое название, но получающих разные типы входных данных. Например, символ сложения
и так далее. Более обобщённо мы можем использовать
С показательной записью
или даже ещё более обобщённо,
Кажется, перегрузка сбивает студентов с толку, и я думаю, что частично причина заключается в том, что математики редко явно говорят о ней, когда применяют её. Перегрузка не так плоха, пока все её отличающиеся экземпляры по крайней мере логично связаны друг с другом, но иногда математические концепции перегружаются без всяких причин, кроме исторических, например, слова «нормальный» и «правильный». Это ещё больше запутывает студентов: иногда одно слово используется в двух разных контекстах из-за логической связи, например, «нормальное расширение» и «нормальные подгруппы», но иногда её просто нет. См. также этот вопрос на MO.
Рекурсивные типы
В теории типов можно определять некоторые типы рекурсивно, относительно их самих, а не напрямую относительно других типов. Таким образом можно определить удивительно много важных видов математических объектов.
Пример. Тип
то есть, натуральное число является или точкой (а именно
Пример. В более общем случае, тип-список
то есть список элементов типа
Пример. Тип
то есть дерево — это или точка или пара деревьев (а именно пара деревьев, полученная удалением их корня).
Пример. Разновидность типа
то есть множество — это функция множеств, которая возвращает или true (для содержащихся в нём элементов), или false (для элементов, которых в нём нет).
Пример. Тип
то есть игра — это пара функций игр, которые мы можем назвать
Конвей заметил, что комбинаторные игры напоминают обобщение обоих порядковых чисел (которое можно описать относительно множества порядковых чисел) и дедекиндовых сечений (которые можно описать парой множеств рациональных чисел). Он использовал эту связь для определения большого класса чисел с помощью игр; подробнее см. в On Numbers and Games.
Определённый нами ранее тип
(Для любителей теории категорий: рекурсивные типы являются инициальными алгебрами относительно соответствующего эндофунктора категории типов.)
Функции, получающие на входе рекурсивный тип, тоже можно определить рекурсивно. Примеры с натуральными числами вам должны быть уже знакомы; вот ещё и другие примеры.
Пример. Длину списка можно определить рекурсивно следующим образом: длина точки — это
Пример. В более общем смысле, для любых двух типов
которая называется map, получающая на входе функцию
(Любители теории категорий увидят, что, по сути, в этой записи конструктор списка является функтором. Существуют даже языки программирования типа Haskell, распознающие этот факт и использующие его.)
Пример. Высота дерева может быть рекурсивно определена следующим образом: высота точки равна
Пример. Игры с гарантированным завершением можно упорядочить на четыре непересекающихся класса: игра является
- положительной, если левый выигрывает вне зависимости от того, кто ходит первым,
- отрицательной, если правый выигрывает вне зависимости от того, кто ходит первым,
- нулевой, если выигрывает игрок, делающий ход вторым,
- нечёткой, если выигрывает игрок, делающий ход первым.
Здесь под «победой» понимаются победы в условиях обычной игры, когда проигрывает первый игрок, который не может сделать ход. Вышеперечисленные классы соответствуют четырём функциям
которые можно рекурсивно определить через друг друга следующим образом:
- Игра положительна тогда и только тогда, когда хотя бы один из вариантов левого является положительным или нулевым, а все варианты правого положительны или нечётки.
- Игра отрицательна тогда и только тогда, когда все варианты левого отрицательны или нечётки, и хотя бы один из вариантов правого отрицательный или нулевой.
- Игра нулевая тогда и только тогда, когда ни один из вариантов левого не положительный и не нулевой, и ни один из вариантов правого не отрицательный и не нулевой.
- Игра нечёткая тогда и только тогда, когда хотя бы один из вариантов левого положительный или нулевой и хотя бы один из вариантов правого отрицательный или нулевой.
(Для любителей теории категорий: рекурсивно определяемые функции являются применением универсального свойства инициальных алгебр.)
Рекурсивные типы — это ещё одна причина считать, что в математике есть система типов: они позволяют гораздо подробнее записывать рекурсию, чем она обычно явно упоминается в математике, где мы записываем её с помощью индукции (рекурсия над
Заключение
Хотя теоретически математика не часто описывается, как имеющая систему типов, на практике оказывается и полезнее, и точнее описывать математику, как имеющую такую систему. Это даёт нам язык для понимания определённых видов математических ошибок (ошибок типизации), а также для понимания определённых подразумеваемых математических действий (перегрузки). Кроме того, типы имеют интересную математическую структуру и предоставляют более богатый язык для задания рекурсивно определяемых математических объектов и для работы с ними, чем традиционные способы.

