类型转换需要类型之间的显式函数,例如,
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
,你会看到强制。
最后对这些嵌入进行评论。预定义的 sum 类型type1 + type2
完全由 type 的所有元素以及分别具有强制转换函数和type1
的 type组成。因此,如果您的类型除了作为 and 的并集之外没有其他用途,那么 sum 类型可能更便于使用。type2
Inl
Inr
type3
type1
type2
另请注意,您的公理表示集合A
和B
是空的。