我在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_NotZeroIsNotEqualToZero pf) with end
| exist (S n') _ => n'
end.
但我实际上并不了解如何使用这个定义。假设我想使用pred
作为一些自然数,我证明这个数字不是零。例如,假设我证明了以下引理:
Lemma Lemma_TenIsNotEqualToZero : 10 <> 0.
Proof.
omega.
Qed.
现在,我想使用pred 10
来计算“Lemma_TenIsNotEqualToZero
”的本质内容:
Eval compute in (pred ??).
怎么做?
答案 0 :(得分:3)
pred
是一个采用sig
类型的函数(尝试Print sig.
)。简单地说,它是一个归纳类型,其中一个构造函数表明“x
类型A
存在P x
为真”。
如果要创建{n : nat | n <> 0}
类型的术语,则必须使用构造函数构建它,就像任何其他归纳类型一样。在你的情况下:
Eval compute in (pred (exist 10 Lemma_TenIsNotEqualToZero)).
这与您在s
的{{1}}参数上用于模式匹配的语法完全相同。
希望它有所帮助,
V
PS:使用pred
来证明你的证据真的过度杀伤......
omega
编辑:Lemma Lemma_NotZeroIsNotEqualToZero : ~ 0 <> 0.
Proof.
intro h.
apply h; reflexivity.
Qed.
Lemma Lemma_TenIsNotEqualToZero : 10 <> 0.
Proof.
intro h.
discriminate h.
Qed.
在实践中需要3个参数(使用exists
来清楚地了解它们的用途)。根据隐式类型的状态,您应该编写
Print
附加exists _ 10 Lemma_TenIsNotEqualToZero
。