Который является корректором Карри-Говарда двойного отрицания a
; (a -> r) -> r
или (a -> ⊥) -> ⊥
, или оба?Является ли корреспондент Карри-Говарда двойного отрицания ((a-> r) -> r) или ((a-> ⊥) -> ⊥)?
Оба типа могут быть закодированы в Haskell следующим образом, где ⊥
кодируется как forall b. b
.
p1 :: forall r. ((a -> r) -> r)
p2 :: (a -> (forall b. b)) -> (forall b. b)
бумаги по Wadler 2003, а также implementation in Haskell, кажется, принять бывший, в то время как некоторые другой литературе (например, this), кажется, поддерживает последние.
Мое настоящее понимание заключается в том, что последнее верно. У меня есть трудности в понимании прежнего стиля, так как вы можете создать значение типа a
из forall r. ((a -> r) -> r)
с использованием чистого вычисления:
> let p1 = ($42) :: forall r. (Int -> r) -> r
> p1 id
42
, который, кажется, противоречит интуиционистской логике, что вы не можете вывести a
из ¬¬a
.
Итак, мой вопрос: может p1
и p2
оба будут рассматриваться как корреспондент Curry-Howard от ¬¬a
? Если да, то как можно построить тот факт, что мы можем построить p1 id :: a
с интуиционистской логикой?
У меня есть более четкое кодирование преобразования в/из двойного отрицания, для удобства обсуждения. Благодаря @ user2407038!
{-# LANGUAGE RankNTypes #-}
to_double_neg :: forall a. a -> (forall r. (a->r)->r)
to_double_neg x = ($x)
from_double_neg :: forall a. (forall r. (a->r)->r) -> a
from_double_neg x = x id
⊥ не тип. Вы хотите «Пустота», как в http://en.wikibooks.org/wiki/Haskell/The_Curry%E2%80%93Howard_isomorphism#Negation. –
@ReinHenrichs, я не думаю, что совсем не принято называть пустой тип ⊥. Это «дно» решетки типов. – dfeuer
@dfeuer Вы правы, конечно. Я просто привык видеть это в контексте ценности. –