coq中的属性定义

coq中的属性定义,coq,Coq,我在形式化以下形式的定义时遇到困难:定义一个整数,使某些属性保持不变 假设我正式定义了财产: Definition IsGood (x : Z) : Prop := ... 现在我需要对表单进行定义: Definition Good : Z := ... 假设我证明了具有该属性的整数存在且唯一: Lemma Lemma_GoodExistsUnique : exists! (x : Z), IsGood x. 使用IsGood和Lemma\u GoodExistsUnique是否有一种定义

我在形式化以下形式的定义时遇到困难:定义一个整数,使某些属性保持不变

假设我正式定义了财产:

Definition IsGood (x : Z) : Prop := ...
现在我需要对表单进行定义:

Definition Good : Z := ...
假设我证明了具有该属性的整数存在且唯一:

Lemma Lemma_GoodExistsUnique : exists! (x : Z), IsGood x.
使用
IsGood
Lemma\u GoodExistsUnique
是否有一种定义
Good
的简单方法

由于该属性是在整数上定义的,因此似乎不需要额外的公理。在任何情况下,我看不出添加诸如选择公理之类的东西如何有助于定义

此外,我在形式化以下形式的定义方面遇到困难(我怀疑这与我上面描述的问题有关,但请说明是否与此相关):对于每个
x
,都存在
y
,并且这些
y
对于不同的
x
是不同的。例如,如何使用
IsGood
定义有
N个不同的好整数:

Definition ThereAreNGoodIntegers (N : Z) (IsGood : Z -> Prop) := ...?

在现实世界的数学中,这样的定义时不时出现,因此,如果Coq适用于实用数学,这应该不难形式化。

第一个问题的简短回答是:一般来说,这是不可能的,但在您的特定情况下,是的

在柯克的理论中,命题(即
Prop
s)及其证明具有非常特殊的地位。特别是,通常不可能编写选择运算符来提取存在性证明的证人。这样做是为了使理论与某些公理和原则相兼容,例如证明无关,即给定命题的所有证明都是相等的。如果你想做到这一点,你需要把这个选择操作符作为一个额外的公理添加到你的理论中,如中所示

然而,在某些特定情况下,可以从抽象的存在性证明中提取证人,而无需重复任何其他公理。特别是,当所讨论的属性是可判定的时,可以对可数类型(例如
Z
)执行此操作。例如,您可以使用库中的
choiceType
界面来获得您想要的内容(查找
xchoose
函数)

尽管如此,我通常会建议不要以这种方式做事,因为这样会导致不必要的复杂性。直接定义
Good
可能更容易,无需借助于存在性证明,然后单独证明
Good
具有所寻求的属性

Definition Good : Z := (* ... *)
Definition IsGood (z : Z) : Prop := (* ... *)

Lemma GoodIsGood : IsGood Good.
Proof. (* ... *) Qed.

Lemma GoodUnique : forall z : Z, IsGood z -> z = Good.
如果您绝对希望使用存在性证明定义
Good
,您还可以将
引理的证明更改为在
类型中使用连接词,而不是
Prop
,因为它允许您直接使用
proj1\u sig
函数提取证人:

Lemma Lemma_GoodExistsUnique : {z : Z | Good z /\ forall z', Good z' -> z' = z}.
Proof. (* ... *) Qed.
至于你的第二个问题,是的,它与第一点有点相关。再一次,我建议您从_x
中写下一个函数
y_,类型为
Z->Z
,该函数将在给定的
x
下计算
y
,然后分别证明该函数以特定方式关联输入和输出。然后,通过证明
y\u from_x
是内射的,可以说
y
s对于不同的
x
s是不同的

另一方面,我不确定你的最后一个例子与第二个问题有什么关系。如果我能正确理解你想做的事情,你可以写下

Definition ThereAreNGoodIntegers (N : Z) (IsGood : Z -> Prop) :=
  exists zs : list Z,
    Z.of_nat (length zs) = N
    /\ NoDup zs
    /\ Forall IsGood zs.
这里,
Z.of_nat:nat->Z
是从自然数到整数的规范注入,
NoDup
是断言列表不包含重复元素的谓词,
Forall
是断言给定谓词(在本例中,
IsGood
)包含列表的所有元素的高阶谓词

最后,我建议不要在只涉及自然数的事情上使用
Z
。在您的示例中,您使用一个整数来讨论集合的基数,而这个数字始终是一个自然数