197 qed |
197 qed |
198 |
198 |
199 lemma euler_approx_aux_Suc: |
199 lemma euler_approx_aux_Suc: |
200 "euler_approx_aux (Suc m) = 1 + Suc m * euler_approx_aux m" |
200 "euler_approx_aux (Suc m) = 1 + Suc m * euler_approx_aux m" |
201 unfolding euler_approx_aux_def |
201 unfolding euler_approx_aux_def |
202 by (subst sum_distrib_left) (simp add: atLeastAtMostSuc_conv) |
202 by (subst sum_distrib_left) (simp add: atLeastAtMostSuc_conv mult.commute) |
203 |
203 |
204 lemma eval_euler_approx_aux: |
204 lemma eval_euler_approx_aux: |
205 "euler_approx_aux 0 = 1" |
205 "euler_approx_aux 0 = 1" |
206 "euler_approx_aux 1 = 2" |
206 "euler_approx_aux 1 = 2" |
207 "euler_approx_aux (Suc 0) = 2" |
207 "euler_approx_aux (Suc 0) = 2" |
208 "euler_approx_aux (numeral n) = 1 + numeral n * euler_approx_aux (pred_numeral n)" (is "?th") |
208 "euler_approx_aux (numeral n) = 1 + numeral n * euler_approx_aux (pred_numeral n)" (is "?th") |
209 proof - |
209 proof - |
210 have A: "euler_approx_aux (Suc m) = 1 + Suc m * euler_approx_aux m" for m :: nat |
210 have A: "euler_approx_aux (Suc m) = 1 + Suc m * euler_approx_aux m" for m :: nat |
211 unfolding euler_approx_aux_def |
211 unfolding euler_approx_aux_def |
212 by (subst sum_distrib_left) (simp add: atLeastAtMostSuc_conv) |
212 by (subst sum_distrib_left) (simp add: atLeastAtMostSuc_conv mult.commute) |
213 show ?th by (subst numeral_eq_Suc, subst A, subst numeral_eq_Suc [symmetric]) simp |
213 show ?th by (subst numeral_eq_Suc, subst A, subst numeral_eq_Suc [symmetric]) simp |
214 qed (simp_all add: euler_approx_aux_def) |
214 qed (simp_all add: euler_approx_aux_def) |
215 |
215 |
216 lemma euler_approx_aux_code [code]: |
216 lemma euler_approx_aux_code [code]: |
217 "euler_approx_aux n = (if n = 0 then 1 else 1 + n * euler_approx_aux (n - 1))" |
217 "euler_approx_aux n = (if n = 0 then 1 else 1 + n * euler_approx_aux (n - 1))" |