在 Coq 中使用存在性证明定义常量
Defining constants using existence proofs in Coq
在证明了一个存在性命题后,为这个定理的某些证人引入一个常量符号通常在符号上很方便。
举个简单的例子,写起来就简单多了(用典型的数学符号)
∀x. ∅ ⊆ x.
不如写
∀x. ∃y. empty(y) and y ⊆ x.
我希望在 Coq 中复制这种效果。这是我遇到的基本场景以及导致错误的尝试(现在是真实的 Coq 代码):
Variable A:Type.
Hypothesis inhabited: exists x:A, x=x.
Definition inhabitant:A.
destruct inhabited.
(*Error: Case analysis on sort Type is not allowed for inductive definition ex.*)
我想知道这个错误消息到底是什么意思,是否有任何方法可以解决这个问题。谢谢!
您的问题与通常的 Prop vs Type
区别有关。你的 witness 存在于 Prop
中(参见类型定义 ex
),所以你不能检查它来建立一个具体的术语,你需要在 Type
中证明这个事实.
您正在寻找 sig
(或类似 sigS
或 sigT
的变体)类型,其符号为:
Hypothesis inhabited : {x : A | x = x }.
在证明了一个存在性命题后,为这个定理的某些证人引入一个常量符号通常在符号上很方便。
举个简单的例子,写起来就简单多了(用典型的数学符号)
∀x. ∅ ⊆ x.
不如写
∀x. ∃y. empty(y) and y ⊆ x.
我希望在 Coq 中复制这种效果。这是我遇到的基本场景以及导致错误的尝试(现在是真实的 Coq 代码):
Variable A:Type.
Hypothesis inhabited: exists x:A, x=x.
Definition inhabitant:A.
destruct inhabited.
(*Error: Case analysis on sort Type is not allowed for inductive definition ex.*)
我想知道这个错误消息到底是什么意思,是否有任何方法可以解决这个问题。谢谢!
您的问题与通常的 Prop vs Type
区别有关。你的 witness 存在于 Prop
中(参见类型定义 ex
),所以你不能检查它来建立一个具体的术语,你需要在 Type
中证明这个事实.
您正在寻找 sig
(或类似 sigS
或 sigT
的变体)类型,其符号为:
Hypothesis inhabited : {x : A | x = x }.