Мне очень нравится этот вопрос. Я не очень много знаю, но у меня есть несколько вещей (при помощи статьи Википедии , в которой есть несколько аккуратных таблиц и тому подобное):
Я думаю, что типы сумм / типы объединений ( например, data Either a b = Left a | Right b
) эквивалентны включительно дизъюнкции. И, хотя я не очень хорошо знаком с Карри-Говардом, я думаю, что это демонстрирует это. Рассмотрим следующую функцию:
andImpliesOr :: (a,b) -> Either a b
andImpliesOr (a,_) = Left a
Если я правильно понимаю вещи, тип говорит, что ( a ∧ b ) → ( a ★ b ) и определение говорит, что это правда, где ★ является либо включающим, либо исключительным, или, в зависимости от того, Either
представляет. У вас есть Either
, представляющий эксклюзив или, ⊕; однако ( a ∧ b ) ↛ ( a ⊕ b ). Например, ⊤ ∧ ⊤ ≡ ⊤, но ⊤ ⊕ ⊥ ≡ ⊥ и ⊤ ↛ ⊥. Другими словами, если оба a и b верны, то гипотеза верна, но вывод неверен, и поэтому это предположение должно быть ложным. Однако ясно, что ( a ∧ b ) → ( a ∨ b ), поскольку, если оба a и b - правда, тогда, по крайней мере, один - правда. Таким образом, если дискриминационные союзы являются какой-то формой дизъюнкции, они должны быть всеобъемлющим разнообразием. Я думаю, что это является доказательством, но не стесняйтесь разубеждать меня в этом понятии.
Точно так же ваши определения тавтологии и абсурда как функции тождества и не завершающих функций, соответственно, немного неправильны. Истинная формула представлена типом единицы , который является типом, который имеет только один элемент (data ⊤ = ⊤
; часто пишется ()
и / или Unit
в функциональных языках программирования). Это имеет смысл: поскольку этот тип гарантированно заселен, и поскольку существует только один возможный обитатель, это должно быть правдой. Функция тождества просто представляет особую тавтологию, которая a → a .
Ваш комментарий о не завершающих функциях, в зависимости от того, что именно вы имели в виду, более полезен. Curry-Howard работает в системе типов, но нетерминация там не кодируется. Согласно Wikipedia , проблема с прерыванием является проблемой, так как добавление этого приводит к несовместимой логике ( например , я могу определить wrong :: a -> b
с помощью wrong x = wrong x
и, таким образом, «доказать» что a → b для любых a и b ). Если это то, что вы имели в виду под «абсурдом», тогда вы совершенно правы. Если вместо этого вы имели в виду ложное утверждение, то вместо этого вам нужен любой необитаемый тип, например, , определенный как data ⊥
, то есть тип данных без какого-либо способа его создания. Это гарантирует, что у него вообще нет значений, и поэтому он должен быть необитаем, что эквивалентно false. Я думаю, что вы, вероятно, могли бы также использовать a -> b
, поскольку, если мы запрещаем не завершающие функции, то это также необитаемо, но я не уверен на 100%.
Википедия говорит, что аксиомы кодируются двумя различными способами, в зависимости от того, как вы интерпретируете Curry-Howard: либо в комбинаторах, либо в переменных. Я думаю, что представление комбинатора означает, что примитивные функции, которые нам даны, кодируют то, что мы можем сказать по умолчанию (подобно тому, как modus ponens является аксиомой, потому что приложение функции является примитивным). И я думаю , что представление переменных может фактически означать одно и то же - комбинаторы, в конце концов, являются просто глобальными переменными, которые являются конкретными функциями. Что касается примитивных типов: если я правильно об этом думаю, то я думаю, что примитивные типы - это сущности - примитивные объекты, о которых мы пытаемся доказать.
Согласно моей логике и семантике класс, фактв ( a ∧ b ) → c ≡ a → ( b → c ) (а также то, что b → ( a → c )) называется законом эквивалентности экспорта, по крайней мере, в доказательствах естественного вывода.В то время я не заметил, что это было просто карри - хотелось бы, потому что это круто!
Хотя у нас теперь есть способ представить включительно у нас нет способа представить эксклюзивное разнообразие.Мы должны быть в состоянии использовать определение исключительного дизъюнкции для его представления: a ⊕ b ≡ ( a ∨ b ) ∧ ¬( a ∧ b ).Я не знаю, как написать отрицание, но я знаю, что ¬ p ≡ p → ⊥, и импликация, и ложь просты.Таким образом, мы должны представлять исключительную дизъюнкцию следующим образом:
data ⊥
data Xor a b = Xor (Either a b) ((a,b) -> ⊥)
Это определяет ⊥
как пустой тип без значений, что соответствует ложности;Затем определяется Xor
, который содержит ( и ) Either
a или b ( или ) и функцию( значение ) от (a, b) ( и ) до нижнего типа ( false ). Однако я понятия не имею, что означает . ( Редактировать 1: Теперь я вижу, см. Следующий абзац!) Поскольку значений неттипа (a,b) -> ⊥
(есть?), я не могу понять, что это будет означать в программе.Кто-нибудь знает лучший способ подумать об этом или другом определении? ( Редактировать 1: Да, camccann .)
Редактировать1: Благодаря ответу Камкканна (точнее, комментариям, которые он оставил, чтобы помочь мне), я думаю, что я вижу, что здесь происходит.Чтобы создать значение типа Xor a b
, вам нужно предоставить две вещи.Во-первых, свидетельство существования элемента либо a
, либо b
в качестве первого аргумента;то есть Left a
или Right b
.И, во-вторых, доказательство того, что нет элементов обоих типов a
и b
- другими словами, доказательство того, что (a,b)
необитаемо - в качестве второго аргумента.Поскольку вы сможете написать функцию из (a,b) -> ⊥
, только если (a,b)
необитаем, что это значит?Это будет означать, что некоторая часть объекта типа (a,b)
не может быть построена;другими словами, что по крайней мере один, а возможно и оба из a
и b
также необитаемы!В этом случае, если мы думаем о сопоставлении с образцом, вы не могли бы сопоставить шаблон с таким кортежем: предположим, что b
необитаем, что бы мы написали, что могло бы соответствовать второй части этого кортежа?Таким образом, мы не можем сопоставить шаблон с ним, что может помочь вам понять, почему это делает его необитаемым.Теперь, единственный способ иметь функцию total, которая не принимает аргументов (как этот должен, так как (a,b)
необитаем), заключается в том, чтобы результат был тоже необитаемого типа - если мы думаем об этом из шаблона -с точки зрения соответствия, это означает, что, хотя у функции нет ни одного случая, нет возможности body , в котором она могла бы быть, и поэтому все в порядке.
Многое из этогоя думаю вслух / проверяю (надеюсь) вещи на лету, но я надеюсь, что это полезно.Я действительно рекомендую статью в Википедии ;Я не читал его в деталях, но его таблицы - действительно хорошее резюме, и оно очень подробное.