在Coq中定义子类型关系

在Coq中定义子类型关系,coq,subtype,Coq,Subtype,有没有办法在Coq中定义子类型关系 我读过关于子集类型的文章,其中谓词用于确定子类型中的内容,但这不是我的目标。我只想定义一个理论,其中有一个类型(U)和另一个类型(I),它是(U)的子类型 Coq中没有真正的子类型(除了宇宙子类型,这可能不是您想要的)。最接近的替代方法是使用强制,这是Coq类型检查器在需要一种类型的元素但找到另一种类型的元素时自动插入的函数。例如,考虑从布尔值到自然数的下列强制: Definition nat_of_bool (b : bool) : nat := if

有没有办法在Coq中定义子类型关系


我读过关于子集类型的文章,其中谓词用于确定子类型中的内容,但这不是我的目标。我只想定义一个理论,其中有一个类型(U)和另一个类型(I),它是(U)的子类型

Coq中没有真正的子类型(除了宇宙子类型,这可能不是您想要的)。最接近的替代方法是使用强制,这是Coq类型检查器在需要一种类型的元素但找到另一种类型的元素时自动插入的函数。例如,考虑从布尔值到自然数的下列强制:

Definition nat_of_bool (b : bool) : nat :=
  if b then 1 else 0.

Coercion nat_of_bool : bool >-> nat.
运行此代码段后,Coq使用
nat\u of_bool
bool
转换为
nat
,如下所示:

Check true + 3.
(* true + 3 : nat *)
因此,
bool
开始表现得几乎就像它是
nat
的一个子类型一样

虽然
nat\u of_bool
没有出现在这里,但它只是被Coq的打印机隐藏了起来。这一术语实际上与布尔真+3的nat_的
nat_相同,我们可以通过要求Coq打印所有强制命令看到:

Set Printing Coercions.
Check true + 3.
(* nat_of_bool true + 3 : nat *)
当在记录声明中使用
:>
符号时,它也在做同样的事情。例如,代码

Record foo := Foo {
  sort :> Type
}.
相当于

Record foo := Foo {
  sort : Type
}.

Coercion sort : foo >-> Sortclass.
其中,
Sortclass
Type
Prop
Set
的特殊强制目标


这篇文章更详细地描述了强迫行为。

感谢您对这两个问题的回答。我想做的是定义一个有两个载体的代数理论,其中一个是另一个的子类型。我将该理论定义为记录类型(如果您有更好的选择,请告诉我)。例如,我有:Record Foo:Type:={U:Type,I:Type}。我需要在I和U之间添加子类型关系,但是使用强制,超类型只能是Foo。我现在能想到的唯一方法是将子类型关系添加为一个公理。有更好的选择吗?例如,您可以说,
Record Foo:Type:={U:Type;I:Type;subtype\U-witness:I->U}
。您可能还需要要求
子类型\u witness
是内射的。这是我最想做的。谢谢