在阅读 this answer on quotient types 时,我偶然发现了结构“case _ of _ ⇒ _
”。检查 the manual 时,没有这样的定义,但是“case _
”(第 6.5.1 节)和“of _
”(第 6.4.3 节)有单独的定义。尽管如此,阅读这些定义只会让我对这个结构的含义更加困惑。
因此,我决定想出一个我可能能够证明的更简单的引理版本,就是这个:
lemma test: "(case n of (0::nat,0::nat) ⇒ (a,b) = n) ⟹ a = 0 ∧ b = 0"
在我的脑海中,在分析了上述问题的上下文后,这个陈述应该等同于"(a,b) = (0,0) ⟹ a = 0 ∧ b = 0"
,这应该是微不足道的。好吧,大锤就不一样了:
"cvc4": Timed out
"z3": Timed out
"e": Timed out
"spass": Timed out
"remote_vampire": The prover gave up
所以我好像误解了这个结构的意思。
有鉴于此,Isabelle 中的语句“case _ of _ ⇒ _
”是什么意思?
答案 0 :(得分:2)
在 Isabelle 中,case _ of _ ⇒ _ | _ ⇒ _ | _ ⇒ _ | ...
类型的语句是一种模式匹配。
您可能需要查看 Isabelle's tutorial 的第 2.5.4 节(第 2.5.5 节和第 2.5.6 节也很有用)。 This question on pattern matching 和 the Wikipedia article 可以提供更多关于模式匹配的一般信息。
您缺少的是不能保证模式是详尽无遗的。如果没有模式匹配,则结果为 undefined
。
Nitpick 实际上会自动在你的引理上找到一个反例:
Nitpicking formula...
Kodkod warning: Interrupt
Nitpick found a counterexample:
Free variables:
a = 1
b = 0
n = (0, 1)
让我们插入 n 的值:
lemma ‹(case (0,1) of (0::nat,0::nat) ⇒ (a,b) = n)⟹ a = 0 ∧ b = 0›
apply simp
(*
proof (prove)
goal (1 subgoal):
1. undefined ⟹ a = 0 ∧ b = 0
*)
编辑,回答以下问题:
(case (0,1) of (0::nat,0::nat) ⇒ (a,b) = n)
的意思大致是 [1]:
(case_prod (0,1) of
(0::nat,0::nat) ⇒ (a,b) = n
| _ ⇒ undefined)
其中 case_prod
是对的析构函数。因此,如果您不匹配任何模式,则结果未定义。
[1] 完整输出:
ML ‹@{term ‹(case (0,1) of (0::nat,0::nat) ⇒ (a,b) = n)›}›
答案 1 :(得分:1)
如前所述,nitpick
在这里很有帮助。幸运的是,修复很简单。
lemma test: "(case n of (0::nat,0::nat) ⇒ (a,b) = n | _ ⇒ False) ⟹ a = 0 ∧ b = 0"
因为您没有绑定任何变量,所以将您的假设重写为条件语句是微不足道的。最后,您可能想了解模式匹配的概念,特别是在函数式编程的上下文中。
lemma test': "(case n of (0::nat,0::nat) ⇒ (a,b) = n | _ ⇒ (a,b) = (0,0)) = ((a,b) = (0,0))"
lemma test'': "(case n of (0::nat,0::nat) ⇒ (a,b) = n) = (if n = (0,0) then (a,b) = n else undefined)"