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

时间:2018-07-24 14:25:27

标签: types coq

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

                              apple: Fruit, apple : Food

并且由于水果是食物,所以我想构造FruitFood类型,使得Fruit属于Type(i),而Food属于{{ 1}},其中i Type(j)。 Coq是否有这种可能性?如果没有,是否有其他方法可以用这种结构形成某种东西?

1 个答案:

答案 0 :(得分:0)

原则上,可以将apple定义为一种类型,以实现所需的目标:

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

Check apple : Fruit.
Check apple : Food.

这将定义一个名为apple的新(空)类型常量,如您所愿,它属于FruitFood

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

(在Coq中,通常不使用子类型,而是使用coercions或子集类型{x : T | P x}来达到类似的效果。例如检查this answerthis question