Isabelle 中的“case _ of _”是什么意思

时间:2021-04-24 16:07:05

标签: isabelle

在阅读 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 _ ⇒ _”是什么意思?

2 个答案:

答案 0 :(得分:2)

在 Isabelle 中,case _ of _ ⇒ _ | _ ⇒ _ | _ ⇒ _ | ... 类型的语句是一种模式匹配。

您可能需要查看 Isabelle's tutorial 的第 2.5.4 节(第 2.5.5 节和第 2.5.6 节也很有用)。 This question on pattern matchingthe 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)"