Le proposte (P -> Q) -> Q
e P \/ Q
sono equivalenti.
C'è un modo per testimoniare questa equivalenza in 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 = ???
tale che
from . to = id
e to . from = id
?
g = const someHardcodedB
a
o b
. Ha senso.
to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))
avrebbe funzionato. (Questa è una valida prova classica dell'implicazione.)
((a -> b) -> b)
è isomorfa aa
: l'unica implementazione possibile èg f = f someHardcodedA
.