完善Isabelle类型声明

时间:2015-04-30 12:24:04

标签: isabelle

在一些理论中,比如TA,我使用Isabelle的typedecl结构来定义一个不透明的类型,比如说OC;

    typedecl C

让我们假设我现在想要在其他一些使用'TA'的理论中定义opaque类型'C'的细化。例如,要说新理论中的'C'是'String'类型。

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

1 个答案:

答案 0 :(得分:2)

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

基本上,您想要说类型Cstring类型同构。通常,您可以使用Isabelle中的命令typedef来执行此操作,该命令声明了一种新类型并使用非空集建立了同构。这是在HOL中引入新类型的非常基本的机制,即类型声明的每个其他包(如recorddatatype)构建在typedef上。通过在旧类型和新类型之间声明两个常量AbsReps并声明公理type_definition Rep Abs A来建立同构,其中A是非空子集旧的类型。因此,如果您希望稍后将C细化为string,则可以使用{{1}声明新函数Abs_C :: string => CRep_C :: C => string以及axiomatise type_definition Rep_C Abs_C UNIV }。之后,您知道axiomatizationC同构,您可以使用stringAbs_C作为强制。

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

如果您不想自己添加公理,则必须将typedef从固定类型更改为类型变量。然后,您可以根据需要稍后实例化它,也不需要强制。但是,在您的一般部分中,您必须概括所有内容以键入变量和(取决于您的应用程序),这在HOL中甚至可能无法表达。

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