Lex Kravetski (lex_kravetski) wrote,
Lex Kravetski
lex_kravetski

Category:

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

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

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

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

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

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


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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



doc-файл

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

  • Временный обман во благо

    Как это работает. В начале кто-то проводит исследование и выясняет, что изрядная часть людей ест слишком много сахара и/или слишком много соли, что…

  • О вероятности редких событий

    Среднее без дисперсии — это число, по которому в общем случае нельзя сделать никаких выводов. Но часто служит оно для того, чтобы сделать выводы…

  • Современный упрощённый эмпиризм

    Должен сказать, что популяризация психологии как носителя самых захватывающих и понятных широким массам экспериментов в совокупности с принятыми у…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 68 comments

  • Временный обман во благо

    Как это работает. В начале кто-то проводит исследование и выясняет, что изрядная часть людей ест слишком много сахара и/или слишком много соли, что…

  • О вероятности редких событий

    Среднее без дисперсии — это число, по которому в общем случае нельзя сделать никаких выводов. Но часто служит оно для того, чтобы сделать выводы…

  • Современный упрощённый эмпиризм

    Должен сказать, что популяризация психологии как носителя самых захватывающих и понятных широким массам экспериментов в совокупности с принятыми у…