假设我有一个关于简单归纳定义集的引理:
inductive_set foo :: "'a ⇒ 'a list set" for x :: 'a where
"[] ∈ foo x" | "[x] ∈ foo x"
lemma "⋀x y. y ∈ foo x ⟹ qux x y ⟹ baz x y"
(对我来说,保留“⋀x y”位很重要,因为引理实际上是在说明我的证明处于长应用链中间的状态。)
我在开始证明这个引理时遇到了麻烦。我想通过规则归纳来进行。
第一次尝试
我试着写
apply (induct rule: foo.induct)
但这不起作用:该induct
方法失败。我发现我可以通过修复x
并y
明确地解决这个问题,然后调用该induct
方法,如下所示:
proof -
fix x :: 'a
fix y :: "'a list"
assume "y ∈ foo x" and "qux x y"
thus "baz x y"
apply (induct rule: foo.induct)
oops
但是,由于我实际上处于应用链的中间,因此我宁愿不输入结构化证明块。
第二次尝试
我尝试使用该induct_tac
方法,但不幸induct_tac
的是没有foo.induct
以我想要的方式应用该规则。如果我输入
apply (induct_tac rule: foo.induct, assumption)
那么第一个子目标是
⋀x y. y ∈ foo x ⟹ qux x y ⟹ baz x []
这不是我想要的:我想要qux x []
而不是qux x y
. 该induct
方法做到了这一点,但还有其他问题,如上所述。