Theory Partial_Order_Reduction.Functions
section ‹Functions›
theory Functions
imports "../Extensions/Set_Extensions"
begin
  locale bounded_function =
    fixes A :: "'a set"
    fixes B :: "'b set"
    fixes f :: "'a ⇒ 'b"
    assumes wellformed[intro?, simp]: "x ∈ A ⟹ f x ∈ B"
  locale bounded_function_pair =
    f: bounded_function A B f +
    g: bounded_function B A g
    for A :: "'a set"
    and B :: "'b set"
    and f :: "'a ⇒ 'b"
    and g :: "'b ⇒ 'a"
  locale injection = bounded_function_pair +
    assumes left_inverse[simp]: "x ∈ A ⟹ g (f x) = x"
  begin
    lemma inj_on[intro]: "inj_on f A" using inj_onI left_inverse by metis
    lemma injective_on:
      assumes "x ∈ A" "y ∈ A" "f x = f y"
      shows "x = y"
      using assms left_inverse by metis
  end
  locale injective = bounded_function +
    assumes injection: "∃ g. injection A B f g"
  begin
    definition "g ≡ SOME g. injection A B f g"
    sublocale injection A B f g unfolding g_def using someI_ex[OF injection] by this
  end
  locale surjection = bounded_function_pair +
    assumes right_inverse[simp]: "y ∈ B ⟹ f (g y) = y"
  begin
    lemma image_superset[intro]: "f ` A ⊇ B"
      using g.wellformed image_iff right_inverse subsetI by metis
    lemma image_eq[simp]: "f ` A = B" using image_superset by auto
  end
  locale surjective = bounded_function +
    assumes surjection: "∃ g. surjection A B f g"
  begin
    definition "g ≡ SOME g. surjection A B f g"
    sublocale surjection A B f g unfolding g_def using someI_ex[OF surjection] by this
  end
  locale bijection = injection + surjection
  lemma inj_on_bijection:
    assumes "inj_on f A"
    shows "bijection A (f ` A) f (inv_into A f)"
  proof
    show "⋀ x. x ∈ A ⟹ f x ∈ f ` A" using imageI by this
    show "⋀ y. y ∈ f ` A ⟹ inv_into A f y ∈ A" using inv_into_into by this
    show "⋀ x. x ∈ A ⟹ inv_into A f (f x) = x" using inv_into_f_f assms by this
    show "⋀ y. y ∈ f ` A ⟹ f (inv_into A f y) = y" using f_inv_into_f by this
  qed
end