(* Imagen_de_la_interseccion_de_aplicaciones_inyectivas.thy
-- Si f es inyectiva, entonces f[s] \<inter> f[t] \<subseteq> f[s \<inter> t].
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 15-abril-2024
-- ------------------------------------------------------------------ *)

(* ---------------------------------------------------------------------
-- Demostrar que si f es inyectiva, entonces
--    f ` s \<inter> f ` t \<subseteq> f ` (s \<inter> t)
-- ------------------------------------------------------------------ *)

theory Imagen_de_la_interseccion_de_aplicaciones_inyectivas
imports Main
begin

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

lemma
  assumes "inj f"
  shows "f ` s \<inter> f ` t \<subseteq> f ` (s \<inter> t)"
proof (rule subsetI)
  fix y
  assume "y \<in> f ` s \<inter> f ` t"
  then have "y \<in> f ` s"
    by (rule IntD1)
  then show "y \<in> f ` (s \<inter> t)"
  proof (rule imageE)
    fix x
    assume "y = f x"
    assume "x \<in> s"
    have "x \<in> t"
    proof -
      have "y \<in> f ` t"
        using \<open>y \<in> f ` s \<inter> f ` t\<close> by (rule IntD2)
      then show "x \<in> t"
      proof (rule imageE)
        fix z
        assume "y = f z"
        assume "z \<in> t"
        have "f x = f z"
          using \<open>y = f x\<close> \<open>y = f z\<close> by (rule subst)
        with \<open>inj f\<close> have "x = z"
          by (simp only: inj_eq)
        then show "x \<in> t"
          using \<open>z \<in> t\<close> by (rule ssubst)
      qed
    qed
    with \<open>x \<in> s\<close> have "x \<in> s \<inter> t"
      by (rule IntI)
    with \<open>y = f x\<close> show "y \<in> f ` (s \<inter> t)"
      by (rule image_eqI)
  qed
qed

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

lemma
  assumes "inj f"
  shows "f ` s \<inter> f ` t \<subseteq> f ` (s \<inter> t)"
proof
  fix y
  assume "y \<in> f ` s \<inter> f ` t"
  then have "y \<in> f ` s" by simp
  then show "y \<in> f ` (s \<inter> t)"
  proof
    fix x
    assume "y = f x"
    assume "x \<in> s"
    have "x \<in> t"
    proof -
      have "y \<in> f ` t" using \<open>y \<in> f ` s \<inter> f ` t\<close> by simp
      then show "x \<in> t"
      proof
        fix z
        assume "y = f z"
        assume "z \<in> t"
        have "f x = f z" using \<open>y = f x\<close> \<open>y = f z\<close> by simp
        with \<open>inj f\<close> have "x = z" by (simp only: inj_eq)
        then show "x \<in> t" using \<open>z \<in> t\<close> by simp
      qed
    qed
    with \<open>x \<in> s\<close> have "x \<in> s \<inter> t" by simp
    with \<open>y = f x\<close> show "y \<in> f ` (s \<inter> t)" by simp
  qed
qed

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

lemma
  assumes "inj f"
  shows "f ` s \<inter> f ` t \<subseteq> f ` (s \<inter> t)"
  using assms
  by (simp only: image_Int)

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

lemma
  assumes "inj f"
  shows "f ` s \<inter> f ` t \<subseteq> f ` (s \<inter> t)"
  using assms
  unfolding inj_def
  by auto

end