Theory Estimation_Method
section "The @{text estimation} tactic"
theory Estimation_Method
imports Main "HOL-Eisbach.Eisbach_Tools"
begin
text "A few useful lemmas for working with inequalities."
lemma if_prop_cong:
assumes "C = C'"
assumes "C ⟹ P A A'"
assumes "¬ C ⟹ P B B'"
shows "P (if C then A else B) (if C' then A' else B')"
using assms by simp
lemma if_leqI:
assumes "C ⟹ A ≤ t"
assumes "¬ C ⟹ B ≤ t"
shows "(if C then A else B) ≤ t"
using assms by simp
lemma if_le_max:
"(if C then (t1 :: 'a :: linorder) else t2) ≤ max t1 t2"
by simp
text "Prove some inequality by showing a chain of inequalities via an intermediate term."
method itrans for step :: "'a :: order" =
(match conclusion in "s ≤ t" for s t :: 'a ⇒ ‹rule order.trans[of s step t]›)
text "A collection of monotonicity intro rules that will be automatically used by @{text estimation}."
lemmas mono_intros =
order.refl add_mono diff_mono mult_le_mono max.mono min.mono power_increasing power_mono
iffD2[OF Suc_le_mono] if_prop_cong[where P = "(≤)"] Nat.le0 one_le_numeral
text "Try to apply a given estimation rule @{text estimate} in a forward-manner."
method estimation uses estimate =
(match estimate in "⋀a. f a ≤ h a" (multi) for f h ⇒ ‹
match conclusion in "g f ≤ t" for g and t :: nat ⇒
‹rule order.trans[of "g f" "g h" t], intro mono_intros refl estimate››
¦ "x ≤ y" for x y ⇒ ‹
match conclusion in "g x ≤ t" for g and t :: nat ⇒
‹rule order.trans[of "g x" "g y" t], intro mono_intros refl estimate››)
end