如何在coq中应用带限制定义的定理
我在coq中找到了许多带有限制的定义示例。例如,这里是如何在coq中应用带限制定义的定理,coq,dependent-type,Coq,Dependent Type,我在coq中找到了许多带有限制的定义示例。例如,这里是pred函数的一种变体: Lemma Lemma_NotZeroIsNotEqualToZero : ~ 0 <> 0. Proof. omega. Qed. Definition pred (s : { n : nat | n <> 0 }) : nat := match s with | exist 0 pf => match (Lemma_NotZeroIsNotEqualToZe
pred
函数的一种变体:
Lemma Lemma_NotZeroIsNotEqualToZero : ~ 0 <> 0.
Proof.
omega.
Qed.
Definition pred (s : { n : nat | n <> 0 }) : nat :=
match s with
| exist 0 pf => match (Lemma_NotZeroIsNotEqualToZero pf) with end
| exist (S n') _ => n'
end.
现在,我想用引理计算“pred10
”的本质:
Eval compute in (pred ??).
如何操作?
pred
是一个采用sig
类型的函数(尝试打印sig.
)。简单地说,它是一种归纳类型,有一个构造函数声明“存在一个A
类型的x
,因此px
是真的”
如果你想创建一个{n:nat | n0}
类型的术语,你必须像其他归纳类型一样使用构造函数来构建它。就你而言:
Eval compute in (pred (exist 10 Lemma_TenIsNotEqualToZero)).
这与您在pred
的s
参数上进行模式匹配时使用的语法完全相同
希望有帮助
五
PS:用omega
做两种证明真是太过分了
Lemma Lemma_NotZeroIsNotEqualToZero : ~ 0 <> 0.
Proof.
intro h.
apply h; reflexivity.
Qed.
Lemma Lemma_TenIsNotEqualToZero : 10 <> 0.
Proof.
intro h.
discriminate h.
Qed.
使用不起作用的附加
。
。(我在问问题之前确实试过了。)错误信息如下:“错误:术语“10”的类型为“nat”,而它的类型应为”?641->Prop“。由于您使用exists 0 pnf
进行模式匹配,我认为您已经激活了隐式类型的自动插入。尝试使用exists\u10
,它应该可以工作。
Lemma Lemma_NotZeroIsNotEqualToZero : ~ 0 <> 0.
Proof.
intro h.
apply h; reflexivity.
Qed.
Lemma Lemma_TenIsNotEqualToZero : 10 <> 0.
Proof.
intro h.
discriminate h.
Qed.
exists _ 10 Lemma_TenIsNotEqualToZero