如何应用有限制的定义定理

时间:2014-12-12 02:53:32

标签: 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_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 ??).

怎么做?

1 个答案:

答案 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