如何在函数中使用复杂模式?

时间:2017-08-29 06:34:51

标签: isabelle

以下是一个示例函数:

fun divide :: "enat option ⇒ enat option ⇒ real option" where
  "divide (Some ∞) _ = None"
| "divide _ (Some ∞) = None"
| "divide _ (Some 0) = None"
| "divide (Some a) (Some b) = Some (a / b)"
| "divide _ _ = None"

Isabelle HOL向我显示以下错误:

Malformed definition:
Non-constructor pattern not allowed in sequential mode.
⋀uw_. divide uw_ (Some 0) = None

为什么模式匹配适用于Some ∞并且不适用于Some 0是类infinity的常量,0是类zero的常量。这些常数之间有什么区别?

1 个答案:

答案 0 :(得分:5)

fun的模式匹配仅适用于构造函数,这些构造函数通常使用datatypecodatatype命令生成。 (事实上​​,如果使用free_constructors将它们注册为自由构造函数就足够了。)enat中定义的扩展自然~~/src/HOL/Library/Extended_Nat有两个这样的构造函数:和{ {1}}。因此,enat :: nat ⇒ enat不是0的构造函数,而是普通自然enat的构造函数。所以,如果你写

nat

相反,它会起作用,因为模式中只有注册的构造函数。

相反,如果您的理论从APF条目| "divide _ (Some (enat 0)) = None" 导入Coinductive_Nat,则Coinductive已注册为具有构造函数enat0,即好像它是一个codatatype。然后,您可以在eSuc上进行模式匹配,但不能再对0进行模式匹配。