如何在isabelle中进行铸造

时间:2014-11-11 08:32:11

标签: casting isabelle isar

我在Isabelle中有以下代码:

typedecl type1
typedecl type2
typedecl type3

consts 
  A::"type1 set"
  B::"type2 set"

当我想使用A和B的联合操作时如下:

axiomatization where
 c0: "A ∪ B = {}"

由于A和B是不同类型的集合,我得到类型冲突的错误,这是有道理的!作为一种解决方法,我想输入转换A和B两者都成为类型" type3"的集合,所以我可以对它们应用联合操作。在这个具体的例子中,如何在isabelle中进行这种类型的铸造,以及一般如何可能。

由于

1 个答案:

答案 0 :(得分:3)

类型转换需要类型之间的显式函数,比如

consts cast_A :: "type1 ⇒ type3"
consts cast_B :: "type2 ⇒ type3"

使用这些功能,您可以按如下方式说明您的公理:

axiomatization where
 c0: "cast_A ` A ∪ cast_B ` B = {}"

Isabelle还可以自动插入此类强制函数,但您必须先启用它:

declare
  [[coercion_enabled]]
  [[coercion cast_A, coercion cast_B]]
  [[coercion_map image]]

这三个声明执行以下操作

  1. 启用强制推理算法。
  2. 将函数cast_Acast_B声明为强制函数,即强制推断可以在需要时插入它们。
  3. 将函数image(写入中缀为`)声明为强制的映射函数。这些映射函数允许推理系统将强制应用于类型构造函数的参数。这里,声明允许通过对其所有元素应用强制函数来强制设置。
  4. 通过这些准备工作,公理可以像以前一样写成:

    axiomatization where
     c0: "A ∪ B = {}"
    

    然而,强制插入只是一种从输入符号中消除混乱的方法。强制在定理中是明确的,你的证明必须处理它们。如果你看一下定理c0,你会看到强制。

    最后评论这些类型的嵌入。预定义的总和类型type1 + type2完全由type1类型的所有元素和类型为type2的元素组成,分别具有强制转换函数InlInr。因此,如果您的类型type3没有其他目的,而不是type1type2的联合,则总和类型可能更方便使用。

    另请注意,您的公理表示集AB为空。