Theory Abstract_Renaming_Apart
theory Abstract_Renaming_Apart
  imports Main
begin
section ‹Abstract Renaming›
locale renaming_apart =
  fixes
    renaming :: "'a set ⇒ 'a ⇒ 'a"
  assumes
    renaming_correct: "finite V ⟹ renaming V x ∉ V" and
    inj_renaming: "finite V ⟹ inj (renaming V)"
subsection ‹Interpretation to Prove That Assumptions Are Consistent›
experiment begin
definition renaming_apart_nats where
  "renaming_apart_nats V = (let m = Max V in (λx. Suc (x + m)))"
interpretation renaming_apart_nats: renaming_apart renaming_apart_nats
proof unfold_locales
  show "⋀V x. finite V ⟹ renaming_apart_nats V x ∉ V"
    unfolding renaming_apart_nats_def Let_def by (meson Max.coboundedI Suc_le_lessD not_add_less2)
next
  show "⋀V. inj (renaming_apart_nats V)"
    unfolding renaming_apart_nats_def Let_def by (rule injI) simp
qed
end
end