Назовем программу проницательной, если в процессе своей работы она печатает в точности свой исходный код. При этом она необязательно останавливается когда-либо, и может печатать еще много всего. Очевидно, набор всех непроницательных программ - вполне определенный объект, в его существовании нет никакого парадокса. Может ли существовать программа, которая - не останавливаясь - печатает исходные коды всех непроницательных программ, и больше ничего?
Она не может напечатать свой код, потому что тогда она одновременно приноцательная по определению, и непроницательная, потому что она печатает только непроницательные программы.
Она не может не напечатать свой код, потому что если она его вообще никогда не напечатает, то она непроницательная по определению, а значит, когда-то должна дойти до своего кода и напечатать.
Поэтому такой программы не существует.
Кажется, это доказательство немного проще, чем стандартное доказательство проблемы остановки. Меж тем оно тоже доказывает невозможность алгоритмического решения определенной задачи. Правда, понятие "решения задачи" в этом случае не столь удобное, как в проблеме остановки.
(по мотивам главы о самореференции в Metamagical Themas Хофштадтера)
(интересно сравнить с парадоксом Расселла в теории множеств, а также известной его формулировкой о брадобрее, который решил брить всех в городе, кто не бреет самого себя, и выходит парадокс, если задуматься, бреет ли он себя сам. В парадоксе Расселла сам рассматриваемый объект "множество всех множеств, которые не являются собственными элементами" существовать не может - его существование и приводит к парадоксу. В вопросе о программах выше в существовании множества всех программ, которые не печатают свой код, нет никакого парадокса и оно вполне себе существует. Но оказывается, что распечатать его невозможно, т.е. когда мы хотим им "воспользоваться", нам не дают. Так же и с брадобреем: множество всех жителей, которые не бреют самих себя, вполне себе существует. Но если мы попробуем к нему подойти и "воспользоваться", т.е. брадобрей хочет брить именно его - это не получается)
Она не может напечатать свой код, потому что тогда она одновременно приноцательная по определению, и непроницательная, потому что она печатает только непроницательные программы.
Она не может не напечатать свой код, потому что если она его вообще никогда не напечатает, то она непроницательная по определению, а значит, когда-то должна дойти до своего кода и напечатать.
Поэтому такой программы не существует.
Кажется, это доказательство немного проще, чем стандартное доказательство проблемы остановки. Меж тем оно тоже доказывает невозможность алгоритмического решения определенной задачи. Правда, понятие "решения задачи" в этом случае не столь удобное, как в проблеме остановки.
(по мотивам главы о самореференции в Metamagical Themas Хофштадтера)
(интересно сравнить с парадоксом Расселла в теории множеств, а также известной его формулировкой о брадобрее, который решил брить всех в городе, кто не бреет самого себя, и выходит парадокс, если задуматься, бреет ли он себя сам. В парадоксе Расселла сам рассматриваемый объект "множество всех множеств, которые не являются собственными элементами" существовать не может - его существование и приводит к парадоксу. В вопросе о программах выше в существовании множества всех программ, которые не печатают свой код, нет никакого парадокса и оно вполне себе существует. Но оказывается, что распечатать его невозможно, т.е. когда мы хотим им "воспользоваться", нам не дают. Так же и с брадобреем: множество всех жителей, которые не бреют самих себя, вполне себе существует. Но если мы попробуем к нему подойти и "воспользоваться", т.е. брадобрей хочет брить именно его - это не получается)
no subject
Date: 2009-08-09 11:51 am (UTC)Единственная же программа нулевой длины будет печатать код всех непроницательных программ, т.е. ничего.
Сказать же, напечатала ли она свой собственный код или нет, с определенностью нельзя, а потому считать ее непроницательной неверно.
no subject
Date: 2009-08-09 11:58 am (UTC)X
код программы
X
код программы
...
и так далее до бесконечности (в случае тривиальных моделей, когда непроницательных программ конечное число, можно уговориться еще один Χ в конце поставить). Это сразу снимает выдвинутое вами возражение.
no subject
Date: 2009-08-09 12:02 pm (UTC)С тем же успехом можно сказать, что брадобрея не существует.
no subject
Date: 2009-08-09 12:10 pm (UTC)no subject
Date: 2009-08-09 12:18 pm (UTC)no subject
Date: 2009-08-09 12:26 pm (UTC)no subject
Date: 2009-08-09 12:40 pm (UTC)no subject
Date: 2009-08-15 08:47 am (UTC)Как только он этот вопрос решит, он станет человеком, который принял два взаимоисключающих решения.
Такие случаи бывают (я лично много раз бывал в похожем положении).
То есть такой человек наверняка существует.
А еще у такого человека всегда существует опасность нарушить одно из своих решений (или оба).
no subject
Date: 2009-08-09 05:07 pm (UTC)Аналогично с программой: если она непроницательная, она не должна печатать себя, но тогда она должна печатать себя, потому что предназначена для печатания всех непроницательных. Такая программа не может существовать.
no subject
Date: 2009-08-09 05:23 pm (UTC)Вот, тот же брадобрей. Вместо "брадобрей НЕ СМОЖЕТ" нам говорят "брадобрей НЕ СУЩЕСТВУЕТ". Но это же глупость! Значит, подобная тонкость должна быть и в теории множеств, только её упускают...
no subject
Date: 2009-08-09 06:56 pm (UTC)Но мухлежа нет, математика такого не любит.
no subject
Date: 2009-08-09 06:58 pm (UTC)Хм
Date: 2009-08-09 12:03 pm (UTC)Доказательство доказывает, что эту задачу в принципе нельзя решить. То есть даже если мы будем рассматривать не обычные вычислительные устройства, а допускающие какие-нибудь неалгоритмичные действия, всё равно такой программы существовать не будет.
То есть чисто логический парадокс, алгоритмы тут ни при чём. Проблема остановки тесно связана с понятием алгоритма.
Re: Хм
Date: 2009-08-09 04:52 pm (UTC)все без исключения необычные вычислительные устройства рассматривать неинтересно. потому что вычислительное устройство, в котором ответ на вопрос «проницательна ли данная программа» дается встроенной командой, ничем не лучше, чем вычислительное устройство, в котором ответ на вопрос «останавливается ли данная программа» дается встроенной командой. если же считать, что такими мощными командами пользоваться нельзя, сразу возникает вопрос — а какими можно?
Re: Хм
Date: 2009-08-09 05:51 pm (UTC)- множество непроницательных программ вполне себе существует
точно так же, как класс всех множеств. А программа, которая печатает тексты всех непроницательных программ, не существует по тем же причинам, по каким класс всех множеств сам не является множеством.
- если же считать, что такими мощными командами пользоваться нельзя, сразу возникает вопрос — а какими можно?
Тут вообще неважно, какими командами мы пользуемся. Вместо вычислительного устройства можно рассмотреть произвольную функцию, отображающую некоторое множество слов (множество "программ") в множество бесконечных строк символов. Скажем, что "программа" проницательна, если её текст входит в строку, в которую она отображается. Далее можно повторить все рассуждения из исходного поста, ничего не изменится.
Понятие алгоритма тут никак не используется.
Re: Хм
Date: 2009-08-10 05:31 am (UTC)Спасибо! Эта мысль у меня крутилась где-то на границе сознания вчера весь вечер, но я так и не смог её внятно сформулировать :-)
Re: Хм
Date: 2009-08-10 07:44 am (UTC)Впрочем, я был не совсем прав
Date: 2009-08-09 08:11 pm (UTC)Пожалуй, недостаток этого рассуждения в том, что проблема остановки даёт пример перечислимого множества, которое не является вычислимым. Здесь же рассматривается более сложное множество. Но зато доказательство более простое, да.
Точнее, совсем не прав
Date: 2009-08-10 04:57 am (UTC)Множество всех проницательных программ вычислимо перечислимо: мы можем запустить все программы одновременно, и если какая-то их них выдаст свой код, напечатать её. Так мы перечислим все проницательные программы.
То есть это тоже пример вычислимо перечислимого и не вычислимого множества.
Re: Точнее, совсем не прав
Date: 2009-08-10 05:05 am (UTC)Множество всех НЕ-проницательных программ неперечислимо, и аргумент в записи, собственно, это доказывает.
Множество всех проницательных программ перечислимо (напр. используя ваш аргумент, который можно сделать строгим), и из предыдущего абзаца сразу следует, что не вычислимо.
Так что в итоге, вы правы, мы получаем пример невычислимого, перечислимого множества, как и в проблеме остановки. Но я вижу это как в первую очередь док-во неперечислимости непроницательных программ - суть док-ва именно в этом.
no subject
Date: 2009-08-09 12:21 pm (UTC)no subject
Date: 2009-08-09 12:25 pm (UTC)no subject
Date: 2009-08-09 04:39 pm (UTC)no subject
Date: 2009-08-09 01:44 pm (UTC)no subject
Date: 2009-08-10 01:23 pm (UTC)забавная аналогия
Date: 2009-08-09 01:51 pm (UTC)no subject
Date: 2009-08-09 05:42 pm (UTC)*Тут я два раза пытался написать про то, останется ли утверждение верным при замене "набор" -> "множество", но оба раза мне самому не нравилось и я стёр. Не знаю как это осознать. Неочевидно мне существует ли такое множество всех непроницательных программ.*
no subject
Date: 2009-08-09 05:49 pm (UTC)С существованием множества нет никаких проблем, так же, как с существованием множества всех неостанавливающихся программ, например. И свойство "строка x кодирует программу, к-я останавливается", и свойство "строка x кодирует программу, к-я во время своей работы ни разу не печатает x" легко можно формализовать в виде соответствующих формул. Если строго к этому подходить, надо выбрать формализм (напр. машины Тьюринга), определить, что такое "печатать в процессе работы" (т.к. машина Тьюринга может стирать уже написанное на ленте, так что может лучше и не ее выбрать в качестве формализма), и так далее. Но все это здесь действительно тривиально.
no subject
Date: 2009-08-09 08:15 pm (UTC)no subject
Date: 2009-08-09 08:19 pm (UTC)no subject
Date: 2009-08-10 02:50 am (UTC)взять множество всех программ пока множество не пусто { взять любую программу из множества если программа непроницательная и не совпадает с данной программой { распечатать } удалить программу из множества } распечатать себяТак как множество всех программ бесконечно, то все условия выполнены:
1) программа в точности делает то, что нужно - распечатывает тексты всех непроницательных программ,
2) при этом сама программа явно проницательна, так как готова распечатать себя как только кончатся все непроницательные,
3) но она этого никогда не сделает, а значит она одновременно непроницательна (поэтому в неё и добавлен код для распечатки самой себя, непроницательной :)
no subject
Date: 2009-08-10 05:06 am (UTC)no subject
Date: 2009-08-10 05:21 am (UTC)no subject
Date: 2009-08-10 05:26 am (UTC)no subject
Date: 2009-08-10 05:37 am (UTC)no subject
Date: 2009-08-10 05:24 pm (UTC)no subject
Date: 2009-08-10 05:50 pm (UTC)no subject
Date: 2009-08-10 08:40 pm (UTC)no subject
Date: 2009-08-26 04:30 pm (UTC)no subject
Date: 2009-08-11 12:35 am (UTC)некая особа предъявляла безо всякого повода справку о том, что она не сумасшедшая.