Theory Auxiliary

section "Some Auxiliary Results"

theory Auxiliary imports Main
begin

lemma disjE3: "P  Q  R  (P  S)  (Q  S)  (R  S)  S" by auto

lemma ge_induct[consumes 1, case_names step]:
  fixes i::nat and j::nat and P::"nat  bool"
  shows "i  j  (n. i  n  ((m  i.  m<n  P m)  P n))  P j"
proof -
  assume a0: "i  j" and a1: "(n. i  n  ((m  i.  m<n  P m)  P n))"
  have "(n. m<n. i  m  P m  i  n  P n)"
  proof
    fix n
    assume a2: "m<n. i  m  P m"
    show "i  n  P n"
    proof -
      assume "i  n"
      with a1 have "(m  i.  m<n  P m)  P n" by simp
      moreover from a2 have "m  i.  m<n  P m" by simp
      ultimately show "P n" by simp
    qed
  qed
  with nat_less_induct[of "λj. i  j  P j" j] have "i  j  P j" .
  with a0 show ?thesis by simp
qed

lemma my_induct[consumes 1, case_names base step]:
  fixes P::"natbool"
assumes less: "i  j"
    and base: "P j"
    and step: "n. i  n  n < j  (n'>n. n'j  P n')  P n"
  shows "P i"
proof cases
  assume "j=0"
  thus ?thesis using less base by simp
next
  assume "¬ j=0"
  have "j - (j - i)  i  P (j - (j - i))"
  proof (rule less_induct[of "λn::nat. j-n  i  P (j-n)" "j-i"])
    fix x assume asmp: "y. y < x  i  j - y  P (j - y)"
    show "i  j - x  P (j - x)"
    proof cases
      assume "x=0"
      with base show ?thesis by simp
    next
      assume "¬ x=0"
      with j  0 have "j - x < j" by simp
      show ?thesis
      proof
        assume "i  j - x"
        moreover have "n'>j-x. n'j  P n'"
        proof
          fix n'
          show "n'>j-x  n'j  P n'"
          proof (rule HOL.impI[OF HOL.impI])
            assume "j - x < n'" and "n'  j"
            hence "j - n' < x" by simp
            moreover from i  j - x j - x < n' have "i  n'" using le_less_trans less_imp_le_nat by blast
            with n'  j have "i  j - (j - n')" by simp
            ultimately have  "P (j - (j - n'))" using asmp by simp
            moreover from n'  j have "j - (j - n') = n'" by simp
            ultimately show "P n'" by simp
          qed
        qed
        ultimately show "P (j - x)" using j-x<j step[of "j-x"] by simp
      qed
    qed
  qed
  moreover from less have "j - (j - i) = i" by simp
  ultimately show ?thesis by simp
qed

lemma Greatest_ex_le_nat: assumes "k. P k  (k'. P k'  k'  k)" shows "¬(n'>Greatest P. P n')"
  by (metis Greatest_equality assms less_le_not_le)

lemma cardEx: assumes "finite A" and "finite B" and "card A > card B" shows "xA. ¬ xB"
proof cases
  assume "A  B"
  with assms have "card Acard B" using card_mono by blast
  with assms have False by simp
  thus ?thesis by simp
next
  assume "¬ A  B" 
  thus ?thesis by auto
qed

lemma cardshift: "card {i::nat. i>n  i  n'  p (n'' + i)} = card {i. i>(n + n'')  i  (n' + n'')  p i}"
proof -
  let ?f="λi. i+n''"
  have "bij_betw ?f {i::nat. i>n  i  n'  p (n'' + i)} {i. i>(n + n'')  i  (n' + n'')  p i}"
  proof (rule bij_betwI')
    fix x y assume "x  {i. n < i  i  n'  p (n'' + i)}" and "y  {i. n < i  i  n'  p (n'' + i)}"
    show "(x + n'' = y + n'') = (x = y)" by simp
  next
    fix x::nat assume "x  {i. n < i  i  n'  p (n'' + i)}"
    hence "n<x" and "x  n'" and "p(n''+x)" by auto
    moreover have "n''+x=x+n''" by simp
    ultimately have "n + n'' < x + n''" and "x + n''  n' + n''" and "p (x + n'')" by auto
    thus "x + n''  {i. n + n'' < i  i  n' + n''  p i}" by auto
  next
    fix y::nat assume "y  {i. n + n'' < i  i  n' + n''  p i}"
    hence "n+n''<y" and "yn'+n''" and "p y" by auto
    then obtain x where "x=y-n''" by simp
    with n+n''<y have "y=x+n''" by simp
    moreover from x=y-n'' n+n''<y have "x>n" by simp
    moreover from x=y-n'' yn'+n'' have "xn'" by simp
    moreover from y=x+n'' have "y=n''+x" by simp
    with p y have "p (n'' + x)" by simp
    ultimately show "x{i. n < i  i  n'  p (n'' + i)}. y = x + n''" by auto
  qed
  thus ?thesis using bij_betw_same_card by auto
qed

end