Quale è il corrispondente Curry-Howard della doppia negazione di a
; (a -> r) -> r
o (a -> ⊥) -> ⊥
o entrambi?Corrispondente Curry-Howard della doppia negazione ((a-> r) -> r) o ((a-> ⊥) -> ⊥)?
Entrambi i tipi possono essere codificati in Haskell come segue, dove ⊥
è codificato come forall b. b
.
p1 :: forall r. ((a -> r) -> r)
p2 :: (a -> (forall b. b)) -> (forall b. b)
carta da Wadler 2003 nonché implementation in Haskell sembrano adottare precedente, mentre alcuni altra letteratura (ad esempio this) sembra sostenere quest'ultimo.
La mia attuale comprensione è che quest'ultimo è corretto. Ho difficoltà a capire l'ex stile, dal momento che è possibile creare un valore di tipo a
da forall r. ((a -> r) -> r)
utilizzando calcolo puro:
> let p1 = ($42) :: forall r. (Int -> r) -> r
> p1 id
42
che sembra contraddire con la logica intuizionista che non si può derivare da a
¬¬a
.
Quindi, la mia domanda è: possibile p1
e p2
essere entrambi considerati corrispondenti Curry-Howard di ¬¬a
? In tal caso, in che modo il fatto che siamo in grado di costruire p1 id :: a
interagisce con la logica intuizionista?
Ho trovato una codifica più chiara della conversione da/a doppia negazione, per comodità di discussione. Grazie 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
⊥ non è un tipo. Vuoi 'Void' come in http://en.wikibooks.org/wiki/Haskell/The_Curry%E2%80%93Howard_isomorphism#Negation. –
@ReinHenrichs, non penso sia affatto insolito chiamare il tipo vuoto ⊥. È il "fondo" del reticolo dei tipi. – dfeuer
@dfeuer Ovviamente hai ragione. Sono abituato a vederlo in un contesto di valore. –