# Theory HOL-Real_Asymp.Eventuallize

```section ‹Lifting theorems onto filters›
theory Eventuallize
imports Complex_Main
begin

text ‹
The following attribute and ML function lift a given theorem of the form
\<^prop>‹∀x. A x ⟶ B x ⟶ C x›
to
\<^prop>‹eventually A F ⟹ eventually B F ⟹ eventually C F› .
›

ML ‹
signature EVENTUALLIZE =
sig
val eventuallize : Proof.context -> thm -> int option -> thm
end

structure Eventuallize : EVENTUALLIZE =
struct

fun dest_All (Const (\<^const_name>‹HOL.All›, _) \$ Abs (x, T, t)) = (x, T, t)
| dest_All (Const (\<^const_name>‹HOL.All›, T) \$ f) =
("x", T |> dest_funT |> fst |> dest_funT |> fst, f \$ Bound 0)
| dest_All t = raise TERM ("dest_All", [t])

fun strip_imp (\<^term>‹(⟶)› \$ a \$ b) = apfst (cons a) (strip_imp b)
| strip_imp t = ([], t)

fun eventuallize ctxt thm n =
let
fun err n = raise THM ("Invalid index in eventuallize: " ^ Int.toString n, 0, [thm])
val n_max =
thm |> Thm.concl_of |> HOLogic.dest_Trueprop |> dest_All |> #3 |> strip_imp |> fst |> length
val _ = case n of NONE => () | SOME n =>
if n >= 0 andalso n <= n_max then () else err n
val n = case n of SOME n => n | NONE => n_max
fun conv n =
if n < 2 then Conv.all_conv else Conv.arg_conv (conv (n - 1)) then_conv
Conv.rewr_conv @{thm eq_reflection[OF imp_conjL [symmetric]]}
val conv = Conv.arg_conv (Conv.binder_conv (K (conv n)) ctxt)
val thm' = Conv.fconv_rule conv thm
fun go n = if n < 2 then @{thm _} else @{thm eventually_conj} OF [@{thm _}, go (n - 1)]
in
@{thm eventually_rev_mp[OF _ always_eventually]} OF [go n, thm']
end

end
›

attribute_setup eventuallized = ‹
Scan.lift (Scan.option Parse.nat) >>
(fn n => fn (ctxt, thm) =>
(NONE, SOME (Eventuallize.eventuallize (Context.proof_of ctxt) thm n)))
›

end```