什么是Isabelle / HOL亚型? Isar命令产生什么子类型?

时间:2013-04-26 07:35:25

标签: types subtype isabelle type-theory isar

我想知道Isabelle / HOL亚型。我解释一下为什么在我对上一个SO问题的部分回答中对我来说很重要:

Trying to Treat Type Classes and Sub-types Like Sets and Subsets

基本上,我只有一种类型,所以如果我可以通过子类型利用HOL类型的力量,它对我有用。

我已经在Isabelle文档,Web和Isabelle邮件列表中进行了搜索。使用“子类型”这个词虽然不多,但它似乎不是伊莎贝尔词汇中非常重要的一部分。

部分原因,我只想知道如何正确使用“子类型”这个词。我不想在Isabelle中调用一个不属于子类型的子类型。

根据Wiki,子类型是特定于语言的:

https://en.wikipedia.org/wiki/Subtyping

重要的最后一部分;请命令

有人可以给我一个创建Isar子类型的Isar命令列表吗?我正在调查typedef,正如上面提到的问题所解释的那样。我倾向于称之为子类型,但isar-ref.pdf在解释命令时不使用“子类型”。

如果还有其他方法可以创建Isabelle / HOL亚型,我想知道。

1 个答案:

答案 0 :(得分:10)

Isabelle / HOL在可替代性意义上没有亚型。这意味着如果您需要a类型的值,则必须提供类型为a的值 - 您无法与其他类型b相处。特别是,Isabelle没有子类型的概念,其中子类型的值满足一些额外的属性。

有一些方法可以模拟子类型的某些方面,这就是使用概念子类型的地方:

  1. 替换类型参数可以让您有时创建子类型的错觉。 record包使用此扩展记录,以便可以使用扩展记录q代替非扩展记录r。在内部,q的其他字段填充到r记录类型的泛化的附加类型参数中。从技术上讲,没有子类型多态性发生;因此,延长记录的顺序很重要。

  2. typedef引入了新类型t,其类型Universe是某些现有HOL类型a的值的非空子集。有时,这被称为t a的子类型,但您不具备可替代性。如果要将Rep_t的值用作t之一,则必须明确提及嵌入态射a。无论您使用typedef定义类型还是通过其他方式定义,任何内射函数都可以作为强制行为。

  3. Isabelle Reference Manual (section 12.4)中描述的强制性子类型使Isabelle推断并自动插入此类强制。这只适用于类型和子类型都是没有参数的类型构造函数。 使用declare [[coercion_enabled]]启用强制子类型并使用declare [[coercion Rep_t]]注册强制函数。 因此,您不必自己插入嵌入函数。