парадокс расселла в применении к программам
Назовем программу проницательной, если в процессе своей работы она печатает в точности свой исходный код. При этом она необязательно останавливается когда-либо, и может печатать еще много всего. Очевидно, набор всех непроницательных программ - вполне определенный объект, в его существовании нет никакого парадокса. Может ли существовать программа, которая - не останавливаясь - печатает исходные коды всех непроницательных программ, и больше ничего?
Она не может напечатать свой код, потому что тогда она одновременно приноцательная по определению, и непроницательная, потому что она печатает только непроницательные программы.
Она не может не напечатать свой код, потому что если она его вообще никогда не напечатает, то она непроницательная по определению, а значит, когда-то должна дойти до своего кода и напечатать.
Поэтому такой программы не существует.
Кажется, это доказательство немного проще, чем стандартное доказательство проблемы остановки. Меж тем оно тоже доказывает невозможность алгоритмического решения определенной задачи. Правда, понятие "решения задачи" в этом случае не столь удобное, как в проблеме остановки.
(по мотивам главы о самореференции в Metamagical Themas Хофштадтера)
(интересно сравнить с парадоксом Расселла в теории множеств, а также известной его формулировкой о брадобрее, который решил брить всех в городе, кто не бреет самого себя, и выходит парадокс, если задуматься, бреет ли он себя сам. В парадоксе Расселла сам рассматриваемый объект "множество всех множеств, которые не являются собственными элементами" существовать не может - его существование и приводит к парадоксу. В вопросе о программах выше в существовании множества всех программ, которые не печатают свой код, нет никакого парадокса и оно вполне себе существует. Но оказывается, что распечатать его невозможно, т.е. когда мы хотим им "воспользоваться", нам не дают. Так же и с брадобреем: множество всех жителей, которые не бреют самих себя, вполне себе существует. Но если мы попробуем к нему подойти и "воспользоваться", т.е. брадобрей хочет брить именно его - это не получается)
Она не может напечатать свой код, потому что тогда она одновременно приноцательная по определению, и непроницательная, потому что она печатает только непроницательные программы.
Она не может не напечатать свой код, потому что если она его вообще никогда не напечатает, то она непроницательная по определению, а значит, когда-то должна дойти до своего кода и напечатать.
Поэтому такой программы не существует.
Кажется, это доказательство немного проще, чем стандартное доказательство проблемы остановки. Меж тем оно тоже доказывает невозможность алгоритмического решения определенной задачи. Правда, понятие "решения задачи" в этом случае не столь удобное, как в проблеме остановки.
(по мотивам главы о самореференции в Metamagical Themas Хофштадтера)
(интересно сравнить с парадоксом Расселла в теории множеств, а также известной его формулировкой о брадобрее, который решил брить всех в городе, кто не бреет самого себя, и выходит парадокс, если задуматься, бреет ли он себя сам. В парадоксе Расселла сам рассматриваемый объект "множество всех множеств, которые не являются собственными элементами" существовать не может - его существование и приводит к парадоксу. В вопросе о программах выше в существовании множества всех программ, которые не печатают свой код, нет никакого парадокса и оно вполне себе существует. Но оказывается, что распечатать его невозможно, т.е. когда мы хотим им "воспользоваться", нам не дают. Так же и с брадобреем: множество всех жителей, которые не бреют самих себя, вполне себе существует. Но если мы попробуем к нему подойти и "воспользоваться", т.е. брадобрей хочет брить именно его - это не получается)
no subject
(Anonymous) 2009-08-09 11:51 am (UTC)(link)Единственная же программа нулевой длины будет печатать код всех непроницательных программ, т.е. ничего.
Сказать же, напечатала ли она свой собственный код или нет, с определенностью нельзя, а потому считать ее непроницательной неверно.
no subject
X
код программы
X
код программы
...
и так далее до бесконечности (в случае тривиальных моделей, когда непроницательных программ конечное число, можно уговориться еще один Χ в конце поставить). Это сразу снимает выдвинутое вами возражение.
no subject
С тем же успехом можно сказать, что брадобрея не существует.
no subject
no subject
no subject
no subject
no subject
Как только он этот вопрос решит, он станет человеком, который принял два взаимоисключающих решения.
Такие случаи бывают (я лично много раз бывал в похожем положении).
То есть такой человек наверняка существует.
А еще у такого человека всегда существует опасность нарушить одно из своих решений (или оба).
no subject
Аналогично с программой: если она непроницательная, она не должна печатать себя, но тогда она должна печатать себя, потому что предназначена для печатания всех непроницательных. Такая программа не может существовать.
no subject
Вот, тот же брадобрей. Вместо "брадобрей НЕ СМОЖЕТ" нам говорят "брадобрей НЕ СУЩЕСТВУЕТ". Но это же глупость! Значит, подобная тонкость должна быть и в теории множеств, только её упускают...
no subject
Но мухлежа нет, математика такого не любит.
no subject
Хм
Доказательство доказывает, что эту задачу в принципе нельзя решить. То есть даже если мы будем рассматривать не обычные вычислительные устройства, а допускающие какие-нибудь неалгоритмичные действия, всё равно такой программы существовать не будет.
То есть чисто логический парадокс, алгоритмы тут ни при чём. Проблема остановки тесно связана с понятием алгоритма.
Re: Хм
(Anonymous) 2009-08-09 04:52 pm (UTC)(link)все без исключения необычные вычислительные устройства рассматривать неинтересно. потому что вычислительное устройство, в котором ответ на вопрос «проницательна ли данная программа» дается встроенной командой, ничем не лучше, чем вычислительное устройство, в котором ответ на вопрос «останавливается ли данная программа» дается встроенной командой. если же считать, что такими мощными командами пользоваться нельзя, сразу возникает вопрос — а какими можно?
Re: Хм
- множество непроницательных программ вполне себе существует
точно так же, как класс всех множеств. А программа, которая печатает тексты всех непроницательных программ, не существует по тем же причинам, по каким класс всех множеств сам не является множеством.
- если же считать, что такими мощными командами пользоваться нельзя, сразу возникает вопрос — а какими можно?
Тут вообще неважно, какими командами мы пользуемся. Вместо вычислительного устройства можно рассмотреть произвольную функцию, отображающую некоторое множество слов (множество "программ") в множество бесконечных строк символов. Скажем, что "программа" проницательна, если её текст входит в строку, в которую она отображается. Далее можно повторить все рассуждения из исходного поста, ничего не изменится.
Понятие алгоритма тут никак не используется.
Re: Хм
Спасибо! Эта мысль у меня крутилась где-то на границе сознания вчера весь вечер, но я так и не смог её внятно сформулировать :-)
Re: Хм
(Anonymous) 2009-08-10 07:44 am (UTC)(link)Впрочем, я был не совсем прав
Пожалуй, недостаток этого рассуждения в том, что проблема остановки даёт пример перечислимого множества, которое не является вычислимым. Здесь же рассматривается более сложное множество. Но зато доказательство более простое, да.
Точнее, совсем не прав
Множество всех проницательных программ вычислимо перечислимо: мы можем запустить все программы одновременно, и если какая-то их них выдаст свой код, напечатать её. Так мы перечислим все проницательные программы.
То есть это тоже пример вычислимо перечислимого и не вычислимого множества.
Re: Точнее, совсем не прав
Множество всех НЕ-проницательных программ неперечислимо, и аргумент в записи, собственно, это доказывает.
Множество всех проницательных программ перечислимо (напр. используя ваш аргумент, который можно сделать строгим), и из предыдущего абзаца сразу следует, что не вычислимо.
Так что в итоге, вы правы, мы получаем пример невычислимого, перечислимого множества, как и в проблеме остановки. Но я вижу это как в первую очередь док-во неперечислимости непроницательных программ - суть док-ва именно в этом.
no subject
no subject
no subject
no subject
(Anonymous) 2009-08-09 01:44 pm (UTC)(link)no subject
забавная аналогия
no subject
*Тут я два раза пытался написать про то, останется ли утверждение верным при замене "набор" -> "множество", но оба раза мне самому не нравилось и я стёр. Не знаю как это осознать. Неочевидно мне существует ли такое множество всех непроницательных программ.*
no subject
С существованием множества нет никаких проблем, так же, как с существованием множества всех неостанавливающихся программ, например. И свойство "строка x кодирует программу, к-я останавливается", и свойство "строка x кодирует программу, к-я во время своей работы ни разу не печатает x" легко можно формализовать в виде соответствующих формул. Если строго к этому подходить, надо выбрать формализм (напр. машины Тьюринга), определить, что такое "печатать в процессе работы" (т.к. машина Тьюринга может стирать уже написанное на ленте, так что может лучше и не ее выбрать в качестве формализма), и так далее. Но все это здесь действительно тривиально.
no subject
no subject
no subject
взять множество всех программ пока множество не пусто { взять любую программу из множества если программа непроницательная и не совпадает с данной программой { распечатать } удалить программу из множества } распечатать себяТак как множество всех программ бесконечно, то все условия выполнены:
1) программа в точности делает то, что нужно - распечатывает тексты всех непроницательных программ,
2) при этом сама программа явно проницательна, так как готова распечатать себя как только кончатся все непроницательные,
3) но она этого никогда не сделает, а значит она одновременно непроницательна (поэтому в неё и добавлен код для распечатки самой себя, непроницательной :)
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
некая особа предъявляла безо всякого повода справку о том, что она не сумасшедшая.