我在对以下形式的定义进行形式化化时遇到了困难:定义一个整数,使某些属性保持不变。
假设我正式化了属性的定义:
Definition IsGood (x : Z) : Prop := ...
现在我需要一个表格的定义:
Definition Good : Z := ...
假设我证明了一个具有该属性的整数存在并且是唯一的:
Lemma Lemma_GoodExistsUnique : exists! (x : Z), IsGood x.
是否有一种使用Good
和IsGood
定义Lemma_GoodExistsUnique
的简单方法?
由于该属性是在整数上定义的,因此似乎不需要额外的公理。无论如何,我看不出添加类似于选择的公理这样的东西对定义有什么帮助。
另外,我在形式化定义以下表单时遇到了困难(我怀疑这与我前面描述的问题有关,但请说明是否是这样):对于每个x
,都存在y
,而这些y
对于不同的x
是不同的。例如,如何使用N
定义IsGood
有不同的好整数
Definition ThereAreNGoodIntegers (N : Z) (IsGood : Z -> Prop) := ...?
在现实世界的数学中,这样的定义时有发生,所以如果Coq要适合于实际的数学,这不应该是很难形式化的。
发布于 2015-05-11 18:17:26
对你的第一个问题的简短回答是:一般来说,这是不可能的,但在你的特殊情况下,是的。
在Coq理论中,命题(即Prop
s)及其证明具有非常特殊的地位。特别是,通常不可能写出提取存在证据的证人的选择操作符。这样做是为了使该理论与某些公理和原则相一致,例如证明无关性,即一个命题的所有证明都是平等的。如果您想要做到这一点,您需要添加这个选择运算符作为您的理论的附加公理,如在标准库。
然而,在某些特殊情况下,可以从抽象的存在证明中提取证人,而不必重复任何附加的公理。特别是,当所讨论的属性是可判定的时,可以对可数类型(如Z
)执行此操作。例如,您可以使用斯皮尔库中的斯皮尔接口来获得您想要的结果(查找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
,还可以将Lemma_GoodExistsUnique
的证明更改为在Type
中使用连接符而不是Prop
,因为它允许您使用proj1_sig
函数直接提取证人:
Lemma Lemma_GoodExistsUnique : {z : Z | Good z /\ forall z', Good z' -> z' = z}.
Proof. (* ... *) Qed.
至于你的第二个问题,是的,这与第一点有关。再次,我建议您用类型为y_from_x
的函数Z -> Z
来计算给定的x
,然后分别证明该函数以特定的方式关联输入和输出。然后,通过证明y
是内射的,可以说对于不同的x
s,y_from_x
是不同的。
另一方面,我不知道你的最后一个例子与第二个问题有什么关系。如果我理解你想要做的事情,你可以写如下
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
。在您的示例中,您使用一个整数来讨论一个集合的基数,这个数字始终是一个自然数。
https://stackoverflow.com/questions/30171995
复制相似问题