(* Imagen_inversa_de_la_interseccion.thy
   f⁻¹[u \<inter> v] = f⁻¹[u] \<inter> f⁻¹[v]
   José A. Alonso Jiménez <https://jaalonso.github.io>
   Sevilla, 12-marzo-2024
   ------------------------------------------------------------------ *)

(* ---------------------------------------------------------------------
  En Isabelle/HOL, la imagen inversa de un conjunto s (de elementos de
  tipo \<beta>) por la función f (de tipo \<alpha> \<rightarrow> \<beta>) es el conjunto `f -` s` de
  elementos x (de tipo \<alpha>) tales que `f x \<in> s`.

   Demostrar que
      f ⁻¹' (u \<inter> v) = f ⁻¹' u \<inter> f ⁻¹' v
  ------------------------------------------------------------------- *)

theory Imagen_inversa_de_la_interseccion
imports Main
begin

(* 1\<ordfeminine> demostración *)
lemma "f -` (u \<inter> v) = f -` u \<inter> f -` v"
proof (rule equalityI)
  show "f -` (u \<inter> v) \<subseteq> f -` u \<inter> f -` v"
  proof (rule subsetI)
    fix x
    assume "x \<in> f -` (u \<inter> v)"
    then have h : "f x \<in> u \<inter> v"
      by (simp only: vimage_eq)
    have "x \<in> f -` u"
    proof -
      have "f x \<in> u"
        using h by (rule IntD1)
      then show "x \<in> f -` u"
        by (rule vimageI2)
    qed
    moreover
    have "x \<in> f -` v"
    proof -
      have "f x \<in> v"
        using h by (rule IntD2)
      then show "x \<in> f -` v"
        by (rule vimageI2)
    qed
    ultimately show "x \<in> f -` u \<inter> f -` v"
      by (rule IntI)
  qed
next
  show "f -` u \<inter> f -` v \<subseteq> f -` (u \<inter> v)"
  proof (rule subsetI)
    fix x
    assume h2 : "x \<in> f -` u \<inter> f -` v"
    have "f x \<in> u"
    proof -
      have "x \<in> f -` u"
        using h2 by (rule IntD1)
      then show "f x \<in> u"
        by (rule vimageD)
    qed
    moreover
    have "f x \<in> v"
    proof -
      have "x \<in> f -` v"
        using h2 by (rule IntD2)
      then show "f x \<in> v"
        by (rule vimageD)
    qed
    ultimately have "f x \<in> u \<inter> v"
      by (rule IntI)
    then show "x \<in> f -` (u \<inter> v)"
      by (rule vimageI2)
  qed
qed

(* 2\<ordfeminine> demostración *)
lemma "f -` (u \<inter> v) = f -` u \<inter> f -` v"
proof
  show "f -` (u \<inter> v) \<subseteq> f -` u \<inter> f -` v"
  proof
    fix x
    assume "x \<in> f -` (u \<inter> v)"
    then have h : "f x \<in> u \<inter> v"
      by simp
    have "x \<in> f -` u"
    proof -
      have "f x \<in> u"
        using h by simp
      then show "x \<in> f -` u"
        by simp
    qed
    moreover
    have "x \<in> f -` v"
    proof -
      have "f x \<in> v"
        using h by simp
      then show "x \<in> f -` v"
        by simp
    qed
    ultimately show "x \<in> f -` u \<inter> f -` v"
      by simp
  qed
next
  show "f -` u \<inter> f -` v \<subseteq> f -` (u \<inter> v)"
  proof
    fix x
    assume h2 : "x \<in> f -` u \<inter> f -` v"
    have "f x \<in> u"
    proof -
      have "x \<in> f -` u"
        using h2 by simp
      then show "f x \<in> u"
        by simp
    qed
    moreover
    have "f x \<in> v"
    proof -
      have "x \<in> f -` v"
        using h2 by simp
      then show "f x \<in> v"
        by simp
    qed
    ultimately have "f x \<in> u \<inter> v"
      by simp
    then show "x \<in> f -` (u \<inter> v)"
      by simp
  qed
qed

(* 3\<ordfeminine> demostración *)
lemma "f -` (u \<inter> v) = f -` u \<inter> f -` v"
proof
  show "f -` (u \<inter> v) \<subseteq> f -` u \<inter> f -` v"
  proof
    fix x
    assume h1 : "x \<in> f -` (u \<inter> v)"
    have "x \<in> f -` u" using h1 by simp
    moreover
    have "x \<in> f -` v" using h1 by simp
    ultimately show "x \<in> f -` u \<inter> f -` v" by simp
  qed
next
  show "f -` u \<inter> f -` v \<subseteq> f -` (u \<inter> v)"
  proof
    fix x
    assume h2 : "x \<in> f -` u \<inter> f -` v"
    have "f x \<in> u" using h2 by simp
    moreover
    have "f x \<in> v" using h2 by simp
    ultimately have "f x \<in> u \<inter> v" by simp
    then show "x \<in> f -` (u \<inter> v)" by simp
  qed
qed

(* 4\<ordfeminine> demostración *)
lemma "f -` (u \<inter> v) = f -` u \<inter> f -` v"
  by (simp only: vimage_Int)

(* 5\<ordfeminine> demostración *)
lemma "f -` (u \<inter> v) = f -` u \<inter> f -` v"
  by auto

end