Welches ist der Curry-Howard-Korrespondent der doppelten Verneinung von a
; (a -> r) -> r
oder (a -> ⊥) -> ⊥
, oder beides?Ist Curry-Howard Korrespondent der doppelten Negation ((a-> r) -> r) oder ((a-> ∞) -> ⊥)?
Beide Typen können in Haskell wie folgt codiert werden, wobei ⊥
als forall b. b
codiert ist.
p1 :: forall r. ((a -> r) -> r)
p2 :: (a -> (forall b. b)) -> (forall b. b)
Papier von Wadler 2003 sowie implementation in Haskell scheinen die ersteren zu verabschieden, während einige andere Literatur (z this) diese zu unterstützen scheint.
Mein derzeitiges Verständnis ist, dass letzteres korrekt ist. Ich habe Schwierigkeiten, den ehemaligen Stil zu verstehen, da Sie a
von forall r. ((a -> r) -> r)
mit reiner Berechnung einen Wert vom Typ erstellen:
> let p1 = ($42) :: forall r. (Int -> r) -> r
> p1 id
42
, die mit intuitionismus zu widersprechen scheinen, dass Sie nicht a
von ¬¬a
ableiten können.
Also, meine Frage ist: können p1
und p2
beide als Curry-Howard Korrespondent von ¬¬a
betrachtet werden? Wenn ja, wie interagiert die Tatsache, dass wir p1 id :: a
konstruieren können, mit der intuitionistischen Logik?
Ich habe mit klarer Codierung der Umwandlung in/aus doppelter Negation, zur Erleichterung der Diskussion kommen. Danke an @ 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
⊥ ist kein Typ. Sie wollen 'Void' wie in http://en.wikibooks.org/wiki/Haskell/The_Curry%E2%80%93Howard_isomorphism#Negation. –
@ReinHenrichs, ich halte es nicht für unüblich, den leeren Typ call zu nennen. Es ist die "Unterseite" des Gitters der Typen. – dfeuer
@dfeuer Du hast natürlich Recht. Ich bin es nur gewohnt, es in einem Wertkontext zu sehen. –