如何在Isabelle中定义一个函数,该函数具有不同的定义,具体取决于其参数的类型或它所使用的上下文的类型?
例如,我可能想要定义类型为is_default
的函数'a ⇒ bool
,其中每个不同类型'a
都有一个可能不同的“默认值”。 (为了论证,我还假设现有的概念,如zero
不合适。)
答案 0 :(得分:3)
Isabelle通过定义常量名称来支持重载定义,然后为常量提供不同类型的新定义。这可以使用consts
命令来定义常量名称,然后使用defs (overloaded)
命令来提供部分定义。
例如:
consts is_default :: "'a ⇒ bool"
defs (overloaded) is_default_nat:
"is_default a ≡ ((a::nat) = 0)"
defs (overloaded) is_default_option:
"is_default a ≡ (a = None)"
上述内容也可以在没有(overloaded)
参数的情况下使用,但会导致Isabelle发出警告。
defs
命令也被赋予一个名称,这是由Isabelle生成的定义的名称,其中包含定义。然后可以在以后的证明中使用此名称:
lemma "¬ is_default (Some 3)"
by (clarsimp simp: is_default_option)
Isablle/Isar reference manual中的“常量和定义”部分提供了更多信息。此外,Obua还有一篇论文"Conservative Overloading in Higher-Order Logic"讨论了一些实现细节,并在不牺牲稳健性的情况下建立了这样的框架。
答案 1 :(得分:2)
这种重载看起来非常适合类型类。首先,为所需函数is_default
定义一个类型类:
class is_default =
fixes is_default :: "'a ⇒ bool"
然后你引入任意实例。例如,对于布尔人来说
instantiation bool :: is_default
begin
definition "is_default (b::bool) ⟷ b"
instance ..
end
和列表
instantiation list :: (type) is_default
begin
definition "is_default (xs::'a list) ⟷ xs = []"
instance ..
end