> {-# 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
Теперь вопрос в том, как мы можем создать тип, представляющий аксиому выбора? Аксиома выбора говорит о множествах множеств. Это означает, что нам понадобятся типы типов или что-то в этом роде. Есть ли что-то эквивалент выбранной аксиоме, которое можно было бы закодировать? (Если вы можете закодировать отрицание, просто объедините его с законом исключенной середины). Может быть, хитрость позволит нам иметь типы типов.
Примечание. В идеале это должна быть версия выбранной аксиомы, которая работает с теоремой Дьяконеску. .