在伊莎贝尔,为什么这个简化引理没有被取代?

In isabelle, why is this simplification lemma not being substituted?

我正在学习 Isabelle "Programming and Proving" 教程,接下来要学习 Ex2.10,您必须在其中得出描述 "exploded" 树中节点数的方程式。

我对此采取的方法是为树中的内部节点和叶节点创建单独的表达式,并且正在为树中的内部节点数进行证明,例如:

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

现在,我还创建(并成功证明)了一个应该用 (Suc (2 * ((ptser (a - Suc 0) 2) + 2 ^ a * nodes_noleaf b)))) 替换 ptser a 2 + 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)"

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

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

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