"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)"