Предложения (P -> Q) -> Q
и P \/ Q
эквивалентны.
Есть ли способ засвидетельствовать эту эквивалентность в Haskell:
from :: Either a b -> ((a -> b) -> b)
from x = case x of
Left a -> \f -> f a
Right b -> \f -> b
to :: ((a -> b) -> b) -> Either a b
to = ???
такой, что
from . to = id
а to . from = id
?
((a -> b) -> b)
изоморфнаa
: единственно возможная реализацияg f = f someHardcodedA
.g = const someHardcodedB
a
илиb
. Имеет смысл.to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))
это сработало бы. (Это достоверное классическое доказательство подтекста.)Ответы:
Это верно в классической логике, но не в конструктивной логике.
В конструктивной логике у нас нет закона исключенной середины , то есть мы не можем начать думать с «либо P верно, либо P неверно».
Классически мы рассуждаем как:
x :: P
)), тогда вернемсяLeft x
.nx :: P -> Void
функцию. Тогдаabsurd . nx :: P -> Q
(мы можем достигнуть максимум любого типа, мы беремQ
) и будем называть даннымf :: (P -> Q) -> Q)
с ,absurd . nx
чтобы получить значение типаQ
.Проблема в том, что нет общей функции типа:
Для некоторых конкретных типов есть, например
Bool
, жилые, поэтому мы можем написатьно опять же мы вообще не можем.
источник
Нет, это невозможно. Рассмотрим особый случай, когда
Q = Void
.Either P Q
тоEither P Void
, что изоморфноP
.Следовательно, если бы у нас был функциональный термин
мы могли бы также иметь термин
Согласно соответствию Карри-Говарда, это было бы тавтологией в интуиционистской логике:
Но вышесказанное - это устранение двойного отрицания, которое, как известно, невозможно доказать в интуиционистской логике - отсюда и противоречие. (То, что мы могли доказать это в классической логике, не имеет значения.)
(Последнее замечание: это предполагает, что наша программа на Haskell завершается. Конечно, используя бесконечную рекурсию
undefined
и подобные способы фактически избежать возврата результата, мы можем использовать любой тип в Haskell.)источник
Нет, это невозможно, но это немного неуловимо. Проблема в том, что переменные типа
a
иb
являются универсально количественными.a
иb
повсеместно количественно. Вызывающая сторона выбирает, какой они тип, поэтому вы не можете просто создать значение любого типа. Это означает, что вы не можете просто создать значение типаEither a b
, игнорируя аргументf
. Но использованиеf
также невозможно. Не зная , какие типыa
иb
, Вы не можете создать значение типаa -> b
перейти наf
. Просто недостаточно информации, когда типы универсально определены количественно.Что касается того, почему изоморфизм не работает в Хаскеле - вы уверены, что эти предложения эквивалентны в конструктивной интуиционистской логике? Haskell не реализует классическую дедуктивную логику.
источник
Как уже отмечали другие, это невозможно, потому что у нас нет закона исключенной середины. Позвольте мне пройти через это немного более явно. Предположим, у нас есть
и мы установили
b ~ Void
. Тогда мы получимТеперь давайте докажем двойное отрицание закона исключенного среднего применительно к конкретному предложению .
А сейчас
lem
явно не может существовать, потому чтоa
может закодировать предположение, что любая конфигурация машины Тьюринга, которую я выберу, остановится.Давайте проверим, что
lem
достаточно:источник
Я понятия не имею, допустимо ли это с точки зрения логики или что это значит для вашей эквивалентности, но да, можно написать такую функцию на Хаскеле.
Для построения
Either a b
нам нужно либо значение,a
либоb
значение. У нас нет никакого способа построитьa
значение, но у нас есть функция, которая возвращает функцию,b
которую мы могли бы вызвать. Для этого нам нужно предоставить функцию, которая преобразует aa
в ab
, но, учитывая, что типы неизвестны, мы могли бы в лучшем случае создать функцию, которая возвращает константуb
. Чтобы получить этоb
значение, мы не можем построить его каким-либо иным способом, чем раньше, поэтому это становится круговым рассуждением - и мы можем решить это, просто создав точку фиксации :источник