Types 使一个术语在Coq中属于两种不同层次的不同类型?

Types 使一个术语在Coq中属于两种不同层次的不同类型?,types,coq,Types,Coq,我们从类型的层次结构中了解到,Set是Type(0),而Type(i)是Type(i+1)。因此,对于类型(i)的任何术语t,它也是类型(i+1)。有可能在Coq中使用此构造吗?例如,假设我们有 apple: Fruit, apple : Food 既然水果是食物,我想构造类型水果和食物,这样水果属于类型(I),食物属于类型(j),其中Iapple也有类型Fruit。我们需要更多的上下文来确定这种编码是否会给您的开发带来任何麻烦 (在

我们从类型的层次结构中了解到,
Set
Type(0)
,而
Type(i)
Type(i+1)
。因此,对于
类型(i)
的任何术语
t
,它也是
类型(i+1)
。有可能在Coq中使用此构造吗?例如,假设我们有

                              apple: Fruit, apple : Food

既然水果是食物,我想构造类型
水果
食物
,这样
水果
属于
类型(I)
食物
属于
类型(j)
,其中I水果:食物。Coq中是否存在这种可能性?如果没有,是否有其他方法可以形成这种结构?

原则上,可以将苹果定义为一种类型,以实现您想要的:

Definition Food := Type.
Definition Fruit : Food := Type.
Inductive apple : Fruit :=.

Check apple : Fruit.
Check apple : Food.
这定义了一个新的(空)类型常量,名为
apple
,它属于
Fruit
Food
,如您所愿

然而,我怀疑这种编码在实践中并不是很有用。例如,如果不假设Coq核心之外的非构造性公理,就不可能在类型
Fruit
上定义等式运算符。此外,
水果
食物
将是非常奇怪的类型,因为它们将包含许多违反直觉的居民;例如,术语
apple->apple
也有类型
Fruit
。我们需要更多的上下文来确定这种编码是否会给您的开发带来任何麻烦


(在Coq中,使用或子集类型
{x:T | px}
来实现类似效果,而不是诉诸子类型,这是很常见的。例如,检查或。)

感谢您的回答。
Check
命令给出
apple:Fruit:Fruit
apple:Food:Food(*|=Top.2 apple.
给出
apple->apple:Type@{Top.2}