我创建了一个定义(nat,bool)的类型 - > T夫妇:
Definition pprod_nb : Set := forall T:Set, (nat -> bool -> T) -> T.
现在我想用T = nat:
专门化pprod_nb(nat -> bool -> nat) -> nat
我的问题是:如何指定表格的类型:T:Set,...?
答案 0 :(得分:1)
首先,您给出的定义并未被Coq接受:
The term "forall T : Set, (nat -> bool -> T) -> T" has type
"Type" while it is expected to have type "Set" (universe inconsistency).
您确定这是您正在使用的定义吗?
要回答我认为是您的实际问题,我认为您希望T
成为参数:
Definition pprod_nb (T : Set) : Set := (nat -> bool -> T) -> T.
这种方式pprod_nb
的类型为Set -> Set
,因此您可以将其应用于nat
:
Definition pprod_nb_nat := pprod_nb nat.
这给出了你想要的类型:
Eval compute in pprod_nb_nat.
= (nat -> bool -> nat) -> nat
: Set
答案 1 :(得分:1)
首先,您的类型pprod_nb
太大(它的功能类型)是Set
,因此您需要将其设为Type
或者您# 39; ll得到一个宇宙不一致错误:
Definition pprod_nb : Type := forall T:Set, (nat -> bool -> T) -> T.
如果我理解正确,你的意思是"专注于"而不是"指定"。上述类型不具备专业性,因为它是高阶或等级2类型(如果您使用适当的扩展名,则会在Haskell中看到的术语,如Rank2Types
)。相反,它指的是适用于所有类型T
的函数;因为多态函数不能检查类型,并且对于Coq中的不同类型的行为不同(技术术语是参数多态),所以这些函数的行为一致,无论它们产生什么样的结果类型T
。
这是另一个高阶类型(它本身不是一个类型,它是一个产生类型的函数),你可以专攻:
Definition pprod_nb' : Set -> Type := fun T:Set => (nat -> bool -> T) -> T.
Eval compute in (pprod_nb' nat).
(*
= (nat -> bool -> nat) -> nat
: Type
*)
(* check that these two definitions are indeed exactly the same *)
Theorem pprod_nb'_is_pprod_nb_forall :
pprod_nb = forall T, pprod_nb' T.
Proof. reflexivity. Qed.
我以一种突出与pprod_nb
定义相似的方式编写它,但它更自然地写成Definition pprod_nb' T := (nat -> bool -> T) -> T.