Я работаю над учебником «Программирование и доказательство» Изабеллы, и я прихожу к Ex2.10, где вы должны прийти к уравнению, определяющему количество узлов в «взорванном» дереве.В isabelle, почему эта упрощающая лемма не подставляется?
Подход, который я взял на это, чтобы создать отдельные выражения для внутренних и листовых узлов в дереве, и я работаю на доказательство числа внутренних узлов в дереве, как таковой:
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)"
Спасибо за ваш ответ. Как бы то ни было, я не могу удалить a> 0, потому что некоторые из моих других лемм не имеют значения 0. В частности, доказательство того, что моя функция ptser (рекурсивная функция, определяющая ряд степеней - двух). У него действительно было> (Suc 0) в предполагаемой части гипотезы индукции до того, как она была удалена с помощью упрощения. Я предполагал, что это было потому, что начальный а> 0 применялся в этом контексте и делал его излишним. – DuSTman
Когда вы делаете индукцию над 'a', вы получаете предположение' Suc a> 0', которое выполняется тривиально и поэтому удаляется. Если ваше утверждение не выполняется для 'a = 0', вы, вероятно, должны сделать различие в делах на индукционном шаге:' a = 0'. –
У меня создалось впечатление, что упрощенная работа исследовала полное дерево возможных путей упрощения? В этом случае, не будет ли также рассмотрено дело с применением замены eeek до удаления Suc a> 0? – DuSTman