thedeemon: (office)
Dmitry Popov ([personal profile] thedeemon) wrote2013-04-18 09:19 pm
Entry tags:

not not (to be or not to be)

В классической логике есть закон исключения третьего, гласящий, что для любого утверждения А справедливо A | -A, т.е. либо оно верно, либо ложно. Однако это очень смелое утверждение, его можно трактовать так, что любое утверждение разрешимо (decidable), что тоже довольно нагло, и вообще герр Гёдель хмурится. Интуиционисткая логика высказываний и с ней конструктивная математика и прочая теория типов ведут себя скромнее, и такого смелого утверждения не делают. Но зато в них доказуемо вот такое:
--(A | -A)
Давайте его докажем, используя тот же Идрис, хотя ровно так же док-во записывается на Хаскеле. Отрицание определено как импликация в абсурд, т.е. отрицание утверждения А это функция, которая из доказательства А производит абсурд (_|_). Тогда наше утверждение записывается так:

((А | (A -> _|_) -> _|_) -> _|_

В теории типов в синтаксисе Идриса оно становится типом функции:

M : ((Either A (A -> _|_)) -> _|_) -> _|_

А конструктивным его доказательством служит тело этой функции. На выходе она должна произвести абсурд, а на входе у нее тоже функция, такого вот типа:

f : (Either A (A -> _|_)) -> _|_

Нам нужно, используя ее одну, произвести _|_. На вход она принимает либо А, либо -А. Взять значение типа А нам неоткуда, значит нужна функция типа A -> _|_. Как ее построить? Сделать лямбду, которая принимает значение А, и скармливает его f, а она уже произведет _|_. Имея такую функцию типа A -> _|_, ее можно опять же скормить f, и тогда получить _|_ "из ничего". Выглядит это так:
  M f = f (Right g) where
    g a = f (Left a)

Вот так, используя только переданную на вход f, скармливая ей использующую ее же функцию, можно произвести _|_ и так получить конструктивное доказательство --(A | -A). Что это значит? Что хоть мы в интуиционизме и конструктивизме и не утверждаем, что для всякого утверждения А верно (A | -A), мы однако со всей уверенностью его активно не_отрицаем. Дословно: считаем, что было бы абсурдным считать его ложным. Так и живем.

[identity profile] sassa-nf.livejournal.com 2013-04-25 03:16 pm (UTC)(link)
"В принципе, в Идрисе для таких вещей есть слово impossible"

интересно. Но в этом случае не подходит, потому что в построении M мы пользуемся f и с Left, и с Right - поэтому f и должна быть тотальна.

[identity profile] sassa-nf.livejournal.com 2013-04-25 05:41 pm (UTC)(link)
"дык, сейчас я докажу просто с помощью X→¬¬X"

вот теперь я таки готов так заявить :)

У A | B = Either A B всегда есть "разложение" на проекции, то есть, наоборот, стрелки из компонент в "сумму". В данном случае это Left: A → Either A B и Right: B → Either A B. Натурально, для всех f: (Either A B)→C есть пара стрелок g: A→C и h: B→C таких, что f=[g, h], и наоборот, для каждой пары g: A→C и h: B→C есть стрелка f такая, что g=f . Left, и h=f . Right.

Это всего лишь многословное заявление того простого факта, что f: (Either A (A→⊥))→⊥ всегда можно разложить на некоторые g:A→⊥ и h:(A→⊥)→⊥, и наоборот, её всегда можно собрать из g и h, если таковые даны.

Тогда при N=flip id доказывающем в частности A→¬¬A, получаем M f = N g h = N (f . Left) (f . Right)