以下是一个示例函数:
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
的常量。这些常数之间有什么区别?
答案 0 :(得分:5)
与fun
的模式匹配仅适用于构造函数,这些构造函数通常使用datatype
和codatatype
命令生成。 (事实上,如果使用free_constructors
将它们注册为自由构造函数就足够了。)enat
中定义的扩展自然~~/src/HOL/Library/Extended_Nat
有两个这样的构造函数:∞
和{ {1}}。因此,enat :: nat ⇒ enat
不是0
的构造函数,而是普通自然enat
的构造函数。所以,如果你写
nat
相反,它会起作用,因为模式中只有注册的构造函数。
相反,如果您的理论从APF条目| "divide _ (Some (enat 0)) = None"
导入Coinductive_Nat
,则Coinductive
已注册为具有构造函数enat
和0
,即好像它是一个codatatype。然后,您可以在eSuc
上进行模式匹配,但不能再对0
进行模式匹配。