如何在 Agda 中构造一个可能非空的集合

How to construct a possibly nonempty Set in Agda

我知道 (A \/ ~A) 一般无法证明。如何构建一个集合 A 的示例,其中 (A \/ ~A) 不可证明,这可能吗?如果可能的话,没有量词是否可能?

I know that (A / ~A) is not provable in general. How does one go about constructing an example of a set A where (A / ~A) is not provable,

你已经给出了一个例子:A \/ ~A本身。

open import Level
open import Data.Empty
open import Relation.Nullary
open import Data.Sum

lem-for : ∀ {α} -> Set α -> Set α
lem-for A = A ⊎ ¬ A

lem : ∀ {α} -> Set (suc α)
lem = ∀ {A} -> lem-for A

lem-lem : ∀ {α} -> Set (suc α)
lem-lem = lem-for lem

lem 表示 "for all A A is either true or false"。 lem-lem 说 "the law of excluded middle is either true or false"。但是我们知道建设性的 lem 不是真的,因为 Agda 不是 anti-classical,lem 也不是假的。

其他经典逻辑公理(取自 Software Foundations 书)是

Definition peirce := ∀P Q: Prop,
  ((P→Q)→P)→P.
Definition classic := ∀P:Prop,
  ~~P → P.
Definition de_morgan_not_and_not := ∀P Q:Prop,
  ~(~P ∧ ¬Q) → P∨Q.
Definition implies_to_or := ∀P Q:Prop,
  (P→Q) → (¬P∨Q).

这些+lem是等价的


这是一个更有趣的例子:

open import Relation.Binary.PropositionalEquality
open import Data.Bool.Base
open import Data.Fin

eq : Set₁
eq = Fin 2 ≡ Bool

"Extensional" 谓词属于同一类。最简单的是函数外延性,但我们也可以说

open import Coinduction
open import Data.Nat.Base
open import Data.Stream

zeros : Stream ℕ
zeros = 0 ∷ ♯ zeros

eq₂ : Set
eq₂ = zeros ≡ 0 ∷ ♯ zeros