从类型的层次结构中我们了解到Set
是Type(0)
,而Type(i)
的类型是Type(i+1)
。因此,对于t
的任何术语Type(i)
,它也是Type(i+1)
的术语。有可能在Coq中使用此构造?例如,假设我们有
apple: Fruit, apple : Food
并且由于水果是食物,所以我想构造Fruit
和Food
类型,使得Fruit
属于Type(i)
,而Food
属于{{ 1}},其中i
答案 0 :(得分:0)
原则上,可以将apple
定义为一种类型,以实现所需的目标:
Definition Food := Type.
Definition Fruit : Food := Type.
Inductive apple : Fruit :=.
Check apple : Fruit.
Check apple : Food.
这将定义一个名为apple
的新(空)类型常量,如您所愿,它属于Fruit
和Food
。
但是,我怀疑这样的编码在实践中不是很有用。例如,如果不假设Coq核心之外的非构造公理,就不可能在类型Fruit
上定义相等运算符。而且,Fruit
和Food
将是非常奇怪的类型,因为它们将包含许多违反直觉的居民。例如,术语apple -> apple
也具有类型Fruit
。我们需要更多上下文来确定此编码是否会对您的开发造成任何麻烦。
(在Coq中,通常不使用子类型,而是使用coercions或子集类型{x : T | P x}
来达到类似的效果。例如检查this answer或this question )