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

时间:2016-01-03 22:29:12

标签: types agda

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

1 个答案:

答案 0 :(得分:3)

  

我知道(A / ~A)一般不可证明。怎么去   关于构造集合A的示例,其中(A / ~A)不是   可证明的,

您已经举了一个例子: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说"所有A A都是真或假"。 lem-lem说"被排除在中间的法则是真的还是假的"。但我们知道建设性的lem并不正确,因为Agda不是反经典的,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

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

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

zeros : Stream ℕ
zeros = 0 ∷ ♯ zeros

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