| author | haftmann | 
| Fri, 16 Mar 2007 21:32:08 +0100 | |
| changeset 22452 | 8a86fd2a1bf0 | 
| parent 22371 | c9f5895972b0 | 
| child 22665 | cf152ff55d16 | 
| permissions | -rw-r--r-- | 
| 22371 | 1 | (* Title: HOL/Library/SCT_Theorem.thy | 
| 2 | ID: $Id$ | |
| 3 | Author: Alexander Krauss, TU Muenchen | |
| 4 | *) | |
| 5 | ||
| 22359 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 6 | theory SCT_Theorem | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 7 | imports Main Ramsey SCT_Misc SCT_Definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 8 | begin | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 9 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 10 | section {* The size change criterion SCT *}
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 11 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 12 | definition is_thread :: "nat \<Rightarrow> nat sequence \<Rightarrow> (nat, scg) ipath \<Rightarrow> bool" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 13 | where | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 14 | "is_thread n \<theta> p = (\<forall>i\<ge>n. eqlat p \<theta> i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 15 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 16 | definition is_fthread :: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 17 | "nat sequence \<Rightarrow> (nat, scg) ipath \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> bool" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 18 | where | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 19 |   "is_fthread \<theta> mp i j = (\<forall>k\<in>{i..<j}. eqlat mp \<theta> k)"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 20 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 21 | definition is_desc_fthread :: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 22 | "nat sequence \<Rightarrow> (nat, scg) ipath \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> bool" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 23 | where | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 24 | "is_desc_fthread \<theta> mp i j = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 25 | (is_fthread \<theta> mp i j \<and> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 26 |   (\<exists>k\<in>{i..<j}. descat mp \<theta> k))"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 27 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 28 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 29 | "has_fth p i j n m = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 30 | (\<exists>\<theta>. is_fthread \<theta> p i j \<and> \<theta> i = n \<and> \<theta> j = m)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 31 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 32 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 33 | "has_desc_fth p i j n m = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 34 | (\<exists>\<theta>. is_desc_fthread \<theta> p i j \<and> \<theta> i = n \<and> \<theta> j = m)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 35 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 36 | section {* Bounded graphs and threads *}
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 37 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 38 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 39 | "bounded_scg (P::nat) (G::scg) = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 40 | (\<forall>p e p'. has_edge G p e p' \<longrightarrow> p < P \<and> p' < P)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 41 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 42 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 43 | "bounded_acg P ACG = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 44 | (\<forall>n G n'. has_edge ACG n G n' \<longrightarrow> n < P \<and> n' < P \<and> bounded_scg P G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 45 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 46 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 47 | "bounded_mp P mp = (\<forall>i. bounded_scg P (snd (mp i)))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 48 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 49 | definition (* = finite (range \<theta>) *) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 50 | "bounded_th (P::nat) n \<theta> = (\<forall>i>n. \<theta> i < P)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 51 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 52 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 53 | "finite_scg (G::scg) = (\<exists>P. bounded_scg P G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 54 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 55 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 56 | "finite_acg (A::acg) = (\<exists>P. bounded_acg P A)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 57 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 58 | lemma "finite (insert x A) = finite A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 59 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 60 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 61 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 62 | lemma finite_scg_finite[simp]: "finite_scg (Graph G) = finite G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 63 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 64 | assume "finite_scg (Graph G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 65 | thm bounded_scg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 66 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 67 | then obtain P where bounded: "bounded_scg P (Graph G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 68 | by (auto simp:finite_scg_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 69 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 70 | show "finite G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 71 | proof (rule finite_subset) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 72 | from bounded | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 73 |     show "G \<subseteq> {0 .. P - 1} \<times> { LESS, LEQ } \<times> { 0 .. P - 1}"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 74 | apply (auto simp:bounded_scg_def has_edge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 75 | apply force | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 76 | apply (case_tac "aa", auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 77 | apply force | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 78 | done | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 79 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 80 | show "finite \<dots>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 81 | by (auto intro: finite_cartesian_product finite_atLeastAtMost) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 82 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 83 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 84 | assume "finite G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 85 | thus "finite_scg (Graph G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 86 | proof induct | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 87 |     show "finite_scg (Graph {})"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 88 | unfolding finite_scg_def bounded_scg_def has_edge_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 89 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 90 | fix x G | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 91 | assume "finite G" "x \<notin> G" "finite_scg (Graph G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 92 | then obtain P | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 93 | where bG: "bounded_scg P (Graph G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 94 | by (auto simp:finite_scg_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 95 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 96 | obtain p e p' where x: "x = (p, e, p')" by (cases x, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 97 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 98 | let ?Q = "max P (max (Suc p) (Suc p'))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 99 | have "P \<le> ?Q" "Suc p \<le> ?Q" "Suc p' \<le> ?Q" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 100 | with bG | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 101 | have "bounded_scg ?Q (Graph (insert x G))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 102 | unfolding x bounded_scg_def has_edge_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 103 | apply simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 104 | apply (intro allI, elim allE) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 105 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 106 | thus "finite_scg (Graph (insert x G))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 107 | by (auto simp:finite_scg_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 108 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 109 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 110 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 111 | lemma finite_acg_empty: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 112 |   "finite_acg (Graph {})"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 113 | unfolding finite_acg_def bounded_acg_def has_edge_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 114 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 115 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 116 | lemma bounded_scg_up: "bounded_scg P G \<Longrightarrow> P \<le> Q \<Longrightarrow> bounded_scg Q G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 117 | unfolding bounded_scg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 118 | by force | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 119 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 120 | lemma bounded_up: "bounded_acg P G \<Longrightarrow> P \<le> Q \<Longrightarrow> bounded_acg Q G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 121 | unfolding bounded_acg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 122 | apply auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 123 | apply force+ | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 124 | apply (rule bounded_scg_up) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 125 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 126 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 127 | lemma bacg_insert: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 128 | assumes "bounded_acg P (Graph A)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 129 | assumes "n < P" "m < P" "bounded_scg P G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 130 | shows "bounded_acg P (Graph (insert (n, G, m) A))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 131 | using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 132 | unfolding bounded_acg_def has_edge_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 133 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 134 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 135 | lemma finite_acg_ins: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 136 | "finite_acg (Graph (insert (n,G,m) A)) = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 137 | (finite_scg G \<and> finite_acg (Graph A))" (is "?A = (?B \<and> ?C)") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 138 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 139 | assume "?A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 140 | thus "?B \<and> ?C" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 141 | unfolding finite_acg_def bounded_acg_def finite_scg_def has_edge_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 142 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 143 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 144 | assume "?B \<and> ?C" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 145 | thus ?A | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 146 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 147 | assume "?B" "?C" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 148 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 149 | from `?C` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 150 | obtain P where bA: "bounded_acg P (Graph A)" by (auto simp:finite_acg_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 151 | from `?B` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 152 | obtain P' where bG: "bounded_scg P' G" by (auto simp:finite_scg_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 153 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 154 | let ?Q = "max (max P P') (max (Suc n) (Suc m))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 155 | have "P \<le> ?Q" "n < ?Q" "m < ?Q" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 156 | have "bounded_acg ?Q (Graph (insert (n, G, m) A))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 157 | apply (rule bacg_insert) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 158 | apply (rule bounded_up) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 159 | apply (rule bA) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 160 | apply auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 161 | apply (rule bounded_scg_up) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 162 | apply (rule bG) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 163 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 164 | thus "finite_acg (Graph (insert (n, G, m) A))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 165 | by (auto simp:finite_acg_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 166 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 167 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 168 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 169 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 170 | lemma bounded_mpath: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 171 | assumes "has_ipath acg mp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 172 | and "bounded_acg P acg" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 173 | shows "bounded_mp P mp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 174 | using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 175 | unfolding bounded_acg_def bounded_mp_def has_ipath_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 176 | by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 177 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 178 | lemma bounded_th: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 179 | assumes th: "is_thread n \<theta> mp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 180 | and mp: "bounded_mp P mp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 181 | shows "bounded_th P n \<theta>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 182 | unfolding bounded_th_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 183 | proof (intro allI impI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 184 | fix i assume "n < i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 185 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 186 | from mp have "bounded_scg P (snd (mp i))" unfolding bounded_mp_def .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 187 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 188 | from th `n < i` have "eqlat mp \<theta> i" unfolding is_thread_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 189 | ultimately | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 190 | show "\<theta> i < P" unfolding bounded_scg_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 191 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 192 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 193 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 194 | lemma finite_range: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 195 | fixes f :: "nat \<Rightarrow> 'a" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 196 | assumes fin: "finite (range f)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 197 | shows "\<exists>x. \<exists>\<^sub>\<infinity>i. f i = x" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 198 | proof (rule classical) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 199 | assume "\<not>(\<exists>x. \<exists>\<^sub>\<infinity>i. f i = x)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 200 | hence "\<forall>x. \<exists>j. \<forall>i>j. f i \<noteq> x" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 201 | unfolding INF_nat by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 202 | with choice | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 203 | have "\<exists>j. \<forall>x. \<forall>i>(j x). f i \<noteq> x" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 204 | then obtain j where | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 205 | neq: "\<And>x i. j x < i \<Longrightarrow> f i \<noteq> x" by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 206 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 207 | from fin have "finite (range (j o f))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 208 | by (auto simp:comp_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 209 | with finite_nat_bounded | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 210 |   obtain m where "range (j o f) \<subseteq> {..<m}" by blast
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 211 | hence "j (f m) < m" unfolding comp_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 212 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 213 | with neq[of "f m" m] show ?thesis by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 214 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 215 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 216 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 217 | lemma bounded_th_infinite_visit: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 218 | fixes \<theta> :: "nat sequence" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 219 | assumes b: "bounded_th P n \<theta>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 220 | shows "\<exists>p. \<exists>\<^sub>\<infinity>i. \<theta> i = p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 221 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 222 |   have split: "range \<theta> = (\<theta> ` {0 .. n}) \<union> (\<theta> ` {i. n < i})"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 223 | (is "\<dots> = ?A \<union> ?B") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 224 | unfolding image_Un[symmetric] by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 225 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 226 | have "finite ?A" by (rule finite_imageI) auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 227 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 228 | have "finite ?B" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 229 | proof (rule finite_subset) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 230 | from b | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 231 |     show "?B \<subseteq> { 0 ..< P }"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 232 | unfolding bounded_th_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 233 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 234 | show "finite \<dots>" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 235 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 236 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 237 | ultimately have "finite (range \<theta>)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 238 | unfolding split by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 239 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 240 | with finite_range show ?thesis . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 241 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 242 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 243 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 244 | lemma bounded_scgcomp: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 245 | "bounded_scg P A | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 246 | \<Longrightarrow> bounded_scg P B | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 247 | \<Longrightarrow> bounded_scg P (A * B)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 248 | unfolding bounded_scg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 249 | by (auto simp:in_grcomp) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 250 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 251 | lemma bounded_acgcomp: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 252 | "bounded_acg P A | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 253 | \<Longrightarrow> bounded_acg P B | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 254 | \<Longrightarrow> bounded_acg P (A * B)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 255 | unfolding bounded_acg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 256 | by (auto simp:in_grcomp intro!:bounded_scgcomp) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 257 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 258 | lemma bounded_acgpow: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 259 | "bounded_acg P A | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 260 | \<Longrightarrow> bounded_acg P (A ^ (Suc n))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 261 | by (induct n, simp add:power_Suc) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 262 | (subst power_Suc, blast intro:bounded_acgcomp) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 263 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 264 | lemma bounded_plus: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 265 | assumes b: "bounded_acg P acg" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 266 | shows "bounded_acg P (tcl acg)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 267 | unfolding bounded_acg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 268 | proof (intro allI impI conjI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 269 | fix n G m | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 270 | assume "tcl acg \<turnstile> n \<leadsto>\<^bsup>G\<^esup> m" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 271 | then obtain i where "0 < i" and i: "acg ^ i \<turnstile> n \<leadsto>\<^bsup>G\<^esup> m" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 272 | unfolding in_tcl by auto (* FIXME: Disambiguate \<turnstile> Grammar *) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 273 | from b have "bounded_acg P (acg ^ (Suc (i - 1)))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 274 | by (rule bounded_acgpow) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 275 | with `0 < i` have "bounded_acg P (acg ^ i)" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 276 | with i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 277 | show "n < P" "m < P" "bounded_scg P G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 278 | unfolding bounded_acg_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 279 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 280 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 281 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 282 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 283 | lemma bounded_scg_def': | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 284 | "bounded_scg P G = (\<forall>(p,e,p')\<in>dest_graph G. p < P \<and> p' < P)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 285 | unfolding bounded_scg_def has_edge_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 286 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 287 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 288 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 289 | lemma finite_bounded_scg: "finite { G. bounded_scg P G }"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 290 | proof (rule finite_subset) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 291 |   show "{G. bounded_scg P G} \<subseteq> 
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 292 |     Graph ` (Pow ({0 .. P - 1} \<times> UNIV \<times> {0 .. P - 1}))"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 293 | proof (rule, simp) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 294 | fix G | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 295 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 296 | assume b: "bounded_scg P G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 297 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 298 |     show "G \<in> Graph ` Pow ({0..P - Suc 0} \<times> UNIV \<times> {0..P - Suc 0})"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 299 | proof (cases G) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 300 | fix G' assume [simp]: "G = Graph G'" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 301 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 302 | from b show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 303 | by (auto simp:bounded_scg_def' image_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 304 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 305 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 306 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 307 | show "finite \<dots>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 308 | apply (rule finite_imageI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 309 | apply (unfold finite_Pow_iff) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 310 | by (intro finite_cartesian_product finite_atLeastAtMost | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 311 | finite_class.finite) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 312 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 313 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 314 | lemma bounded_finite: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 315 | assumes bounded: "bounded_acg P A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 316 | shows "finite (dest_graph A)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 317 | proof (rule finite_subset) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 318 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 319 | from bounded | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 320 |   show "dest_graph A \<subseteq> {0 .. P - 1} \<times> { G. bounded_scg P G } \<times> { 0 .. P - 1}"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 321 | by (auto simp:bounded_acg_def has_edge_def) force+ | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 322 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 323 | show "finite \<dots>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 324 | by (intro finite_cartesian_product finite_atLeastAtMost finite_bounded_scg) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 325 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 326 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 327 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 328 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 329 | section {* Contraction and more *}
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 330 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 331 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 332 | abbreviation | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 333 | "pdesc P == (fst P, prod P, end_node P)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 334 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 335 | lemma pdesc_acgplus: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 336 | assumes "has_ipath \<A> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 337 | and "i < j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 338 | shows "has_edge (tcl \<A>) (fst (p\<langle>i,j\<rangle>)) (prod (p\<langle>i,j\<rangle>)) (end_node (p\<langle>i,j\<rangle>))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 339 | unfolding plus_paths | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 340 | apply (rule exI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 341 | apply (insert prems) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 342 | by (auto intro:sub_path_is_path[of "\<A>" p i j] simp:sub_path_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 343 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 344 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 345 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 346 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 347 | lemma combine_fthreads: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 348 | assumes range: "i < j" "j \<le> k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 349 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 350 | "has_fth p i k m r = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 351 | (\<exists>n. has_fth p i j m n \<and> has_fth p j k n r)" (is "?L = ?R") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 352 | proof (intro iffI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 353 | assume "?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 354 | then obtain \<theta> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 355 | where "is_fthread \<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 356 | and [simp]: "\<theta> i = m" "\<theta> k = r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 357 | by (auto simp:has_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 358 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 359 | with range | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 360 | have "is_fthread \<theta> p i j" and "is_fthread \<theta> p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 361 | by (auto simp:is_fthread_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 362 | hence "has_fth p i j m (\<theta> j)" and "has_fth p j k (\<theta> j) r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 363 | by (auto simp:has_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 364 | thus "?R" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 365 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 366 | assume "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 367 | then obtain n \<theta>1 \<theta>2 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 368 | where ths: "is_fthread \<theta>1 p i j" "is_fthread \<theta>2 p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 369 | and [simp]: "\<theta>1 i = m" "\<theta>1 j = n" "\<theta>2 j = n" "\<theta>2 k = r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 370 | by (auto simp:has_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 371 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 372 | let ?\<theta> = "(\<lambda>i. if i < j then \<theta>1 i else \<theta>2 i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 373 | have "is_fthread ?\<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 374 | unfolding is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 375 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 376 |     fix l assume range: "l \<in> {i..<k}"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 377 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 378 | show "eqlat p ?\<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 379 | proof (cases rule:three_cases) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 380 | assume "Suc l < j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 381 | with ths range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 382 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 383 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 384 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 385 | assume "Suc l = j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 386 | hence "l < j" "\<theta>2 (Suc l) = \<theta>1 (Suc l)" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 387 | with ths range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 388 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 389 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 390 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 391 | assume "j \<le> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 392 | with ths range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 393 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 394 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 395 | qed arith | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 396 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 397 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 398 | have "?\<theta> i = m" "?\<theta> k = r" using range by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 399 | ultimately show "has_fth p i k m r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 400 | by (auto simp:has_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 401 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 402 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 403 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 404 | lemma desc_is_fthread: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 405 | "is_desc_fthread \<theta> p i k \<Longrightarrow> is_fthread \<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 406 | unfolding is_desc_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 407 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 408 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 409 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 410 | lemma combine_dfthreads: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 411 | assumes range: "i < j" "j \<le> k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 412 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 413 | "has_desc_fth p i k m r = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 414 | (\<exists>n. (has_desc_fth p i j m n \<and> has_fth p j k n r) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 415 | \<or> (has_fth p i j m n \<and> has_desc_fth p j k n r))" (is "?L = ?R") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 416 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 417 | assume "?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 418 | then obtain \<theta> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 419 | where desc: "is_desc_fthread \<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 420 | and [simp]: "\<theta> i = m" "\<theta> k = r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 421 | by (auto simp:has_desc_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 422 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 423 | hence "is_fthread \<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 424 | by (simp add: desc_is_fthread) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 425 | with range have fths: "is_fthread \<theta> p i j" "is_fthread \<theta> p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 426 | unfolding is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 427 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 428 | hence hfths: "has_fth p i j m (\<theta> j)" "has_fth p j k (\<theta> j) r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 429 | by (auto simp:has_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 430 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 431 | from desc obtain l | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 432 | where "i \<le> l" "l < k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 433 | and "descat p \<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 434 | by (auto simp:is_desc_fthread_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 435 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 436 | with fths | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 437 | have "is_desc_fthread \<theta> p i j \<or> is_desc_fthread \<theta> p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 438 | unfolding is_desc_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 439 | by (cases "l < j") auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 440 | hence "has_desc_fth p i j m (\<theta> j) \<or> has_desc_fth p j k (\<theta> j) r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 441 | by (auto simp:has_desc_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 442 | with hfths show ?R | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 443 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 444 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 445 | assume "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 446 | then obtain n \<theta>1 \<theta>2 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 447 | where "(is_desc_fthread \<theta>1 p i j \<and> is_fthread \<theta>2 p j k) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 448 | \<or> (is_fthread \<theta>1 p i j \<and> is_desc_fthread \<theta>2 p j k)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 449 | and [simp]: "\<theta>1 i = m" "\<theta>1 j = n" "\<theta>2 j = n" "\<theta>2 k = r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 450 | by (auto simp:has_fth_def has_desc_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 451 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 452 | hence ths2: "is_fthread \<theta>1 p i j" "is_fthread \<theta>2 p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 453 | and dths: "is_desc_fthread \<theta>1 p i j \<or> is_desc_fthread \<theta>2 p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 454 | by (auto simp:desc_is_fthread) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 455 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 456 | let ?\<theta> = "(\<lambda>i. if i < j then \<theta>1 i else \<theta>2 i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 457 | have "is_fthread ?\<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 458 | unfolding is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 459 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 460 |     fix l assume range: "l \<in> {i..<k}"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 461 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 462 | show "eqlat p ?\<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 463 | proof (cases rule:three_cases) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 464 | assume "Suc l < j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 465 | with ths2 range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 466 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 467 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 468 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 469 | assume "Suc l = j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 470 | hence "l < j" "\<theta>2 (Suc l) = \<theta>1 (Suc l)" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 471 | with ths2 range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 472 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 473 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 474 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 475 | assume "j \<le> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 476 | with ths2 range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 477 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 478 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 479 | qed arith | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 480 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 481 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 482 | from dths | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 483 | have "\<exists>l. i \<le> l \<and> l < k \<and> descat p ?\<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 484 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 485 | assume "is_desc_fthread \<theta>1 p i j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 486 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 487 | then obtain l where range: "i \<le> l" "l < j" and "descat p \<theta>1 l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 488 | unfolding is_desc_fthread_def Bex_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 489 | hence "descat p ?\<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 490 | by (cases "Suc l = j", auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 491 | with `j \<le> k` and range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 492 | by (rule_tac x="l" in exI, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 493 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 494 | assume "is_desc_fthread \<theta>2 p j k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 495 | then obtain l where range: "j \<le> l" "l < k" and "descat p \<theta>2 l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 496 | unfolding is_desc_fthread_def Bex_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 497 | with `i < j` have "descat p ?\<theta> l" "i \<le> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 498 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 499 | with range show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 500 | by (rule_tac x="l" in exI, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 501 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 502 | ultimately have "is_desc_fthread ?\<theta> p i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 503 | by (simp add: is_desc_fthread_def Bex_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 504 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 505 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 506 | have "?\<theta> i = m" "?\<theta> k = r" using range by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 507 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 508 | ultimately show "has_desc_fth p i k m r" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 509 | by (auto simp:has_desc_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 510 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 511 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 512 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 513 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 514 | lemma fth_single: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 515 | "has_fth p i (Suc i) m n = eql (snd (p i)) m n" (is "?L = ?R") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 516 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 517 | assume "?L" thus "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 518 | unfolding is_fthread_def Ball_def has_fth_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 519 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 520 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 521 | let ?\<theta> = "\<lambda>k. if k = i then m else n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 522 | assume edge: "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 523 | hence "is_fthread ?\<theta> p i (Suc i) \<and> ?\<theta> i = m \<and> ?\<theta> (Suc i) = n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 524 | unfolding is_fthread_def Ball_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 525 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 526 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 527 | thus "?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 528 | unfolding has_fth_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 529 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 530 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 531 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 532 | lemma desc_fth_single: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 533 | "has_desc_fth p i (Suc i) m n = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 534 | dsc (snd (p i)) m n" (is "?L = ?R") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 535 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 536 | assume "?L" thus "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 537 | unfolding is_desc_fthread_def has_desc_fth_def is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 538 | Bex_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 539 | by (elim exE conjE) (case_tac "k = i", auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 540 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 541 | let ?\<theta> = "\<lambda>k. if k = i then m else n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 542 | assume edge: "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 543 | hence "is_desc_fthread ?\<theta> p i (Suc i) \<and> ?\<theta> i = m \<and> ?\<theta> (Suc i) = n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 544 | unfolding is_desc_fthread_def is_fthread_def Ball_def Bex_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 545 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 546 | thus "?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 547 | unfolding has_desc_fth_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 548 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 549 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 550 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 551 | lemma mk_eql: "(G \<turnstile> m \<leadsto>\<^bsup>e\<^esup> n) \<Longrightarrow> eql G m n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 552 | by (cases e, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 553 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 554 | lemma eql_scgcomp: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 555 | "eql (G * H) m r = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 556 | (\<exists>n. eql G m n \<and> eql H n r)" (is "?L = ?R") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 557 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 558 | show "?L \<Longrightarrow> ?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 559 | by (auto simp:in_grcomp intro!:mk_eql) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 560 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 561 | assume "?R" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 562 | then obtain n where l: "eql G m n" and r:"eql H n r" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 563 | thus ?L | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 564 | by (cases "dsc G m n") (auto simp:in_grcomp mult_sedge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 565 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 566 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 567 | lemma desc_scgcomp: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 568 | "dsc (G * H) m r = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 569 | (\<exists>n. (dsc G m n \<and> eql H n r) \<or> (eq G m n \<and> dsc H n r))" (is "?L = ?R") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 570 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 571 | show "?R \<Longrightarrow> ?L" by (auto simp:in_grcomp mult_sedge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 572 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 573 | assume "?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 574 | thus ?R | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 575 | by (auto simp:in_grcomp mult_sedge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 576 | (case_tac "e", auto, case_tac "e'", auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 577 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 578 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 579 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 580 | lemma has_fth_unfold: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 581 | assumes "i < j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 582 | shows "has_fth p i j m n = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 583 | (\<exists>r. has_fth p i (Suc i) m r \<and> has_fth p (Suc i) j r n)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 584 | by (rule combine_fthreads) (insert `i < j`, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 585 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 586 | lemma has_dfth_unfold: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 587 | assumes range: "i < j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 588 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 589 | "has_desc_fth p i j m r = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 590 | (\<exists>n. (has_desc_fth p i (Suc i) m n \<and> has_fth p (Suc i) j n r) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 591 | \<or> (has_fth p i (Suc i) m n \<and> has_desc_fth p (Suc i) j n r))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 592 | by (rule combine_dfthreads) (insert `i < j`, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 593 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 594 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 595 | lemma Lemma7a: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 596 | assumes "i \<le> j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 597 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 598 | "has_fth p i j m n = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 599 | eql (prod (p\<langle>i,j\<rangle>)) m n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 600 | using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 601 | proof (induct i arbitrary: m rule:inc_induct) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 602 | case 1 show ?case | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 603 | unfolding has_fth_def is_fthread_def sub_path_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 604 | by (auto simp:in_grunit one_sedge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 605 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 606 | case (2 i) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 607 | note IH = `\<And>m. has_fth p (Suc i) j m n = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 608 | eql (prod (p\<langle>Suc i,j\<rangle>)) m n` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 609 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 610 | have "has_fth p i j m n | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 611 | = (\<exists>r. has_fth p i (Suc i) m r \<and> has_fth p (Suc i) j r n)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 612 | by (rule has_fth_unfold[OF `i < j`]) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 613 | also have "\<dots> = (\<exists>r. has_fth p i (Suc i) m r | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 614 | \<and> eql (prod (p\<langle>Suc i,j\<rangle>)) r n)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 615 | by (simp only:IH) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 616 | also have "\<dots> = (\<exists>r. eql (snd (p i)) m r | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 617 | \<and> eql (prod (p\<langle>Suc i,j\<rangle>)) r n)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 618 | by (simp only:fth_single) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 619 | also have "\<dots> = eql (snd (p i) * prod (p\<langle>Suc i,j\<rangle>)) m n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 620 | by (simp only:eql_scgcomp) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 621 | also have "\<dots> = eql (prod (p\<langle>i,j\<rangle>)) m n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 622 | by (simp only:prod_unfold[OF `i < j`]) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 623 | finally show ?case . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 624 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 625 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 626 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 627 | lemma Lemma7b: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 628 | assumes "i \<le> j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 629 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 630 | "has_desc_fth p i j m n = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 631 | dsc (prod (p\<langle>i,j\<rangle>)) m n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 632 | using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 633 | proof (induct i arbitrary: m rule:inc_induct) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 634 | case 1 show ?case | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 635 | unfolding has_desc_fth_def is_desc_fthread_def sub_path_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 636 | by (auto simp:in_grunit one_sedge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 637 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 638 | case (2 i) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 639 | thus ?case | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 640 | by (simp only:prod_unfold desc_scgcomp desc_fth_single | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 641 | has_dfth_unfold fth_single Lemma7a) auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 642 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 643 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 644 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 645 | lemma descat_contract: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 646 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 647 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 648 | "descat (contract s p) \<theta> i = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 649 | has_desc_fth p (s i) (s (Suc i)) (\<theta> i) (\<theta> (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 650 | by (simp add:Lemma7b increasing_weak contract_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 651 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 652 | lemma eqlat_contract: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 653 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 654 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 655 | "eqlat (contract s p) \<theta> i = | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 656 | has_fth p (s i) (s (Suc i)) (\<theta> i) (\<theta> (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 657 | by (auto simp:Lemma7a increasing_weak contract_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 658 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 659 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 660 | subsection {* Connecting threads *}
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 661 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 662 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 663 | "connect s \<theta>s = (\<lambda>k. \<theta>s (section_of s k) k)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 664 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 665 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 666 | lemma next_in_range: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 667 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 668 | assumes a: "k \<in> section s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 669 | shows "(Suc k \<in> section s i) \<or> (Suc k \<in> section s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 670 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 671 | from a have "k < s (Suc i)" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 672 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 673 | hence "Suc k < s (Suc i) \<or> Suc k = s (Suc i)" by arith | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 674 | thus ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 675 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 676 | assume "Suc k < s (Suc i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 677 | with a have "Suc k \<in> section s i" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 678 | thus ?thesis .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 679 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 680 | assume eq: "Suc k = s (Suc i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 681 | with increasing_strict have "Suc k < s (Suc (Suc i))" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 682 | with eq have "Suc k \<in> section s (Suc i)" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 683 | thus ?thesis .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 684 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 685 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 686 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 687 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 688 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 689 | lemma connect_threads: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 690 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 691 | assumes connected: "\<theta>s i (s (Suc i)) = \<theta>s (Suc i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 692 | assumes fth: "is_fthread (\<theta>s i) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 693 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 694 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 695 | "is_fthread (connect s \<theta>s) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 696 | unfolding is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 697 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 698 | fix k assume krng: "k \<in> section s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 699 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 700 | with fth have eqlat: "eqlat p (\<theta>s i) k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 701 | unfolding is_fthread_def by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 702 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 703 | from krng and next_in_range | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 704 | have "(Suc k \<in> section s i) \<or> (Suc k \<in> section s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 705 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 706 | thus "eqlat p (connect s \<theta>s) k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 707 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 708 | assume "Suc k \<in> section s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 709 | with krng eqlat show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 710 | unfolding connect_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 711 | by (simp only:section_of_known `increasing s`) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 712 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 713 | assume skrng: "Suc k \<in> section s (Suc i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 714 | with krng have "Suc k = s (Suc i)" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 715 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 716 | with krng skrng eqlat show ?thesis | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 717 | unfolding connect_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 718 | by (simp only:section_of_known connected[symmetric] `increasing s`) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 719 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 720 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 721 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 722 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 723 | lemma connect_dthreads: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 724 | assumes inc[simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 725 | assumes connected: "\<theta>s i (s (Suc i)) = \<theta>s (Suc i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 726 | assumes fth: "is_desc_fthread (\<theta>s i) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 727 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 728 | shows | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 729 | "is_desc_fthread (connect s \<theta>s) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 730 | unfolding is_desc_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 731 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 732 | show "is_fthread (connect s \<theta>s) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 733 | apply (rule connect_threads) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 734 | apply (insert fth) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 735 | by (auto simp:connected is_desc_fthread_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 736 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 737 | from fth | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 738 | obtain k where dsc: "descat p (\<theta>s i) k" and krng: "k \<in> section s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 739 | unfolding is_desc_fthread_def by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 740 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 741 | from krng and next_in_range | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 742 | have "(Suc k \<in> section s i) \<or> (Suc k \<in> section s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 743 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 744 | hence "descat p (connect s \<theta>s) k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 745 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 746 | assume "Suc k \<in> section s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 747 | with krng dsc show ?thesis unfolding connect_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 748 | by (simp only:section_of_known inc) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 749 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 750 | assume skrng: "Suc k \<in> section s (Suc i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 751 | with krng have "Suc k = s (Suc i)" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 752 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 753 | with krng skrng dsc show ?thesis unfolding connect_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 754 | by (simp only:section_of_known connected[symmetric] inc) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 755 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 756 | with krng show "\<exists>k\<in>section s i. descat p (connect s \<theta>s) k" .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 757 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 758 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 759 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 760 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 761 | lemma mk_inf_thread: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 762 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 763 | assumes fths: "\<And>i. i > n \<Longrightarrow> is_fthread \<theta> p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 764 | shows "is_thread (s (Suc n)) \<theta> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 765 | unfolding is_thread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 766 | proof (intro allI impI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 767 | fix j assume st: "s (Suc n) \<le> j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 768 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 769 | let ?k = "section_of s j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 770 | from in_section_of st | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 771 | have rs: "j \<in> section s ?k" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 772 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 773 | with st have "s (Suc n) < s (Suc ?k)" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 774 | with increasing_bij have "n < ?k" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 775 | with rs and fths[of ?k] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 776 | show "eqlat p \<theta> j" by (simp add:is_fthread_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 777 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 778 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 779 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 780 | lemma mk_inf_desc_thread: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 781 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 782 | assumes fths: "\<And>i. i > n \<Longrightarrow> is_fthread \<theta> p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 783 | assumes fdths: "\<exists>\<^sub>\<infinity>i. is_desc_fthread \<theta> p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 784 | shows "is_desc_thread \<theta> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 785 | unfolding is_desc_thread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 786 | proof (intro exI conjI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 787 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 788 | from mk_inf_thread[of s n] is_thread_def fths | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 789 | show "\<forall>i\<ge>s (Suc n). eqlat p \<theta> i" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 790 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 791 | show "\<exists>\<^sub>\<infinity>l. descat p \<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 792 | unfolding INF_nat | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 793 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 794 | fix i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 795 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 796 | let ?k = "section_of s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 797 | from fdths obtain j | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 798 | where "?k < j" "is_desc_fthread \<theta> p (s j) (s (Suc j))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 799 | unfolding INF_nat by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 800 | then obtain l where "s j \<le> l" and desc: "descat p \<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 801 | unfolding is_desc_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 802 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 803 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 804 | have "i < s (Suc ?k)" by (rule section_of2) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 805 | also have "\<dots> \<le> s j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 806 | by (rule increasing_weak[of s], assumption) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 807 | (insert `?k < j`, arith) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 808 | also note `\<dots> \<le> l` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 809 | finally have "i < l" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 810 | with desc | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 811 | show "\<exists>l. i < l \<and> descat p \<theta> l" by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 812 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 813 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 814 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 815 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 816 | lemma desc_ex_choice: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 817 | assumes A: "((\<exists>n.\<forall>i\<ge>n. \<exists>x. P x i) \<and> (\<exists>\<^sub>\<infinity>i. \<exists>x. Q x i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 818 | and imp: "\<And>x i. Q x i \<Longrightarrow> P x i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 819 | shows "\<exists>xs. ((\<exists>n.\<forall>i\<ge>n. P (xs i) i) \<and> (\<exists>\<^sub>\<infinity>i. Q (xs i) i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 820 | (is "\<exists>xs. ?Ps xs \<and> ?Qs xs") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 821 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 822 | let ?w = "\<lambda>i. (if (\<exists>x. Q x i) then (SOME x. Q x i) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 823 | else (SOME x. P x i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 824 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 825 | from A | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 826 | obtain n where P: "\<And>i. n \<le> i \<Longrightarrow> \<exists>x. P x i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 827 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 828 |   {
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 829 | fix i::'a assume "n \<le> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 830 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 831 | have "P (?w i) i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 832 | proof (cases "\<exists>x. Q x i") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 833 | case True | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 834 | hence "Q (?w i) i" by (auto intro:someI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 835 | with imp show "P (?w i) i" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 836 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 837 | case False | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 838 | with P[OF `n \<le> i`] show "P (?w i) i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 839 | by (auto intro:someI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 840 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 841 | } | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 842 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 843 | hence "?Ps ?w" by (rule_tac x=n in exI) auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 844 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 845 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 846 | from A have "\<exists>\<^sub>\<infinity>i. (\<exists>x. Q x i)" .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 847 | hence "?Qs ?w" by (rule INF_mono) (auto intro:someI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 848 | ultimately | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 849 | show "?Ps ?w \<and> ?Qs ?w" .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 850 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 851 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 852 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 853 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 854 | lemma dthreads_join: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 855 | assumes [simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 856 | assumes dthread: "is_desc_thread \<theta> (contract s p)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 857 | shows "\<exists>\<theta>s. desc (\<lambda>i. is_fthread (\<theta>s i) p (s i) (s (Suc i)) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 858 | \<and> \<theta>s i (s i) = \<theta> i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 859 | \<and> \<theta>s i (s (Suc i)) = \<theta> (Suc i)) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 860 | (\<lambda>i. is_desc_fthread (\<theta>s i) p (s i) (s (Suc i)) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 861 | \<and> \<theta>s i (s i) = \<theta> i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 862 | \<and> \<theta>s i (s (Suc i)) = \<theta> (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 863 | apply (rule desc_ex_choice) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 864 | apply (insert dthread) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 865 | apply (simp only:is_desc_thread_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 866 | apply (simp add:eqlat_contract) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 867 | apply (simp add:descat_contract) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 868 | apply (simp only:has_fth_def has_desc_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 869 | by (auto simp:is_desc_fthread_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 870 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 871 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 872 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 873 | lemma INF_drop_prefix: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 874 | "(\<exists>\<^sub>\<infinity>i::nat. i > n \<and> P i) = (\<exists>\<^sub>\<infinity>i. P i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 875 | apply (auto simp:INF_nat) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 876 | apply (drule_tac x = "max m n" in spec) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 877 | apply (elim exE conjE) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 878 | apply (rule_tac x = "na" in exI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 879 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 880 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 881 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 882 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 883 | lemma contract_keeps_threads: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 884 | assumes inc[simp]: "increasing s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 885 | shows "(\<exists>\<theta>. is_desc_thread \<theta> p) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 886 | \<longleftrightarrow> (\<exists>\<theta>. is_desc_thread \<theta> (contract s p))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 887 | (is "?A \<longleftrightarrow> ?B") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 888 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 889 | assume "?A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 890 | then obtain \<theta> n | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 891 | where fr: "\<forall>i\<ge>n. eqlat p \<theta> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 892 | and ds: "\<exists>\<^sub>\<infinity>i. descat p \<theta> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 893 | unfolding is_desc_thread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 894 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 895 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 896 | let ?c\<theta> = "\<lambda>i. \<theta> (s i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 897 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 898 | have "is_desc_thread ?c\<theta> (contract s p)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 899 | unfolding is_desc_thread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 900 | proof (intro exI conjI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 901 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 902 | show "\<forall>i\<ge>n. eqlat (contract s p) ?c\<theta> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 903 | proof (intro allI impI) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 904 | fix i assume "n \<le> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 905 | also have "i \<le> s i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 906 | using increasing_inc by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 907 | finally have "n \<le> s i" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 908 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 909 | with fr have "is_fthread \<theta> p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 910 | unfolding is_fthread_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 911 | hence "has_fth p (s i) (s (Suc i)) (\<theta> (s i)) (\<theta> (s (Suc i)))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 912 | unfolding has_fth_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 913 | with less_imp_le[OF increasing_strict] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 914 | have "eql (prod (p\<langle>s i,s (Suc i)\<rangle>)) (\<theta> (s i)) (\<theta> (s (Suc i)))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 915 | by (simp add:Lemma7a) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 916 | thus "eqlat (contract s p) ?c\<theta> i" unfolding contract_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 917 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 918 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 919 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 920 | show "\<exists>\<^sub>\<infinity>i. descat (contract s p) ?c\<theta> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 921 | unfolding INF_nat | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 922 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 923 | fix i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 924 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 925 | let ?K = "section_of s (max (s (Suc i)) n)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 926 | from `\<exists>\<^sub>\<infinity>i. descat p \<theta> i` obtain j | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 927 | where "s (Suc ?K) < j" "descat p \<theta> j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 928 | unfolding INF_nat by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 929 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 930 | let ?L = "section_of s j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 931 |       {
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 932 | fix x assume r: "x \<in> section s ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 933 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 934 | have e1: "max (s (Suc i)) n < s (Suc ?K)" by (rule section_of2) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 935 | note `s (Suc ?K) < j` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 936 | also have "j < s (Suc ?L)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 937 | by (rule section_of2) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 938 | finally have "Suc ?K \<le> ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 939 | by (simp add:increasing_bij) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 940 | with increasing_weak have "s (Suc ?K) \<le> s ?L" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 941 | with e1 r have "max (s (Suc i)) n < x" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 942 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 943 | hence "(s (Suc i)) < x" "n < x" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 944 | } | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 945 | note range_est = this | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 946 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 947 | have "is_desc_fthread \<theta> p (s ?L) (s (Suc ?L))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 948 | unfolding is_desc_fthread_def is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 949 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 950 | show "\<forall>m\<in>section s ?L. eqlat p \<theta> m" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 951 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 952 | fix m assume "m\<in>section s ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 953 | with range_est(2) have "n < m" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 954 | with fr show "eqlat p \<theta> m" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 955 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 956 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 957 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 958 | from in_section_of inc less_imp_le[OF `s (Suc ?K) < j`] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 959 | have "j \<in> section s ?L" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 960 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 961 | with `descat p \<theta> j` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 962 | show "\<exists>m\<in>section s ?L. descat p \<theta> m" .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 963 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 964 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 965 | with less_imp_le[OF increasing_strict] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 966 | have a: "descat (contract s p) ?c\<theta> ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 967 | unfolding contract_def Lemma7b[symmetric] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 968 | by (auto simp:Lemma7b[symmetric] has_desc_fth_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 969 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 970 | have "i < ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 971 | proof (rule classical) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 972 | assume "\<not> i < ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 973 | hence "s ?L < s (Suc i)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 974 | by (simp add:increasing_bij) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 975 | also have "\<dots> < s ?L" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 976 | by (rule range_est(1)) (simp add:increasing_strict) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 977 | finally show ?thesis . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 978 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 979 | with a show "\<exists>l. i < l \<and> descat (contract s p) ?c\<theta> l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 980 | by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 981 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 982 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 983 | with exI show "?B" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 984 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 985 | assume "?B" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 986 | then obtain \<theta> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 987 | where dthread: "is_desc_thread \<theta> (contract s p)" .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 988 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 989 | with dthreads_join inc | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 990 | obtain \<theta>s where ths_spec: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 991 | "desc (\<lambda>i. is_fthread (\<theta>s i) p (s i) (s (Suc i)) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 992 | \<and> \<theta>s i (s i) = \<theta> i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 993 | \<and> \<theta>s i (s (Suc i)) = \<theta> (Suc i)) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 994 | (\<lambda>i. is_desc_fthread (\<theta>s i) p (s i) (s (Suc i)) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 995 | \<and> \<theta>s i (s i) = \<theta> i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 996 | \<and> \<theta>s i (s (Suc i)) = \<theta> (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 997 | (is "desc ?alw ?inf") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 998 | by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 999 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1000 | then obtain n where fr: "\<forall>i\<ge>n. ?alw i" by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1001 | hence connected: "\<And>i. n < i \<Longrightarrow> \<theta>s i (s (Suc i)) = \<theta>s (Suc i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1002 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1003 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1004 | let ?j\<theta> = "connect s \<theta>s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1005 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1006 | from fr ths_spec have ths_spec2: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1007 | "\<And>i. i > n \<Longrightarrow> is_fthread (\<theta>s i) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1008 | "\<exists>\<^sub>\<infinity>i. is_desc_fthread (\<theta>s i) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1009 | by (auto intro:INF_mono) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1010 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1011 | have p1: "\<And>i. i > n \<Longrightarrow> is_fthread ?j\<theta> p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1012 | by (rule connect_threads) (auto simp:connected ths_spec2) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1013 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1014 | from ths_spec2(2) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1015 | have "\<exists>\<^sub>\<infinity>i. n < i \<and> is_desc_fthread (\<theta>s i) p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1016 | unfolding INF_drop_prefix . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1017 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1018 | hence p2: "\<exists>\<^sub>\<infinity>i. is_desc_fthread ?j\<theta> p (s i) (s (Suc i))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1019 | apply (rule INF_mono) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1020 | apply (rule connect_dthreads) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1021 | by (auto simp:connected) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1022 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1023 | with `increasing s` p1 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1024 | have "is_desc_thread ?j\<theta> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1025 | by (rule mk_inf_desc_thread) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1026 | with exI show "?A" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1027 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1028 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1029 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1030 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1031 | lemma repeated_edge: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1032 | assumes "\<And>i. i > n \<Longrightarrow> dsc (snd (p i)) k k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1033 | shows "is_desc_thread (\<lambda>i. k) p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1034 | using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1035 | unfolding is_desc_thread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1036 | apply (auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1037 | apply (rule_tac x="Suc n" in exI, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1038 | apply (rule INF_mono[where P="\<lambda>i. n < i"]) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1039 | apply (simp only:INF_nat) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1040 | by auto arith | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1041 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1042 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1043 | lemma fin_from_inf: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1044 | assumes "is_thread n \<theta> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1045 | assumes "n < i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1046 | assumes "i < j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1047 | shows "is_fthread \<theta> p i j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1048 | using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1049 | unfolding is_thread_def is_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1050 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1051 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1052 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1053 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1054 | section {* Ramsey's Theorem *}
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1055 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1056 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1057 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1058 |   "set2pair S = (THE (x,y). x < y \<and> S = {x,y})"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1059 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1060 | lemma set2pair_conv: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1061 | fixes x y :: nat | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1062 | assumes "x < y" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1063 |   shows "set2pair {x, y} = (x, y)"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1064 | unfolding set2pair_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1065 | proof (rule the_equality, simp_all only:split_conv split_paired_all) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1066 |   from `x < y` show "x < y \<and> {x,y}={x,y}" by simp
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1067 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1068 | fix a b | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1069 |   assume a: "a < b \<and> {x, y} = {a, b}"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1070 |   hence "{a, b} = {x, y}" by simp_all
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1071 | hence "(a, b) = (x, y) \<or> (a, b) = (y, x)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1072 | by (cases "x = y") auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1073 | thus "(a, b) = (x, y)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1074 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1075 | assume "(a, b) = (y, x)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1076 | with a and `x < y` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1077 | show ?thesis by auto (* contradiction *) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1078 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1079 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1080 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1081 | definition | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1082 | "set2list = inv set" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1083 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1084 | lemma finite_set2list: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1085 | assumes [intro]: "finite S" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1086 | shows "set (set2list S) = S" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1087 | unfolding set2list_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1088 | proof (rule f_inv_f) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1089 | from finite_list | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1090 | have "\<exists>l. set l = S" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1091 | thus "S \<in> range set" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1092 | unfolding image_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1093 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1094 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1095 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1096 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1097 | corollary RamseyNatpairs: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1098 | fixes S :: "'a set" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1099 | and f :: "nat \<times> nat \<Rightarrow> 'a" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1100 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1101 | assumes "finite S" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1102 | and inS: "\<And>x y. x < y \<Longrightarrow> f (x, y) \<in> S" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1103 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1104 | obtains T :: "nat set" and s :: "'a" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1105 | where "infinite T" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1106 | and "s \<in> S" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1107 | and "\<And>x y. \<lbrakk>x \<in> T; y \<in> T; x < y\<rbrakk> \<Longrightarrow> f (x, y) = s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1108 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1109 | from `finite S` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1110 | have "set (set2list S) = S" by (rule finite_set2list) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1111 | then | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1112 | obtain l where S: "S = set l" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1113 |   also from set_conv_nth have "\<dots> = {l ! i |i. i < length l}" .
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1114 |   finally have "S = {l ! i |i. i < length l}" .
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1115 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1116 | let ?s = "length l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1117 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1118 | from inS | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1119 |   have index_less: "\<And>x y. x \<noteq> y \<Longrightarrow> index_of l (f (set2pair {x, y})) < ?s"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1120 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1121 | fix x y :: nat | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1122 | assume neq: "x \<noteq> y" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1123 |     have "f (set2pair {x, y}) \<in> S"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1124 | proof (cases "x < y") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1125 |       case True hence "set2pair {x, y} = (x, y)"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1126 | by (rule set2pair_conv) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1127 | with True inS | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1128 | show ?thesis by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1129 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1130 | case False | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1131 | with neq have y_less: "y < x" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1132 |       have x:"{x,y} = {y,x}" by auto
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1133 |       with y_less have "set2pair {x, y} = (y, x)"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1134 | by (simp add:set2pair_conv) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1135 | with y_less inS | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1136 | show ?thesis by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1137 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1138 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1139 |     thus "index_of l (f (set2pair {x, y})) < length l"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1140 | by (simp add: S index_of_length) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1141 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1142 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1143 | have "\<exists>Y. infinite Y \<and> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1144 | (\<exists>t. t < ?s \<and> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1145 | (\<forall>x\<in>Y. \<forall>y\<in>Y. x \<noteq> y \<longrightarrow> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1146 |                       index_of l (f (set2pair {x, y})) = t))"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1147 | by (rule Ramsey2[of "UNIV::nat set", simplified]) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1148 | (auto simp:index_less) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1149 | then obtain T i | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1150 | where inf: "infinite T" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1151 | and "i < length l" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1152 | and d: "\<And>x y. \<lbrakk>x \<in> T; y\<in>T; x \<noteq> y\<rbrakk> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1153 |     \<Longrightarrow> index_of l (f (set2pair {x, y})) = i"
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1154 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1155 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1156 | have "l ! i \<in> S" unfolding S | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1157 | by (rule nth_mem) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1158 | moreover | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1159 | have "\<And>x y. x \<in> T \<Longrightarrow> y\<in>T \<Longrightarrow> x < y | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1160 | \<Longrightarrow> f (x, y) = l ! i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1161 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1162 | fix x y assume "x \<in> T" "y \<in> T" "x < y" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1163 | with d have | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1164 |       "index_of l (f (set2pair {x, y})) = i" by auto
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1165 | with `x < y` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1166 | have "i = index_of l (f (x, y))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1167 | by (simp add:set2pair_conv) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1168 | with `i < length l` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1169 | show "f (x, y) = l ! i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1170 | by (auto intro:index_of_member[symmetric] iff:index_of_length) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1171 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1172 | moreover note inf | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1173 | ultimately | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1174 | show ?thesis using prems | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1175 | by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1176 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1177 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1178 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1179 | section {* Main Result *}
 | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1180 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1181 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1182 | theorem LJA_Theorem4: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1183 | assumes "bounded_acg P \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1184 | shows "SCT \<A> \<longleftrightarrow> SCT' \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1185 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1186 | assume "SCT \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1187 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1188 | show "SCT' \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1189 | proof (rule classical) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1190 | assume "\<not> SCT' \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1191 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1192 | then obtain n G | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1193 | where in_closure: "(tcl \<A>) \<turnstile> n \<leadsto>\<^bsup>G\<^esup> n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1194 | and idemp: "G * G = G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1195 | and no_strict_arc: "\<forall>p. \<not>(G \<turnstile> p \<leadsto>\<^bsup>\<down>\<^esup> p)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1196 | unfolding SCT'_def no_bad_graphs_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1197 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1198 | from in_closure obtain k | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1199 | where k_pow: "\<A> ^ k \<turnstile> n \<leadsto>\<^bsup>G\<^esup> n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1200 | and "0 < k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1201 | unfolding in_tcl by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1202 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1203 | from power_induces_path k_pow | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1204 | obtain loop where loop_props: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1205 | "has_fpath \<A> loop" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1206 | "n = fst loop" "n = end_node loop" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1207 | "G = prod loop" "k = length (snd loop)" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1208 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1209 | with `0 < k` and path_loop_graph | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1210 | have "has_ipath \<A> (omega loop)" by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1211 | with `SCT \<A>` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1212 | have thread: "\<exists>\<theta>. is_desc_thread \<theta> (omega loop)" by (auto simp:SCT_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1213 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1214 | let ?s = "\<lambda>i. k * i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1215 | let ?cp = "\<lambda>i. (n, G)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1216 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1217 | from loop_props have "fst loop = end_node loop" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1218 | with `0 < k` `k = length (snd loop)` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1219 | have "\<And>i. (omega loop)\<langle>?s i,?s (Suc i)\<rangle> = loop" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1220 | by (rule sub_path_loop) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1221 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1222 | with `n = fst loop` `G = prod loop` `k = length (snd loop)` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1223 | have a: "contract ?s (omega loop) = ?cp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1224 | unfolding contract_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1225 | by (simp add:path_loop_def split_def fst_p0) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1226 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1227 | from `0 < k` have "increasing ?s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1228 | by (auto simp:increasing_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1229 | with thread have "\<exists>\<theta>. is_desc_thread \<theta> ?cp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1230 | unfolding a[symmetric] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1231 | by (unfold contract_keeps_threads[symmetric]) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1232 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1233 | then obtain \<theta> where desc: "is_desc_thread \<theta> ?cp" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1234 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1235 | then obtain n where thr: "is_thread n \<theta> ?cp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1236 | unfolding is_desc_thread_def is_thread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1237 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1238 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1239 | have "bounded_th P n \<theta>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1240 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1241 | from `bounded_acg P \<A>` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1242 | have "bounded_acg P (tcl \<A>)" by (rule bounded_plus) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1243 | with in_closure have "bounded_scg P G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1244 | unfolding bounded_acg_def by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1245 | hence "bounded_mp P ?cp" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1246 | unfolding bounded_mp_def by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1247 | with thr bounded_th | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1248 | show ?thesis by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1249 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1250 | with bounded_th_infinite_visit | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1251 | obtain p where inf_visit: "\<exists>\<^sub>\<infinity>i. \<theta> i = p" by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1252 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1253 | then obtain i where "n < i" "\<theta> i = p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1254 | by (auto simp:INF_nat) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1255 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1256 | from desc | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1257 | have "\<exists>\<^sub>\<infinity>i. descat ?cp \<theta> i" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1258 | unfolding is_desc_thread_def by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1259 | then obtain j | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1260 | where "i < j" and "descat ?cp \<theta> j" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1261 | unfolding INF_nat by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1262 | from inf_visit obtain k where "j < k" "\<theta> k = p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1263 | by (auto simp:INF_nat) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1264 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1265 | from `i < j` `j < k` `n < i` thr fin_from_inf `descat ?cp \<theta> j` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1266 | have "is_desc_fthread \<theta> ?cp i k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1267 | unfolding is_desc_fthread_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1268 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1269 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1270 | with `\<theta> k = p` `\<theta> i = p` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1271 | have dfth: "has_desc_fth ?cp i k p p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1272 | unfolding has_desc_fth_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1273 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1274 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1275 | from `i < j` `j < k` have "i < k" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1276 | hence "prod (?cp\<langle>i, k\<rangle>) = G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1277 | proof (induct i rule:strict_inc_induct) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1278 | case 1 thus ?case by (simp add:sub_path_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1279 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1280 | case (2 i) thus ?case | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1281 | by (simp add:sub_path_def upt_rec[of i k] idemp) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1282 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1283 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1284 | with `i < j` `j < k` dfth Lemma7b | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1285 | have "dsc G p p" by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1286 | with no_strict_arc have False by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1287 | thus ?thesis .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1288 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1289 | next | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1290 | assume "SCT' \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1291 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1292 | show "SCT \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1293 | proof (rule classical) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1294 | assume "\<not> SCT \<A>" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1295 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1296 | with SCT_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1297 | obtain p | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1298 | where ipath: "has_ipath \<A> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1299 | and no_desc_th: "\<not> (\<exists>\<theta>. is_desc_thread \<theta> p)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1300 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1301 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1302 | from `bounded_acg P \<A>` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1303 | have "finite (dest_graph (tcl \<A>))" (is "finite ?AG") | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1304 | by (intro bounded_finite bounded_plus) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1305 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1306 | from pdesc_acgplus[OF ipath] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1307 | have a: "\<And>x y. x<y \<Longrightarrow> pdesc p\<langle>x,y\<rangle> \<in> dest_graph (tcl \<A>)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1308 | unfolding has_edge_def . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1309 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1310 | obtain S G | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1311 | where "infinite S" "G \<in> dest_graph (tcl \<A>)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1312 | and all_G: "\<And>x y. \<lbrakk> x \<in> S; y \<in> S; x < y\<rbrakk> \<Longrightarrow> | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1313 | pdesc (p\<langle>x,y\<rangle>) = G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1314 | apply (rule RamseyNatpairs[of ?AG "\<lambda>(x,y). pdesc p\<langle>x, y\<rangle>"]) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1315 | apply (rule `finite (dest_graph (tcl \<A>))`) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1316 | by (simp only:split_conv, rule a, auto) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1317 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1318 | obtain n H m where | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1319 | G_struct: "G = (n, H, m)" by (cases G) simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1320 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1321 | let ?s = "enumerate S" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1322 | let ?q = "contract ?s p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1323 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1324 | note all_in_S[simp] = enumerate_in_set[OF `infinite S`] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1325 | from `infinite S` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1326 | have inc[simp]: "increasing ?s" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1327 | unfolding increasing_def by (simp add:enumerate_mono) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1328 | note increasing_bij[OF this, simp] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1329 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1330 | from ipath_contract inc ipath | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1331 | have "has_ipath (tcl \<A>) ?q" . | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1332 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1333 | from all_G G_struct | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1334 | have all_H: "\<And>i. (snd (?q i)) = H" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1335 | unfolding contract_def | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1336 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1337 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1338 | have loop: "(tcl \<A>) \<turnstile> n \<leadsto>\<^bsup>H\<^esup> n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1339 | and idemp: "H * H = H" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1340 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1341 | let ?i = "?s 0" and ?j = "?s (Suc 0)" and ?k = "?s (Suc (Suc 0))" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1342 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1343 | have "pdesc (p\<langle>?i,?j\<rangle>) = G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1344 | and "pdesc (p\<langle>?j,?k\<rangle>) = G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1345 | and "pdesc (p\<langle>?i,?k\<rangle>) = G" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1346 | using all_G | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1347 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1348 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1349 | with G_struct | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1350 | have "m = end_node (p\<langle>?i,?j\<rangle>)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1351 | "n = fst (p\<langle>?j,?k\<rangle>)" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1352 | and Hs: "prod (p\<langle>?i,?j\<rangle>) = H" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1353 | "prod (p\<langle>?j,?k\<rangle>) = H" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1354 | "prod (p\<langle>?i,?k\<rangle>) = H" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1355 | by auto | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1356 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1357 | hence "m = n" by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1358 | thus "tcl \<A> \<turnstile> n \<leadsto>\<^bsup>H\<^esup> n" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1359 | using G_struct `G \<in> dest_graph (tcl \<A>)` | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1360 | by (simp add:has_edge_def) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1361 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1362 | from sub_path_prod[of ?i ?j ?k p] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1363 | show "H * H = H" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1364 | unfolding Hs by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1365 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1366 | moreover have "\<And>k. \<not>dsc H k k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1367 | proof | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1368 | fix k :: nat assume "dsc H k k" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1369 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1370 | with all_H repeated_edge | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1371 | have "\<exists>\<theta>. is_desc_thread \<theta> ?q" by fast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1372 | with inc have "\<exists>\<theta>. is_desc_thread \<theta> p" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1373 | by (subst contract_keeps_threads) | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1374 | with no_desc_th | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1375 | show False .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1376 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1377 | ultimately | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1378 | have False | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1379 | using `SCT' \<A>`[unfolded SCT'_def no_bad_graphs_def] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1380 | by blast | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1381 | thus ?thesis .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1382 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1383 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1384 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1385 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1386 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1387 | lemma LJA_apply: | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1388 | assumes fin: "finite_acg A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1389 | assumes "SCT' A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1390 | shows "SCT A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1391 | proof - | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1392 | from fin obtain P where b: "bounded_acg P A" | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1393 | unfolding finite_acg_def .. | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1394 | show ?thesis using LJA_Theorem4[OF b] | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1395 | by simp | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1396 | qed | 
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1397 | |
| 
94a794672c8b
Added formalization of size-change principle (experimental).
 krauss parents: diff
changeset | 1398 | end |