Closures2.thy
author urbanc
Thu, 01 Sep 2011 20:26:30 +0000
changeset 221 68e28debe995
parent 220 91e3e906034c
child 222 191769fc68c3
permissions -rw-r--r--
solved the SUBSEQ/SUPSEQ problem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
     1
theory Closure2
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
     2
imports 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
     3
  Closures
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
     4
  (* "~~/src/HOL/Proofs/Extraction/Higman" *)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
     5
begin
91e3e906034c added a further test
urbanc
parents:
diff changeset
     6
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
     7
inductive 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
     8
  emb :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" ("_ \<preceq> _")
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
     9
where
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    10
   emb0 [intro]: "emb [] y"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    11
 | emb1 [intro]: "emb x y \<Longrightarrow> emb x (c # y)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    12
 | emb2 [intro]: "emb x y \<Longrightarrow> emb (c # x) (c # y)"
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    13
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    14
lemma emb_refl [intro]:
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    15
  shows "x \<preceq> x"
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    16
by (induct x) (auto intro: emb.intros)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    17
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    18
lemma emb_right [intro]:
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    19
  assumes a: "x \<preceq> y"
91e3e906034c added a further test
urbanc
parents:
diff changeset
    20
  shows "x \<preceq> y @ y'"
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    21
using a by (induct arbitrary: y') (auto)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    22
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    23
lemma emb_left [intro]:
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    24
  assumes a: "x \<preceq> y"
91e3e906034c added a further test
urbanc
parents:
diff changeset
    25
  shows "x \<preceq> y' @ y"
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    26
using a by (induct y') (auto)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    27
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    28
lemma emb_appendI [intro]:
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    29
  assumes a: "x \<preceq> x'"
91e3e906034c added a further test
urbanc
parents:
diff changeset
    30
  and     b: "y \<preceq> y'"
91e3e906034c added a further test
urbanc
parents:
diff changeset
    31
  shows "x @ y \<preceq> x' @ y'"
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    32
using a b by (induct) (auto)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    33
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    34
lemma emb_cons_leftD:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    35
  assumes "a # x \<preceq> y"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    36
  shows "\<exists>y1 y2. y = y1 @ [a] @ y2 \<and> x \<preceq> y2"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    37
using assms
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    38
apply(induct x\<equiv>"a # x" y\<equiv>"y" arbitrary: a x y)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    39
apply(auto)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    40
apply(metis append_Cons)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    41
done
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    42
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    43
lemma emb_append_leftD:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    44
  assumes "x1 @ x2 \<preceq> y"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    45
  shows "\<exists>y1 y2. y = y1 @ y2 \<and> x1 \<preceq> y1 \<and> x2 \<preceq> y2"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    46
using assms
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    47
apply(induct x1 arbitrary: x2 y)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    48
apply(auto)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    49
apply(drule emb_cons_leftD)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    50
apply(auto)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    51
apply(drule_tac x="x2" in meta_spec)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    52
apply(drule_tac x="y2" in meta_spec)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    53
apply(auto)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    54
apply(rule_tac x="y1 @ (a # y1a)" in exI)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    55
apply(rule_tac x="y2a" in exI)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    56
apply(auto)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    57
done
91e3e906034c added a further test
urbanc
parents:
diff changeset
    58
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    59
lemma emb_trans:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    60
  assumes a: "x1 \<preceq> x2"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    61
  and     b: "x2 \<preceq> x3"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    62
  shows "x1 \<preceq> x3"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    63
using a b
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    64
apply(induct arbitrary: x3)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    65
apply(metis emb0)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    66
apply(metis emb_cons_leftD emb_left)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    67
apply(drule_tac emb_cons_leftD)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    68
apply(auto)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    69
done
91e3e906034c added a further test
urbanc
parents:
diff changeset
    70
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    71
lemma emb_strict_length:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    72
  assumes a: "x \<preceq> y" "x \<noteq> y" 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    73
  shows "length x < length y"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    74
using a
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    75
by (induct) (auto simp add: less_Suc_eq)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    76
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    77
lemma emb_antisym:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    78
  assumes a: "x \<preceq> y" "y \<preceq> x" 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    79
  shows "x = y"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    80
using a emb_strict_length
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    81
by (metis not_less_iff_gr_or_eq)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    82
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    83
lemma emb_wf:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    84
  shows "wf {(x, y). x \<preceq> y \<and> x \<noteq> y}"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    85
proof -
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    86
  have "wf (measure length)" by simp
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    87
  moreover
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    88
  have "{(x, y). x \<preceq> y \<and> x \<noteq> y} \<subseteq> measure length"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    89
    unfolding measure_def by (auto simp add: emb_strict_length)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    90
  ultimately 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    91
  show "wf {(x, y). x \<preceq> y \<and> x \<noteq> y}" by (rule wf_subset)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    92
qed
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    93
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
    94
subsection {* Sub- and Supsequences *}
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
    95
91e3e906034c added a further test
urbanc
parents:
diff changeset
    96
definition
91e3e906034c added a further test
urbanc
parents:
diff changeset
    97
 "SUBSEQ A \<equiv> {x. \<exists>y \<in> A. x \<preceq> y}"
91e3e906034c added a further test
urbanc
parents:
diff changeset
    98
91e3e906034c added a further test
urbanc
parents:
diff changeset
    99
definition
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   100
 "SUPSEQ A \<equiv> {x. \<exists>y \<in> A. y \<preceq> x}"
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   101
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   102
lemma SUPSEQ_simps [simp]:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   103
  shows "SUPSEQ {} = {}"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   104
  and   "SUPSEQ {[]} = UNIV"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   105
unfolding SUPSEQ_def by auto
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   106
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   107
lemma SUPSEQ_atom [simp]:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   108
  shows "SUPSEQ {[a]} = UNIV \<cdot> {[a]} \<cdot> UNIV"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   109
unfolding SUPSEQ_def conc_def
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   110
by (auto) (metis append_Cons emb_cons_leftD)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   111
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   112
lemma SUPSEQ_union [simp]:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   113
  shows "SUPSEQ (A \<union> B) = SUPSEQ A \<union> SUPSEQ B"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   114
unfolding SUPSEQ_def by auto
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   115
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   116
lemma SUPSEQ_conc [simp]:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   117
  shows "SUPSEQ (A \<cdot> B) = SUPSEQ A \<cdot> SUPSEQ B"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   118
unfolding SUPSEQ_def conc_def
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   119
by (auto) (metis emb_append_leftD)
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   120
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   121
lemma SUPSEQ_star [simp]:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   122
  shows "SUPSEQ (A\<star>) = UNIV"
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   123
apply(subst star_unfold_left)
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   124
apply(simp only: SUPSEQ_union) 
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   125
apply(simp)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   126
done
91e3e906034c added a further test
urbanc
parents:
diff changeset
   127
91e3e906034c added a further test
urbanc
parents:
diff changeset
   128
definition
91e3e906034c added a further test
urbanc
parents:
diff changeset
   129
  Allreg :: "'a::finite rexp"
91e3e906034c added a further test
urbanc
parents:
diff changeset
   130
where
91e3e906034c added a further test
urbanc
parents:
diff changeset
   131
  "Allreg \<equiv> \<Uplus>(Atom ` UNIV)"
91e3e906034c added a further test
urbanc
parents:
diff changeset
   132
91e3e906034c added a further test
urbanc
parents:
diff changeset
   133
lemma Allreg_lang [simp]:
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   134
  shows "lang Allreg = (\<Union>a. {[a]})"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   135
unfolding Allreg_def by auto
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   136
91e3e906034c added a further test
urbanc
parents:
diff changeset
   137
lemma [simp]:
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   138
  shows "(\<Union>a. {[a]})\<star> = UNIV"
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   139
apply(auto)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   140
apply(induct_tac x rule: list.induct)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   141
apply(auto)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   142
apply(subgoal_tac "[a] @ list \<in> (\<Union>a. {[a]})\<star>")
91e3e906034c added a further test
urbanc
parents:
diff changeset
   143
apply(simp)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   144
apply(rule append_in_starI)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   145
apply(auto)
91e3e906034c added a further test
urbanc
parents:
diff changeset
   146
done
91e3e906034c added a further test
urbanc
parents:
diff changeset
   147
91e3e906034c added a further test
urbanc
parents:
diff changeset
   148
lemma Star_Allreg_lang [simp]:
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   149
  shows "lang (Star Allreg) = UNIV"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   150
by simp
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   151
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   152
fun 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   153
  UP :: "'a::finite rexp \<Rightarrow> 'a rexp"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   154
where
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   155
  "UP (Zero) = Zero"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   156
| "UP (One) = Star Allreg"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   157
| "UP (Atom c) = Times (Star Allreg) (Times (Atom c) (Star Allreg))"   
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   158
| "UP (Plus r1 r2) = Plus (UP r1) (UP r2)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   159
| "UP (Times r1 r2) = Times (UP r1) (UP r2)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   160
| "UP (Star r) = Star Allreg"
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   161
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   162
lemma lang_UP:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   163
  shows "lang (UP r) = SUPSEQ (lang r)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   164
by (induct r) (simp_all)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   165
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   166
lemma regular_SUPSEQ: 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   167
  fixes A::"'a::finite lang"
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   168
  assumes "regular A"
91e3e906034c added a further test
urbanc
parents:
diff changeset
   169
  shows "regular (SUPSEQ A)"
91e3e906034c added a further test
urbanc
parents:
diff changeset
   170
proof -
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   171
  from assms obtain r::"'a::finite rexp" where "lang r = A" by auto
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   172
  then have "lang (UP r) = SUPSEQ A" by (simp add: lang_UP)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   173
  then show "regular (SUPSEQ A)" by auto
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   174
qed
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   175
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   176
lemma SUPSEQ_subset:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   177
  shows "A \<subseteq> SUPSEQ A"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   178
unfolding SUPSEQ_def by auto
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   179
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   180
lemma w3:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   181
  assumes eq: "T = - (SUBSEQ A)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   182
  shows "T = SUPSEQ T"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   183
apply(rule)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   184
apply(rule SUPSEQ_subset)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   185
apply(rule ccontr)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   186
apply(auto)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   187
apply(rule ccontr)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   188
apply(subgoal_tac "x \<in> SUBSEQ A")
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   189
prefer 2
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   190
apply(subst (asm) (2) eq)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   191
apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   192
apply(simp add: SUPSEQ_def)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   193
apply(erule bexE)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   194
apply(subgoal_tac "y \<in> SUBSEQ A")
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   195
prefer 2
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   196
apply(simp add: SUBSEQ_def)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   197
apply(erule bexE)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   198
apply(rule_tac x="xa" in bexI)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   199
apply(rule emb_trans)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   200
apply(assumption)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   201
apply(assumption)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   202
apply(assumption)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   203
apply(subst (asm) (2) eq)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   204
apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   205
done
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   206
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   207
lemma w4:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   208
  shows "- (SUBSEQ A) = SUPSEQ (- (SUBSEQ A))"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   209
by (rule w3) (simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   210
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   211
definition
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   212
  "minimal_in x L \<equiv> \<forall>y \<in> L. y \<preceq> x \<longrightarrow> y = x"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   213
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   214
lemma minimal_in2:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   215
  shows "minimal_in x L = (\<forall>y \<in> L. y \<preceq> x \<longrightarrow> x \<preceq> y)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   216
by (auto simp add: minimal_in_def intro: emb_antisym)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   217
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   218
lemma higman:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   219
  assumes "\<forall>x \<in> A. \<forall>y \<in> A. x \<noteq> y \<longrightarrow> \<not>(x \<preceq> y) \<and> \<not>(y \<preceq> x)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   220
  shows "finite A"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   221
sorry
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   222
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   223
lemma minimal:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   224
  assumes "minimal_in x A" "minimal_in y A"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   225
  and "x \<noteq> y" "x \<in> A" "y \<in> A"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   226
  shows "\<not>(x \<preceq> y) \<and> \<not>(y \<preceq> x)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   227
using assms unfolding minimal_in_def 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   228
by auto
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   229
221
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   230
lemma main_lemma:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   231
  "\<exists>M. M \<subseteq> A \<and> finite M \<and> SUPSEQ A = SUPSEQ M"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   232
proof -
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   233
  def M \<equiv> "{x \<in> A. minimal_in x A}"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   234
  have "M \<subseteq> A" unfolding M_def minimal_in_def by auto
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   235
  moreover
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   236
  have "finite M"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   237
    apply(rule higman)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   238
    unfolding M_def minimal_in_def
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   239
    by auto
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   240
  moreover
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   241
  have "SUPSEQ A \<subseteq> SUPSEQ M"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   242
    apply(rule)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   243
    apply(simp only: SUPSEQ_def)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   244
    apply(auto)[1]
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   245
    using emb_wf
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   246
    apply(erule_tac Q="{y' \<in> A. y' \<preceq> x}" and x="y" in wfE_min)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   247
    apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   248
    apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   249
    apply(rule_tac x="z" in bexI)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   250
    apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   251
    apply(simp add: M_def)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   252
    apply(simp add: minimal_in2)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   253
    apply(rule ballI)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   254
    apply(rule impI)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   255
    apply(drule_tac x="ya" in meta_spec)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   256
    apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   257
    apply(case_tac "ya = z")
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   258
    apply(auto)[1]
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   259
    apply(simp)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   260
    by (metis emb_trans)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   261
  moreover
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   262
  have "SUPSEQ M \<subseteq> SUPSEQ A"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   263
    by (auto simp add: SUPSEQ_def M_def)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   264
  ultimately
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   265
  show "\<exists>M. M \<subseteq> A \<and> finite M \<and> SUPSEQ A = SUPSEQ M" by blast
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   266
qed
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   267
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   268
lemma closure_SUPSEQ:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   269
  fixes A::"'a::finite lang" 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   270
  shows "regular (SUPSEQ A)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   271
proof -
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   272
  obtain M where a: "finite M" and b: "SUPSEQ A = SUPSEQ M"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   273
    using main_lemma by blast
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   274
  have "regular M" using a by (rule finite_regular)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   275
  then have "regular (SUPSEQ M)" by (rule regular_SUPSEQ)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   276
  then show "regular (SUPSEQ A)" using b by simp
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   277
qed
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   278
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   279
lemma closure_SUBSEQ:
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   280
  fixes A::"'a::finite lang"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   281
  shows "regular (SUBSEQ A)"
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   282
proof -
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   283
  have "regular (SUPSEQ (- SUBSEQ A))" by (rule closure_SUPSEQ)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   284
  then have "regular (- SUBSEQ A)" 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   285
    apply(subst w4) 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   286
    apply(assumption) 
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   287
    done
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   288
  then have "regular (- (- (SUBSEQ A)))" by (rule closure_complement)
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   289
  then show "regular (SUBSEQ A)" by simp
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   290
qed
68e28debe995 solved the SUBSEQ/SUPSEQ problem
urbanc
parents: 220
diff changeset
   291
220
91e3e906034c added a further test
urbanc
parents:
diff changeset
   292
91e3e906034c added a further test
urbanc
parents:
diff changeset
   293
91e3e906034c added a further test
urbanc
parents:
diff changeset
   294
end