(* Imagen_inversa_de_la_union.thy
   f⁻¹[A \<union> B] = f⁻¹[A] \<union> f⁻¹[B].
   José A. Alonso Jiménez <https://jaalonso.github.io>
   Sevilla, 5-abril-2024
   ------------------------------------------------------------------ *)

(* ---------------------------------------------------------------------
-- Demostrar que
--    f -` (u \<union> v) = f -` u \<union> f -` v
-- ------------------------------------------------------------------ *)

theory Imagen_inversa_de_la_union
imports Main
begin

(* 1\<ordfeminine> demostración *)

lemma "f -` (u \<union> v) = f -` u \<union> f -` v"
proof (rule equalityI)
  show "f -` (u \<union> v) \<subseteq> f -` u \<union> f -` v"
  proof (rule subsetI)
    fix x
    assume "x \<in> f -` (u \<union> v)"
    then have "f x \<in> u \<union> v"
      by (rule vimageD)
    then show "x \<in> f -` u \<union> f -` v"
    proof (rule UnE)
      assume "f x \<in> u"
      then have "x \<in> f -` u"
        by (rule vimageI2)
      then show "x \<in> f -` u \<union> f -` v"
        by (rule UnI1)
    next
      assume "f x \<in> v"
      then have "x \<in> f -` v"
        by (rule vimageI2)
      then show "x \<in> f -` u \<union> f -` v"
        by (rule UnI2)
    qed
  qed
next
  show "f -` u \<union> f -` v \<subseteq> f -` (u \<union> v)"
  proof (rule subsetI)
    fix x
    assume "x \<in> f -` u \<union> f -` v"
    then show "x \<in> f -` (u \<union> v)"
    proof (rule UnE)
      assume "x \<in> f -` u"
      then have "f x \<in> u"
        by (rule vimageD)
      then have "f x \<in> u \<union> v"
        by (rule UnI1)
      then show "x \<in> f -` (u \<union> v)"
        by (rule vimageI2)
    next
      assume "x \<in> f -` v"
      then have "f x \<in> v"
        by (rule vimageD)
      then have "f x \<in> u \<union> v"
        by (rule UnI2)
      then show "x \<in> f -` (u \<union> v)"
        by (rule vimageI2)
    qed
  qed
qed

(* 2\<ordfeminine> demostración *)

lemma "f -` (u \<union> v) = f -` u \<union> f -` v"
proof
  show "f -` (u \<union> v) \<subseteq> f -` u \<union> f -` v"
  proof
    fix x
    assume "x \<in> f -` (u \<union> v)"
    then have "f x \<in> u \<union> v" by simp
    then show "x \<in> f -` u \<union> f -` v"
    proof
      assume "f x \<in> u"
      then have "x \<in> f -` u" by simp
      then show "x \<in> f -` u \<union> f -` v" by simp
    next
      assume "f x \<in> v"
      then have "x \<in> f -` v" by simp
      then show "x \<in> f -` u \<union> f -` v" by simp
    qed
  qed
next
  show "f -` u \<union> f -` v \<subseteq> f -` (u \<union> v)"
  proof
    fix x
    assume "x \<in> f -` u \<union> f -` v"
    then show "x \<in> f -` (u \<union> v)"
    proof
      assume "x \<in> f -` u"
      then have "f x \<in> u" by simp
      then have "f x \<in> u \<union> v" by simp
      then show "x \<in> f -` (u \<union> v)" by simp
    next
      assume "x \<in> f -` v"
      then have "f x \<in> v" by simp
      then have "f x \<in> u \<union> v" by simp
      then show "x \<in> f -` (u \<union> v)" by simp
    qed
  qed
qed

(* 3\<ordfeminine> demostración *)

lemma "f -` (u \<union> v) = f -` u \<union> f -` v"
  by (simp only: vimage_Un)

(* 4\<ordfeminine> demostración *)

lemma "f -` (u \<union> v) = f -` u \<union> f -` v"
  by auto

end