首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按属性定义的coq

按属性定义的coq
EN

Stack Overflow用户
提问于 2015-05-11 15:42:20
回答 1查看 769关注 0票数 6

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

假设我正式化了属性的定义:

代码语言:javascript
运行
复制
Definition IsGood (x : Z) : Prop := ...

现在我需要一个表格的定义:

代码语言:javascript
运行
复制
Definition Good : Z := ...

假设我证明了一个具有该属性的整数存在并且是唯一的:

代码语言:javascript
运行
复制
Lemma Lemma_GoodExistsUnique : exists! (x : Z), IsGood x.

是否有一种使用GoodIsGood定义Lemma_GoodExistsUnique的简单方法?

由于该属性是在整数上定义的,因此似乎不需要额外的公理。无论如何,我看不出添加类似于选择的公理这样的东西对定义有什么帮助。

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

代码语言:javascript
运行
复制
Definition ThereAreNGoodIntegers (N : Z) (IsGood : Z -> Prop) := ...?

在现实世界的数学中,这样的定义时有发生,所以如果Coq要适合于实际的数学,这不应该是很难形式化的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 18:17:26

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

在Coq理论中,命题(即Props)及其证明具有非常特殊的地位。特别是,通常不可能写出提取存在证据的证人的选择操作符。这样做是为了使该理论与某些公理和原则相一致,例如证明无关性,即一个命题的所有证明都是平等的。如果您想要做到这一点,您需要添加这个选择运算符作为您的理论的附加公理,如在标准库

然而,在某些特殊情况下,可以从抽象的存在证明中提取证人,而不必重复任何附加的公理。特别是,当所讨论的属性是可判定的时,可以对可数类型(如Z)执行此操作。例如,您可以使用斯皮尔库中的斯皮尔接口来获得您想要的结果(查找xchoose函数)。

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

代码语言:javascript
运行
复制
Definition Good : Z := (* ... *)
Definition IsGood (z : Z) : Prop := (* ... *)

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

Lemma GoodUnique : forall z : Z, IsGood z -> z = Good.

如果您绝对希望用存在性证明来定义Good,还可以将Lemma_GoodExistsUnique的证明更改为在Type中使用连接符而不是Prop,因为它允许您使用proj1_sig函数直接提取证人:

代码语言:javascript
运行
复制
Lemma Lemma_GoodExistsUnique : {z : Z | Good z /\ forall z', Good z' -> z' = z}.
Proof. (* ... *) Qed.

至于你的第二个问题,是的,这与第一点有关。再次,我建议您用类型为y_from_x的函数Z -> Z来计算给定的x,然后分别证明该函数以特定的方式关联输入和输出。然后,通过证明y是内射的,可以说对于不同的xs,y_from_x是不同的。

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

代码语言:javascript
运行
复制
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。在您的示例中,您使用一个整数来讨论一个集合的基数,这个数字始终是一个自然数。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30171995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档