"case _ of _"在伊莎贝尔中是什么意思
What does "case _ of _" mean in Isabelle
阅读, I stumbled upon the construct "case _ of _ ⇒ _
". Upon checking 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
所以我好像误解了这个构造的意思。
鉴于此,伊莎贝尔的声明“case _ of _ ⇒ _
”是什么意思?
在 Isabelle 中,case _ of _ ⇒ _ | _ ⇒ _ | _ ⇒ _ | ...
类型的语句是模式匹配的一种形式。
您可能需要查看 Isabelle's tutorial (§2.5.5 and §2.5.6 are also useful). This question on pattern matching and the Wikipedia article 的第 2.5.4 节,可能会提供有关模式匹配的更多信息。
您缺少的是不能保证模式是详尽无遗的。如果没有模式匹配,则结果为 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)›}›
如前所述,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)"
阅读case _ of _ ⇒ _
". Upon checking 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
所以我好像误解了这个构造的意思。
鉴于此,伊莎贝尔的声明“case _ of _ ⇒ _
”是什么意思?
在 Isabelle 中,case _ of _ ⇒ _ | _ ⇒ _ | _ ⇒ _ | ...
类型的语句是模式匹配的一种形式。
您可能需要查看 Isabelle's tutorial (§2.5.5 and §2.5.6 are also useful). This question on pattern matching and the Wikipedia article 的第 2.5.4 节,可能会提供有关模式匹配的更多信息。
您缺少的是不能保证模式是详尽无遗的。如果没有模式匹配,则结果为 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)›}›
如前所述,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)"