有没有一种方法可以在Coq中定义子类型关系?
我读到有关子集类型的信息,其中使用谓词来确定子类型的内容,但这不是我的目标。我只想定义一个理论,其中有一个类型(U)和另一个类型(I),它是(U)的子类型。
答案 0 :(得分:1)
Coq中没有真正的子类型(Universe子类型除外,这可能不是您想要的)。最接近的替代方法是使用强制,这些强制功能是Coq类型检查器在期望一种类型的元素但找到另一种类型的元素时自动插入的函数。例如,考虑以下从布尔值到自然数的强制:
Definition nat_of_bool (b : bool) : nat :=
if b then 1 else 0.
Coercion nat_of_bool : bool >-> nat.
运行此代码段后,Coq使用nat_of_bool
将bool
转换为nat
,如下所示:
Check true + 3.
(* true + 3 : nat *)
因此,bool
开始表现得好像是nat
的子类型一样。
尽管nat_of_bool
在这里没有出现,但只是被Coq的打印机隐藏了。这个术语实际上与nat_of_bool true + 3
是同一件事,正如我们通过要求Coq打印所有强制来看到的那样:
Set Printing Coercions.
Check true + 3.
(* nat_of_bool true + 3 : nat *)
:>
符号you had asked about earlier在记录声明中使用时,正在执行相同的操作。例如,代码
Record foo := Foo {
sort :> Type
}.
等同于
Record foo := Foo {
sort : Type
}.
Coercion sort : foo >-> Sortclass.
其中Sortclass
是Type
,Prop
和Set
的特殊强制目标。
Coq user manual更详细地描述了强制。