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}