如何宣布"免费"类的实例?

时间:2015-10-07 12:48:59

标签: typeclass isabelle

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

这就像我写作的方式类似

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将是"免费"除了满足格子定律之外我什么都不需要的有界格子。 Isabelle / HOL不接受这种特殊语法,也不像

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

我可以通过定义具体数据类型并使其成为bounded_lattice的实例来解决此问题,但我不明白为什么不应该采用更通用的方式。是否有一些简单(或复杂)的语法来实现我的目标?我是否必须(不知何故,我不确定它是否会起作用)将我的整个开发工作放在context bounded_lattice块内?或者是否有某种原因可以通过typedecl获得完全免费的类型,但不是类型类限制的免费类型?

1 个答案:

答案 0 :(得分:2)

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

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,但这已经停止,以强调未指定类型类实例化的公理性质。

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

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

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