在Isabelle中定义重载常量

时间:2013-04-08 03:28:39

标签: overloading isabelle

如何在Isabelle中定义一个函数,该函数具有不同的定义,具体取决于其参数的类型或它所使用的上下文的类型?

例如,我可能想要定义类型为is_default的函数'a ⇒ bool,其中每个不同类型'a都有一个可能不同的“默认值”。 (为了论证,我还假设现有的概念,如zero不合适。)

2 个答案:

答案 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