我正在通过Isabelle"编程和证明"教程,我来到Ex2.10,你必须得到一个方程式,描述一个"爆炸"中的节点数量。树。
我采用的方法是为树中的内部节点和叶节点创建单独的表达式,并且正在研究树中内部节点数量的证明,如下所示:
lemma dddq: " a>0 ⟶ (nodes_noleaf (explode a b) = (ptser (a - 1) (2::nat)) + ((2 ^ a) * (nodes_noleaf b)))"
apply(induction a)
apply(simp)
apply(simp add:eeei eeed eeej eeek )
这样就将证据状态保留为以下内容:
goal (1 subgoal):
1. ⋀a. 0 < a ⟶ nodes_noleaf (explode a b) = ptser (a - Suc 0) 2 + 2 ^ a * nodes_noleaf b ⟹
Suc (2 * nodes_noleaf (explode a b)) = ptser a 2 + 2 * 2 ^ a * nodes_noleaf b
现在,我还创建了(并成功证明)一个应该用ptser a 2 + 2 * 2 ^ a * nodes_noleaf b
代替(Suc (2 * ((ptser (a - Suc 0) 2) + 2 ^ a * nodes_noleaf b))))
的引理,因为:
lemma eeek: "∀ a b . a>0 ⟶ (((ptser a 2) + 2 * 2 ^ a * nodes_noleaf b) = (Suc (2 * ((ptser (a - Suc 0) 2) + 2 ^ a * nodes_noleaf b))))"
apply(auto)
apply(simp add: ddddd)
done
但是,将此添加到dddq的简化列表中没有任何作用,我也看不出原因。
其他定义..
fun nodes_noleaf:: "tree0 ⇒ nat" where
"nodes_noleaf Tip = 0"|
"nodes_noleaf (Node a b) = (add 1 (add (nodes_noleaf a) (nodes_noleaf b)))"
fun explode:: "nat ⇒ tree0 ⇒ tree0" where
"explode 0 t = t" |
"explode (Suc n) t = explode n (Node t t)"
fun ptser:: "nat ⇒ nat ⇒ nat" where
"ptser 0 b = b^0" |
"ptser a b = b^a + (ptser (a - 1) b)"
答案 0 :(得分:0)
你的引理eeek
是一个条件重写规则,因为它只能在简化器证明a > 0
成立时才能应用。但是,在目标状态下,您没有假设a > 0
。 0 < a
是归纳假设的前提条件(-->
强于==>
),这就是为什么simp
也不适用归纳假设的原因。
由于问题并未包含您目标的所有定义,因此很难确切说明原因。尽管如此,我建议从a > 0
中删除dddq
假设并证明更强有力的陈述。
对样式的评论:尝试使用自然演绎框架的连词!!
和==>
,而不是显式通用量词和-->
。简化器知道如何将它们转换回!!
和==>
,但其他证明方法不会自动执行此操作。因此,使用!!
和==>
将在以后为您节省样板证明步骤。