> {-# LANGUAGE RankNTypes #-}
我想知道是否有一种方法可以在 haskell 和/或其他一些函数式编程语言中表示选择公理。
众所周知,false 由没有值的类型表示(Void
在 haskell 中)。
> import Data.Void
我们可以像这样表示否定
> type Not a = a -> Void
a
我们可以为这样的类型表达排中律
> type LEM a = Either a (a -> Void)
这意味着我们可以将建设性逻辑变成一个Reader
单子
> type Constructive a = (forall r. LEM r) -> a
例如,我们可以在其中进行双重否定消除
> doubleneg :: Constructive (((a -> Void) -> Void) -> a)
> doubleneg = \lem nna -> either id (absurd . nna) lem
我们也可以有一个排中定律失效的单子
> type AntiConstructive a = ((forall r. LEM r) -> Void) -> a
现在的问题是,我们如何制作一个代表选择公理的类型?选择公理是关于集合的集合。这意味着我们需要类型的类型或其他东西。是否有与可以编码的选择公理等效的东西?(如果您可以对否定进行编码,只需将其与排中律结合即可)。也许诡计会让我们拥有类型的类型。
注意:理想情况下,它应该是适用于Diaconescu 定理的选择公理的一个版本。