如何在一个规则中绑定原理图变量?case以便通过案例进行证明?

时间:2013-09-08 17:57:08

标签: proof isabelle

我想根据案例定义证据规则,与proof (cases rule: <rule-name>)一起使用。我设法使用case_namesconsumes参数,但我没有设法绑定原理图变量?case,因此,在使用我的规则进行证明的情况下,可以编写show ?case ...。我如何绑定它?

具体地说:我有Mizar启发的琐事集的概念,即空集或单身集。我想通过 empty singleton 案例分析来证明琐碎集的属性。到目前为止,我有:

definition trivial where "trivial x = (x ⊆ {the_elem x})"

lemma trivial_cases [case_names empty singleton, consumes 1]:
  assumes "trivial X"
  assumes empty: "P {}"
      and singleton: "⋀ x . X = {x} ⟹ P {x}"
  shows "P X"
using assms unfolding trivial_def by (metis subset_singletonD)

我可以按照以下方式使用:

notepad
begin
  fix Q
  fix X::"'a set"
  have "trivial X" sorry
  then have "Q X"
  proof (cases rule: trivial_cases)
    case empty
    show "Q {}" sorry
  next
    case (singleton x)
    show "Q {x}" sorry
  qed
end

但我无法使用show ?case。如果我尝试,它会给我错误消息“未绑定的原理图变量:?case”。证明中的print_cases输出以下内容:

cases:
  empty:
    let "?case" = "?P {}"
  singleton:
    fix x_
    let "?case" = "?P {x_}"
    assume "X = {x_}"

这表明它不起作用,因为?P未绑定到trivial

BTW:我可以在https://github.com/formare/auctions/blob/master/isabelle/Auction/SetUtils.thy看到我使用此文件的完整上下文。

1 个答案:

答案 0 :(得分:3)

正如Joachim已经提到的,与induct不同,cases方法不绑定原理图变量?case。我会说,进行案例分析(作为证明方法)的“规范”方式符合这种设置,因为通常只考虑不同的假设 - 这些假设是穷举的 - 而结论在不同情况下保持不变(在Isabelle中缩写为?thesis)。我会将您的trivial_cases设置如下:

lemma trivial_cases [consumes 1, case_names empty singleton]:
  assumes "trivial X" and "X = {} ⟹ P" and "⋀x . X = {x} ⟹ P"
  shows "P"
  using assms by (auto simp: trivial_def)

然后你可以像

一样使用它
notepad
begin
  fix P and X :: "'a set"
  have "trivial X" sorry
  then have "P X"
  proof (cases rule: trivial_cases)
    case empty
    then show ?thesis sorry
  next
    case (singleton x)
    then show ?thesis sorry
  qed
end

简化器或显式展开分别负责X{}{x}的专业化。

旁注:您可以通过添加属性trivial_cases来进一步调整cases pred: trivial。然后,只要trivial ?X是送到cases的主要假设,就会隐式使用规则trivial_cases,即您可以执行以下操作

have "trivial X" sorry
then have "P X"
proof (cases)

在上面的证据中。