К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026)

Материал из 0x1.tv

Докладчик
Николай Непейвода.jpg
Николай Непейвода

Рассматриваются фундаментальные различия между алгоритмикой для дискретных и непрерывных объектов и показывается, что классические модели вычислимости адекватны прежде всего для дискретных задач. Опираясь на результаты конструктивной математики, демонстрируется связь непрерывности и относительной вычислимости, а также невозможность полноценной работы с действительными числами в рамках традиционных подходов к программированию без явной спецификации точности.

Особое внимание уделяется проблемам равенства и недетерминированности в вычислениях над действительными числами. Показывается, что точное равенство в непрерывной среде неконструктивно, а корректные программы должны работать с оценками точности и учитывать приближённый характер входных и выходных данных. Предлагаются принципы замещения равенства оценками и использования контролируемой недетерминированности.

Формулируются практические рекомендации по конструктивизации программ и их спецификаций:

  • необходимость явного задания точности данных и результатов,
  • введения «окрестностного отношения» как характеристики программы
  • разработки методики построения логически корректных непрерывных программ в среде свободного программного обеспечения.

Видео[править вики-текст]

on youtube

Презентация[править вики-текст]

К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026).pdf

Thesis[править | править вики-текст]

Теоретическая прелюдия[править | править вики-текст]

Алгоритмика для работы с точными дискретными объектами и непрерывными, заданными приближениями, принципиально отличается. Теоретическим аспектам алгоритмики для топологических объектов занимается конструктивная математика, итоги 120-летнего развития которой подведены в фундаментальной коллективной монографии[1]. Значительная часть этих работ посвящена конструктивизации и вычислимости для хаусдорфовых пространств со счётной базой окрестностей, которыми почти всегда являются структуры, основанные на действительных числах. При этом конструктивные функции и функционалы всегда оказывались непрерывными. Но не любая непрерывная функция была конструктивной. Причины этого оказалось возможным полностью прояснить.

В работе[2] на базе соединения понятия относительной вычислимости, конструктивизации произвольных хаусдорфовых пространств со счётной базой, рекурсивных схем[3], типизированного λ-исчисления[4] и методов суперкомпиляции[5] доказано, что функция непрерывна тогда и только тогда, когда она вычислима относительно некоторой целочисленной функции. При этом для каждой вычислимой функции имеется окрестностное отношение, показывающее, какой окрестности аргумента достаточно для вычисления каждой окрестности результата. Но вычислить это отношение, имея лишь конструктивную функцию, невозможно, нужно знать и преобразовать её программу методами суперкомпиляции.

Работу конструктивной функции можно охарактеризовать следующей схемой:

Работа с конечной информацией

Практика программирования показала, что функциональные программы для дискретных и непрерывных задач пишутся в разном стиле. Стандартное в информатике определение вычислимости через машины Тьюринга либо λ-исчисление[6] прагматически корректно прежде всего для дискретных задач. Более того, для работы с функционалами высокого порядка машины Тьюринга практически непригодны: они приспособлены лишь обрабатывать первопорядковую функцию как бесконечную ленту с записями только для чтения. Тем самым они оказываются недостаточно адекватны уже для вычислимости над действительными числами.

Фундаментальный результат Крайзеля и Трулстра[7] показал, что моделью вычислимости с неполной информацией служит не алгоритм, а относительная вычислимость. Она представляется как алгоритмическое устройство, программу в котором мы не знаем, принимающее на входы дискретную информацию, физический датчик, моделируемый в первом приближении беззаконной последовательностью, знания о которой исчерпываются уже полученными данными, и творческой последовательностью, моделирующей действия человека-оператора.

Вычисления по Крайзелю и Трулстра

Тем самым программы для работы с непрерывными объектами являются обрывками алгоритмов, где вход и вывод оборваны в некотором, порою достаточно произвольном, месте.

В дискретной математике оказалось полезным понятие доказательного программирования, стандартной реализацией которого стала система AGDA[8]. В ней исключительно богатые библиотеки работы с алгебраическими и комбинаторными алгоритмами, высокоразвитая система функционального программирования, но почти нет пакетов для работы с действительными числами. Причины этого показала теорема[2].

Кошмар равенства[править | править вики-текст]

В AGDA принимается, что значения можно проверять на равенство, но равенство действительных чисел вычислительного смысла не имеет, оно требует проверки бесконечной информации. Практики также неоднократно предупреждали о некорректности использования равенства в типе действительных чисел. Этот вариант неконструктивности теоретически неизлечим.

Практически же есть возможность в некоторых случаях его преодолевать.

  1. Заменить равенство приближённым равенством, возможно несколько исправив формулировку задачи. Например, классическая задача нахождения нуля функции, меняющей знак на отрезке, конструктивно некорректна. Её нужно заменить на нахождение точки с малым значением функции.
  2. Сравниваемые значения задаются последовательностью, члены которой различаются больше, чем на точность представления чисел. В этом случае целесообразно определить новый класс значений последовательности, позволяющий новые операции и переопределяющий практически все старые как дающие результат в стандартном классе.

Вывод, что действительные числа должны быть не исходным типом, а классом, важен. Поскольку любое конкретное представление является обрывком чисел, логически корректная программа должна быть шаблоном, куда подставляются конкретные представления чисел и операций.

  1. В этом случае равенство замещается совпадением классов, то есть единым источником копирования, что корректно. Но стоит помнить: тогда не влечёт , а лишь . Все операции неточные и часто недетерминированные.

Недетерминированность[править | править вики-текст]

В конструктивизме нет трихотомии, она заменяется сравнением с точностью до некоторого :

Самой точной конструктивизацией оператора

является недетерминированный условный оператор Дейкстры:

либо:

В случае интервальных либо других избыточных представлений чисел недетерминированность реализуется как в теории: разные представления числа дают разные результаты.

Педагогическая проблема[править | править вики-текст]

Корректному программированию численных задач мешает глобальная педагогическая ошибка. От школы вплоть до серьёзных книг утверждают, что рациональные числа — подмножество действительных. Но в таком случае избыточная информация, унаследованная ими, забивает релевантную и возникают все недостатки непрерывности. Целые числа корректно представлять как частный случай действительных.

Основная проблема действий с рациональными числами — быстрый рост числителей и знаменателей. Возможное решение — разложить дробную часть в цепную дробь и отбросить последний член.

Следующие шаги по конструктивизации программы и её спецификации[править | править вики-текст]

В конструктивном представлении программ над топологическим пространством аргументы всегда задаются с некоторой точностью и результат тоже получается приближённым. Поэтому логичным шагом является спецификация критически важных значений их точностью.

Информация о функции.

По приближении к функции можно найти приближение к интегралу: границы прямоугольников позволяют вычислить нижние и верхние интегральные суммы. Также видна возможность получения информации о равномерной непрерывности функции.

Информация о функции с производной

Для функций с несколькими производными потребуется создавать собственную конечную информацию.

Большое конечное как непрерывное[править | править вики-текст]

Большой текст можно представить как бесконечную последовательность символов, большую базу данных — как бэровское пространство. Здесь естественно строить функции, пытающиеся выдать результат с требуемой точностью по части большой информации и запрашивающие уточнения.

Заключение[править | править вики-текст]

Ближайшая задача для свободного софта — накопить примеры логически корректных непрерывных программ и выработать рекомендации по технике их спецификации. Здесь поможет опыт рецензирования кода сообществом и инструменты, в частности, bugzilla.

К доказательному программированию для непрерывных данных (Николай Непейвода, OSEDUCONF-2026)!.jpg

Примечания и ссылки[править вики-текст]

  1. Bridges D., Ishihara H., Rathjen M., Schwichtenberg H. Handbook of Constructive Mathematics. Cambridge University Press; 2023.
  2. 2,0 2,1 Непейвода Н. Н. Непрерывность как вычислимость. Проблемы управления, 2025, № 6.
  3. McCarthy J. A Basis for a Mathematical Theory of Computation // Computer Programming and Formal Systems, 1963, pp. 33--70.
  4. Barendregt H. P. The lambda calculus. Its syntax and semantics. Revised edition. North-Holland Publishing Co., Amsterdam, 1984.
  5. Суперкомпиляция: основные принципы и базовые понятия // Препринты ИПМ им. М. В. Келдыша. 2018. № 111. 36 с. doi:10.20948/prepr-2018-111 http://library.keldysh.ru/preprint.asp?id=2018-111
  6. Митчелл Дж. Основания языков программирования. М.: — Ижевск: НИЦ «Регулярная и хаотическая динамика», 2010.
  7. Kreisel G., Troelstra A. S. Formal systems for some branches of intuitionistic analysis. Ann. Math. Logic, 1(3), 1970, p. 229--387.
  8. Agda User Manual Release 2.8.0 The Agda Team Mar 12, 2025 https://agda.readthedocs.io/en/v2.8.0/