| 
368
 | 
     1  | 
theory WQO_Finite_Lists
  | 
| 
 | 
     2  | 
imports "Seq"
  | 
| 
 | 
     3  | 
begin
  | 
| 
 | 
     4  | 
  | 
| 
 | 
     5  | 
subsection {* Auxiliary Lemmas *}
 | 
| 
 | 
     6  | 
  | 
| 
 | 
     7  | 
lemma funpow_non_decreasing:
  | 
| 
 | 
     8  | 
  fixes f :: "'a::order \<Rightarrow> 'a"
  | 
| 
 | 
     9  | 
  assumes "\<forall>i\<ge>n. f i \<ge> i"
  | 
| 
 | 
    10  | 
  shows "(f ^^ i) n \<ge> n"
  | 
| 
 | 
    11  | 
  using assms by (induct i) auto
  | 
| 
 | 
    12  | 
  | 
| 
 | 
    13  | 
lemma funpow_mono:
  | 
| 
 | 
    14  | 
  assumes "\<forall>i\<ge>n::nat. f i > i" and "j > i"
  | 
| 
 | 
    15  | 
  shows "(f ^^ j) n > (f ^^ i) n"
  | 
| 
 | 
    16  | 
using assms(2)
  | 
| 
 | 
    17  | 
proof (induct "j - i" arbitrary: i j)
  | 
| 
 | 
    18  | 
  case 0 thus ?case by simp
  | 
| 
 | 
    19  | 
next
  | 
| 
 | 
    20  | 
  case (Suc m)
  | 
| 
 | 
    21  | 
  then obtain j' where j: "j = Suc j'" by (cases j) auto
  | 
| 
 | 
    22  | 
  show ?case
  | 
| 
 | 
    23  | 
  proof (cases "i < j'")
  | 
| 
 | 
    24  | 
    case True
  | 
| 
 | 
    25  | 
    with Suc(1)[of j'] and Suc(2)[unfolded j]
  | 
| 
 | 
    26  | 
      have "(f ^^ j') n > (f ^^ i) n" by simp
  | 
| 
 | 
    27  | 
    moreover have "(f ^^ j) n > (f ^^ j') n"
  | 
| 
 | 
    28  | 
    proof -
  | 
| 
 | 
    29  | 
      have "(f ^^ j) n = f ((f ^^ j') n)" by (simp add: j)
  | 
| 
 | 
    30  | 
      also have "\<dots> > (f ^^ j') n" using assms and funpow_non_decreasing[of n f j'] by force
  | 
| 
 | 
    31  | 
      finally show ?thesis .
  | 
| 
 | 
    32  | 
    qed
  | 
| 
 | 
    33  | 
    ultimately show ?thesis by auto
  | 
| 
 | 
    34  | 
  next
  | 
| 
 | 
    35  | 
    case False
  | 
| 
 | 
    36  | 
    with Suc have i: "i = j'" unfolding j by (induct i) auto
  | 
| 
 | 
    37  | 
    show ?thesis unfolding i j using assms and funpow_non_decreasing[of n f j'] by force
  | 
| 
 | 
    38  | 
  qed
  | 
| 
 | 
    39  | 
qed
  | 
| 
 | 
    40  | 
  | 
| 
 | 
    41  | 
  | 
| 
 | 
    42  | 
subsection {* Basic Definitions *}
 | 
| 
 | 
    43  | 
  | 
| 
 | 
    44  | 
definition reflp_on :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a set \<Rightarrow> bool" where
 | 
| 
 | 
    45  | 
  "reflp_on P A \<equiv> \<forall>a\<in>A. P a a"
  | 
| 
 | 
    46  | 
  | 
| 
 | 
    47  | 
lemma reflp_onI [Pure.intro]:
  | 
| 
 | 
    48  | 
  "(\<And>a. a \<in> A \<Longrightarrow> P a a) \<Longrightarrow> reflp_on P A"
  | 
| 
 | 
    49  | 
  unfolding reflp_on_def by blast
  | 
| 
 | 
    50  | 
  | 
| 
 | 
    51  | 
definition transp_on :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a set \<Rightarrow> bool" where
 | 
| 
 | 
    52  | 
  "transp_on P A \<equiv> \<forall>a\<in>A. \<forall>b\<in>A. \<forall>c\<in>A. P a b \<and> P b c \<longrightarrow> P a c"
  | 
| 
 | 
    53  | 
  | 
| 
 | 
    54  | 
lemma transp_onI [Pure.intro]:
  | 
| 
 | 
    55  | 
  "(\<And>a b c. \<lbrakk>a \<in> A; b \<in> A; c \<in> A; P a b; P b c\<rbrakk> \<Longrightarrow> P a c) \<Longrightarrow> transp_on P A"
  | 
| 
 | 
    56  | 
  unfolding transp_on_def by blast
  | 
| 
 | 
    57  | 
  | 
| 
 | 
    58  | 
definition goodp :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a seq \<Rightarrow> bool" where
 | 
| 
 | 
    59  | 
  "goodp P f \<equiv> \<exists>i j. i < j \<and> P\<^sup>=\<^sup>= (f i) (f j)"
  | 
| 
 | 
    60  | 
  | 
| 
 | 
    61  | 
abbreviation bad where "bad P f \<equiv> \<not> goodp P f"
  | 
| 
 | 
    62  | 
  | 
| 
 | 
    63  | 
definition wqo_on :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a set \<Rightarrow> bool" where
 | 
| 
 | 
    64  | 
  "wqo_on P A \<equiv> reflp_on P A \<and> transp_on P A \<and> (\<forall>f. (\<forall>i. f i \<in> A) \<longrightarrow> goodp P f)"
  | 
| 
 | 
    65  | 
  | 
| 
 | 
    66  | 
lemma wqo_onI [Pure.intro]:
  | 
| 
 | 
    67  | 
  "\<lbrakk>reflp_on P A; transp_on P A; \<And>f. \<forall>i. f i \<in> A \<Longrightarrow> goodp P f\<rbrakk> \<Longrightarrow> wqo_on P A"
  | 
| 
 | 
    68  | 
  unfolding wqo_on_def by blast
  | 
| 
 | 
    69  | 
  | 
| 
 | 
    70  | 
lemma reflp_on_reflclp [simp]:
  | 
| 
 | 
    71  | 
  assumes "reflp_on P A" and "a \<in> A" and "b \<in> A"
  | 
| 
 | 
    72  | 
  shows "P\<^sup>=\<^sup>= a b = P a b"
  | 
| 
 | 
    73  | 
  using assms by (auto simp: reflp_on_def)
  | 
| 
 | 
    74  | 
  | 
| 
 | 
    75  | 
lemma transp_on_tranclp:
  | 
| 
 | 
    76  | 
  assumes "transp_on P A"
  | 
| 
 | 
    77  | 
  shows "(\<lambda>x y. x \<in> A \<and> y \<in> A \<and> P x y)\<^sup>+\<^sup>+ a b \<longleftrightarrow> a \<in> A \<and> b \<in> A \<and> P a b"
  | 
| 
 | 
    78  | 
    (is "?lhs = ?rhs")
  | 
| 
 | 
    79  | 
  by (rule iffI, induction rule: tranclp.induct)
  | 
| 
 | 
    80  | 
     (insert assms, auto simp: transp_on_def)
  | 
| 
 | 
    81  | 
  | 
| 
 | 
    82  | 
lemma wqo_on_imp_reflp_on:
  | 
| 
 | 
    83  | 
  "wqo_on P A \<Longrightarrow> reflp_on P A"
  | 
| 
 | 
    84  | 
  by (auto simp: wqo_on_def)
  | 
| 
 | 
    85  | 
  | 
| 
 | 
    86  | 
lemma wqo_on_imp_transp_on:
  | 
| 
 | 
    87  | 
  "wqo_on P A \<Longrightarrow> transp_on P A"
  | 
| 
 | 
    88  | 
  by (auto simp: wqo_on_def)
  | 
| 
 | 
    89  | 
  | 
| 
 | 
    90  | 
lemma wqo_on_imp_goodp:
  | 
| 
 | 
    91  | 
  "wqo_on P A \<Longrightarrow> \<forall>i. f i \<in> A \<Longrightarrow> goodp P f"
  | 
| 
 | 
    92  | 
  by (auto simp: wqo_on_def)
  | 
| 
 | 
    93  | 
  | 
| 
 | 
    94  | 
lemma reflp_on_converse:
  | 
| 
 | 
    95  | 
  "reflp_on P A \<Longrightarrow> reflp_on P\<inverse>\<inverse> A"
  | 
| 
 | 
    96  | 
  unfolding reflp_on_def by blast
  | 
| 
 | 
    97  | 
  | 
| 
 | 
    98  | 
lemma transp_on_converse:
  | 
| 
 | 
    99  | 
  "transp_on P A \<Longrightarrow> transp_on P\<inverse>\<inverse> A"
  | 
| 
 | 
   100  | 
  unfolding transp_on_def by blast
  | 
| 
 | 
   101  | 
  | 
| 
 | 
   102  | 
subsection {* Dickson's Lemma *}
 | 
| 
 | 
   103  | 
  | 
| 
 | 
   104  | 
text {*When two sets are wqo, then their cartesian product is wqo.*}
 | 
| 
 | 
   105  | 
  | 
| 
 | 
   106  | 
definition
  | 
| 
 | 
   107  | 
  prod_le :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> ('b \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> 'a \<times> 'b \<Rightarrow> 'a \<times> 'b \<Rightarrow> bool"
 | 
| 
 | 
   108  | 
where
  | 
| 
 | 
   109  | 
  "prod_le P1 P2 \<equiv> \<lambda>(p1, p2) (q1, q2). P1 p1 q1 \<and> P2 p2 q2"
  | 
| 
 | 
   110  | 
  | 
| 
 | 
   111  | 
lemma wqo_on_Sigma:
  | 
| 
 | 
   112  | 
  fixes A1 :: "'a set" and A2 :: "'b set"
  | 
| 
 | 
   113  | 
  assumes "wqo_on P1 A1" and "wqo_on P2 A2"
  | 
| 
 | 
   114  | 
  shows "wqo_on (prod_le P1 P2) (A1 \<times> A2)"
  | 
| 
 | 
   115  | 
    (is "wqo_on ?P ?A")
  | 
| 
 | 
   116  | 
proof
  | 
| 
 | 
   117  | 
  show "reflp_on ?P ?A"
  | 
| 
 | 
   118  | 
    using assms by (auto simp: wqo_on_def reflp_on_def prod_le_def)
  | 
| 
 | 
   119  | 
next
  | 
| 
 | 
   120  | 
  from assms have "transp_on P1 A1" and "transp_on P2 A2" by (auto simp: wqo_on_def)
  | 
| 
 | 
   121  | 
  thus "transp_on ?P ?A" unfolding transp_on_def prod_le_def by blast
  | 
| 
 | 
   122  | 
next
  | 
| 
 | 
   123  | 
  fix g :: "('a \<times> 'b) seq"
 | 
| 
 | 
   124  | 
  let ?p = "\<lambda>i. fst (g i)"
  | 
| 
 | 
   125  | 
  let ?q = "\<lambda>i. snd (g i)"
  | 
| 
 | 
   126  | 
  assume g: "\<forall>i. g i \<in> ?A"
  | 
| 
 | 
   127  | 
  have p: "\<forall>i. ?p i \<in> A1"
  | 
| 
 | 
   128  | 
  proof
  | 
| 
 | 
   129  | 
    fix i
  | 
| 
 | 
   130  | 
    from g have "g i \<in> ?A" by simp
  | 
| 
 | 
   131  | 
    thus "?p i \<in> A1" by auto
  | 
| 
 | 
   132  | 
  qed
  | 
| 
 | 
   133  | 
  have q: "\<forall>i. ?q i \<in> A2"
  | 
| 
 | 
   134  | 
  proof
  | 
| 
 | 
   135  | 
    fix i
  | 
| 
 | 
   136  | 
    from g have "g i \<in> ?A" by simp
  | 
| 
 | 
   137  | 
    thus "?q i \<in> A2" by auto
  | 
| 
 | 
   138  | 
  qed
  | 
| 
 | 
   139  | 
  let ?T = "{m. \<forall>n>m. \<not> (P1 (?p m) (?p n))}"
 | 
| 
 | 
   140  | 
  have "finite ?T"
  | 
| 
 | 
   141  | 
  proof (rule ccontr)
  | 
| 
 | 
   142  | 
    assume "infinite ?T"
  | 
| 
 | 
   143  | 
    hence "INFM m. m \<in> ?T" unfolding INFM_iff_infinite by simp
  | 
| 
 | 
   144  | 
    then interpret infinitely_many "\<lambda>m. m \<in> ?T" by (unfold_locales) assumption
  | 
| 
 | 
   145  | 
    let ?p' = "\<lambda>i. ?p (index i)"
  | 
| 
 | 
   146  | 
    have p': "\<forall>i. ?p' i \<in> A1" using p by auto
  | 
| 
 | 
   147  | 
    have "bad P1 ?p'"
  | 
| 
 | 
   148  | 
    proof
  | 
| 
 | 
   149  | 
      assume "goodp P1 ?p'"
  | 
| 
 | 
   150  | 
      then obtain i j :: nat where "i < j"
  | 
| 
 | 
   151  | 
        and "P1\<^sup>=\<^sup>= (?p' i) (?p' j)" by (auto simp: goodp_def)
  | 
| 
 | 
   152  | 
      hence "P1 (?p' i) (?p' j)"
  | 
| 
 | 
   153  | 
        using p' and reflp_on_reflclp[OF wqo_on_imp_reflp_on[OF assms(1)]] by simp
  | 
| 
 | 
   154  | 
      moreover from index_ordered_less[OF `i < j`] have "index j > index i" .
  | 
| 
 | 
   155  | 
      moreover from index_p have "index i \<in> ?T" by simp
  | 
| 
 | 
   156  | 
      ultimately show False by blast
  | 
| 
 | 
   157  | 
    qed
  | 
| 
 | 
   158  | 
    with assms(1) show False using p' by (auto simp: wqo_on_def)
  | 
| 
 | 
   159  | 
  qed
  | 
| 
 | 
   160  | 
  then obtain n where "\<forall>r\<ge>n. r \<notin> ?T"
  | 
| 
 | 
   161  | 
    using infinite_nat_iff_unbounded_le[of "?T"] by auto
  | 
| 
 | 
   162  | 
  hence "\<forall>i\<in>{n..}. \<exists>j>i. P1 (?p i) (?p j)" by blast
 | 
| 
 | 
   163  | 
  with p have "\<forall>i\<in>{n..}. \<exists>j>i. ?p j \<in> A1 \<and> ?p i \<in> A1 \<and> P1 (?p i) (?p j)" by auto
 | 
| 
 | 
   164  | 
  from bchoice[OF this] obtain f :: "nat seq"
  | 
| 
 | 
   165  | 
    where 1: "\<forall>i\<ge>n. i < f i \<and> ?p i \<in> A1 \<and> ?p (f i) \<in> A1 \<and> P1 (?p i) (?p (f i))" by blast
  | 
| 
 | 
   166  | 
  from stepfun_imp_chainp[of n f "\<lambda>x y. x \<in> A1 \<and> y \<in> A1 \<and> P1 x y" ?p, OF this]
  | 
| 
 | 
   167  | 
    have chain: "chainp (\<lambda>x y. x \<in> A1 \<and> y \<in> A1 \<and> P1 x y) (\<lambda>i. ?p ((f^^i) n))" .
  | 
| 
 | 
   168  | 
  let ?f = "\<lambda>i. (f^^i) n"
  | 
| 
 | 
   169  | 
  from 1 have inc: "\<forall>i\<ge>n. f i > i" by simp
  | 
| 
 | 
   170  | 
  from wqo_on_imp_goodp[OF assms(2), of "?q \<circ> ?f"] and q
  | 
| 
 | 
   171  | 
    obtain i j where "\<And>i. ?q (?f i) \<in> A2" and "j > i" and "P2\<^sup>=\<^sup>= (?q (?f i)) (?q (?f j))"
  | 
| 
 | 
   172  | 
    by (auto simp: goodp_def)
  | 
| 
 | 
   173  | 
  hence "P2 (?q (?f i)) (?q (?f j))"
  | 
| 
 | 
   174  | 
    using reflp_on_reflclp[OF wqo_on_imp_reflp_on[OF assms(2)]] by simp
  | 
| 
 | 
   175  | 
  moreover from funpow_mono[OF inc `j > i`] have "?f j > ?f i" .
  | 
| 
 | 
   176  | 
  moreover from chainp_imp_tranclp[of "\<lambda>x y. x \<in> A1 \<and> y \<in> A1 \<and> P1 x y", OF chain `j > i`]
  | 
| 
 | 
   177  | 
    have "P1 (?p (?f i)) (?p (?f j))"
  | 
| 
 | 
   178  | 
    unfolding transp_on_tranclp[OF wqo_on_imp_transp_on[OF assms(1)]] by simp
  | 
| 
 | 
   179  | 
  ultimately have "\<exists>i j. j > i \<and> P1 (?p i) (?p j) \<and> P2 (?q i) (?q j)" by auto
  | 
| 
 | 
   180  | 
  thus "goodp ?P g" by (auto simp: split_def goodp_def prod_le_def)
  | 
| 
 | 
   181  | 
qed
  | 
| 
 | 
   182  | 
  | 
| 
 | 
   183  | 
subsection {* Higman's Lemma *}
 | 
| 
 | 
   184  | 
  | 
| 
 | 
   185  | 
inductive
  | 
| 
 | 
   186  | 
  emb :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool"
  | 
| 
 | 
   187  | 
where
  | 
| 
 | 
   188  | 
  emb0 [intro]: "emb [] y"
  | 
| 
 | 
   189  | 
| emb1 [intro]: "emb x y \<Longrightarrow> emb x (c # y)"
  | 
| 
 | 
   190  | 
| emb2 [intro]: "emb x y \<Longrightarrow> emb (c # x) (c # y)"
  | 
| 
 | 
   191  | 
  | 
| 
 | 
   192  | 
lemma emb_refl [simp]: "emb xs xs"
  | 
| 
 | 
   193  | 
  by (induct xs) auto
  | 
| 
 | 
   194  | 
  | 
| 
 | 
   195  | 
lemma emb_Nil2 [simp]: "emb y [] \<Longrightarrow> y = []"
  | 
| 
 | 
   196  | 
  by (cases rule: emb.cases) auto
  | 
| 
 | 
   197  | 
  | 
| 
 | 
   198  | 
lemma emb_right [intro]:
  | 
| 
 | 
   199  | 
  assumes a: "emb x y"
  | 
| 
 | 
   200  | 
  shows "emb x (y @ y')"
  | 
| 
 | 
   201  | 
using a 
  | 
| 
 | 
   202  | 
by (induct arbitrary: y') (auto)
  | 
| 
 | 
   203  | 
  | 
| 
 | 
   204  | 
lemma emb_left [intro]:
  | 
| 
 | 
   205  | 
  assumes a: "emb x y"
  | 
| 
 | 
   206  | 
  shows "emb x (y' @ y)"
  | 
| 
 | 
   207  | 
using a by (induct y') (auto)
  | 
| 
 | 
   208  | 
  | 
| 
 | 
   209  | 
lemma emb_appendI [intro]:
  | 
| 
 | 
   210  | 
  assumes a: "emb x x'"
  | 
| 
 | 
   211  | 
  and     b: "emb y y'"
  | 
| 
 | 
   212  | 
  shows "emb (x @ y) (x' @ y')"
  | 
| 
 | 
   213  | 
using a b by (induct) (auto)
  | 
| 
 | 
   214  | 
  | 
| 
 | 
   215  | 
lemma emb_cons_leftD:
  | 
| 
 | 
   216  | 
  assumes "emb (a # x) y"
  | 
| 
 | 
   217  | 
  shows "\<exists>y1 y2. y = y1 @ [a] @ y2 \<and> emb x y2"
  | 
| 
 | 
   218  | 
using assms
  | 
| 
 | 
   219  | 
apply(induct x\<equiv>"a # x" y\<equiv>"y" arbitrary: a x y)
  | 
| 
 | 
   220  | 
apply(auto)
  | 
| 
 | 
   221  | 
apply(metis append_Cons)
  | 
| 
 | 
   222  | 
done
  | 
| 
 | 
   223  | 
  | 
| 
 | 
   224  | 
lemma emb_append_leftD:
  | 
| 
 | 
   225  | 
  assumes "emb (x1 @ x2) y"
  | 
| 
 | 
   226  | 
  shows "\<exists>y1 y2. y = y1 @ y2 \<and> emb x1 y1 \<and> emb x2 y2"
  | 
| 
 | 
   227  | 
using assms
  | 
| 
 | 
   228  | 
apply(induct x1 arbitrary: x2 y)
  | 
| 
 | 
   229  | 
apply(auto)
  | 
| 
 | 
   230  | 
apply(drule emb_cons_leftD)
  | 
| 
 | 
   231  | 
apply(auto)
  | 
| 
 | 
   232  | 
apply(drule_tac x="x2" in meta_spec)
  | 
| 
 | 
   233  | 
apply(drule_tac x="y2" in meta_spec)
  | 
| 
 | 
   234  | 
apply(auto)
  | 
| 
 | 
   235  | 
apply(rule_tac x="y1 @ (a # y1a)" in exI)
  | 
| 
 | 
   236  | 
apply(rule_tac x="y2a" in exI)
  | 
| 
 | 
   237  | 
apply(auto)
  | 
| 
 | 
   238  | 
done
  | 
| 
 | 
   239  | 
  | 
| 
 | 
   240  | 
lemma emb_trans:
  | 
| 
 | 
   241  | 
  assumes a: "emb x1 x2"
  | 
| 
 | 
   242  | 
  and     b: "emb x2 x3"
  | 
| 
 | 
   243  | 
  shows "emb x1 x3"
  | 
| 
 | 
   244  | 
using a b
  | 
| 
 | 
   245  | 
apply(induct arbitrary: x3)
  | 
| 
 | 
   246  | 
apply(metis emb0)
  | 
| 
 | 
   247  | 
apply(metis emb_cons_leftD emb_left)
  | 
| 
 | 
   248  | 
apply(drule_tac emb_cons_leftD)
  | 
| 
 | 
   249  | 
apply(auto)
  | 
| 
 | 
   250  | 
done
  | 
| 
 | 
   251  | 
  | 
| 
 | 
   252  | 
lemma empty_imp_goodp_emb [simp]:
  | 
| 
 | 
   253  | 
  assumes "f i = []"
  | 
| 
 | 
   254  | 
  shows "goodp emb f"
  | 
| 
 | 
   255  | 
proof (rule ccontr)
  | 
| 
 | 
   256  | 
  assume "bad emb f"
  | 
| 
 | 
   257  | 
  moreover have "(emb)\<^sup>=\<^sup>= (f i) (f (Suc i))"
  | 
| 
 | 
   258  | 
    unfolding assms by auto
  | 
| 
 | 
   259  | 
  ultimately show False
  | 
| 
 | 
   260  | 
    unfolding goodp_def by auto
  | 
| 
 | 
   261  | 
qed
  | 
| 
 | 
   262  | 
  | 
| 
 | 
   263  | 
lemma bad_imp_not_empty:
  | 
| 
 | 
   264  | 
  "bad emb f \<Longrightarrow> f i \<noteq> []"
  | 
| 
 | 
   265  | 
  by auto
  | 
| 
 | 
   266  | 
  | 
| 
 | 
   267  | 
text {*Replace the elements of an infinite sequence, starting from a given
 | 
| 
 | 
   268  | 
position, by those of another infinite sequence.*}
  | 
| 
 | 
   269  | 
definition repl :: "nat \<Rightarrow> 'a seq \<Rightarrow> 'a seq \<Rightarrow> 'a seq" where
  | 
| 
 | 
   270  | 
  "repl i f g \<equiv> \<lambda>j. if j \<ge> i then g j else f j"
  | 
| 
 | 
   271  | 
  | 
| 
 | 
   272  | 
lemma repl_0 [simp]:
  | 
| 
 | 
   273  | 
  "repl 0 f g = g"
  | 
| 
 | 
   274  | 
  by (simp add: repl_def)
  | 
| 
 | 
   275  | 
  | 
| 
 | 
   276  | 
lemma repl_simps [simp]:
  | 
| 
 | 
   277  | 
  "j \<ge> i \<Longrightarrow> repl i f g j = g j"
  | 
| 
 | 
   278  | 
  "j < i \<Longrightarrow> repl i f g j = f j"
  | 
| 
 | 
   279  | 
  by (auto simp: repl_def)
  | 
| 
 | 
   280  | 
  | 
| 
 | 
   281  | 
lemma repl_ident [simp]:
  | 
| 
 | 
   282  | 
   "repl i f f = f"
  | 
| 
 | 
   283  | 
   by (auto simp: repl_def)
  | 
| 
 | 
   284  | 
  | 
| 
 | 
   285  | 
lemma repl_repl_ident [simp]:
  | 
| 
 | 
   286  | 
  "repl n f (repl n g h) = repl n f h"
  | 
| 
 | 
   287  | 
  by (auto simp: repl_def)
  | 
| 
 | 
   288  | 
  | 
| 
 | 
   289  | 
lemma repl_repl_ident' [simp]:
  | 
| 
 | 
   290  | 
  "repl n (repl n f g) h = repl n f h"
  | 
| 
 | 
   291  | 
  by (auto simp: repl_def)
  | 
| 
 | 
   292  | 
  | 
| 
 | 
   293  | 
lemma bad_emb_repl:
  | 
| 
 | 
   294  | 
  assumes "bad emb f"
  | 
| 
 | 
   295  | 
    and "bad emb g"
  | 
| 
 | 
   296  | 
    and "\<forall>i\<ge>n. \<exists>j\<ge>n. emb (g i) (f j)"
  | 
| 
 | 
   297  | 
  shows "bad emb (repl n f g)" (is "bad emb ?f")
  | 
| 
 | 
   298  | 
proof (rule ccontr)
  | 
| 
 | 
   299  | 
  presume "goodp emb ?f"
  | 
| 
 | 
   300  | 
  then obtain i j where "i < j"
  | 
| 
 | 
   301  | 
    and good: "emb\<^sup>=\<^sup>= (?f i) (?f j)" by (auto simp: goodp_def)
  | 
| 
 | 
   302  | 
  {
 | 
| 
 | 
   303  | 
    assume "j < n"
  | 
| 
 | 
   304  | 
    with `i < j` and good have "emb\<^sup>=\<^sup>= (f i) (f j)" by simp
  | 
| 
 | 
   305  | 
    with assms(1) have False using `i < j` by (auto simp: goodp_def)
  | 
| 
 | 
   306  | 
  } moreover {
 | 
| 
 | 
   307  | 
    assume "n \<le> i"
  | 
| 
 | 
   308  | 
    with `i < j` and good have "i - n < j - n"
  | 
| 
 | 
   309  | 
      and "emb\<^sup>=\<^sup>= (g i) (g j)" by auto
  | 
| 
 | 
   310  | 
    with assms(2) have False by (auto simp: goodp_def)
  | 
| 
 | 
   311  | 
  } moreover {
 | 
| 
 | 
   312  | 
    assume "i < n" and "n \<le> j"
  | 
| 
 | 
   313  | 
    with assms(3) obtain k where "k \<ge> n" and emb: "emb (g j) (f k)" by blast
  | 
| 
 | 
   314  | 
    from `i < j` and `i < n` and `n \<le> j` and good
  | 
| 
 | 
   315  | 
      have "emb\<^sup>=\<^sup>= (f i) (g j)" by auto
  | 
| 
 | 
   316  | 
    hence "emb\<^sup>=\<^sup>= (f i) (f k)"
  | 
| 
 | 
   317  | 
    proof
  | 
| 
 | 
   318  | 
      assume fi: "f i = g j"
  | 
| 
 | 
   319  | 
      with emb_refl have "emb (f i) (f i)" by blast
  | 
| 
 | 
   320  | 
      with emb_trans[OF emb] show "emb\<^sup>=\<^sup>= (f i) (f k)" by (auto simp: fi)
  | 
| 
 | 
   321  | 
    next
  | 
| 
 | 
   322  | 
      assume "emb (f i) (g j)"
  | 
| 
 | 
   323  | 
      from emb_trans[OF this emb] show "emb\<^sup>=\<^sup>= (f i) (f k)" by auto
  | 
| 
 | 
   324  | 
    qed
  | 
| 
 | 
   325  | 
    with `i < n` and `n \<le> k` and assms(1) have False by (auto simp: goodp_def)
  | 
| 
 | 
   326  | 
  } ultimately show False using `i < j` by arith
  | 
| 
 | 
   327  | 
qed simp
  | 
| 
 | 
   328  | 
  | 
| 
 | 
   329  | 
text {*A \emph{minimal bad prefix} of an infinite sequence, is a
 | 
| 
 | 
   330  | 
prefix of its first @{text n} elements, such that every subsequence (of subsets)
 | 
| 
 | 
   331  | 
starting with the same @{text n} elements is good, whenever the @{text n}-th
 | 
| 
 | 
   332  | 
element is replaced by a proper subset of itself.*}
  | 
| 
 | 
   333  | 
definition mbp :: "'a list seq \<Rightarrow> nat \<Rightarrow> bool" where
  | 
| 
 | 
   334  | 
  "mbp f n \<equiv>
  | 
| 
 | 
   335  | 
    \<forall>g. (\<forall>i<n. g i = f i) \<and> g n \<noteq> f n \<and> emb (g n) (f n) \<and> (\<forall>i\<ge>n. \<exists>j\<ge>n. emb (g i) (f j))
  | 
| 
 | 
   336  | 
    \<longrightarrow> goodp emb g"
  | 
| 
 | 
   337  | 
  | 
| 
 | 
   338  | 
lemma ex_repl_conv:
  | 
| 
 | 
   339  | 
  "(\<exists>j\<ge>n. P (repl n f g j)) \<longleftrightarrow> (\<exists>j\<ge>n. P (g j))"
  | 
| 
 | 
   340  | 
  by auto
  | 
| 
 | 
   341  | 
  | 
| 
 | 
   342  | 
lemma emb_strict_length:
  | 
| 
 | 
   343  | 
  assumes a: "emb x y" "x \<noteq> y" 
  | 
| 
 | 
   344  | 
  shows "length x < length y"
  | 
| 
 | 
   345  | 
  using a by (induct) (auto simp add: less_Suc_eq)
  | 
| 
 | 
   346  | 
  | 
| 
 | 
   347  | 
lemma emb_wf:
  | 
| 
 | 
   348  | 
  shows "wf {(x, y). emb x y \<and> x \<noteq> y}"
 | 
| 
 | 
   349  | 
proof -
  | 
| 
 | 
   350  | 
  have "wf (measure length)" by simp
  | 
| 
 | 
   351  | 
  moreover
  | 
| 
 | 
   352  | 
  have "{(x, y). emb x y \<and> x \<noteq> y} \<subseteq> measure length"
 | 
| 
 | 
   353  | 
    unfolding measure_def by (auto simp add: emb_strict_length)
  | 
| 
 | 
   354  | 
  ultimately 
  | 
| 
 | 
   355  | 
  show "wf {(x, y). emb x y \<and> x \<noteq> y}" by (rule wf_subset)
 | 
| 
 | 
   356  | 
qed
  | 
| 
 | 
   357  | 
  | 
| 
 | 
   358  | 
lemma minimal_bad_element:
  | 
| 
 | 
   359  | 
  fixes f :: "'a list seq"
  | 
| 
 | 
   360  | 
  assumes "mbp f n"
  | 
| 
 | 
   361  | 
    and "bad emb f"
  | 
| 
 | 
   362  | 
  shows "\<exists>M.
  | 
| 
 | 
   363  | 
    (\<forall>i\<le>n. M i = f i) \<and>
  | 
| 
 | 
   364  | 
    emb (M (Suc n)) (f (Suc n)) \<and>
  | 
| 
 | 
   365  | 
    (\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb ((repl (Suc n) f M) i) (f j)) \<and>
  | 
| 
 | 
   366  | 
    bad emb (repl (Suc n) f M) \<and>
  | 
| 
 | 
   367  | 
    mbp (repl (Suc n) f M) (Suc n)"
  | 
| 
 | 
   368  | 
using assms
  | 
| 
 | 
   369  | 
proof (induct "f (Suc n)" arbitrary: f n rule: wf_induct_rule[OF emb_wf])
  | 
| 
 | 
   370  | 
  case (1 g)
  | 
| 
 | 
   371  | 
  show ?case
  | 
| 
 | 
   372  | 
  proof (cases "mbp g (Suc n)")
  | 
| 
 | 
   373  | 
    case True
  | 
| 
 | 
   374  | 
    let ?g = "repl (Suc n) g g"
  | 
| 
 | 
   375  | 
    have "\<forall>i\<le>n. ?g i = g i" by simp
  | 
| 
 | 
   376  | 
    moreover have "emb (g (Suc n)) (g (Suc n))" by simp
  | 
| 
 | 
   377  | 
    moreover have "\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb ((repl (Suc n) g g) i) (g j)" by auto
  | 
| 
 | 
   378  | 
    moreover from `bad emb g`
  | 
| 
 | 
   379  | 
      have "bad emb (repl (Suc n) g g)" by simp
  | 
| 
 | 
   380  | 
    moreover from True have "mbp (repl (Suc n) g g) (Suc n)" by simp
  | 
| 
 | 
   381  | 
    ultimately show ?thesis by blast
  | 
| 
 | 
   382  | 
  next
  | 
| 
 | 
   383  | 
    case False
  | 
| 
 | 
   384  | 
    then obtain h where less: "\<forall>i<Suc n. h i = g i"
  | 
| 
 | 
   385  | 
      and emb: "(h (Suc n), g (Suc n)) \<in> {(x, y). emb x y \<and> x \<noteq> y}"
 | 
| 
 | 
   386  | 
        (is "_ \<in> ?emb")
  | 
| 
 | 
   387  | 
      and greater: "\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb (h i) (g j)"
  | 
| 
 | 
   388  | 
      and bad: "bad emb h"
  | 
| 
 | 
   389  | 
      unfolding mbp_def by blast
  | 
| 
 | 
   390  | 
    let ?g = "repl (Suc n) g h"
  | 
| 
 | 
   391  | 
    from emb have emb': "(?g (Suc n), g (Suc n)) \<in> ?emb" by simp
  | 
| 
 | 
   392  | 
    have mbp: "mbp ?g n"
  | 
| 
 | 
   393  | 
    proof (unfold mbp_def, intro allI impI, elim conjE)
  | 
| 
 | 
   394  | 
      fix e
  | 
| 
 | 
   395  | 
      assume "\<forall>i<n. e i = ?g i"
  | 
| 
 | 
   396  | 
      hence 1: "\<forall>i<n. e i = g i" by auto
  | 
| 
 | 
   397  | 
      assume "e n \<noteq> ?g n"
  | 
| 
 | 
   398  | 
      hence 2: "e n \<noteq> ?g n" .
  | 
| 
 | 
   399  | 
      assume "emb (e n) (?g n)"
  | 
| 
 | 
   400  | 
      hence 3: "emb (e n) (g n)" by auto
  | 
| 
 | 
   401  | 
      assume *: "\<forall>i\<ge>n. \<exists>j\<ge>n. emb (e i) (?g j)"
  | 
| 
 | 
   402  | 
      have 4: "\<forall>i\<ge>n. \<exists>j\<ge>n. emb (e i) (g j)"
  | 
| 
 | 
   403  | 
      proof (intro allI impI)
  | 
| 
 | 
   404  | 
        fix i assume "n \<le> i"
  | 
| 
 | 
   405  | 
        with * obtain j where "j \<ge> n"
  | 
| 
 | 
   406  | 
          and **: "emb (e i) (?g j)" by auto
  | 
| 
 | 
   407  | 
        show "\<exists>j\<ge>n. emb (e i) (g j)"
  | 
| 
 | 
   408  | 
        proof (cases "j \<le> n")
  | 
| 
 | 
   409  | 
          case True with ** show ?thesis
  | 
| 
 | 
   410  | 
            using `j \<ge> n` by auto
  | 
| 
 | 
   411  | 
        next
  | 
| 
 | 
   412  | 
          case False
  | 
| 
 | 
   413  | 
          with `j \<ge> n` have "j \<ge> Suc n" by auto
  | 
| 
 | 
   414  | 
          with ** have "emb (e i) (h j)" by auto
  | 
| 
 | 
   415  | 
          with greater obtain k where "k \<ge> Suc n"
  | 
| 
 | 
   416  | 
            and "emb (h j) (g k)" using `j \<ge> Suc n` by auto
  | 
| 
 | 
   417  | 
          with `emb (e i) (h j)` have "emb (e i) (g k)" by (auto intro: emb_trans)
  | 
| 
 | 
   418  | 
          moreover from `k \<ge> Suc n` have "k \<ge> n" by auto
  | 
| 
 | 
   419  | 
          ultimately show ?thesis by blast
  | 
| 
 | 
   420  | 
        qed
  | 
| 
 | 
   421  | 
      qed
  | 
| 
 | 
   422  | 
      from `mbp g n`[unfolded mbp_def] and 1 and 2 and 3 and 4
  | 
| 
 | 
   423  | 
        show "goodp emb e" by auto
  | 
| 
 | 
   424  | 
    qed
  | 
| 
 | 
   425  | 
    have bad: "bad emb ?g"
  | 
| 
 | 
   426  | 
      using bad_emb_repl[OF `bad emb g` `bad emb h`, of "Suc n",
  | 
| 
 | 
   427  | 
      OF greater] .
  | 
| 
 | 
   428  | 
    let ?g' = "repl (Suc n) g"
  | 
| 
 | 
   429  | 
    from 1(1)[of ?g n, OF emb' mbp bad] obtain M
  | 
| 
 | 
   430  | 
      where "\<forall>i\<le>n. M i = g i"
  | 
| 
 | 
   431  | 
      and "emb (M (Suc n)) (?g' h (Suc n))"
  | 
| 
 | 
   432  | 
      and *: "\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb (?g' M i) (h j)"
  | 
| 
 | 
   433  | 
      and "bad emb (?g' M)"
  | 
| 
 | 
   434  | 
      and "mbp (?g' M) (Suc n)"
  | 
| 
 | 
   435  | 
      unfolding ex_repl_conv by auto
  | 
| 
 | 
   436  | 
    moreover with emb have "emb (M (Suc n)) (g (Suc n))" by (auto intro: emb_trans)
  | 
| 
 | 
   437  | 
    moreover have "\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb (?g' M i) (g j)"
  | 
| 
 | 
   438  | 
    proof (intro allI impI)
  | 
| 
 | 
   439  | 
      fix i assume "Suc n \<le> i"
  | 
| 
 | 
   440  | 
      with * obtain j where "j \<ge> Suc n" and "emb (?g' M i) (h j)" by auto
  | 
| 
 | 
   441  | 
      hence "j \<ge> Suc n" by auto
  | 
| 
 | 
   442  | 
      from greater and `j \<ge> Suc n` obtain k where "k \<ge> Suc n"
  | 
| 
 | 
   443  | 
        and "emb (h j) (g k)" by auto
  | 
| 
 | 
   444  | 
      with `emb (?g' M i) (h j)` show "\<exists>j\<ge>Suc n. emb (?g' M i) (g j)" by (blast intro: emb_trans)
  | 
| 
 | 
   445  | 
    qed
  | 
| 
 | 
   446  | 
    ultimately show ?thesis by blast
  | 
| 
 | 
   447  | 
  qed
  | 
| 
 | 
   448  | 
qed
  | 
| 
 | 
   449  | 
  | 
| 
 | 
   450  | 
lemma choice2:
  | 
| 
 | 
   451  | 
  "\<forall>x y. P x y \<longrightarrow> (\<exists>z. Q x y z) \<Longrightarrow> \<exists>f. \<forall>x y. P x y \<longrightarrow> Q x y (f x y)"
  | 
| 
 | 
   452  | 
  using bchoice[of "{(x, y). P x y}" "\<lambda>(x, y) z. Q x y z"] by force
 | 
| 
 | 
   453  | 
  | 
| 
 | 
   454  | 
fun minimal_bad_seq :: "('a seq \<Rightarrow> nat \<Rightarrow> 'a seq) \<Rightarrow> 'a seq \<Rightarrow> nat \<Rightarrow> 'a seq" where
 | 
| 
 | 
   455  | 
  "minimal_bad_seq A f 0 = A f 0"
  | 
| 
 | 
   456  | 
| "minimal_bad_seq A f (Suc n) = (
  | 
| 
 | 
   457  | 
    let g = minimal_bad_seq A f n in
  | 
| 
 | 
   458  | 
    repl (Suc n) g (A g n))"
  | 
| 
 | 
   459  | 
  | 
| 
 | 
   460  | 
lemma bad_imp_mbp:
  | 
| 
 | 
   461  | 
  assumes "bad emb f"
  | 
| 
 | 
   462  | 
  shows "\<exists>g. (\<forall>i. \<exists>j. emb (g i) (f j)) \<and> mbp g 0 \<and> bad emb g"
  | 
| 
 | 
   463  | 
using assms
  | 
| 
 | 
   464  | 
proof (induct "f 0" arbitrary: f rule: wf_induct_rule[OF emb_wf])
  | 
| 
 | 
   465  | 
  case (1 g)
  | 
| 
 | 
   466  | 
  show ?case
  | 
| 
 | 
   467  | 
  proof (cases "mbp g 0")
  | 
| 
 | 
   468  | 
    case True with 1 show ?thesis by (blast intro: emb_refl)
  | 
| 
 | 
   469  | 
  next
  | 
| 
 | 
   470  | 
    case False
  | 
| 
 | 
   471  | 
    then obtain h where less: "\<forall>i<0. h i = g i"
  | 
| 
 | 
   472  | 
      and emb: "(h 0, g 0) \<in> {(x, y). emb x y \<and> x \<noteq> y}" (is "_ \<in> ?emb")
 | 
| 
 | 
   473  | 
      and greater: "\<forall>i\<ge>0. \<exists>j\<ge>0. emb (h i) (g j)"
  | 
| 
 | 
   474  | 
      and bad: "bad emb h"
  | 
| 
 | 
   475  | 
      unfolding mbp_def by auto
  | 
| 
 | 
   476  | 
    from 1(1)[of h, OF emb bad] obtain e
  | 
| 
 | 
   477  | 
      where "\<forall>i. \<exists>j. emb (e i) (h j)" and "mbp e 0" and "bad emb e"
  | 
| 
 | 
   478  | 
      by auto
  | 
| 
 | 
   479  | 
    moreover with greater have "\<forall>i. \<exists>j. emb (e i) (g j)" by (force intro: emb_trans)
  | 
| 
 | 
   480  | 
    ultimately show ?thesis by blast
  | 
| 
 | 
   481  | 
  qed
  | 
| 
 | 
   482  | 
qed
  | 
| 
 | 
   483  | 
  | 
| 
 | 
   484  | 
lemma repl_1 [simp]:
  | 
| 
 | 
   485  | 
  assumes "f 0 = g 0"
  | 
| 
 | 
   486  | 
  shows "repl (Suc 0) f g = g"
  | 
| 
 | 
   487  | 
proof
  | 
| 
 | 
   488  | 
  fix i show "repl (Suc 0) f g i = g i"
  | 
| 
 | 
   489  | 
    by (induct i) (simp_all add: assms)
  | 
| 
 | 
   490  | 
qed
  | 
| 
 | 
   491  | 
  | 
| 
 | 
   492  | 
lemma bad_repl:
  | 
| 
 | 
   493  | 
  assumes "\<forall>i. f i \<ge> f 0" and "\<forall>i j. i > j \<longrightarrow> f i > f j"
  | 
| 
 | 
   494  | 
    and "bad P (repl (f 0) A B)" (is "bad P ?A")
  | 
| 
 | 
   495  | 
  shows "bad P (B \<circ> f)"
  | 
| 
 | 
   496  | 
proof
  | 
| 
 | 
   497  | 
  assume "goodp P (B \<circ> f)"
  | 
| 
 | 
   498  | 
  then obtain i j where "i < j" and "P\<^sup>=\<^sup>= (B (f i)) (B (f j))" by (auto simp: goodp_def)
  | 
| 
 | 
   499  | 
  hence "P\<^sup>=\<^sup>= (?A (f i)) (?A (f j))" using assms by auto
  | 
| 
 | 
   500  | 
  moreover from `i < j` have "f i < f j" using assms by auto
  | 
| 
 | 
   501  | 
  ultimately show False using assms(3) by (auto simp: goodp_def)
  | 
| 
 | 
   502  | 
qed
  | 
| 
 | 
   503  | 
  | 
| 
 | 
   504  | 
lemma iterated_subseq:
  | 
| 
 | 
   505  | 
  assumes "\<forall>n>0::nat. \<forall>i\<ge>n. \<exists>j\<ge>n. emb (g n i) (g (n - 1) j)"
  | 
| 
 | 
   506  | 
    and "m \<le> n"
  | 
| 
 | 
   507  | 
  shows "\<forall>i\<ge>n. \<exists>j\<ge>m. emb (g n i) (g m j)"
  | 
| 
 | 
   508  | 
using assms(2)
  | 
| 
 | 
   509  | 
proof (induct "n - m" arbitrary: n)
  | 
| 
 | 
   510  | 
  case 0 thus ?case by auto
  | 
| 
 | 
   511  | 
next
  | 
| 
 | 
   512  | 
  case (Suc k)
  | 
| 
 | 
   513  | 
  then obtain n' where n: "n = Suc n'" by (cases n) auto
  | 
| 
 | 
   514  | 
  with Suc have "k = n' - m" and "m \<le> n'" by auto
  | 
| 
 | 
   515  | 
  have "n > 0" by (auto simp: n)
  | 
| 
 | 
   516  | 
  show ?case
  | 
| 
 | 
   517  | 
  proof (intro allI impI)
  | 
| 
 | 
   518  | 
    fix i assume "i \<ge> n"
  | 
| 
 | 
   519  | 
    with assms(1)[rule_format, OF `n > 0`] obtain j where "j \<ge> n"
  | 
| 
 | 
   520  | 
      and "emb (g (Suc n') i) (g n' j)" by (auto simp: n)
  | 
| 
 | 
   521  | 
    with Suc(1)[OF `k = n' - m` `m \<le> n'`, THEN spec[of _ j]]
  | 
| 
 | 
   522  | 
      obtain k where "k \<ge> m" and "emb (g n' j) (g m k)" by (auto simp: n)
  | 
| 
 | 
   523  | 
    with `emb (g (Suc n') i) (g n' j)` have "emb (g n i) (g m k)" by (auto intro: emb_trans simp: n)
  | 
| 
 | 
   524  | 
    thus "\<exists>j\<ge>m. emb (g n i) (g m j)" using `k \<ge> m` by blast
  | 
| 
 | 
   525  | 
  qed
  | 
| 
 | 
   526  | 
qed
  | 
| 
 | 
   527  | 
  | 
| 
 | 
   528  | 
lemma no_bad_of_special_shape_imp_goodp:
  | 
| 
 | 
   529  | 
  assumes "\<not> (\<exists>f:: nat seq. (\<forall>i. f 0 \<le> f i) \<and> bad P (B \<circ> f))"
  | 
| 
 | 
   530  | 
    and "\<forall>i. f i \<in> {B i | i. True}"
 | 
| 
 | 
   531  | 
  shows "goodp P f"
  | 
| 
 | 
   532  | 
proof (rule ccontr)
  | 
| 
 | 
   533  | 
  assume "bad P f"
  | 
| 
 | 
   534  | 
  from assms(2) have "\<forall>i. \<exists>j. f i = B j" by blast
  | 
| 
 | 
   535  | 
  from choice[OF this] obtain g where "\<And>i. f i = B (g i)" by blast
  | 
| 
 | 
   536  | 
  with `bad P f` have "bad P (B \<circ> g)" by (auto simp: goodp_def)
  | 
| 
 | 
   537  | 
  have "\<forall>i. \<exists>j>i. g j \<ge> g 0"
  | 
| 
 | 
   538  | 
  proof (rule ccontr)
  | 
| 
 | 
   539  | 
    assume "\<not> ?thesis"
  | 
| 
 | 
   540  | 
    then obtain i::nat where "\<forall>j>i. \<not> (g j \<ge> g 0)" by auto
  | 
| 
 | 
   541  | 
    hence *: "\<forall>j>i. g j < g 0" by auto
  | 
| 
 | 
   542  | 
    let ?I = "{j. j > i}"
 | 
| 
 | 
   543  | 
    from * have "\<forall>j>i. g j \<in> {..<g 0}" by auto
 | 
| 
 | 
   544  | 
    hence "\<forall>j\<in>?I. g j \<in> {..<g 0}" by auto
 | 
| 
 | 
   545  | 
    hence "g ` ?I \<subseteq> {..<g 0}" unfolding image_subset_iff by auto
 | 
| 
 | 
   546  | 
    moreover have "finite {..<g 0}" by auto
 | 
| 
 | 
   547  | 
    ultimately have 1: "finite (g ` ?I)" using finite_subset by blast
  | 
| 
 | 
   548  | 
    have 2: "infinite ?I"
  | 
| 
 | 
   549  | 
    proof -
  | 
| 
 | 
   550  | 
      {
 | 
| 
 | 
   551  | 
      fix m have "\<exists>n>m. i < n"
  | 
| 
 | 
   552  | 
      proof (cases "m > i")
  | 
| 
 | 
   553  | 
        case True thus ?thesis by auto
  | 
| 
 | 
   554  | 
      next
  | 
| 
 | 
   555  | 
        case False
  | 
| 
 | 
   556  | 
        hence "m \<le> i" by auto
  | 
| 
 | 
   557  | 
        hence "Suc i > m" and "i < Suc i" by auto
  | 
| 
 | 
   558  | 
        thus ?thesis by blast
  | 
| 
 | 
   559  | 
      qed
  | 
| 
 | 
   560  | 
      }
  | 
| 
 | 
   561  | 
      thus ?thesis unfolding infinite_nat_iff_unbounded by auto
  | 
| 
 | 
   562  | 
    qed
  | 
| 
 | 
   563  | 
    from pigeonhole_infinite[OF 2 1]
  | 
| 
 | 
   564  | 
      obtain k where "k > i" and "infinite {j. j > i \<and> g j = g k}" by auto
 | 
| 
 | 
   565  | 
    then obtain l where "k < l" and "g l = g k"
  | 
| 
 | 
   566  | 
      unfolding infinite_nat_iff_unbounded by auto
  | 
| 
 | 
   567  | 
    hence "P\<^sup>=\<^sup>= (B (g k)) (B (g l))" by auto
  | 
| 
 | 
   568  | 
    with `k < l` and `bad P (B \<circ> g)` show False by (auto simp: goodp_def)
  | 
| 
 | 
   569  | 
  qed
  | 
| 
 | 
   570  | 
  from choice[OF this] obtain h
  | 
| 
 | 
   571  | 
    where "\<forall>i. (h i) > i" and *: "\<And>i. g (h i) \<ge> g 0" by blast
  | 
| 
 | 
   572  | 
  hence "\<forall>i\<ge>0. (h i) > i" by auto
  | 
| 
 | 
   573  | 
  from funpow_mono[OF this] have **: "\<And>i j. i < j \<Longrightarrow> (h ^^ i) 0 < (h ^^ j) 0" by auto
  | 
| 
 | 
   574  | 
  let ?i = "\<lambda>i. (h ^^ i) 0"
  | 
| 
 | 
   575  | 
  let ?f = "\<lambda>i. g (?i i)"
  | 
| 
 | 
   576  | 
  have "\<forall>i. ?f i \<ge> ?f 0"
  | 
| 
 | 
   577  | 
  proof
  | 
| 
 | 
   578  | 
    fix i show "?f i \<ge> ?f 0" using * by (induct i) auto
  | 
| 
 | 
   579  | 
  qed
  | 
| 
 | 
   580  | 
  moreover have "bad P (B \<circ> ?f)"
  | 
| 
 | 
   581  | 
  proof
  | 
| 
 | 
   582  | 
    assume "goodp P (B \<circ> ?f)"
  | 
| 
 | 
   583  | 
    then obtain i j where "i < j" and "P\<^sup>=\<^sup>= (B (?f i)) (B (?f j))" by (auto simp: goodp_def)
  | 
| 
 | 
   584  | 
    hence "P\<^sup>=\<^sup>= (B (g (?i i))) (B (g (?i j)))" by simp
  | 
| 
 | 
   585  | 
    moreover from **[OF `i < j`] have "?i i < ?i j" .
  | 
| 
 | 
   586  | 
    ultimately show False using `bad P (B \<circ> g)` by (auto simp: goodp_def)
  | 
| 
 | 
   587  | 
  qed
  | 
| 
 | 
   588  | 
  ultimately have "(\<forall>i. ?f i \<ge> ?f 0) \<and> bad P (B \<circ> ?f)" by auto
  | 
| 
 | 
   589  | 
  hence "\<exists>f. (\<forall>i. f i \<ge> f 0) \<and> bad P (B \<circ> f)" by (rule exI[of _ ?f])
  | 
| 
 | 
   590  | 
  with assms(1) show False by blast
  | 
| 
 | 
   591  | 
qed
  | 
| 
 | 
   592  | 
  | 
| 
 | 
   593  | 
lemma emb_tl_left [simp]: "xs \<noteq> [] \<Longrightarrow> emb (tl xs) xs"
  | 
| 
 | 
   594  | 
  by (induct xs) auto
  | 
| 
 | 
   595  | 
  | 
| 
 | 
   596  | 
lemma tl_ne [simp]: "xs \<noteq> [] \<Longrightarrow> tl xs = xs \<Longrightarrow> False"
  | 
| 
 | 
   597  | 
  by (induct xs) auto
  | 
| 
 | 
   598  | 
  | 
| 
 | 
   599  | 
text {*Every reflexive and transitive relation on a finite set
 | 
| 
 | 
   600  | 
is a wqo.*}
  | 
| 
 | 
   601  | 
lemma finite_wqo_on:
  | 
| 
 | 
   602  | 
  fixes A :: "('a::finite) set"
 | 
| 
 | 
   603  | 
  assumes "reflp_on P A" and "transp_on P A"
  | 
| 
 | 
   604  | 
  shows "wqo_on P A"
  | 
| 
 | 
   605  | 
proof
  | 
| 
 | 
   606  | 
  fix f::"'a::finite seq"
  | 
| 
 | 
   607  | 
  assume *: "\<forall>i. f i \<in> A"
  | 
| 
 | 
   608  | 
  let ?I = "UNIV::nat set"
  | 
| 
 | 
   609  | 
  have "f ` ?I \<subseteq> A" using * by auto
  | 
| 
 | 
   610  | 
  with finite[of A] and finite_subset have 1: "finite (f ` ?I)" by blast
  | 
| 
 | 
   611  | 
  have "infinite ?I" by auto
  | 
| 
 | 
   612  | 
  from pigeonhole_infinite[OF this 1]
  | 
| 
 | 
   613  | 
    obtain k where "infinite {j. f j = f k}" by auto
 | 
| 
 | 
   614  | 
  then obtain l where "k < l" and "f l = f k"
  | 
| 
 | 
   615  | 
    unfolding infinite_nat_iff_unbounded by auto
  | 
| 
 | 
   616  | 
  hence "P\<^sup>=\<^sup>= (f k) (f l)" by auto
  | 
| 
 | 
   617  | 
  with `k < l` show "goodp P f" by (auto simp: goodp_def)
  | 
| 
 | 
   618  | 
qed fact+
  | 
| 
 | 
   619  | 
  | 
| 
 | 
   620  | 
lemma finite_eq_wqo_on:
  | 
| 
 | 
   621  | 
  "wqo_on (op =) (A::('a::finite) set)"
 | 
| 
 | 
   622  | 
  using finite_wqo_on[of "op =" A]
  | 
| 
 | 
   623  | 
  by (auto simp: reflp_on_def transp_on_def)
  | 
| 
 | 
   624  | 
  | 
| 
 | 
   625  | 
lemma wqo_on_finite_lists:
  | 
| 
 | 
   626  | 
  shows "wqo_on emb (UNIV::('a::finite) list set)"
 | 
| 
 | 
   627  | 
    (is "wqo_on ?P ?A")
  | 
| 
 | 
   628  | 
proof -
  | 
| 
 | 
   629  | 
  {
 | 
| 
 | 
   630  | 
    from emb_refl
  | 
| 
 | 
   631  | 
      have "reflp_on ?P ?A" unfolding reflp_on_def by auto
  | 
| 
 | 
   632  | 
  }
  | 
| 
 | 
   633  | 
  note refl = this
  | 
| 
 | 
   634  | 
  {
 | 
| 
 | 
   635  | 
    from emb_trans
  | 
| 
 | 
   636  | 
      have "transp_on ?P ?A" unfolding transp_on_def by auto
  | 
| 
 | 
   637  | 
  }
  | 
| 
 | 
   638  | 
  note trans = this
  | 
| 
 | 
   639  | 
  {
 | 
| 
 | 
   640  | 
    have "\<forall>f. (\<forall>i. f i \<in> ?A) \<longrightarrow> goodp ?P f"
  | 
| 
 | 
   641  | 
    proof (rule ccontr)
  | 
| 
 | 
   642  | 
      assume "\<not> ?thesis"
  | 
| 
 | 
   643  | 
      then obtain f where "bad ?P f" by blast
  | 
| 
 | 
   644  | 
      from bad_imp_mbp[of f, OF `bad ?P f`] obtain g
  | 
| 
 | 
   645  | 
        where "\<forall>i. \<exists>j. emb (g i) (f j)"
  | 
| 
 | 
   646  | 
        and "mbp g 0"
  | 
| 
 | 
   647  | 
        and "bad ?P g"
  | 
| 
 | 
   648  | 
        by blast
  | 
| 
 | 
   649  | 
      from minimal_bad_element
  | 
| 
 | 
   650  | 
        have "\<forall>f n.
  | 
| 
 | 
   651  | 
        mbp f n \<and>
  | 
| 
 | 
   652  | 
        bad ?P f \<longrightarrow>
  | 
| 
 | 
   653  | 
        (\<exists>M.
  | 
| 
 | 
   654  | 
          (\<forall>i\<le>n. M i = f i) \<and>
  | 
| 
 | 
   655  | 
          emb (M (Suc n)) (f (Suc n)) \<and>
  | 
| 
 | 
   656  | 
          (\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb (repl (Suc n) f M i) (f j)) \<and>
  | 
| 
 | 
   657  | 
          bad ?P (repl (Suc n) f M) \<and>
  | 
| 
 | 
   658  | 
          mbp (repl (Suc n) f M) (Suc n))"
  | 
| 
 | 
   659  | 
        (is "\<forall>f n. ?Q f n \<longrightarrow> (\<exists>M. ?Q' f n M)")
  | 
| 
 | 
   660  | 
        by blast
  | 
| 
 | 
   661  | 
      from choice2[OF this] obtain M
  | 
| 
 | 
   662  | 
        where *[rule_format]: "\<forall>f n. ?Q f n \<longrightarrow> ?Q' f n (M f n)" by force
  | 
| 
 | 
   663  | 
      let ?g = "minimal_bad_seq M g"
  | 
| 
 | 
   664  | 
      let ?A = "\<lambda>i. ?g i i"
  | 
| 
 | 
   665  | 
      have "\<forall>n. (n = 0 \<longrightarrow> (\<forall>i\<ge>n. \<exists>j\<ge>n. emb (?g n i) (g j))) \<and> (n > 0 \<longrightarrow> (\<forall>i\<ge>n. \<exists>j\<ge>n. emb (?g n i) (?g (n - 1) j))) \<and> (\<forall>i\<le>n. mbp (?g n) i) \<and> (\<forall>i\<le>n. ?A i = ?g n i) \<and> bad ?P (?g n)"
  | 
| 
 | 
   666  | 
      proof
  | 
| 
 | 
   667  | 
        fix n
  | 
| 
 | 
   668  | 
        show "(n = 0 \<longrightarrow> (\<forall>i\<ge>n. \<exists>j\<ge>n. emb (?g n i) (g j))) \<and> (n > 0 \<longrightarrow> (\<forall>i\<ge>n. \<exists>j\<ge>n. emb (?g n i) (?g (n - 1) j))) \<and> (\<forall>i\<le>n. mbp (?g n) i) \<and> (\<forall>i\<le>n. ?A i = ?g n i) \<and> bad ?P (?g n)"
  | 
| 
 | 
   669  | 
        proof (induction n)
  | 
| 
 | 
   670  | 
          case 0
  | 
| 
 | 
   671  | 
          have "mbp g 0" by fact
  | 
| 
 | 
   672  | 
          moreover have "bad ?P g" by fact
  | 
| 
 | 
   673  | 
          ultimately
  | 
| 
 | 
   674  | 
            have [simp]: "M g 0 0 = g 0" and "emb (M g 0 (Suc 0)) (g (Suc 0))"
  | 
| 
 | 
   675  | 
            and "bad ?P (M g 0)" and "mbp (M g 0) (Suc 0)"
  | 
| 
 | 
   676  | 
            and **: "\<forall>i\<ge>Suc 0. \<exists>j\<ge>Suc 0. emb (M g 0 i) (g j)"
  | 
| 
 | 
   677  | 
            using *[of g 0] by auto
  | 
| 
 | 
   678  | 
          moreover have "mbp (M g 0) 0"
  | 
| 
 | 
   679  | 
          proof (unfold mbp_def, intro allI impI, elim conjE)
  | 
| 
 | 
   680  | 
            fix e :: "'a list seq"
  | 
| 
 | 
   681  | 
            presume "(e 0, g 0) \<in> {(x, y). emb x y \<and> x \<noteq> y}" (is "_ \<in> ?emb")
 | 
| 
 | 
   682  | 
              and *: "\<forall>i. \<exists>j\<ge>0. emb (e i) (M g 0 j)"
  | 
| 
 | 
   683  | 
            have "\<forall>i. \<exists>j\<ge>0::nat. emb (e i) (g j)"
  | 
| 
 | 
   684  | 
            proof (intro allI impI)
  | 
| 
 | 
   685  | 
              fix i
  | 
| 
 | 
   686  | 
              from * obtain j where "j \<ge> 0" and "emb (e i) (M g 0 j)" by auto
  | 
| 
 | 
   687  | 
              show "\<exists>j\<ge>0. emb (e i) (g j)"
  | 
| 
 | 
   688  | 
              proof (cases "j = 0")
  | 
| 
 | 
   689  | 
                case True
  | 
| 
 | 
   690  | 
                with `emb (e i) (M g 0 j)` have "emb (e i) (g 0)" by auto
  | 
| 
 | 
   691  | 
                thus ?thesis by auto
  | 
| 
 | 
   692  | 
              next
  | 
| 
 | 
   693  | 
                case False
  | 
| 
 | 
   694  | 
                hence "j \<ge> Suc 0" by auto
  | 
| 
 | 
   695  | 
                with ** obtain k where "k \<ge> Suc 0" and "emb (M g 0 j) (g k)" by auto
  | 
| 
 | 
   696  | 
                with `emb (e i) (M g 0 j)` have "emb (e i) (g k)" by (blast intro: emb_trans)
  | 
| 
 | 
   697  | 
                moreover with `k \<ge> Suc 0` have "k \<ge> 0" by auto
  | 
| 
 | 
   698  | 
                ultimately show ?thesis by blast
  | 
| 
 | 
   699  | 
              qed
  | 
| 
 | 
   700  | 
            qed
  | 
| 
 | 
   701  | 
            with `mbp g 0`[unfolded mbp_def]
  | 
| 
 | 
   702  | 
            show "goodp ?P e" using `(e 0, g 0) \<in> ?emb` by (simp add: mbp_def)
  | 
| 
 | 
   703  | 
          qed auto
  | 
| 
 | 
   704  | 
          moreover have "\<forall>i\<ge>0. \<exists>j\<ge>0. emb (?g 0 i) (g j)"
  | 
| 
 | 
   705  | 
          proof (intro allI impI)
  | 
| 
 | 
   706  | 
            fix i::nat
  | 
| 
 | 
   707  | 
            assume "i \<ge> 0"
  | 
| 
 | 
   708  | 
            hence "i = 0 \<or> i \<ge> Suc 0" by auto
  | 
| 
 | 
   709  | 
            thus "\<exists>j\<ge>0. emb (?g 0 i) (g j)"
  | 
| 
 | 
   710  | 
            proof
  | 
| 
 | 
   711  | 
              assume "i \<ge> Suc 0"
  | 
| 
 | 
   712  | 
              with ** obtain j where "j \<ge> Suc 0" and "emb (?g 0 i) (g j)" by auto
  | 
| 
 | 
   713  | 
              moreover from this have "j \<ge> 0" by auto
  | 
| 
 | 
   714  | 
              ultimately show "?thesis" by auto
  | 
| 
 | 
   715  | 
            next
  | 
| 
 | 
   716  | 
              assume "i = 0"
  | 
| 
 | 
   717  | 
              hence "emb (?g 0 i) (g 0)" by auto
  | 
| 
 | 
   718  | 
              thus ?thesis by blast
  | 
| 
 | 
   719  | 
            qed
  | 
| 
 | 
   720  | 
          qed
  | 
| 
 | 
   721  | 
          ultimately show ?case by simp
  | 
| 
 | 
   722  | 
        next
  | 
| 
 | 
   723  | 
          case (Suc n)
  | 
| 
 | 
   724  | 
          with *[of "?g n" n]
  | 
| 
 | 
   725  | 
            have eq: "\<forall>i\<le>n. ?A i = ?g n i"
  | 
| 
 | 
   726  | 
            and emb: "emb (?g (Suc n) (Suc n)) (?g n (Suc n))"
  | 
| 
 | 
   727  | 
            and subseq: "\<forall>i\<ge>Suc n. \<exists>j\<ge>Suc n. emb (?g (Suc n) i) (?g n j)"
  | 
| 
 | 
   728  | 
            and "bad ?P (?g (Suc n))"
  | 
| 
 | 
   729  | 
            and mbp: "mbp (?g (Suc n)) (Suc n)"
  | 
| 
 | 
   730  | 
            by (simp_all add: Let_def)
  | 
| 
 | 
   731  | 
          moreover have *: "\<forall>i\<le>Suc n. ?A i = ?g (Suc n) i"
  | 
| 
 | 
   732  | 
          proof (intro allI impI)
  | 
| 
 | 
   733  | 
            fix i assume "i \<le> Suc n"
  | 
| 
 | 
   734  | 
            show "?A i = ?g (Suc n) i"
  | 
| 
 | 
   735  | 
            proof (cases "i = Suc n")
  | 
| 
 | 
   736  | 
              assume "i = Suc n"
  | 
| 
 | 
   737  | 
              thus ?thesis by simp
  | 
| 
 | 
   738  | 
            next
  | 
| 
 | 
   739  | 
              assume "i \<noteq> Suc n"
  | 
| 
 | 
   740  | 
              with `i \<le> Suc n` have "i < Suc n" by auto
  | 
| 
 | 
   741  | 
              thus ?thesis by (simp add: Let_def eq)
  | 
| 
 | 
   742  | 
            qed
  | 
| 
 | 
   743  | 
          qed
  | 
| 
 | 
   744  | 
          moreover have "\<forall>i\<le>Suc n. mbp (?g (Suc n)) i"
  | 
| 
 | 
   745  | 
          proof (intro allI impI)
  | 
| 
 | 
   746  | 
            fix i assume "i \<le> Suc n"
  | 
| 
 | 
   747  | 
            show "mbp (?g (Suc n)) i"
  | 
| 
 | 
   748  | 
            proof (cases "i = Suc n")
  | 
| 
 | 
   749  | 
              case True with mbp show ?thesis by simp
  | 
| 
 | 
   750  | 
            next
  | 
| 
 | 
   751  | 
              case False with `i \<le> Suc n` have le: "i \<le> Suc n" "i \<le> n" by auto
  | 
| 
 | 
   752  | 
              show ?thesis
  | 
| 
 | 
   753  | 
              proof (unfold mbp_def, intro allI impI, elim conjE)
  | 
| 
 | 
   754  | 
                fix e
  | 
| 
 | 
   755  | 
                note * = *[rule_format, symmetric] eq[rule_format, symmetric]
  | 
| 
 | 
   756  | 
                assume "\<forall>i'<i. e i' = ?g (Suc n) i'"
  | 
| 
 | 
   757  | 
                hence 1: "\<forall>i'<i. e i' = ?g n i'" using * and le by auto
  | 
| 
 | 
   758  | 
                presume "(e i, ?g (Suc n) i) \<in> {(x, y). emb x y \<and> x \<noteq> y}" (is "_ \<in> ?emb")
 | 
| 
 | 
   759  | 
                hence 2: "(e i, ?g n i) \<in> ?emb" using * and le by simp
  | 
| 
 | 
   760  | 
                assume **: "\<forall>j\<ge>i. \<exists>k\<ge>i. emb (e j) (?g (Suc n) k)"
  | 
| 
 | 
   761  | 
                have 3: "\<forall>j\<ge>i. \<exists>k\<ge>i. emb (e j) (?g n k)"
  | 
| 
 | 
   762  | 
                proof (intro allI impI)
  | 
| 
 | 
   763  | 
                  fix j assume "i \<le> j"
  | 
| 
 | 
   764  | 
                  with ** obtain k where "k \<ge> i" and "emb (e j) (?g (Suc n) k)" by blast
  | 
| 
 | 
   765  | 
                  show "\<exists>k\<ge>i. emb (e j) (?g n k)"
  | 
| 
 | 
   766  | 
                  proof (cases "k \<le> n")
  | 
| 
 | 
   767  | 
                    case True with `emb (e j) (?g (Suc n) k)`
  | 
| 
 | 
   768  | 
                      have "emb (e j) (?g n k)" using * by auto
  | 
| 
 | 
   769  | 
                    thus ?thesis using `k \<ge> i` by auto
  | 
| 
 | 
   770  | 
                  next
  | 
| 
 | 
   771  | 
                    case False hence "k \<ge> Suc n" by auto
  | 
| 
 | 
   772  | 
                    with subseq obtain l where "l \<ge> Suc n"
  | 
| 
 | 
   773  | 
                      and "emb (?g (Suc n) k) (?g n l)" by blast
  | 
| 
 | 
   774  | 
                    with `emb (e j) (?g (Suc n) k)` have "emb (e j) (?g n l)" by (auto intro: emb_trans)
  | 
| 
 | 
   775  | 
                    moreover from `i \<le> Suc n` and `l \<ge> Suc n` have "l \<ge> i" by auto
  | 
| 
 | 
   776  | 
                    ultimately show ?thesis by blast
  | 
| 
 | 
   777  | 
                  qed
  | 
| 
 | 
   778  | 
                qed
  | 
| 
 | 
   779  | 
                from 1 2 3 and Suc[THEN conjunct2, THEN conjunct2] and `i \<le> n`
  | 
| 
 | 
   780  | 
                show "goodp ?P e" unfolding mbp_def by blast
  | 
| 
 | 
   781  | 
              qed simp
  | 
| 
 | 
   782  | 
            qed
  | 
| 
 | 
   783  | 
          qed
  | 
| 
 | 
   784  | 
          ultimately show ?case by simp
  | 
| 
 | 
   785  | 
        qed
  | 
| 
 | 
   786  | 
      qed
  | 
| 
 | 
   787  | 
      hence 1: "\<forall>n. \<forall>i\<le>n. mbp (?g n) i"
  | 
| 
 | 
   788  | 
        and 2: "\<forall>n. \<forall>i\<le>n. ?A i = ?g n i"
  | 
| 
 | 
   789  | 
        and 3: "\<forall>n. bad ?P (?g n)"
  | 
| 
 | 
   790  | 
        and 6: "\<forall>i\<ge>0. \<exists>j\<ge>0. emb (?g 0 i) (g j)"
  | 
| 
 | 
   791  | 
        and 7: "\<forall>n>0. \<forall>i\<ge>n. \<exists>j\<ge>n. emb (?g n i) (?g (n - 1) j)"
  | 
| 
 | 
   792  | 
        by auto
  | 
| 
 | 
   793  | 
      have ex_subset: "\<forall>n. \<forall>i. \<exists>j. emb (?g n i) (g j)"
  | 
| 
 | 
   794  | 
      proof
  | 
| 
 | 
   795  | 
        fix n show "\<forall>i. \<exists>j. emb (?g n i) (g j)"
  | 
| 
 | 
   796  | 
        proof (induct n)
  | 
| 
 | 
   797  | 
          case 0 with 6 show ?case by simp
  | 
| 
 | 
   798  | 
        next
  | 
| 
 | 
   799  | 
          case (Suc n)
  | 
| 
 | 
   800  | 
          show ?case
  | 
| 
 | 
   801  | 
          proof
  | 
| 
 | 
   802  | 
            fix i
  | 
| 
 | 
   803  | 
            have "i < Suc n \<or> i \<ge> Suc n" by auto
  | 
| 
 | 
   804  | 
            thus "\<exists>j. emb (?g (Suc n) i) (g j)"
  | 
| 
 | 
   805  | 
            proof
  | 
| 
 | 
   806  | 
              assume "i < Suc n" hence "i \<le> Suc n" and "i \<le> n" by auto
  | 
| 
 | 
   807  | 
              from `i \<le> Suc n` have "?g (Suc n) i = ?g i i" using 2 by auto
  | 
| 
 | 
   808  | 
              moreover from `i \<le> n` have "?g n i = ?g i i" using 2 by auto
  | 
| 
 | 
   809  | 
              ultimately have "?g (Suc n) i = ?g n i" by auto
  | 
| 
 | 
   810  | 
              with Suc show ?thesis by auto
  | 
| 
 | 
   811  | 
            next
  | 
| 
 | 
   812  | 
              assume "i \<ge> Suc n"
  | 
| 
 | 
   813  | 
              with 7[THEN spec[of _ "Suc n"]]
  | 
| 
 | 
   814  | 
                obtain j where "j \<ge> Suc n" and "emb (?g (Suc n) i) (?g n j)" by auto
  | 
| 
 | 
   815  | 
              moreover from Suc obtain k where "emb (?g n j) (g k)" by blast
  | 
| 
 | 
   816  | 
              ultimately show ?thesis by (blast intro: emb_trans)
  | 
| 
 | 
   817  | 
            qed
  | 
| 
 | 
   818  | 
          qed
  | 
| 
 | 
   819  | 
        qed
  | 
| 
 | 
   820  | 
      qed
  | 
| 
 | 
   821  | 
      have bad: "bad ?P ?A"
  | 
| 
 | 
   822  | 
      proof
  | 
| 
 | 
   823  | 
        assume "goodp ?P ?A"
  | 
| 
 | 
   824  | 
        then obtain i j :: nat where "i < j"
  | 
| 
 | 
   825  | 
          and "?P\<^sup>=\<^sup>= (?g i i) (?g j j)" unfolding goodp_def by auto
  | 
| 
 | 
   826  | 
        moreover with 2[rule_format, of i j]
  | 
| 
 | 
   827  | 
          have "?P\<^sup>=\<^sup>= (?g j i) (?g j j)" by auto
  | 
| 
 | 
   828  | 
        ultimately have "goodp ?P (?g j)" unfolding goodp_def by blast
  | 
| 
 | 
   829  | 
        with 3 show False by auto
  | 
| 
 | 
   830  | 
      qed
  | 
| 
 | 
   831  | 
      have non_empty: "\<forall>i. ?A i \<noteq> []" using bad and bad_imp_not_empty[of ?A] by auto
  | 
| 
 | 
   832  | 
      then obtain a as where a: "\<forall>i. hd (?A i) = a i \<and> tl (?A i) = as i" by force
  | 
| 
 | 
   833  | 
      let ?B = "\<lambda>i. tl (?A i)"
  | 
| 
 | 
   834  | 
      {
 | 
| 
 | 
   835  | 
        assume "\<exists>f::nat seq. (\<forall>i. f i \<ge> f 0) \<and> bad ?P (?B \<circ> f)"
  | 
| 
 | 
   836  | 
        then obtain f :: "nat seq" where ge: "\<forall>i. f i \<ge> f 0"
  | 
| 
 | 
   837  | 
          and "bad ?P (?B \<circ> f)" by auto
  | 
| 
 | 
   838  | 
        let ?C = "\<lambda>i. if i < f 0 then ?A i else ?B (f (i - f 0))"
  | 
| 
 | 
   839  | 
        have [simp]: "\<And>i. i < f 0 \<Longrightarrow> ?C i = ?A i" by auto
  | 
| 
 | 
   840  | 
        have [simp]: "\<And>i. f 0 \<le> i \<Longrightarrow> ?C i = ?B (f (i - f 0))" by auto
  | 
| 
 | 
   841  | 
        have "bad ?P ?C"
  | 
| 
 | 
   842  | 
        proof
  | 
| 
 | 
   843  | 
          assume "goodp ?P ?C"
  | 
| 
 | 
   844  | 
          then obtain i j where "i < j" and *: "?P\<^sup>=\<^sup>= (?C i) (?C j)" by (auto simp: goodp_def)
  | 
| 
 | 
   845  | 
          {
 | 
| 
 | 
   846  | 
            assume "j < f 0" with `i < j` and * have "?P\<^sup>=\<^sup>= (?A i) (?A j)" by simp
  | 
| 
 | 
   847  | 
            with `i < j` and `bad ?P ?A` have False by (auto simp: goodp_def)
  | 
| 
 | 
   848  | 
          } moreover {
 | 
| 
 | 
   849  | 
            assume "f 0 \<le> i" with `i < j` and * have "?P\<^sup>=\<^sup>= (?B (f (i - f 0))) (?B (f (j - f 0)))" by simp
  | 
| 
 | 
   850  | 
            moreover with `i < j` and `f 0 \<le> i` have "i - f 0 < j - f 0" by auto
  | 
| 
 | 
   851  | 
            ultimately have False using `bad ?P (?B \<circ> f)` by (auto simp: goodp_def)
  | 
| 
 | 
   852  | 
          } moreover {
 | 
| 
 | 
   853  | 
            have emb: "emb (?B (f (j - f 0))) (?A (f (j - f 0)))" using non_empty by simp
  | 
| 
 | 
   854  | 
            assume "i < f 0" and "f 0 \<le> j"
  | 
| 
 | 
   855  | 
            with * have "?P\<^sup>=\<^sup>= (?A i) (?B (f (j - f 0)))" by auto
  | 
| 
 | 
   856  | 
            hence "?P (?A i) (?B (f (j - f 0))) \<or> ?A i = ?B (f (j - f 0))" by simp
  | 
| 
 | 
   857  | 
            hence False
  | 
| 
 | 
   858  | 
            proof
  | 
| 
 | 
   859  | 
              assume "?P (?A i) (?B (f (j - f 0)))"
  | 
| 
 | 
   860  | 
              with emb have "?P (?A i) (?A (f (j - f 0)))" by (blast intro: emb_trans)
  | 
| 
 | 
   861  | 
              moreover from ge[THEN spec[of _ "j - f 0"]] and `i < f 0` have "i < f (j - f 0)" by auto
  | 
| 
 | 
   862  | 
              ultimately show ?thesis using `bad ?P ?A` by (auto simp: goodp_def)
  | 
| 
 | 
   863  | 
            next
  | 
| 
 | 
   864  | 
              assume "?A i = ?B (f (j - f 0))"
  | 
| 
 | 
   865  | 
              with emb have "emb (?A i) (?A (f (j - f 0)))" by auto
  | 
| 
 | 
   866  | 
              moreover have "?P (?A i) (?A i)" using emb_refl by auto
  | 
| 
 | 
   867  | 
              ultimately have "?P (?A i) (?A (f (j - f 0)))" by (blast intro: emb_trans)
  | 
| 
 | 
   868  | 
              moreover from ge[THEN spec[of _ "j - f 0"]] and `i < f 0` have "i < f (j - f 0)" by auto
  | 
| 
 | 
   869  | 
              ultimately show ?thesis using `bad ?P ?A` by (auto simp: goodp_def)
  | 
| 
 | 
   870  | 
            qed
  | 
| 
 | 
   871  | 
          } ultimately show False by arith
  | 
| 
 | 
   872  | 
        qed
  | 
| 
 | 
   873  | 
        have "\<forall>i<f 0. ?C i = ?g (f 0) i" using 2 by auto
  | 
| 
 | 
   874  | 
        moreover have "(?C (f 0), ?g (f 0) (f 0)) \<in> {(x, y). emb x y \<and> x \<noteq> y}" using non_empty tl_ne by auto
 | 
| 
 | 
   875  | 
        moreover have "\<forall>i\<ge>f 0. \<exists>j\<ge>f 0. emb (?C i) (?g (f 0) j)"
  | 
| 
 | 
   876  | 
        proof (intro allI impI)
  | 
| 
 | 
   877  | 
          fix i
  | 
| 
 | 
   878  | 
          let ?i = "f (i - f 0)"
  | 
| 
 | 
   879  | 
          assume "f 0 \<le> i"
  | 
| 
 | 
   880  | 
          with `\<forall>i. f 0 \<le> f i` have "f 0 \<le> ?i" by auto
  | 
| 
 | 
   881  | 
          from `f 0 \<le> i` have *: "?C i = ?B ?i" by auto
  | 
| 
 | 
   882  | 
          have "emb (?C i) (?g ?i ?i)" unfolding * using non_empty emb_tl_left by auto
  | 
| 
 | 
   883  | 
          from iterated_subseq[OF 7, of "f 0" "?i", THEN spec[of _ "?i"], OF `f 0 \<le> ?i`]
  | 
| 
 | 
   884  | 
            obtain j where "j \<ge> f 0" and "emb (?g ?i ?i) (?g (f 0) j)" by blast
  | 
| 
 | 
   885  | 
          with `emb (?C i) (?g ?i ?i)`
  | 
| 
 | 
   886  | 
            show "\<exists>j\<ge>f 0. emb (?C i) (?g (f 0) j)" by (blast intro: emb_trans)
  | 
| 
 | 
   887  | 
        qed
  | 
| 
 | 
   888  | 
        ultimately have "goodp ?P ?C"
  | 
| 
 | 
   889  | 
          using 1[rule_format, of "f 0", OF le_refl, unfolded mbp_def] by auto
  | 
| 
 | 
   890  | 
        with `bad ?P ?C` have False by blast
  | 
| 
 | 
   891  | 
      }
  | 
| 
 | 
   892  | 
      hence no_index: "\<not> (\<exists>f. (\<forall>i. f 0 \<le> f i) \<and> bad ?P (?B \<circ> f))" by blast
  | 
| 
 | 
   893  | 
      let ?B' = "{?B i | i. True}"
 | 
| 
 | 
   894  | 
      have subset: "?B' \<subseteq> UNIV" by auto
  | 
| 
 | 
   895  | 
      have "wqo_on ?P ?B'"
  | 
| 
 | 
   896  | 
      proof
  | 
| 
 | 
   897  | 
        from emb_refl show "reflp_on ?P ?B'" by (auto simp: reflp_on_def)
  | 
| 
 | 
   898  | 
      next
  | 
| 
 | 
   899  | 
        from emb_trans show "transp_on ?P ?B'" by (auto simp: transp_on_def)
  | 
| 
 | 
   900  | 
      next
  | 
| 
 | 
   901  | 
        fix f :: "'a list seq" assume "\<forall>i. f i \<in> ?B'"
  | 
| 
 | 
   902  | 
        from no_bad_of_special_shape_imp_goodp[of ?P ?B f, OF no_index this]
  | 
| 
 | 
   903  | 
          show "goodp ?P f" .
  | 
| 
 | 
   904  | 
      qed
  | 
| 
 | 
   905  | 
      let ?a' = "{a i | i. True}"
 | 
| 
 | 
   906  | 
      have "?a' \<subseteq> UNIV" by auto
  | 
| 
 | 
   907  | 
      with finite_eq_wqo_on
  | 
| 
 | 
   908  | 
        have "wqo_on op = ?a'"
  | 
| 
 | 
   909  | 
        using finite[of UNIV] and finite_subset by blast
  | 
| 
 | 
   910  | 
      from wqo_on_Sigma[OF `wqo_on op = ?a'` `wqo_on ?P ?B'`]
  | 
| 
 | 
   911  | 
        have wqo: "wqo_on (prod_le op = ?P) (?a' \<times> ?B')" .
  | 
| 
 | 
   912  | 
      let ?aB = "\<lambda>i. (a i, ?B i)"
  | 
| 
 | 
   913  | 
      let ?P' = "prod_le op = ?P"
  | 
| 
 | 
   914  | 
      have "\<forall>i. ?aB i \<in> (?a' \<times> ?B')" by auto
  | 
| 
 | 
   915  | 
      with wqo have "goodp ?P' ?aB" unfolding wqo_on_def by auto
  | 
| 
 | 
   916  | 
      then obtain i j where "i < j" and *: "?P'\<^sup>=\<^sup>= (?aB i) (?aB j)"
  | 
| 
 | 
   917  | 
        by (auto simp: goodp_def)
  | 
| 
 | 
   918  | 
      from hd_Cons_tl and non_empty
  | 
| 
 | 
   919  | 
        have hd_tl: "hd (?A i) # tl (?A i) = ?A i"
  | 
| 
 | 
   920  | 
          "hd (?A j) # tl (?A j) = ?A j" by auto
  | 
| 
 | 
   921  | 
      from * have "(a i = a j \<and> ?B i = ?B j) \<or> (a i = a j \<and> ?P (?B i) (?B j))"
  | 
| 
 | 
   922  | 
        unfolding prod_le_def by auto
  | 
| 
 | 
   923  | 
      thus False
  | 
| 
 | 
   924  | 
      proof
  | 
| 
 | 
   925  | 
        assume *: "a i = a j \<and> ?B i = ?B j"
  | 
| 
 | 
   926  | 
        hence "?A i = ?A j" using a and hd_tl by auto
  | 
| 
 | 
   927  | 
        hence "?P\<^sup>=\<^sup>= (?A i) (?A j)" by auto
  | 
| 
 | 
   928  | 
        with `i < j` and `bad ?P ?A` show False by (auto simp: goodp_def)
  | 
| 
 | 
   929  | 
      next
  | 
| 
 | 
   930  | 
        assume "op = (a i) (a j) \<and> ?P (?B i) (?B j)"
  | 
| 
 | 
   931  | 
        hence *: "op = (a i) (a j)" and **: "?P (?B i) (?B j)" by auto
  | 
| 
 | 
   932  | 
        with emb_appendI[OF emb_refl[of "[hd (?A i)]"] **]
  | 
| 
 | 
   933  | 
          have "emb (?A i) (?A j)" using hd_tl a by simp
  | 
| 
 | 
   934  | 
        hence "?P\<^sup>=\<^sup>= (?A i) (?A j)" by auto
  | 
| 
 | 
   935  | 
        with `i < j` and `bad ?P ?A` show False by (auto simp: goodp_def)
  | 
| 
 | 
   936  | 
      qed
  | 
| 
 | 
   937  | 
    qed
  | 
| 
 | 
   938  | 
  }
  | 
| 
 | 
   939  | 
  with refl and trans show ?thesis unfolding wqo_on_def by blast
  | 
| 
 | 
   940  | 
qed
  | 
| 
 | 
   941  | 
  | 
| 
 | 
   942  | 
lemma Higman_antichains:
  | 
| 
 | 
   943  | 
  fixes A :: "('a::finite) list set"
 | 
| 
 | 
   944  | 
  assumes a: "\<forall>x \<in> A. \<forall>y \<in> A. x \<noteq> y \<longrightarrow> \<not>(emb x y) \<and> \<not>(emb y x)"
  | 
| 
 | 
   945  | 
  shows "finite A"
  | 
| 
 | 
   946  | 
proof (rule ccontr)
  | 
| 
 | 
   947  | 
  assume "infinite A"
  | 
| 
 | 
   948  | 
  then obtain f :: "nat \<Rightarrow> ('a::finite) list" where b: "inj f" and c: "range f \<subseteq> A"
 | 
| 
 | 
   949  | 
    by (auto simp add: infinite_iff_countable_subset)
  | 
| 
 | 
   950  | 
  from wqo_on_imp_goodp[OF wqo_on_finite_lists, simplified, of f]
  | 
| 
 | 
   951  | 
    obtain i j where d: "i < j" and e: "emb (f i) (f j)" by (auto simp: goodp_def)
  | 
| 
 | 
   952  | 
  have "f i \<noteq> f j" using b d by (auto simp add: inj_on_def)
  | 
| 
 | 
   953  | 
  moreover
  | 
| 
 | 
   954  | 
  have "f i \<in> A" using c by auto
  | 
| 
 | 
   955  | 
  moreover
  | 
| 
 | 
   956  | 
  have "f j \<in> A" using c by auto
  | 
| 
 | 
   957  | 
  ultimately have "\<not> (emb (f i) (f j))" using a by simp
  | 
| 
 | 
   958  | 
  with e show "False" by simp
  | 
| 
 | 
   959  | 
qed
  | 
| 
 | 
   960  | 
  | 
| 
 | 
   961  | 
end
  |