(* Conmutatividad_de_la_interseccion.thy
   Conmutatividad de la intersección.
   José A. Alonso Jiménez
   Sevilla, 27 de febrero de 2024
   ---------------------------------------------------------------------
*)

(* ---------------------------------------------------------------------
-- Demostrar que
--    s \<inter> t = t \<inter> s
-- ------------------------------------------------------------------ *)

theory Conmutatividad_de_la_interseccion
imports Main
begin

(* 1\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
proof (rule set_eqI)
  fix x
  show "x \<in> s \<inter> t \<longleftrightarrow> x \<in> t \<inter> s"
  proof (rule iffI)
    assume h : "x \<in> s \<inter> t"
    then have xs : "x \<in> s"
      by (simp only: IntD1)
    have xt : "x \<in> t"
      using h by (simp only: IntD2)
    then show "x \<in> t \<inter> s"
      using xs by (rule IntI)
  next
    assume h : "x \<in> t \<inter> s"
    then have xt : "x \<in> t"
      by (simp only: IntD1)
    have xs : "x \<in> s"
      using h by (simp only: IntD2)
    then show "x \<in> s \<inter> t"
      using xt by (rule IntI)
  qed
qed

(* 2\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
proof (rule set_eqI)
  fix x
  show "x \<in> s \<inter> t \<longleftrightarrow> x \<in> t \<inter> s"
  proof
    assume h : "x \<in> s \<inter> t"
    then have xs : "x \<in> s"
      by simp
    have xt : "x \<in> t"
      using h by simp
    then show "x \<in> t \<inter> s"
      using xs by simp
  next
    assume h : "x \<in> t \<inter> s"
    then have xt : "x \<in> t"
      by simp
    have xs : "x \<in> s"
      using h by simp
    then show "x \<in> s \<inter> t"
      using xt by simp
  qed
qed

(* 3\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
proof (rule equalityI)
  show "s \<inter> t \<subseteq> t \<inter> s"
  proof (rule subsetI)
    fix x
    assume h : "x \<in> s \<inter> t"
    then have xs : "x \<in> s"
      by (simp only: IntD1)
    have xt : "x \<in> t"
      using h by (simp only: IntD2)
    then show "x \<in> t \<inter> s"
      using xs by (rule IntI)
  qed
next
  show "t \<inter> s \<subseteq> s \<inter> t"
  proof (rule subsetI)
    fix x
    assume h : "x \<in> t \<inter> s"
    then have xt : "x \<in> t"
      by (simp only: IntD1)
    have xs : "x \<in> s"
      using h by (simp only: IntD2)
    then show "x \<in> s \<inter> t"
      using xt by (rule IntI)
  qed
qed

(* 4\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
proof
  show "s \<inter> t \<subseteq> t \<inter> s"
  proof
    fix x
    assume h : "x \<in> s \<inter> t"
    then have xs : "x \<in> s"
      by simp
    have xt : "x \<in> t"
      using h by simp
    then show "x \<in> t \<inter> s"
      using xs by simp
  qed
next
  show "t \<inter> s \<subseteq> s \<inter> t"
  proof
    fix x
    assume h : "x \<in> t \<inter> s"
    then have xt : "x \<in> t"
      by simp
    have xs : "x \<in> s"
      using h by simp
    then show "x \<in> s \<inter> t"
      using xt by simp
  qed
qed

(* 5\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
proof
  show "s \<inter> t \<subseteq> t \<inter> s"
  proof
    fix x
    assume "x \<in> s \<inter> t"
    then show "x \<in> t \<inter> s"
      by simp
  qed
next
  show "t \<inter> s \<subseteq> s \<inter> t"
  proof
    fix x
    assume "x \<in> t \<inter> s"
    then show "x \<in> s \<inter> t"
      by simp
  qed
qed

(* 6\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
by (fact Int_commute)

(* 7\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
by (fact inf_commute)

(* 8\<ordfeminine> demostración *)
lemma "s \<inter> t = t \<inter> s"
by auto

end