我想知道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亚型,我想知道。
答案 0 :(得分:10)
Isabelle / HOL在可替代性意义上没有亚型。这意味着如果您需要a
类型的值,则必须提供类型为a
的值 - 您无法与其他类型b
相处。特别是,Isabelle没有子类型的概念,其中子类型的值满足一些额外的属性。
有一些方法可以模拟子类型的某些方面,这就是使用概念子类型的地方:
替换类型参数可以让您有时创建子类型的错觉。 record
包使用此扩展记录,以便可以使用扩展记录q
代替非扩展记录r
。在内部,q
的其他字段填充到r
记录类型的泛化的附加类型参数中。从技术上讲,没有子类型多态性发生;因此,延长记录的顺序很重要。
typedef
引入了新类型t
,其类型Universe是某些现有HOL类型a
的值的非空子集。有时,这被称为t
a
的子类型,但您不具备可替代性。如果要将Rep_t
的值用作t
之一,则必须明确提及嵌入态射a
。无论您使用typedef
定义类型还是通过其他方式定义,任何内射函数都可以作为强制行为。
Isabelle Reference Manual (section 12.4)中描述的强制性子类型使Isabelle推断并自动插入此类强制。这只适用于类型和子类型都是没有参数的类型构造函数。
使用declare [[coercion_enabled]]
启用强制子类型并使用declare [[coercion Rep_t]]
注册强制函数。
因此,您不必自己插入嵌入函数。