thedeemon: (office)
[personal profile] thedeemon
В классической логике есть закон исключения третьего, гласящий, что для любого утверждения А справедливо 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), мы однако со всей уверенностью его активно не_отрицаем. Дословно: считаем, что было бы абсурдным считать его ложным. Так и живем.

Date: 2013-04-18 03:27 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Прикольный трюк. Определение M красивое, но я как-то упустил, а почему это тавтологическое _|_?

В топосах это известное дело, что в топологии двойного отрицания логика становится булевой.

Date: 2013-04-18 03:56 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Это не _|_, это функция в него - отрицание.

Date: 2013-04-18 04:02 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
А, хм, ну да; посмотрю ещё. Кажется, въехал.

Date: 2013-04-18 06:14 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Да, это действительно прямо на Хаскеле можно рассказывать:
> let m = \f -> f $ Right $ \a -> f (Left a)
> :t m
m :: (Either a (a -> t) -> t) -> t
Ну и тогда, для верности конкретизируем
> :set -XImpredicativeTypes
> type Bot = forall t. t
> let {m :: (Either a (a -> Bot) -> Bot) -> Bot; m = \f -> f $ Right $ \a -> f (Left a)}

Date: 2013-04-18 07:23 pm (UTC)
From: [identity profile] helvegr.livejournal.com
Есть ещё красивое доказательство через call/cc: http://www.cs.cmu.edu/~rwh/courses/logic/www-old/handouts/callcc.pdf

Date: 2013-04-18 08:11 pm (UTC)
From: [identity profile] -darkus-.livejournal.com
Вы, интуиционисты-конструктивисты, — ужасные люди :).

Date: 2013-04-21 05:32 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
M f = f $ Right $ f . Left

но как-то не ясно, как строить функцию f. Точнее, если её построить как const ⊥, то не ясно, зачем городить M f.
Edited Date: 2013-04-21 05:35 pm (UTC)

Date: 2013-04-21 06:19 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Популярная реализация функции в _|_ - незавершающееся вычисление.

Осмыслять этот код стоит с т.з. логики. В булевой логике любое утверждение либо истинно, либо ложно, его можно просто заменить одной из этих двух констант. В конструктивной логике жизнь разнообразней. Есть разница между true и irrefutable. Утверждение истинно, когда у меня есть его конструктивное доказательство в виде конкретного объекта, программы. Пока такое доказательство не получено, утверждение не истинно, но и не ложно, оно просто еще не решено. Ложно оно тогда, когда у меня опять же есть конкретная программа, которая из предполагаемого док-ва этого утверждения производит _|_, виснет. Ложные утверждения - это типы плохих, негодных, виснущих программ. Наконец, irrefutable оно, когда его отрицание ложно. Т.е. у нас нет конструктивного доказательства данного утверждения, мы не называем его истинным, но у нас есть конструктивное доказательство, что предположение о его ложности ведет к абсурду, т.е. его отрицание ложно. В посте как раз такое.

В принципе, есть определенная процедура, позволяющая конвертировать классические доказательства в конструктивные, но не один в один, а ценой замены для некоторых утверждений истинности на бесспорность (так по русски irrefutable?). Если конкретнее, в импликациях перед следствиями появляются двойные отрицания.

Date: 2013-04-21 09:15 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
Это замечательный пост. Я как раз в депендент тайпах повис где-то вокруг понимания A → ⊥, так что, для меня очень вовремя :)


Я бы irrefutable переводил как "неопровержимость"

Про замену классических конструктивными понятно, хотя и не прочувствовал.


"Наконец, irrefutable оно, когда его отрицание ложно."

здесь "оно" относится к "истинно" или "ложно"? Или в смысле, что не важно, вычислимо ли, главное, что отрицание ложно?

Date: 2013-04-22 03:33 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Неопровержимость хорошее слово, спасибо.

Утверждение А неопровержимо, когда у нас есть терм-доказательство --А, т.е. док-во ложности отрицания А. Док-ва самого А у нас может не быть. Если оно есть, т.е. А одновременно истинно и неопровержимо, такое утверждение называется stable. Далеко не все увтерждения stable, например А | -A не stable. Зато все отрицательные утверждения stable: ---P == -P, ----P == --P.

Возвращаясь к посту: если бы у нас было доказательство forall A. A | -A, то это получилась бы программа, которая для любого А за конечное число шагов определяет, останавливается вычисление А или виснет (-А), выдавая из ничего конструктивное док-во или А, или -А. Т.е. это было бы решением halting problem, и даже круче - кроме ответа да или нет еще и обоснование давалось бы.
Edited Date: 2013-04-22 03:42 am (UTC)

Date: 2013-04-22 07:00 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
да, почему forall A. A | -A не годится, мне как раз понятно, но это же просто мотивация, от неё нужен ещё огромный шаг :)

Тут нужно сообразить, как теория типов изгоняет дух Де Моргана.

И что умного именно в том, что (Either A (A → ⊥)) → ⊥. Ок, A → ⊥ означает, что мы для любого типа можем построить функцию, которая виснет.

Отсюда получается, что (A → ⊥) → ⊥ было бы доказательством населённости типа A (A неопровержимо истинно), но это только если мы строим функцию, пользуясь только переданной A → ⊥, т.е. можем построить одно значение A, которое вбросим в функцию, а не строим новую виснущую функцию для этого типа (мы же можем построить такую функцию для любого типа). Вот тут вот одна заковыка - почему мы обязаны пользоваться переданной функцией.

Хм, или откуда получается, что мы не можем построить виснущую функцию для ненаселённого типа: ⊥ → ⊥
Edited Date: 2013-04-22 08:18 am (UTC)

Date: 2013-04-22 08:35 am (UTC)
From: [identity profile] thedeemon.livejournal.com
>Ок, A → ⊥ означает, что мы для любого типа можем построить функцию, которая виснет.

В общем случае не можем. Не из чего. А если бы могли, это бы сделало любые утверждения ложными.

>Отсюда получается, что (A → ⊥) → ⊥ было бы доказательством населённости типа A (A неопровержимо истинно)

Нет, и этот момент ключевой. Основное отличие от булевой логики в том, что --Р не означает Р. Неопровержимость не означает истинность. Если мы как-то получили доказательство --А, это еще не доказательство А, у нас по-прежнему нет док-ва населенности А.

>Вот тут вот одна заковыка - почему мы обязаны пользоваться переданной функцией.

Потому что больше у нас на руках ничего нет. У нас конструктор, и все детали, из которых мы что-то конструируем, мы должны задекларировать. Если мы для получения результата используем какую-то третью функцию-лемму, она должна быть пререквизитом: ее тип должен быть среди посылок (аргументов), наша функция-теорема должна получать на вход док-во используемой леммы.

Date: 2013-04-22 08:46 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
"В общем случае не можем. Не из чего."

хм. f x = f x не годится?


"А если бы могли, это бы сделало любые утверждения ложными."

А вот здесь по-подробнее. В классической логике мы можем подставить отрицание чего-нибудь. Чем тогда A → ⊥ не отрицание? Не "A - ложно", а часть выражения "если A ложно, ..." В частности, A неопровержимо, если всё, что может следовать из "если A ложно, ..." - это только абсурд.


"Потому что больше у нас на руках ничего нет."

Ну......а программы сначала тоже на руках ничего не имеют.

Date: 2013-04-22 09:02 am (UTC)
From: [identity profile] thedeemon.livejournal.com
> f x = f x не годится?

Это необузданная рекурсия, порождение сотоны. В нашей кошерной конструктивной логике и теории типов нет такой штуки. Благодаря чему возможно тотальное программирование, без таких вот засад. Мы можем гарантировать завершимость программ, если их типы кошерны, не ведут в ⊥.

>Чем тогда A → ⊥ не отрицание?

Это именно оно, это прямо-таки определение отрицания. Вот только инструменты в нашем конструкторе таковы, что фиг его зациклишь. Получить ⊥ можно только если его нам дали на вход или на входе есть функция, его производящая, и мы нашли, что ей скормить. Фактически, такие программы - как мысленные эксперименты, они говорят "вот если бы ты мне дал на вход такую штуку, то вот процедура, которая сделает из нее вот эту вот другую штуку". Но на практике добыть такой аргумент может быть неоткуда. В частности, функция ⊥ → ⊥ тривиальна, это id, но где взять конкретное значение типа ⊥, чтобы передать ей на вход? Построить мы эту функцию можем, это будет валидная конструкция, но вот запустить не сможем, нечего нам ей скормить.

Date: 2013-04-22 09:12 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
ага, i was about to say, что я видать заблуждаюсь в возможности f x = f x. Из чего-то оно должно выплывать.

ок, ⊥ → ⊥ населён, ибо есть id. Да, это означает, что не-абсурд - это истина.

Date: 2013-04-23 07:46 am (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
> Утверждение истинно, когда у меня есть его конструктивное доказательство в виде конкретного объекта, программы.

В виде чего угодно, главное, чтобы оно было конструктивным :)
А записывать его на русском языке, английском, языке классической логики + ZF, наивной теории множеств или каком-то языке программирования - дело вкуса конкретного математика, от этого совершенно ничего не изменится. Разница примерно та же, как писать ручкой или другой ручкой :)

Date: 2013-04-23 07:58 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Не, в виде чего угодно плохо, само доказательство должно быть конструкцией. Собранной по правилам нашего конструктора - всяких introduction/elimination правил и связанных с ними definitional equalities. Ибо оно должно быть годным аргументом для других функций, с ним должно быть можно проводить разные операции, вроде case-анализа и индукции, т.е. по сути, вычисления.

Date: 2013-04-23 08:36 am (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
> Не, в виде чего угодно плохо, само доказательство должно быть конструкцией. Собранной по правилам нашего конструктора - всяких introduction/elimination правил и связанных с ними definitional equalities.

Да кто же вам это сказал? :)

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

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

Что до A | -A - формально говоря, это утверждение вовсе нельзя сформулировать в рамках констурктивизма, т.к. тут не говорится ни о существовании объектов ни об их свойствах.
Edited Date: 2013-04-23 08:39 am (UTC)

Date: 2013-04-23 08:53 am (UTC)
From: [identity profile] thedeemon.livejournal.com
>Да кто же вам это сказал? :)

Один type-theorist у доски, семи пядей во лбу, из видео в соседнем посте. :)

Date: 2013-04-23 09:01 am (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
Ну так это его мнение, видите. Он считает, что ъ-конструктивное - только вот такое, но поскольку других критериев (кроме мнения математика), у нас нет, как я выше сказал, то такой подход ни чуть не хуже других. Хотите - используйте, вам нравится, а это в математике главное :)

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

Date: 2013-04-22 03:53 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
тут ещё интересный момент. В интуиционизме выбрасывают law of excluded middle, но ещё и добавляют law of contradiction: ¬A → (A → B). А это не что иное, как объявление ⊥ инициальным объектом:

∀ A B . (A → ⊥) → (A → B)

Т.е. когда A = ⊥, мы говорим о существовании стрелки из ⊥ во все объекты. Тогда если стрелок из других A в ⊥ нет, выходит, что ⊥ → (A → B), т.е. истинно (ибо есть стрелки из ⊥ во все объекты).

Date: 2013-04-22 04:48 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Да, это инициальный объект. В Идрисе это отражено функцией
FalseElim : _|_ -> a
Аналогичная есть в Агде. Из абсурда следует все что угодно.
Последнюю вашу фразу не понял, что именно истинно, и в чем основная мысль.

Date: 2013-04-22 05:15 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
да это я вслух радуюсь своим маленьким находкам :)

последнее "истинно" относилось к тому, что когда стрелки A → ⊥ нет, то получаем множество таким стрелок не населено, и выражение сводится к ⊥ → (A → B). Это множество населено, т.к. есть стрелки из ⊥ во что угодно из рассуждений о A = ⊥. Тут забавно также, что доказывается существование стрелки из любого типа в любой другой. А маленькая находка в том, как правила импликации тоже выходят сами собой (из абсурда следует что угодно).

Date: 2013-04-22 05:41 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Если у нас есть док-во f : ⊥ → (A → B), то чтобы получить стрелку из А в В нам придется откуда-то достать ⊥ как объект и передать его f, а с этим проблема - ⊥ не населен. Стрелку из любого типа в любой можно взять только, когда мы конкретно напортачили и нарушили консистентность всей нашей логики, произведя откуда-то ⊥.

Date: 2013-04-22 06:16 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
Я не вижу, в чём проблема.

FalseElim гласит, что есть стрелка из ⊥ в любой тип. Так что, существует и стрелка из ⊥ в (A → B).

Date: 2013-04-22 06:35 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Все правильно, эта стрелка существует. Я про (A → B), ее существование не доказано.

Date: 2013-04-22 08:13 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
да, в формальном виде понятно: не зависимо от того, населен или нет (A → B), стрелка в него существует. А как на голову надеть возможность выбрать какую-то (A → B) - вот это весело :) Видимо, как и с нулевыми стрелками в категориях, сам смысл стрелки охватить умом не получится - можно понять только в контексте композиции.

Date: 2013-04-23 05:02 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Мне мысленно стрелки представляются такими трубами, а типы - эдакими бочками. В бочке может что-то находится, тогда она населена. Тогда это что-то может по трубе перейти в другую бочку, трансформируясь по дороге, и другая бочка станет населена. Но некоторые бочки и трубы всегда остаются пустыми. Вот бочка ⊥ пустая, и по трубам из нее ничего не идет. :)

Date: 2013-04-23 06:55 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
О, это ещё не всё :)

Я ещё как-то пытался соединять объекты оптоволокном :) по одному кабелю на стрелку, и по одному волокну в кабеле на каждую точку объекта домена - так тогда можно суръекции от инъекций отличать; например, можно визуализировать, что за эквалайзер такой и как это вообще квадраты коммутируют. "Включил свет" - посмотрел, где и какие точки засветились, да ещё каким цветом. :)

В категорном смысле есть ещё один занятный факт: для стрелок zA: 0 → A zB: 0 → B и двух стрелок f, g: A → B верно следующее: f . zA = g . zA = zB Так вот, здесь аналогии с трубами и кабелями заканчиваются :)
Edited Date: 2013-04-23 07:09 am (UTC)

Date: 2013-04-23 07:39 am (UTC)
From: [identity profile] thedeemon.livejournal.com
C оптоволокном прикольно, да. :)
В ситуации с композицией, имхо, аналогия еще держится: закон композиции говорит, что если у нас два таких кабеля, один идет из 0 в А, второй из А в В, то должен быть и третий кабель из 0 в В. Нет никаких проблем в том, что для f и g этим третьим кабелем оказывается один и тот же zB: 0 → B.

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

Еще важная отдельная тема возникает, если начать спрашивать, что именно означает f1 = f2. Возникают разные виды equality, intensional vs. extensional теории, двумерные и бесконечномерные теории типов, а там и до гомотопий докатиться можно.

Date: 2013-04-25 09:32 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
хм, вообще-то не очень понятно, почему доказывается именно ¬¬(A | ¬A). Потому что на самом деле доказательство перефразирует A→¬¬A (т.е. если A доказуемо, то ¬¬A доказуемо):

N : A→((A→⊥)→⊥)
N = flip id


А теперь концептуальный такой вопрос.

Как можно в принципе написать функцию f : (Either A (A → ⊥)) → ⊥ ? Она же не может быть тотальной. То есть, будет ли доказательством (Either A (A → ⊥)) → ⊥ функция, которая матчит только Left или только Right?

Если да, то не очень ясно, каким боком это доказательство (нутро требует доказательство ∀ x:(Either A (A → ⊥)), а не ∃).

Если нет, то не ясно, как можно вообще написать функцию, которая делает и (Left x) → ⊥, и (Right f) → ⊥

Date: 2013-04-25 09:50 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
ооо..... а есть даже ещё более интересный вывод.

Мы привыкли к | как дизъюнкции, не отрицающей возможность, что обе стороны являются истиной. Так вот, именно в случае (A | ¬A) связка | имеет более сильное значение - здесь "или" исключающее. И, между прочим, интуиционистское доказательство доказывает эту более сильную форму "или".

То есть, если бы "или" было в слабом смысле, то можно было бы написать тотальную функцию f:(Either A (A→⊥))→⊥.

Высказывание ((Either A (A→⊥))→⊥)→⊥ можно перефразировать, что если бы функция f существовала, то мы бы могли опровергнуть её существование - с помощью её же. Вот в чём смысл доказательства M f = f $ Right $ f . Left.

Date: 2013-04-25 11:25 am (UTC)
From: [identity profile] thedeemon.livejournal.com
>если бы функция f существовала, то мы бы могли опровергнуть её существование - с помощью её же

Именно! А точнее, мы бы получили на руки тот заветный инициальный объект, обладание которым делает одновременно существующими Кришну, Зевса, ЛММ, черепах, на которых стоит мир, Деда Мороза, единорогов, Винни Пуха и все-все-все... Только от санитаров пришлось бы скрываться.

Date: 2013-04-25 11:17 am (UTC)
From: [identity profile] thedeemon.livejournal.com
>почему доказывается именно ¬¬(A | ¬A)

Потому что таков тип у той функции. Или вопрос "зачем"? Чтобы сравниться с классической логикой.

>Как можно в принципе написать функцию f : (Either A (A → ⊥)) → ⊥ ?

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

В принципе, в Идрисе для таких вещей есть слово impossible, которое ставят в недостижимых ветвях паттерн-матчинга. Например, там есть такой вот тип для decidable equality:
data Dec : Type -> Type where
    Yes : {A : Type} -> A          -> Dec A
    No  : {A : Type} -> (A -> _|_) -> Dec A

и пишут так, например:
total trueNotFalse : True = False -> _|_
trueNotFalse refl impossible

instance DecEq Bool where
  decEq True  True  = Yes refl
  decEq False False = Yes refl
  decEq True  False = No trueNotFalse
  decEq False True  = No (negEqSym trueNotFalse)


Здесь trueNotFalse - функция из кое-чего в ⊥. Если бы у нас нашелся для нее подходящий аргумент, она вернула бы ⊥, но система типов нам гарантирует, что такой аргумент не найдется, поэтому ее единственный clause никогда не будет задействован, что и помечается ключевым словом impossible.

Date: 2013-04-25 01:39 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
"Потому что таков тип у той функции."

неее, плохая причина. Здесь был невидимый контекст. :) я начал писать тот ответ с "дык, сейчас я докажу просто с помощью X→¬¬X", потому что показалось, что дело в том, что нужно доказать это высказывание для X=(A | ¬A). В результате обнаружилась проблема с функцией f. А потом дошло, в чём разница и тонкость с дизъюнкцией в именно этом выражении.

NA является доказательством того, что нельзя одновременно иметь доказательство A и ¬A. (одновременно населить типы A и A→⊥)

А MA является доказательством того, что нельзя одновременно опровергнуть A и ¬A. (одновременно населить типы A→⊥ и (A→⊥)→⊥ - результат доказательства такой же, как и у N, т.е. MA=NA→⊥; разница в предпосылке)

Таким образом мы определяем исключающее "или". Вот это, по-моему, причина, почему нам нужно доказать и A→¬¬A, и (A | ¬A)→¬¬(A | ¬A) :)
Edited Date: 2013-04-25 01:48 pm (UTC)

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

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

Date: 2013-04-25 05:41 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
"дык, сейчас я докажу просто с помощью 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)

Date: 2013-04-26 02:18 pm (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
> Как было доказано выше, если бы мы могли ее написать, это привело бы к абсурду, неконсистентности всей нашей логики

Почему, собственно?

Date: 2013-04-26 09:53 pm (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
Я имею ввиду, что чисто логически, если у нас (A | -A) - это ни к каким ужасным вещам не приводит, ну становится логика классической, да, но существования Зевса с Кришной отсюда не получается, да и расходиться это тоже далеко не причина. Тут дело именно в патологии модели (утверждения - типы, выводимость - населенность), или с моделью тоже все хорошо, а под Кришной и абсурдом подразумевается именно тот факт что логика стала классической? Или под абсурдом подразумевается выраженное в модели несоответствие логики интуитивным принципам рассуждений?
Edited Date: 2013-04-26 09:54 pm (UTC)

Date: 2013-04-27 02:46 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Стоп-стоп-стоп. Речь же не об А | -A, речь про
f : (Either A (A → ⊥)) → ⊥

Отрицание А | -A приводит к абсурду, а не утверждение.

Date: 2013-04-27 04:34 am (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
А, ясно, я просто не понял о чем речь. Спасибо большое :)

Date: 2013-04-28 09:28 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
А вот в классической логике нужно как-то уточнить, что "или" здесь исключающее.

В интуиционизме ничего странного тоже не заявляется. Всего лишь, мы можем доказать ненаселённость опровержения (A | -A) не зависимо от доказательства A и доказательства -A. Это на мой взгляд очень сильное утверждение.

И ещё замечательное свойство интуиционисткого построения доказательства - Either A B всегда "исключающее" - в том смысле, что каждое значение этого типа может содержать только одно из A и B, хотя не отрицается населённость обоих. Поэтому нужно доказать также -(A & -A), то есть, что A и -A не могут быть населены одновременно. Выходит, что -(A & -A) можно доказать с помощью пары -(-A → A) и -(A → -A), а это есть ничто иное как первый и второй закон классики: -A → -A и A → --A.

Таким образом, на пальцах понятно, что Either A (A→⊥) населён, но для consistency мы считаем это недоказанным, пока не будет построено доказательство - т.е. предоставлены конкретные стрелки Left и Right; одна из них будет ⊥→⊥, но чтобы выяснить, какая, нужно доказательство населённости второго.
Edited Date: 2013-04-28 09:33 am (UTC)

Date: 2013-04-28 01:13 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
> -(A & -A)

Тут совсем просто:
f : (a, a -> ⊥) -> ⊥
f (a, na) = na a

Date: 2013-04-28 09:04 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
:) конечно

я хотел перевести разговор на вторые два закона.

Date: 2013-05-14 09:44 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
"impossible"

а как тогда пишется в идрисе FalseElim?

FalseElim : ⊥ → A
FalseElim impossible

что ли?

Date: 2013-05-14 10:20 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Заглянул в стдандартную библиотеку, там только тип указан, а тела функции нет совсем.

Profile

thedeemon: (Default)
Dmitry Popov

May 2025

S M T W T F S
    123
45678910
11 121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 17th, 2025 11:19 pm
Powered by Dreamwidth Studios