我想根据案例定义证据规则,与proof (cases rule: <rule-name>)
一起使用。我设法使用case_names
和consumes
参数,但我没有设法绑定原理图变量?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看到我使用此文件的完整上下文。
答案 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)
在上面的证据中。