LINUX.ORG.RU

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

 


2

2

Под эквивалентностью я подразумеваю равенство выходных данных и произведенных побочных эффектов

Например, для двух функций вычислений n-го числа фибоначчи (питон)


def fib1(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

def fib2(n):
    if n < 2:
        return n
    return fib2(n-1) + fib2(n-2)

как доказать что соотношения множеств входных и выходных данных для этих функций одинаковы (не учитывая переполнение стека для второй) ?

Питон тут для примера, для какого-нибудь лиспа, наверное, проще будет сделать это


Ответ на: комментарий от emulek

Слышь, пёзданутый, ты вообще знаешь, что такое доказательство? То, что ты тут высираешь, на формальные доказательства не тянет, только на гнилой пиздежь.

anonymous
()
Ответ на: комментарий от anonymous

учи матчасть.

Ну так иди и почитай определение. Любая МТ конечна.

ок, дай пруф, пойду я учить...

А этого я не знаю, это уже зависит от реализации rand(). Может, там квантовый генератор стоит?

отродясь не было.

The rand() function returns a pseudo-random integer in the range 0 to RAND_MAX inclusive (i.e., the mathe‐ matical range [0, RAND_MAX]).

The srand() function sets its argument as the seed for a new sequence of pseudo-random integers to be returned by rand(). These sequences are repeatable by calling srand() with the same seed value.

Ну у тебя конечно какая-то другая rand()...

emulek
()
Ответ на: комментарий от anonymous

Алсо, если rand детерминирован, то виснет эта программа или заканчивается (и за сколько шагов заканчивается) - вполне корректно определено.

угу. Только детерминированности недостаточно. Надо ещё и алгоритм определить. А вот он как раз и *не* определён. В POSIX.1-2001 например. Или в C89.

К слову, в доказательстве неразрешимости проблемы останова как раз существенно используется тот факт, что любая МТ _конечна_. Если допускать бесконечные МТ - то доказательство уже работать не будет. Не факт, что и сама теорема будет верна, кстати.

а я в курсе. Но и для случая _конечных_ алгоритмов теорема не верна. Если понимать «конечность» в математическом смысле. Математики называют конечным такое число x, которое не больше какого-то _заданного_ M. Причём M может быть _любым_. В этом смысле в «доказательстве» нужно изменить «зависло», на «отработало не меньше M тактов», где M любое, но *фиксированное* число. С такой поправкой доказательство лишается всякого смысла.

emulek
()
Ответ на: комментарий от emulek

угу. Только детерминированности недостаточно. Надо ещё и алгоритм определить. А вот он как раз и *не* определён. В POSIX.1-2001 например. Или в C89.

Твой posix или c89 не имеют никакого отношения к MT. Если алгоритм не определен (то есть сам не является частью описания данной МТ), то это значит, что это будет МТ с оракулом (rand() - оракул).

а я в курсе. Но и для случая _конечных_ алгоритмов теорема не верна.

Ты что, тупой? Она как раз и доказывается только для конечных алгоритмов. Именно для них.

В этом смысле в «доказательстве» нужно изменить «зависло», на «отработало не меньше M тактов», где M любое, но *фиксированное* число.

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

anonymous
()
Ответ на: комментарий от anonymous

ну если у машины M бит памяти, то у неё 2^M состояний. Всего. И потому, не далее как через 2^M ходов(или раньше) машина вернётся к узловой точке, которую уже проходила, и там и зациклится. Т.к. мы про детерминированную машину, которая переходит всегда одинаково. И нет никакой «проблемы останова» и «алгоритма, который не заканчивается в конечном состоянии и в цикле».

А у Тьринга проблема есть просто потому, что он всегда готов приписать лишних строчек, у него машина бесконечная.

emulek
()
Ответ на: комментарий от emulek

А у Тьринга проблема есть просто потому, что он всегда готов приписать лишних строчек, у него машина бесконечная.

Да нету у Тьюринга никаких бесконечных машин. Если бы были - то и проблем бы никаких не было, ведь тогда проблема останова конечных программ становится разрешимой. А она неразрешима. Потому что нету бесконечных машин.

ну если у машины M бит памяти, то у неё 2^M состояний. Всего. И потому, не далее как через 2^M ходов(или раньше) машина вернётся к узловой точке, которую уже проходила, и там и зациклится.

Вот у нас и нету никакого алгоритма, который по любой машине Тьюринга может сказать - зациклится она или нет.

anonymous
()
Ответ на: комментарий от anonymous

ну если у машины M бит памяти, то у неё 2^M состояний. Всего. И потому, не далее как через 2^M ходов(или раньше) машина вернётся к узловой точке, которую уже проходила, и там и зациклится.

Вот у нас и нету никакого алгоритма, который по любой машине Тьюринга может сказать - зациклится она или нет.

ну как же «нету»? Есть. Единственная беда — число M очень большое.

emulek
()
Ответ на: комментарий от anonymous

алгоритм вполне очевиден: если множество состояний действительно конечно, то очевидно мы рано или поздно обойдём всё множество, или ещё раньше дойдём до повтора. Это тебе понятно?

Для этого необходимо и достаточно:

1. конечности множества состояний

2. детерминированности, т.е. из состояния X1 мы переходим всегда в X2.

Для любых реальных вычислителей это справедливо. Для МТ — нет, правило №1 не выполнено. Потому и возникает «проблема остановки».

emulek
()
Ответ на: комментарий от emulek

алгоритм вполне очевиден: если множество состояний действительно конечно, то очевидно мы рано или поздно обойдём всё множество, или ещё раньше дойдём до повтора.

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

Потому и возникает «проблема остановки».

Проблема остановки возникает из-за того, что мы не знаем сколько нам ждать.

anonymous
()
Ответ на: комментарий от anonymous

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

это всё ещё мысленный эксперимент.

Проблема остановки возникает из-за того, что мы не знаем сколько нам ждать.

да.

emulek
()
Ответ на: комментарий от emulek

это всё ещё мысленный эксперимент.

Угу. Мы договорились к ленте дополнительного ничего не приклеивать. Теперь скажи, откуда же ты возьмешь память для хранения состояний, если заранее их количество неизвестно, лента - конечная, и доклеивать что-то походу к ней нельзя?

да.

То есть ты понял, что никакого алгоритма, который решает проблему останова для _конечных_ МТ, у тебя нет?

anonymous
()
Ответ на: комментарий от anonymous

Теперь скажи, откуда же ты возьмешь память для хранения состояний, если заранее их количество неизвестно, лента - конечная, и доклеивать что-то походу к ней нельзя?

если в ленте M ячеек для хранения M бит, то у такой ленты ровно 2^M состояний.

То есть ты понял, что никакого алгоритма, который решает проблему останова для _конечных_ МТ, у тебя нет?

есть. Ибо число состояний тоже конечно и не более 2^M. «Конечное состояние» это цикл от узловой точки и до неё же. Максимально возможный размер этого цикла 2^M.

emulek
()
Ответ на: комментарий от emulek

если в ленте M ячеек для хранения M бит, то у такой ленты ровно 2^M состояний.

Откуда ты знаешь сколько в ленте ячеек?

Ибо число состояний тоже конечно и не более 2^M

Но ты не знаешь M.

anonymous
()

Чувак, доказывай индукцией. Я читал Кнута, он все доказывает индукцией!

p.s. сарказм

zekka
()
Ответ на: комментарий от anonymous

Откуда ты знаешь сколько в ленте ячеек?

она же конечная. А значит, я знаю, где она КОНЧАЕТСЯ. Это и есть определение «конечности».

emulek
()
Ответ на: комментарий от emulek

она же конечная.

Да.

А значит, я знаю, где она КОНЧАЕТСЯ.

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

anonymous
()
Ответ на: комментарий от anonymous

Анон, хватит уже путать. Абстрактный вычислитель с конечной памятью — это не машина Тьюринга. У него конечное число состояний (собственные состояние машины, помноженные на все состояния памяти). Полноценная машина Тьюринга может за некоторое конечное время выписать у себя в памяти вообще все состояния вычислителя с конечной лентой — вершины графа. Затем для каждой вершины она может определить следующую, пользуясь конечным списком правил конечного вычислителя — это будут дуги. Каждая вершина имеет не более одной исходящей дуги, так как конечный вычислитель детерминирован. Все циклы на конечном графе можно найти за конечное время. Для решения проблемы останова для конечного вычислителя достаточно проверить, достижим ли какой-то цикл из вершины, представляющей начальную конфигурацию конечного вычислителя.

Естественно, сам конечный вычислитель не сможет решить проблему останова для самого себя, потому что у него памяти не хватит, чтобы вместить все эти графы. Машина Тьюринга не может этого сделать по той же причине: нет перечислимых множеств, которые были бы более бесконечны, чем множество натуральных чисел.

ilammy ★★★
()
Последнее исправление: ilammy (всего исправлений: 3)
Ответ на: комментарий от emulek

выше написано, что алгоритмы КОНЕЧНЫ (sic!), значит и число их конечно.

Ага, а если у меня член большой, значит и у других они тоже большие:) ЧТД

И BTW, очевидно, что некоторые алгоритмы конечны, но то что все они конечны, ты доказать тоже не сможешь.

anonimous
()
Ответ на: комментарий от anonymous

А значит, я знаю, где она КОНЧАЕТСЯ.

Конечно же, нет. Ты знаешь, что она кончается, но где кончается - не знаешь.

почему «не знаю»? Если «не знаю», то это особая постановка задачи, другая. Этот момент нужно было в самом начале постулировать, что дескать МТ конечно, но число состояний неизвестно.

emulek
()
Ответ на: комментарий от ilammy

Естественно, сам конечный вычислитель не сможет решить проблему останова для самого себя, потому что у него памяти не хватит, чтобы вместить все эти графы. Машина Тьюринга не может этого сделать по той же причине: нет перечислимых множеств, которые были бы более бесконечны, чем множество натуральных чисел.

вот с этим нужно согласится.

emulek
()
Ответ на: комментарий от anonimous

И BTW, очевидно, что некоторые алгоритмы конечны, но то что все они конечны, ты доказать тоже не сможешь.

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

emulek
()
Ответ на: комментарий от emulek

Если выписать все ваши сообщения в ряд, будет казаться, что вы спорите сами с собой :(

Ваши рассуждения похожи на манную кашу.

anonymous
()
Ответ на: комментарий от anonymous

Если выписать все ваши сообщения в ряд, будет казаться, что вы спорите сами с собой :(

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

emulek
()
Ответ на: комментарий от anonymous

Emulek это просто еще один алиас для анонимуса. От него пишут произвольные люди.

нет, один. Просто ты дурак, и многие посты не понимаешь. А если дурак что-то не понимает, то он называет это «бредом».

emulek
()
Ответ на: комментарий от emulek

Этот момент нужно было в самом начале постулировать, что дескать МТ конечно, но число состояний неизвестно.

Это и постулируется в определении МТ. МТ задается набором состояний (с выделенными терминальными), алфавитом и набором правил перехода. А какая там будет лента - никто не в курсе.

anonymous
()
Ответ на: комментарий от ilammy

Естественно, сам конечный вычислитель не сможет решить проблему останова для самого себя

О чем и речь.

anonymous
()
Ответ на: комментарий от emulek

Все алгоритмы конечны потому, что бесконечных мы не рассматриваем.

Именно так. Но конечных алгоритмов - бесконечное число. Что тут непонятного? Это тривиально доказывается.

anonymous
()
Ответ на: комментарий от anonymous

Это и постулируется в определении МТ. МТ задается набором состояний (с выделенными терминальными), алфавитом и набором правил перехода. А какая там будет лента - никто не в курсе.

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

emulek
()
Ответ на: комментарий от anonymous

Естественно, сам конечный вычислитель не сможет решить проблему останова для самого себя

О чем и речь.

а у нас такой задачи и не стоит. За то, для любого _реального_ (конечного) вычислителя можно решить задачу останова другим вычислителем. И этот другой тоже будет _конечным_.

emulek
()
Ответ на: комментарий от anonymous

Именно так. Но конечных алгоритмов - бесконечное число. Что тут непонятного? Это тривиально доказывается.

конечных чисел — тоже бесконечное число. Но если есть конечное натуральное число М, то можно строго доказать, что множество всех целых чисел не больше М конечно, и в нём ровно М натуральных чисел. Для любого М, кроме бесконечного (потому бесконечность — не является натуральным числом).

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

Ну а ты всё время путаешь «любое» и «бесконечное».

emulek
()
Ответ на: комментарий от emulek

вот как раз длинна ленты для МТ и не постулируется.

Именно это я и сказал.

А для реальных — постулируется.

И для реальных не постулируется. Именно по-этому она не постулируется для МТ - чтобы они соответствовали реальности.

anonymous
()
Ответ на: комментарий от emulek

За то, для любого _реального_ (конечного) вычислителя можно решить задачу останова другим вычислителем. И этот другой тоже будет _конечным_.

Задачу останова вообще нельзя решить для вычислителя. Потому что эта задача для вычислителя не ставится. Она ставится для МТ. А МТ - это не вычислитель, это _программа_. Видимо, в этом твоем непонимании и содержалась вся проблема?

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

anonymous
()
Ответ на: комментарий от emulek

конечных чисел — тоже бесконечное число.

Так с чем ты споришь тогда?

Ну а ты всё время путаешь «любое» и «бесконечное».

Нет, не путаю.

anonymous
()
Ответ на: комментарий от anonymous

И для реальных не постулируется.

вот для реальных — постулируется.

Но может ты просто говнокодер. Например жабер. И твой код и работает соответственно, как этот ЛОР. То радует юзеров сообщением «место на HDD кончилось», то «место в памяти», то «что-то там с СУБД», а то просто невообразимо тупит. (:

Именно по-этому она не постулируется для МТ - чтобы они соответствовали реальности.

ВНЕЗАПНО: IRL у каждого вычислителя имеется вполне конкретный запас ячеек. Ион тщательно запостулирован в спеках этого вычислителя. А у тебя наверное какая-то другая «реальность»...

emulek
()
Ответ на: комментарий от anonymous

Задачу останова вообще нельзя решить для вычислителя.

бред. Можно.

Она ставится для МТ. А МТ - это не вычислитель, это _программа_. Видимо, в этом твоем непонимании и содержалась вся проблема?

МАШИНА Тьюринга — воображаемый вычислитель. Который выполняет воображаемую программу. Может это тебе стоит подучить азы?

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

я знаю, на чём будет выполняться моя программа. Да, есть Over9000 конкретных вариантов, но всё равно _знаю_.

На семеричном компьютере с Марса — моя программа работать не будет. А если будет, то не правильно.

emulek
()
Ответ на: комментарий от anonymous

Так с чем ты споришь тогда?

Ну а ты всё время путаешь «любое» и «бесконечное».

Нет, не путаю.

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

emulek
()
Ответ на: комментарий от emulek

вот для реальных — постулируется.

Нет, не постулируется.

ВНЕЗАПНО: IRL у каждого вычислителя имеется вполне конкретный запас ячеек.

При чем тут вычислитель? Еще раз, МТ - _программа_, а не _вычислитель_. Вот у меня есть программа на сишке, где у этой программы указано количество памяти вычислителя, на котором программу будут запускать?

anonymous
()
Ответ на: комментарий от emulek

МАШИНА Тьюринга — воображаемый вычислитель.

Да нет, это программа. Каждая конкретная машина Тьюринга - это программа. Лента - входные данные этой программы.

Сам формализм МТ был придуман лишь затем, чтобы изучить процесс выполнения программ (алгоритмов, то бишь) максимально абстрагировавшись от сущности вычислителя, на котором эта программа будет исполняться.

я знаю, на чём будет выполняться моя программа.

Откуда? Я вот взял и выполнил твою программу не на том компьютере, а на другом.

На семеричном компьютере с Марса — моя программа работать не будет.

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

anonymous
()
Ответ на: комментарий от emulek

нет, путаешь. Ты путаешь «любое заданное число» с «бесконечно большим числом».

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

anonymous
()
Ответ на: комментарий от anonymous

Нет, не постулируется.

ну ты-то может и не в курсе, сколько в твоём локалхосте памяти, не спорю.

МТ - _программа_, а не _вычислитель_

пруф можно?

Вот у меня есть программа на сишке, где у этой программы указано количество памяти

сишка это посто ЯП. Она подходит для многих компьютеров(почти для любых на сегодня). Там не то что размер всей памяти, там даже размер самих чисел не определён. Какой будет, на том и работаем.

emulek
()
Ответ на: комментарий от anonymous

Сам формализм МТ был придуман лишь затем, чтобы изучить процесс выполнения программ (алгоритмов, то бишь) максимально абстрагировавшись от сущности вычислителя, на котором эта программа будет исполняться.

вот потому-то придумали воображаемую идеальную *машину*.

Откуда? Я вот взял и выполнил твою программу не на том компьютере, а на другом.

«других» IRL не бывает.

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

увы. Кроме формализмов в реальном мире существует ещё и множество неявных умолчаний. Вроде того, что я тут высказался: «short всегда не длиннее 4х байтов». Откуда я это вывел? Просто знаю, и всё. А в марсианском может и 5.

emulek
()
Ответ на: комментарий от anonymous

имеют ввиду «сколь угодно большое» - подразумевается неявный предельный переход

«переход» куда? Чем тебе плохо в «сколь угодно больших»? Зачем куда-то переходить?

в котором подпредельное выражение становится «сколь угодно большим»- это если формально строго

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

emulek
()
Ответ на: комментарий от anonymous

Ребят, вы о чём вообще спорите? А то я что-то уже потерял нить дискуссии.

Я так понял, emulek вещает прописную истину о том, что для любой заранее выбранной кастрированной машины Тьюринга A проблема останова алгоритмически разрешима на некоторой менее кастрированной машине Тьюринга B.

В то же время Анон пытается донести до него другую мысль, что машина Тьюринга не может «заранее выбрать» B до того, как будет «заранее выбрана» A, но emulek почему-то воспринимает это как отрицание утверждения из предыдущего абзаца.

ilammy ★★★
()
Ответ на: комментарий от emulek

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

А вот ограничение по размеру кода — существенно. Вообще говоря, если у нас есть код F, который получая на вход код A и input, может сказать, остановится ли код A на input за N тактов, и при этом сам работает меньше чем N-eps тактов, тогда необходимо, чтобы он сам не входил в класс алгоритмов, которые он может оценить (ну, плюс-минус).

kaathewise
()
Ответ на: комментарий от ilammy

В то же время Анон пытается донести до него другую мысль, что машина Тьюринга не может «заранее выбрать» B до того, как будет «заранее выбрана» A, но emulek почему-то воспринимает это как отрицание утверждения из предыдущего абзаца.

потому что нет смысла обсуждать то, чего нет. Бесконечность полезна тогда, когда в этом есть смысл. Ну скажем алгоритм с временем работы O(N*N) действительно работает в миллион раз дольше (по факту зависает), если данных не 1К, а 1М. Т.е. если для 1К работает секунду, то для 1М — 11.6 дней. Так оно и происходит IRL, хотя O работает и имеет смыл только для бесконечности. Но в данном случае, бесконечности нет.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.