在isabelle中,为什么这个简化引理没有被替换?

时间:2015-04-14 22:55:06

标签: isabelle

我正在通过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)"

1 个答案:

答案 0 :(得分:0)

你的引理eeek是一个条件重写规则,因为它只能在简化器证明a > 0成立时才能应用。但是,在目标状态下,您没有假设a > 00 < a是归纳假设的前提条件(-->强于==>),这就是为什么simp也不适用归纳假设的原因。

由于问题并未包含您目标的所有定义,因此很难确切说明原因。尽管如此,我建议从a > 0中删除dddq假设并证明更强有力的陈述。

对样式的评论:尝试使用自然演绎框架的连词!!==>,而不是显式通用量词和-->。简化器知道如何将它们转换回!!==>,但其他证明方法不会自动执行此操作。因此,使用!!==>将在以后为您节省样板证明步骤。