Как кодировать аксиому выбора в Haskell/ Функциональное программирование?
> {-# LANGUAGE RankNTypes #-}
Мне было интересно, есть ли способ представить аксиому выбора в Haskell и / или некотором другом функциональном языке программирования.
Как мы знаем, false представлен типом без значений (Void
в хаскеле).
> 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
Теперь вопрос в том, как мы можем создать тип, который представляет аксиому выбора. Аксиома выбора говорит о множествах множеств. Это подразумевает, что нам понадобятся типы типов или что-то в этом роде. Есть ли что-то эквивалентное аксиоме выбора, которую можно закодировать? (Если вы можете закодировать отрицание, просто объедините его с законом исключенного среднего). Может быть, обман позволил бы нам иметь типы типов.
Примечание: в идеале, это должна быть версия аксиомы выбора, которая работает с теоремой Дьяконеску.
1 ответ
Это всего лишь подсказка.
Аксиома выбора может быть выражена как:
Если для каждого
x : A
естьy : B
такой, что собственностьP x y
держит, то есть функция выбораf : A -> B
такой, что для всехx : A
у нас естьP x (f x)
,
Точнее
choice : {A B : Set} (P : A -> B -> Set) ->
((x : A) -> Σ B (λ y -> P x y)) ->
Σ (A -> B) (λ f -> (x : A) -> P x (f x))
choice P h = ?
дано
data Σ (A : Set) (P : A -> Set) : Set where
_,_ : (x : A) -> P x -> Σ A P
Выше, choice
действительно доказуемо. В самом деле, h
назначает каждому x
(зависимая) пара, чей первый компонент y
является элементом A
а второй компонент является доказательством того, что первый действительно удовлетворяет P x y
, Вместо этого f
в дипломной работе необходимо присвоить x
только y
без каких-либо доказательств.
Как видите, получение функции выбора f
от h
это просто вопрос отбрасывания компонента доказательства в паре.
Нет необходимости расширять Agda с помощью LEM или любой другой аксиомы, чтобы доказать это. Приведенное выше доказательство является полностью конструктивным.
Если мы использовали Coq, обратите внимание, что Coq запрещает удалять доказательства (такие как h : ... -> Prop
) построить не доказательство (f
), так что перевести это на Coq напрямую не получается. (Это необходимо для извлечения программы.) Однако, если мы избегаем Prop
своего рода Coq и использовать Type
напрямую, то вышеперечисленное можно перевести.
Вы можете использовать следующие прогнозы для этого упражнения:
pr1 : ∀ {A : Set} {P} -> Σ A P -> A
pr1 (x , _) = x
pr2 : ∀ {A : Set} {P} -> (p : Σ A P) -> P (pr1 p)
pr2 (_ , y) = y