src/HOL/Library/SCT_Theorem.thy
author wenzelm
Tue, 03 Apr 2007 19:24:11 +0200
changeset 22567 1565d476a9e2
parent 22371 c9f5895972b0
child 22665 cf152ff55d16
permissions -rw-r--r--
removed assert/deny (avoid clash with Alice keywords and confusion due to strict evaluation);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22371
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     1
(*  Title:      HOL/Library/SCT_Theorem.thy
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     2
    ID:         $Id$
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     3
    Author:     Alexander Krauss, TU Muenchen
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     4
*)
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     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