归纳类型中多态的不同方法

时间:2018-02-03 13:10:15

标签: coq

在定义归纳类型时,在冒号之前或之后放置东西是否存在根本区别?在我看来,这主要是语法上的便利。例如,这4个多态列表定义与我基本相同:

Inductive list1 : Type -> Type :=
  | Nil1 : forall (X : Type), list1 X
  | Cons1 : forall (X : Type), X -> list1 X -> list1 X.

Inductive list2 (X : Type) : Type :=
  | Nil2 : list2 X
  | Cons2 : X -> list2 X -> list2 X.

Inductive list3 {X : Type} : Type :=
  | Nil3 : list3
  | Cons3 : X -> list3 -> list3.

Inductive list4 : Type -> Type :=
  | Nil4 : forall {X : Type}, list4 X
  | Cons4 : forall {X : Type}, X -> list4 X -> list4 X.

唯一的区别是,其中一些要求更明确X : Type,如以下示例所示:

Compute Cons1 nat 3 (Nil1 nat).
Compute Cons2 nat 3 (Nil2 nat).
Compute Cons3 3 Nil3.
Compute Cons4 3 Nil4.

但是,可以使用Implicit Arguments

轻松修复此问题
Implicit Arguments Nil1 [X].
Implicit Arguments Cons1 [X].
Compute Cons1 3 Nil1.

Implicit Arguments Nil2 [X].
Implicit Arguments Cons2 [X].
Compute Cons2 3 Nil2.

因此,除了语法上的便利之外,这四个定义与我的观点没有根本区别。那是对的吗?是否有用例在结肠之前或之后放一些东西会产生更严重的后果?

0 个答案:

没有答案