归纳类型的声明顺序重要吗?


9

我想知道归纳类型的声明顺序是否重要。

例如,在Coq中,您可以Nat通过以下方式之一进行定义:

Inductive Nat :=
  | O : Nat
  | S : Nat -> Nat.

要么

Inductive Nat :=
  | S : Nat -> Nat
  | O : Nat.

这也许会改变自动生成的消除器中参数的顺序,但这没什么大不了的。

我想知道的是,是否可以编写像这样的声明

Inductive typewhereordermatters :=
  | cons1 : type1
  | cons2 : type2.

其中type2是一个依赖型,这取决于cons1?(在这种情况下,以其他顺序编写声明将没有任何意义,因为type2要引用的声明cons1尚不存在)。

Answers:


10
  1. 顺序无关紧要。我想不出会发生什么情况。正如安德烈·鲍尔(Andrej Bauer)在评论中指出的那样,如果更改顺序,结果将与原始正则同构

  2. 一个案例不能依赖另一案例。总和的元素代表一个选择,因此,所选择的选择取决于未选择的选择没有意义。


2
您可以更具体地说明您的第一点。顺序无关紧要。如果更改顺序,则结果与原始规范同构。
安德烈·鲍尔

2
@戴夫:谢谢!我之所以问这个问题,是因为(归类于较高的归纳实验理论)更高的归纳类型,这种现象似乎发生在哪里,我想知道规则归纳类型是否也可能出现这种情况。
纪尧姆·布鲁内

1
@Guillaume:我不确定链接指向的是什么现象。数据类型定义的不同构造子句不能相互依赖,无论它是否是高阶数据类型。也许您正在考虑依赖记录(在链接中使用,并且在AgdaCoq中可用)?
Noam Zeilberger

1
@Noam:在较高归纳类型的示例中circleloop构造函数的类型取决于base构造函数。
纪尧姆·布鲁内

2
@Guillaume:我现在看到了(他们正在引入实验性语法),不知道我是怎么想的。
Noam Zeilberger

6

顺序是否取决于您的要求?没有。

但是命令是否与证明助手的功能完全无关?再说一次 在Matita(非常类似于Coq)的证明助手中,以归纳定义编写构造函数的顺序对于类型检查确实很重要,尤其是在对匹配表达式进行类型检查时。

Matita首先必须检查匹配主体中是否匹配了所有构造函数。它通过按声明的顺序循环遍历构造函数来实现此目的。然后,对匹配表达式进行适当的类型检查,该匹配表达式以相反的顺序发生,首先检查最后声明的构造函数的大小写。然后进行这种类型的检查,以检查其他情况。

这在编写大型匹配表达式时经常出现。您想先填写简单的案例,将较困难的案例放在通配符下,并定期键入检查您编写的内容以确保它有意义。有时候Matita无法推断出不完全匹配表达式的类型,但是如果您填写归纳类型中定义的最后一个构造函数的大小写,则会很高兴地做到这一点。

我不确定,虽然我不确定,但Coq也会做类似的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.