Theory Helpers

theory Helpers
imports Main
section ‹Helpers›

theory Helpers imports Main begin

text ‹
  First, we will prove a few lemmas unrelated to graphs or Menger's Theorem.  These lemmas
  will simplify some of the other proof steps.
›

text ‹
  If two finite sets have different cardinality, then there exists an element in the larger set
  that is not in the smaller set.
›
lemma card_finite_less_ex:
  assumes finite_A: "finite A"
      and finite_B: "finite B"
      and card_AB: "card A < card B"
  shows "∃b ∈ B. b ∉ A"
proof-
  have "card (B - A) > 0" using finite_A finite_B card_AB
    by (meson Diff_eq_empty_iff card_eq_0_iff card_mono finite_Diff gr0I leD)
  then show ?thesis using finite_B
    by (metis Diff_eq_empty_iff card_0_eq finite_Diff neq_iff subsetI)
qed

text ‹
  The cardinality of the union of two disjoint finite sets is the sum of their cardinalities
  even if we intersect everything with a fixed set @{term X}.
›
lemma card_intersect_sum_disjoint:
  assumes "finite B" "finite C" "A = B ∪ C" "B ∩ C = {}"
    shows "card (A ∩ X) = card (B ∩ X) + card (C ∩ X)"
  by (metis (no_types, lifting) Un_Diff_Int assms card_Un_disjoint finite_Int inf.commute
      inf_sup_distrib2 sup_eq_bot_iff)

text ‹
  If @{term x} is in a list @{term xs} but is not its last element, then it is also in
  @{term "butlast xs"}.
›
lemma set_butlast: "⟦ x ∈ set xs; x ≠ last xs ⟧ ⟹ x ∈ set (butlast xs)"
  by (metis butlast.simps(2) in_set_butlast_appendI last.simps last_appendR
      list.set_intros(1) split_list_first)

text ‹
  If a property @{term P} is satisfiable and if we have a weight measure mapping into the natural
  numbers, then there exists an element of minimum weight satisfying @{term P} because the
  natural numbers are well-ordered.
›
lemma arg_min_ex:
  fixes P :: "'a ⇒ bool" and weight :: "'a ⇒ nat"
  assumes "∃x. P x"
  obtains x where "P x" "⋀y. P y ⟹ weight x ≤ weight y"
proof (cases "∃x. P x ∧ weight x = 0")
  case True then show ?thesis using that by auto
next
  case False then show ?thesis
    using that ex_least_nat_le[of "λn. ∃x. P x ∧ weight x = n"] assms by (metis not_le_imp_less)
qed

end