在一些理论中,比如TA,我使用Isabelle的typedecl结构来定义一个不透明的类型,比如说OC;
typedecl C
让我们假设我现在想要在其他一些使用'TA'的理论中定义opaque类型'C'的细化。例如,要说新理论中的'C'是'String'类型。
我该怎么做?伊莎贝尔有直接的方法吗?或者我是否需要定义将一种类型映射到另一种类型的强制函数?
答案 0 :(得分:2)
在Isabelle中声明常量或类型后,您无法在之后更改规范。由于您已将C
声明为未指定类型,因此Isabelle的所有定义包都将拒绝优化规范。但是,如果你绕过它们,你可以这样做,但这样做需要你自担风险。
基本上,您想要说类型C
与string
类型同构。通常,您可以使用Isabelle中的命令typedef
来执行此操作,该命令声明了一种新类型并使用非空集建立了同构。这是在HOL中引入新类型的非常基本的机制,即类型声明的每个其他包(如record
和datatype
)构建在typedef
上。通过在旧类型和新类型之间声明两个常量Abs
和Reps
并声明公理type_definition Rep Abs A
来建立同构,其中A
是非空子集旧的类型。因此,如果您希望稍后将C
细化为string
,则可以使用{{1}声明新函数Abs_C :: string => C
和Rep_C :: C => string
以及axiomatise type_definition Rep_C Abs_C UNIV
}。之后,您知道axiomatization
与C
同构,您可以使用string
和Abs_C
作为强制。
使用这种方法,您有责任不引入不一致。比方说,如果你在两种理论中采用这种方法并将Rep_C
改进为每种理论中的不同类型,那么你最好不要将这两种理论(或从它们派生的任何东西)合并,否则你可能会导出{{ 1}}。伊莎贝尔不会也不能为你检查这个!传统的C
通过将声明和规范组合成一个原子步骤来避免这个问题。然而,正如Isabelle参考手册所言,False
仍然有些公理,并且在某些极端情况下可能会滥用它来引入不一致。
如果您不想自己添加公理,则必须将typedef
从固定类型更改为类型变量。然后,您可以根据需要稍后实例化它,也不需要强制。但是,在您的一般部分中,您必须概括所有内容以键入变量和(取决于您的应用程序),这在HOL中甚至可能无法表达。
几年前,AWE tool提供了使用理论态射来实例化未指定的类型。不幸的是,最新版本适用于Isabelle2009-1,所以这不是一个真正的选择。