如何声明 "free" 类型 class 的实例?

How to declare "free" instance of type class?

我正在尝试对 Isabelle/HOL 中的一些程序分析进行建模。分析计算有界格中的值,但是(现在,为了一般性)我不想承诺任何具体的格定义;我只关心某些结果是否为底部。我正在寻找一种方法来声明抽象类型,该抽象类型是 Isabelle/HOL 的 bounded_lattice 类型 class 的实例,而无需提交具体实例。

也就是说,类似于我的写作方式

typedecl some_data
type_synonym my_analysis_result = "var => some_data"

其中some_data是完全免费的,我希望能够写出类似

的东西
typedecl "some_lattice::bounded_lattice"
type_synonym my_analysis_result = "var => some_lattice"

其中 some_lattice 将是 "free" 有界格,除了它满足格定律外,我不需要任何东西。 Isabelle/HOL 不接受这种特殊语法,

也不接受
type_synonym my_analysis_result = "var => 'a::bounded_lattice"

我可以通过定义一个具体的数据类型并使其成为 bounded_lattice 的实例来解决这个问题,但我不明白为什么不应该有更通用的方法。是否有一些简单(或复杂)的语法来实现我正在做的事情?我是否必须(不知何故,我不确定它是否会起作用)将我的整个开发过程都放在 context bounded_lattice 块中?或者有什么原因可以通过 typedecl 拥有完全自由的类型而不是受类型 class 限制的自由类型?

如果类型 class 具有相互矛盾的假设,则将未指定类型作为类型 class 的实例可能会导致不一致。为了使这种公理化性质明确化,您必须公理化实例化。这是一个例子:

typedecl some_lattice
axiomatization where some_lattice_bounded:
  "OFCLASS(some_lattice, bounded_lattice_class)"
instance some_lattice :: bounded_lattice by(rule some_lattice_bounded)

注意:几年前,您可以使用命令 arities,但该命令已被停用,以强调未指定类型 class 实例化的公理性质。

或者,您可以只为晶格使用类型变量。这更灵活,因为如果您需要具体的有界格,您可以稍后实例化类型变量。但是,您必须始终携带类型变量。例如,

type_synonym 'a my_analysis_result = "var => 'a"

Isabelle 不支持具有排序约束的类型同义词(因为无论如何都没有多大意义)。如果您添加排序约束,您将收到一条警告,指出它将被忽略。每当您需要 bounded_lattice 实例时,类型推断都会添加排序约束(或者您必须为类型变量明确提及)。