细化 Isabelle 类型声明

Refining a Isabelle type declaration

在某些理论中,比如 TA,我定义了一个不透明类型,比如 OC,使用 Isabelle 的 typedecl 构造:

    typedecl C

假设我现在想在其他一些使用 'TA' 的理论中定义不透明类型 'C' 的细化。例如,说那个新理论中的 'C' 是类型 'String'.

我该怎么做?在伊莎贝尔有直接的方法吗?或者我是否需要定义将一种类型映射到另一种类型的强制函数?

一旦在 Isabelle 中声明了常量或类型,之后就无法更改规范。由于你声明了 C 为未指定类型,Isabelle 的所有定义包将拒绝细化规范。但是,如果您绕过它们,您可以这样做,但您需要自行承担风险。

本质上,您想说类型 C 与类型 string 同构。通常,您会在 Isabelle 中使用命令 typedef 来执行此操作,该命令声明一个新类型并与非空集建立同构。这是在 HOL 中引入新类型的非常基本的机制,即,用于类型声明的所有其他包(如 recorddatatype)构建在 typedef 上。同构是通过在旧类型和新类型之间声明两个常量 AbsReps 并通过断言公理 type_definition Rep Abs A 建立的,其中 A 是非空子集旧类型。因此,如果你想稍后细化 C 以键入 string,你只需声明新函数 Abs_C :: string => CRep_C :: C => string 并使用 [=26= 公理化 type_definition Rep_C Abs_C UNIV ].之后,您知道 Cstring 同构,您可以使用 Abs_CRep_C 作为强制转换。

使用这种方法,您有责任避免出现不一致的情况。比如说,如果你在两个理论中采用这种方法并将 C 细化为每个理论中的不同类型,那么你最好永远不要合并这两个理论(或从它们派生的任何东西),否则你可能会推导出 False。 Isabelle 不会也不能为您检查这个!传统的 typedef 通过将声明和规范合并为一个原子步骤来避免这个问题。然而,typedef 仍然有点不言自明,正如 Isabelle 参考手册所说,它可能在某些极端情况下被滥用以引入不一致。

如果不想自己加公理,就得把C从固定类型改成到处都是类型变量。然后,您可以稍后根据需要实例化它,您也不需要强制转换。但是,在您的一般部分,您必须将所有内容概括为类型变量,并且(取决于您的应用程序)这甚至可能无法在 HOL 中表达。

几年前,AWE tool 提出使用理论态射来实例化未指定的类型。不幸的是,最新版本适用于 Isabelle2009-1,所以这不是一个真正的选择。