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

Isabelle 在《伊莎贝尔》中,为什么这个简化引理没有被取代?,isabelle,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) a

我正在学习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 )
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
这使得证明状态如下所示:

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
然而,将其添加到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>0。0绑定强于==>,这就是simp也不应用归纳假设的原因

因为这个问题没有包含你的目标的所有定义,所以很难找出确切的原因。然而,我建议放弃dddq中的假设a>0,并证明一个更有力的说法


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

谢谢您的回复。目前,我无法删除a>0,因为我的一些其他引理不支持0。特别是一个证明,我的ptser函数是一个递归函数,它定义了一系列的二次幂。。。在简化器移除之前,归纳假设的隐含部分中确实有一个>Suc 0-我假设这是因为初始a>0应用于该上下文并使其冗余。当你对a进行归纳时,你得到的假设Suc a>0很小,因此被移除。如果你的陈述不适用于a=0,那么你可能必须在归纳步骤中区分a=0与否。我的印象是简化者在探索可能简化路径的完整树?在这种情况下,在移除Suc a>0之前,它是否也会检查应用eeek替换的情况?简化器只遵循一条路径。它在外部术语之前重写内部术语。此外,Suc a>0对应用eeek没有帮助,因为eeek中的a被实例化为目标状态中的a,而不是Suc a。我看到了问题——我得到了0