我在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中进行这种类型的铸造,以及一般如何可能。
由于
答案 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]]
这三个声明执行以下操作
cast_A
和cast_B
声明为强制函数,即强制推断可以在需要时插入它们。image
(写入中缀为`)声明为强制的映射函数。这些映射函数允许推理系统将强制应用于类型构造函数的参数。这里,声明允许通过对其所有元素应用强制函数来强制设置。通过这些准备工作,公理可以像以前一样写成:
axiomatization where
c0: "A ∪ B = {}"
然而,强制插入只是一种从输入符号中消除混乱的方法。强制在定理中是明确的,你的证明必须处理它们。如果你看一下定理c0
,你会看到强制。
最后评论这些类型的嵌入。预定义的总和类型type1 + type2
完全由type1
类型的所有元素和类型为type2
的元素组成,分别具有强制转换函数Inl
和Inr
。因此,如果您的类型type3
没有其他目的,而不是type1
和type2
的联合,则总和类型可能更方便使用。
另请注意,您的公理表示集A
和B
为空。