多晶型规范

时间:2018-03-28 09:22:06

标签: coq lambda-calculus

我创建了一个定义(nat,bool)的类型 - > T夫妇:

Definition pprod_nb : Set := forall T:Set, (nat -> bool -> T) -> T.

现在我想用T = nat:

专门化pprod_nb
(nat -> bool -> nat) -> nat

我的问题是:如何指定表格的类型:T:Set,...?

2 个答案:

答案 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.