О точности математиков

Feb 25, 2021 12:47

Есть такое распространённое мнение, что «математики запредельно точны в своих рассуждениях - не то, что физики, инженеры или биологи».

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

Привычка к тому, что можно додумывать что угодно между выражениями на формальном языке, заполняя тем самым все недосказанности и разрешая себе даже из очевидных вариантов выбирать только удобные в данный момент, - страшная штука. Настолько страшная, что разница в сабжевой «точности» между математиками и физиками с этого ракурса не особо-то и заметна.

Не менее круто развиты и двойные стандарты, применяемые почти на автомате. Например, весьма нередко встречаются рассуждения вроде:

  1. Возьмём в качестве текущего результата число 1.

  2. Применим к текущему результату функцию f.

  3. Применим к текущему результату функцию g.

  4. Будем повторять 2 и 3 бесконечно много раз.

  5. Финальным результатом будет что-то, что выдала функция f в этот момент.

Каждый раз, читая подобное, я офигиваю: ладно ещё «финальный результат» - но почему именно f-то? Есть ли в мире тому хоть одно обоснование, кроме «нам так хотелось»?

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

Оба варианта как бы верны одновременно. Но не одновременно в одном случае, а в каждом случае - в зависимости от того, какой именно нам в его рамках удобен. Такая вот она, точность.

Что интересно, к этому ещё в качестве обоснования иногда приписывается что-то типа: «А это у вас просто недостаточно смелая фантазия - вот мы, математики, можем представлять себе чего-то, чего не может быть, и это анализировать, а вы, вот, не можете».

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

Аналогично, программисты вроде как понимают, что у рекурсивно определённой функции должно быть как минимум одно условие выхода без рекурсивного вызова, чтобы она вернула какое-то значение, отличное выброса «exception» или входа в бесконечный цикл (если таковое тоже считать «результатом»). Но в области математики почему-то норм объявить рекурсивную функцию без такого условия и начать рассуждать о её «предельном результате», иногда прикрывая оный ещё какими-то эвфемизмами. Как так-то? У вас же вроде «точность»?

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

Ещё мне очень нравится, сколь легко многие математики соглашаются с тем, что бесконечная сумма чему-то равна. Какому-то числу, в смысле, а не только самому выражению в текстовом виде, которым записывается эта операция. То есть это мы говорим не про предел частичных сумм, который существует исключительно в том смысле, что чем больше слагаемых мы уже просуммировали, тем меньше мы отклоняемся от этого предела, а прямо сразу про саму сумму всего бесконечного количества слагаемых.

Казалось бы, очевидно, что бесконечное суммирование никогда не закончится, поскольку оно бесконечное - это ж прямо в определении самого термина содержится, нет? Если мы напишем такую функцию, то она никогда не завершит свою работу, а потому единственный вариант - искать предел через символьные преобразования самого выражения с суммой в текстовом виде. Но нет, кто-то когда-то для краткости сказал «сумма равна» вместо «предел частичных сумм равен», и на этом месте тяга к точности почему-то запросто отступила.

Кроме того, программистам интуитивно понятно, что «число» и «объект, в котором лежит число» - две большие разницы. В общем случае их нельзя отождествлять - даже если в объекте только-то одно это число и лежит. Такие сущности вполне могут быть не эквивалентны друг другу в каких-то случаях, поэтому произвольная замена «числа» на «обёрнутое в объект число» и обратно - циничное попрание точности рассуждений. Но в математических рассуждения такое - почему-то норм.

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

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

В компьютере, если что, это тоже хранится в виде чисел - поскольку там в виде чисел хранится вообще всё - однако из этого ведь не следует, что наши трактовки этих чисел тут же становятся тождественными друг другу. Например, даже если некоторый текст записан в виде числа, и при этом он вроде как описывает способ получения некоторого числа, то от этого «текст, описывающий способ получения числа» не превращается в «это число».

Вроде же очевидно. Вроде же, вот она - точность. Но нет. Если хочется, то можно считать и вот так.

Но самое интересное проявление реального отсутствия стремления к точности - это, конечно, то, что в математических рассуждения до сих пор присваивание и сравнение обозначаются одним и тем же знаком «=». Причём я бы понял, если бы это дело можно было списать на «контекст внутри выражения». Но нет, выражения вполне могут быть вообще посимвольно идентичными, а контекст при этом задаётся рассуждениями на разговорном языке, причём в ряде случаев - подразумеваемыми, а не написанными явно.

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

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

Математик-непрограммист же свободен от этих ментальных страданий: его цель не написать работающую программу, а убедить кого-то в своих выводах. Из-за чего сабжевая «точность» должна быть ровно такой, чтобы его рассуждения выглядели убедительно для собеседника (причём некоторые математики, в своих философских трактатах пишут ровно вот это сразу напрямую). Если собеседник не заметит жонглирования понятиями - всё нормально, дальше уточнять их не нужно. А когда кто-то всё-таки заметит и если его не удастся убедить в том, что он «неправильно додумывает», то можно что-то уточнить - но опять же лишь до той степени, чтобы возражения исчезли.

Некоторые программисты с бэкграундом в математике, видимо, умеют «переключать режимы». То есть при переходе в другую область у них просто пропадает ощущение, что «надо программировать». Оттуда - чувство свободы и мгновенный отказ от той точности, которая была естественной в области написания программ.

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

doc-файл

наука, философия, программирование

Previous post Next post
Up