Математические байки
Photo
То есть — вот здесь, например, программа действительно делает недостаточно итераций, и под этим увеличением рисует заметно-неправильное множество.
И возникает вопрос: хорошо, а как определить, сколько ждать надо?
В этом месте должна бы начинать звучать драматическая музыка — потому что на слова "определить, сколько времени нужно ждать" одной из первых ассоциаций является алгоритмически неразрешимая проблема останова.
А именно — если мы рассматриваем компьютер (с бесконечной памятью; машину Тьюринга, чтобы формализовать слово "компьютер"), на котором будем запускать программы — то нет никакого универсального алгоритмического способа по любой программе правильно сказать, закончит ли она когда-нибудь работу, или нет.
То есть — есть очевидные случаи (скажем, если первой же командой идёт "закончить работу", или первым же делом программа сваливается в бесконечный цикл).
Есть менее очевидные, которые всё ещё можно обработать. Но нет никакого алгоритма, позволяющего правильно дать ответ во всех случаях.
Потому что — пусть такой алгоритм ( = программа) существует:
Испортим эту программу (которая должна была бы давать ответ всегда): пусть она зависает вместо того, чтобы печатать "OK" — но аккуратно печатает "FAIL":
И получим классический парадокс лжеца: если он останавливается, то он должен был бы зависнуть из-за того, как мы его испортили (вместо того, чтобы напечатать "OK"), а если он зависает, то должен был бы добросовестно напечатать "FAIL" и остановиться.
На самом деле — я тут чуть-чуть сжульничал: чтобы рассуждения выше стали совсем правдой, нужно сказать, что мы рассматриваем пару из программы и входных данных — а эти рассуждения доказывают алгоритмическую неразрешимость проблемы самоприменимости: "остановится ли программа, если её запустить на её собственном коде в качестве входных данных?"
Но если бы мы могли решать, остановится ли данная программа на данных начальных данных — то и про частный случай, "запустить на своём собственном коде", смогли бы ответить. А мы только что увидели, что даже для этого частного случая никакого алгоритма нет.
Так вот — есть метод, который позволяет иногда ответить на вопрос, останавливается ли программа: скажем, подождать годик, вдруг остановится. И кстати — это не такой дурацкий способ!
Я приведу цитату из (очень живым языком написанной) статьи А. Разборова в сборнике "Студенческих чтений НМУ", https://www.mccme.ru/free-books/globus/iumlectures1.pdf , которую (как и весь сборник — и последовавшие за ним выпуски "Глобуса") очень советую:
Я приведу цитату из (очень живым языком написанной) статьи А. Разборова в сборнике "Студенческих чтений НМУ", https://www.mccme.ru/free-books/globus/iumlectures1.pdf , которую (как и весь сборник — и последовавшие за ним выпуски "Глобуса") очень советую: