Theory Bondy

theory Bondy
imports Main
begin

lemma card_less_if_surj_not_inj:
  " finite A; f ` A = B; ¬ inj_on f A   card B < card A"
by (metis card_image_le inj_on_iff_eq_card order_le_neq_trans)

theorem Bondy : 
  assumes "A  F. A  X" and "card X  1" and "card F = card X"
  shows "D. D  X & card D < card X & card (inter D ` F) = card F"
proof -
  from assms(2,3) have "finite F" and "finite X"
    by (metis card.infinite not_one_le_zero)+
  { fix m
    have "m < card F  D. D  X & card D  m & card (inter D ` F)  m + 1"
    proof (induction m)
      case 0
      hence "{}  X & card {}  0 & card (inter {} ` F)  0 + 1"
        by auto (metis Suc_leI card_eq_0_iff empty_is_image finite_imageI gr0I)
      thus "D. (D  X & card D  0 & card (inter D ` F)  0 + 1)" by blast
    next
      case (Suc m)
      hence "m < card F" by arith
      with Suc.IH obtain D
        where D: "D  X  card D  m  m + 1  card (inter D ` F)" by auto
      with finite X have "finite D" by (auto intro: finite_subset)
      show ?case
      proof (cases "card (inter D ` F) = card F")
        case True
        hence "D  X  card D  Suc m  Suc m + 1  card(inter D ` F)"
          using D Suc.prems by auto
        thus ?thesis by blast
      next
        case False
        hence "~ inj_on (inter D) F" by (auto simp: card_image)
        then obtain A1 A2 where "A1  F" and "A2  F" and 
          "D  A1 = D  A2" and "A1  A2"  by (auto simp: inj_on_def)
        then obtain x where x: "x : (A1 - A2)  (A2 - A1)" by auto
        from A  F. A  X A1  F A2  F x have "x : X" by auto
        let ?E = "insert x D"
        from D finite D have "card ?E  Suc m"
          by (metis (full_types) Suc_le_mono card_insert_if le_Suc_eq)
        moreover with D x:X have "?E  X" by auto
        moreover have "Suc m < card (inter ?E ` F)"
        proof -
          from D  A1 = D  A2 have 1: "(D  (?E  A1)) = (D  (?E  A2))"
            by auto
          from x have 2: "?E Int A1  ?E Int A2" by auto
          have 3: "inter D  inter ?E = inter D" by auto
          have 4: "~ inj_on (inter D) (inter ?E ` F)"
            unfolding inj_on_def using 1 2 A1  F A2  F by blast
          from D have "Suc m  card (inter D ` F)" by auto
          also have "... < card (inter ?E ` F)"
            by (rule card_less_if_surj_not_inj[of _ "inter D"])
              (auto simp add: image_image 3 4 finite F)
          finally show ?thesis .
        qed
        ultimately have "?EX  card ?E  Suc m  Suc m + 1  card (inter ?E ` F)" 
          by auto
        thus "DX. card D  Suc m  Suc m + 1  card (inter D ` F)" by blast
      qed
    qed
  }
  moreover from assms(2,3) have "card X - 1 < card F" by auto
  ultimately obtain D where 
    "D  X & card D  card X - 1 & card (inter D ` F)  (card X - 1) + 1"
    by auto
  moreover with finite F have "card (inter D ` F)  card F"
    by (elim card_image_le)
  ultimately have "D  X & card D < card X & card (inter D ` F) = card F"
    using card F = card X by auto
  thus ?thesis by auto
qed

end