Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2010-06-14 19:24:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
За самоприменимость
Народ тут не верит в самоприменимые функции, боится парадокса Рассела и цитирует Витгенштейна:

3.333. Функция не может быть своим собственным аргументом, потому что функциональный знак уже содержит первообраз своего аргумента, а он не может содержать самого себя. Предположим, например, что функция F(fx) могла бы быть своим собственным аргументом; тогда должно иметься предложение: F(F(fx)), и в нем внешняя функция F и внутренняя функция F должны иметь различные значения, потому что внутренняя функция имеет форму Ф (fх), а внешняя - пси (Ф (fх)). Общим у обеих функций является только буква F, которая сама по себе ничего не обозначает. Это сразу же станет ясно, если мы вместо F(F(u)) напишем: ($Ф) : Р(Ф и) • Фи=Fи". Этим самым устраняется парадокс Рассела.

Потому некоторый ликбез:

(тем, кто и так в курсе того, что такое Y-combinator, вряд ли будет интересно)

Итак - что такое рекурссия: это когда мы пишем что-то типа:

TYPE List = RECORD value: INTEGER; next: ^List END;


Или функция:

factorial = λ n. if n = 0 then 1 else n * factorial (n-1)


(обозначение λ x. ... обозначает функцию от x, правило вычисления которой расположено справа от точки
F = λ x. ... - тоже самое, что обычно пишется: F (x) = ... - символика, кстати, восходит как раз к Расселу)

То есть все, что надо - это уметь находить решение уравнения

a = F (a)


где F - формула вроде вышеприведенных, в которую определяемое значение входит параметром. То есть - находить фиксированную точку функции F - такое значение параметра, при котором (назовем его а) - см. выше. Назовем его Y (F)

F (Y (F)) = Y (F)


Тезис о его существовании выглядит несколько странно, но это чуть ниже. А пока пример:

fact0 = λ f  . λ n . if n = 0 then 1 else n * f (n-1)


Пока никакой рекурсии - правда. Теперь определим fact = Y fact0 и посмотрим, что будет, если попробовать посчитать fact (2):

fact (2) = Y fact0 2 = fact0 (Y fact0) 2 = 
      if 2 = 0 then 2 else 2 * Y fact0 (2-1) = 2 * Y fact0 1 =
      2 * if 1 = 0 then 1 else 1 * Y fact0 (1-1) = 2 * 1 * Y fact0 0 =  2 * 1 * fact0 (Y fact0 0)
      2 * 1 * if 0 = 0 then 1 else 0 * Y fact0 (0-1) = 2 * 1 * 1 = 2


Что и требовалось получить. Теперь собственно об обосновании оператора фиксированной точки, кой был обозначен Y: он, как ни странно, не только непротиворечив, но и имеет свойство с завидной назойливостью вылазить в любых околоалгоритмических формализмах. Первый раз он вылез в 30-е годы у Черча в λ-исчислении - формализме, придуманном им до некоторой степени по мотивам расселовской теории типов в предположении, что если в столь примитивном формализме удастся формлизовать значительную часть математики (арифметику, хотя бы) то уж точно никакой гадости не вылезет.

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

Но в один прекрасный момент обнаружилось, что там есть такая конструкция (а также еще много похожих):

 Y = λf.(λx.f (x x)) (λx.f (x x))


Про нее легко проверить, что для любого f имеет место Y f = f (Y f) (подробности см). И счастье окончилось.

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

Собственно самоприменимость точно также вылазит и из теоремы Геделя (из совсем неожиданного места и неожиданным образом). Так что пугаться ее не надо (хотя надо "обращаться с осторожностью") и вообще свойство естественное - так что видимо в начале XX века перепугались не того чего надо и не по делу. А Рассел научил Витгенштейна плохому.


(Добавить комментарий)


[info]akater
2010-06-14 21:23 (ссылка)
> factorial = λ n. if n = 0 then 1 else n * fact (n-1)

Что-то непонятно. Наверное, должно быть

fact = λ n. if n = 0 then 1 else n * fact (n-1)

или

factorial = λ n. if n = 0 then 1 else n * factorial (n-1),

чтобы рекурсия была?

(Ответить) (Ветвь дискуссии)


[info]kouzdra
2010-06-14 22:16 (ссылка)
Второе, конечно, ступил.

(Ответить) (Уровень выше)


[info]i.dluciv.name
2010-06-14 21:31 (ссылка)
[Error: Irreparable invalid markup ('') in entry.

Когда это будет исправлено, остаток моего вечера будет угроблен...

(Ответить) (Ветвь дискуссии)


[info]kouzdra
2010-06-14 21:47 (ссылка)
Смех в том, что именно этот пост почему-то не хочет редактироваться :)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]i.dluciv.name
2010-06-14 22:00 (ссылка)
За миллиард лет до конца света? Слабо небось новый запилить? =)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2010-06-14 22:15 (ссылка)
Я его отредактировал, ручками сформировав нужный URL, кнопочек как не было, так и нет.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]i.dluciv.name
2010-06-14 22:30 (ссылка)
Спасибо. Вот сына спать уложу - буду кайф ловить =).

(Ответить) (Уровень выше)


[info]i.dluciv.name
2010-06-14 22:07 (ссылка)
У меня такое было с моей хронической диссертацией (которая тогда была ещё острой, а не хронической).

Сидел, думал по формальной части (описание модели данных в терминах матлогики). Думал. И такое было впечатление, что почти придумал. Но тут раз, и само по себе пусковое реле в холодильнике прогорело. Это сразу понятно по звуку - гудит, но не запускается, отдыхает минуты две, потом опять. Ну я вынул, разобрал, почистил это хреново реле (он после этого работал ещё пару лет точно, потом не знаю, отдали). Модель из головы тем временем улетучилась...

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

После этого у меня появилось стойкое впечатление, что моя хроническая диссертация на фундаментальную тему. До этого не было =).

(Ответить) (Уровень выше)


[info]zogmeister
2010-06-15 00:12 (ссылка)
это понятно
а при чём там Гёдель?

(Ответить) (Ветвь дискуссии)


[info]kouzdra
2010-06-15 00:13 (ссылка)
Дык тоже самое примерно - долго и нудно строится утверждение, постулирующее собственную недоказуемость. Яйца несколько другие - но сходные.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]zogmeister
2010-06-15 00:46 (ссылка)
сходство имхо только в хитровыебанности высказывания, которое таки да. кстати у Гёделя-то похитрее будет, чисто технически (идея художественная но - сама по себе несложная, типа языковой шутки, а вот воплощение пиздец..) а игрек-комбинатор штука вроде простая.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2010-06-15 00:48 (ссылка)
Сходство пожалуй в том, что как ни гони автореферентность из системы - а она из самых неожиданных мест вылазит.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]zogmeister
2010-06-15 02:17 (ссылка)
чертовски философское высказывание, не понял его сермяжный смысл,
а так-то мы, люди ака гомосапиенс, вообще автореферентны, математикой занимаемся, наукой о своём собственном мозге.

(Ответить) (Уровень выше)


[info]polytheme
2010-06-15 19:36 (ссылка)
самоприменимы все черчевы числа и булевые константы.

(Ответить)