在定义归纳类型时,在冒号之前或之后放置东西是否存在根本区别?在我看来,这主要是语法上的便利。例如,这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.
因此,除了语法上的便利之外,这四个定义与我的观点没有根本区别。那是对的吗?是否有用例在结肠之前或之后放一些东西会产生更严重的后果?