为什么Coq在归纳命题类型中使用未命名的参数?

时间:2018-12-16 23:51:02

标签: coq

我看着IndProp,发现:

Fail Inductive wrong_ev (n : nat) : Prop :=
| wrong_ev_0 : wrong_ev 0
| wrong_ev_SS : ∀ n, wrong_ev n → wrong_ev (S (S n)).
(* ===> Error: A parameter of an inductive type n is not
        allowed to be used as a bound variable in the type
        of its constructor. *)

区别在于它看起来好像在接受参数一样,但是似乎抛出错误。为什么会这样?

文字提供了一些解释,但我不理解:

我不明白的是什么。我不明白的部分是它说的部分:

  

允许在类型中使用不同的值

为什么说“类型”?类型不是输入,值是输入。为什么这样说呢?似乎极为混乱。我(非常模糊地)知道存在诸如“依赖类型”之类的东西,但是它也指的是什么?难道不是争论吗?构造函数不取值或“东西”并返回某种类型的对象吗?

为什么归纳类型的签名(实际上我只是将其视为构建事物的函数是某种类型的返回对象)却缺少自变量


更多文字内容似乎会出现解释:

  

此定义在一个关键方面与以前的归纳用法不同:它的结果不是Type,而是从nat到Prop的函数-即数字的属性。请注意,我们已经看到了其他归纳定义,这些归纳定义会生成函数,例如list,其类型为Type→Type。此处的新功能是,由于ev的nat参数未命名,在冒号的右侧,因此可以在不同构造函数的类型中采用不同的值:ev_0和S(S n)的类型为0。 ev_SS的类型。   相反,列表的定义在冒号的左侧全局命名X参数,从而强制nil和cons的结果相同(列表X)。如果我们尝试在定义ev时将nat移到左侧,我们将看到一个错误...我们可以将ev的定义视为定义Coq属性ev:nat→Prop以及原始定理ev_0:ev 0和ev_SS:∀n,ev n→ev(S(S n))。   这样的“构造定理”与已证明的定理具有相同的地位。

1 个答案:

答案 0 :(得分:0)

  

为什么说“类型”?类型不是输入,值是

您需要阅读整个表达式:“使用不同的构造函数的类型”。 而且,的确,两个构造函数的返回类型的自然数是不同的:

  • ev_0的值为0
  • 它是S (S n)的{​​{1}}