| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Fri, 25 Oct 2024 18:54:08 +0100 | |
| changeset 970 | e15be5466802 | 
| parent 456 | 4abd90760ffe | 
| child 971 | b7d97a2a083b | 
| permissions | -rw-r--r-- | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 1 | theory Matcher2 | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 2 | imports "Main" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 3 | begin | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 4 | |
| 355 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 5 | lemma Suc_Union: | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 6 | "(\<Union> x\<le>Suc m. B x) = (B (Suc m) \<union> (\<Union> x\<le>m. B x))" | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 7 | by (metis UN_insert atMost_Suc) | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 8 | |
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 9 | lemma Suc_reduce_Union: | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 10 |   "(\<Union>x\<in>{Suc n..Suc m}. B x) = (\<Union>x\<in>{n..m}. B (Suc x))"
 | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 11 | by (metis UN_extend_simps(10) image_Suc_atLeastAtMost) | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 12 | |
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 13 | |
| 970 | 14 | section \<open>Regular Expressions\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 15 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 16 | datatype rexp = | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 17 | NULL | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 18 | | EMPTY | 
| 970 | 19 | | CH char | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 20 | | SEQ rexp rexp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 21 | | ALT rexp rexp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 22 | | STAR rexp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 23 | | NOT rexp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 24 | | PLUS rexp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 25 | | OPT rexp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 26 | | NTIMES rexp nat | 
| 362 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 27 | | NMTIMES rexp nat nat | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 28 | | UPNTIMES rexp nat | 
| 362 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 29 | |
| 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 30 | |
| 970 | 31 | section \<open>Sequential Composition of Sets\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 32 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 33 | definition | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 34 |   Seq :: "string set \<Rightarrow> string set \<Rightarrow> string set" ("_ ;; _" [100,100] 100)
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 35 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 36 |   "A ;; B = {s1 @ s2 | s1 s2. s1 \<in> A \<and> s2 \<in> B}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 37 | |
| 970 | 38 | text \<open>Two Simple Properties about Sequential Composition\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 39 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 40 | lemma seq_empty [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 41 |   shows "A ;; {[]} = A"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 42 |   and   "{[]} ;; A = A"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 43 | by (simp_all add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 44 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 45 | lemma seq_null [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 46 |   shows "A ;; {} = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 47 |   and   "{} ;; A = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 48 | by (simp_all add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 49 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 50 | lemma seq_union: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 51 | shows "A ;; (B \<union> C) = A ;; B \<union> A ;; C" | 
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 52 | and "(B \<union> C) ;; A = B ;; A \<union> C ;; A" | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 53 | by (auto simp add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 54 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 55 | lemma seq_Union: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 56 | shows "A ;; (\<Union>x\<in>B. C x) = (\<Union>x\<in>B. A ;; C x)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 57 | by (auto simp add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 58 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 59 | lemma seq_empty_in [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 60 | "[] \<in> A ;; B \<longleftrightarrow> ([] \<in> A \<and> [] \<in> B)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 61 | by (simp add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 62 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 63 | lemma seq_assoc: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 64 | shows "A ;; (B ;; C) = (A ;; B) ;; C" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 65 | apply(auto simp add: Seq_def) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 66 | apply(metis append_assoc) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 67 | apply(metis) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 68 | done | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 69 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 70 | |
| 970 | 71 | section \<open>Power for Sets\<close> | 
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 72 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 73 | fun | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 74 |   pow :: "string set \<Rightarrow> nat \<Rightarrow> string set" ("_ \<up> _" [101, 102] 101)
 | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 75 | where | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 76 |    "A \<up> 0 = {[]}"
 | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 77 | | "A \<up> (Suc n) = A ;; (A \<up> n)" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 78 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 79 | lemma pow_empty [simp]: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 80 | shows "[] \<in> A \<up> n \<longleftrightarrow> (n = 0 \<or> [] \<in> A)" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 81 | by (induct n) (auto) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 82 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 83 | lemma pow_plus: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 84 | "A \<up> (n + m) = A \<up> n ;; A \<up> m" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 85 | by (induct n) (simp_all add: seq_assoc) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 86 | |
| 970 | 87 | section \<open>Kleene Star for Sets\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 88 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 89 | inductive_set | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 90 |   Star :: "string set \<Rightarrow> string set" ("_\<star>" [101] 102)
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 91 | for A :: "string set" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 92 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 93 | start[intro]: "[] \<in> A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 94 | | step[intro]: "\<lbrakk>s1 \<in> A; s2 \<in> A\<star>\<rbrakk> \<Longrightarrow> s1 @ s2 \<in> A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 95 | |
| 970 | 96 | text \<open>A Standard Property of Star\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 97 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 98 | lemma star_decomp: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 99 | assumes a: "c # x \<in> A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 100 | shows "\<exists>a b. x = a @ b \<and> c # a \<in> A \<and> b \<in> A\<star>" | 
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 101 | using a | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 102 | using a | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 103 | by (induct x\<equiv>"c # x" rule: Star.induct) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 104 | (auto simp add: append_eq_Cons_conv) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 105 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 106 | lemma star_cases: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 107 |   shows "A\<star> = {[]} \<union> A ;; A\<star>"
 | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 108 | unfolding Seq_def | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 109 | by (auto) (metis Star.simps) | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 110 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 111 | lemma Star_in_Pow: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 112 | assumes a: "s \<in> A\<star>" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 113 | shows "\<exists>n. s \<in> A \<up> n" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 114 | using a | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 115 | apply(induct) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 116 | apply(auto) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 117 | apply(rule_tac x="Suc n" in exI) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 118 | apply(auto simp add: Seq_def) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 119 | done | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 120 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 121 | lemma Pow_in_Star: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 122 | assumes a: "s \<in> A \<up> n" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 123 | shows "s \<in> A\<star>" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 124 | using a | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 125 | by (induct n arbitrary: s) (auto simp add: Seq_def) | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 126 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 127 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 128 | lemma Star_def2: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 129 | shows "A\<star> = (\<Union>n. A \<up> n)" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 130 | using Star_in_Pow Pow_in_Star | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 131 | by (auto) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 132 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 133 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 134 | |
| 970 | 135 | section \<open>Semantics of Regular Expressions\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 136 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 137 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 138 | L :: "rexp \<Rightarrow> string set" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 139 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 140 |   "L (NULL) = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 141 | | "L (EMPTY) = {[]}"
 | 
| 970 | 142 | | "L (CH c) = {[c]}"
 | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 143 | | "L (SEQ r1 r2) = (L r1) ;; (L r2)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 144 | | "L (ALT r1 r2) = (L r1) \<union> (L r2)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 145 | | "L (STAR r) = (L r)\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 146 | | "L (NOT r) = UNIV - (L r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 147 | | "L (PLUS r) = (L r) ;; ((L r)\<star>)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 148 | | "L (OPT r) = (L r) \<union> {[]}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 149 | | "L (NTIMES r n) = (L r) \<up> n" | 
| 362 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 150 | | "L (NMTIMES r n m) = (\<Union>i\<in> {n..m} . ((L r) \<up> i))" 
 | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 151 | | "L (UPNTIMES r n) = (\<Union>i\<in> {..n} . ((L r) \<up> i))"
 | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 152 | |
| 227 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 153 | lemma "L (NOT NULL) = UNIV" | 
| 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 154 | apply(simp) | 
| 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 155 | done | 
| 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 156 | |
| 970 | 157 | section \<open>The Matcher\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 158 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 159 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 160 | nullable :: "rexp \<Rightarrow> bool" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 161 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 162 | "nullable (NULL) = False" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 163 | | "nullable (EMPTY) = True" | 
| 970 | 164 | | "nullable (CH c) = False" | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 165 | | "nullable (ALT r1 r2) = (nullable r1 \<or> nullable r2)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 166 | | "nullable (SEQ r1 r2) = (nullable r1 \<and> nullable r2)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 167 | | "nullable (STAR r) = True" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 168 | | "nullable (NOT r) = (\<not>(nullable r))" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 169 | | "nullable (PLUS r) = (nullable r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 170 | | "nullable (OPT r) = True" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 171 | | "nullable (NTIMES r n) = (if n = 0 then True else nullable r)" | 
| 362 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 172 | | "nullable (NMTIMES r n m) = (if m < n then False else (if n = 0 then True else nullable r))" | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 173 | | "nullable (UPNTIMES r n) = True" | 
| 361 
9c7eb266594c
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
355diff
changeset | 174 | |
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 175 | fun M :: "rexp \<Rightarrow> nat" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 176 | where | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 177 | "M (NULL) = 0" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 178 | | "M (EMPTY) = 0" | 
| 970 | 179 | | "M (CH char) = 0" | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 180 | | "M (SEQ r1 r2) = Suc ((M r1) + (M r2))" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 181 | | "M (ALT r1 r2) = Suc ((M r1) + (M r2))" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 182 | | "M (STAR r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 183 | | "M (NOT r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 184 | | "M (PLUS r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 185 | | "M (OPT r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 186 | | "M (NTIMES r n) = Suc (M r) * 2 * (Suc n)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 187 | | "M (NMTIMES r n m) = Suc (Suc (M r)) * 2 * (Suc m) * (Suc (Suc m) - Suc n)" | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 188 | | "M (UPNTIMES r n) = Suc (M r) * 2 * (Suc n)" | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 189 | |
| 361 
9c7eb266594c
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
355diff
changeset | 190 | function der :: "char \<Rightarrow> rexp \<Rightarrow> rexp" | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 191 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 192 | "der c (NULL) = NULL" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 193 | | "der c (EMPTY) = NULL" | 
| 970 | 194 | | "der c (CH d) = (if c = d then EMPTY else NULL)" | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 195 | | "der c (ALT r1 r2) = ALT (der c r1) (der c r2)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 196 | | "der c (SEQ r1 r2) = ALT (SEQ (der c r1) r2) (if nullable r1 then der c r2 else NULL)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 197 | | "der c (STAR r) = SEQ (der c r) (STAR r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 198 | | "der c (NOT r) = NOT(der c r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 199 | | "der c (PLUS r) = SEQ (der c r) (STAR r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 200 | | "der c (OPT r) = der c r" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 201 | | "der c (NTIMES r 0) = NULL" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 202 | | "der c (NTIMES r (Suc n)) = der c (SEQ r (NTIMES r n))" | 
| 363 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 203 | | "der c (NMTIMES r n m) = | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 204 | (if m < n then NULL else | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 205 | (if n = m then der c (NTIMES r n) else | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 206 | ALT (der c (NTIMES r n)) (der c (NMTIMES r (Suc n) m))))" | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 207 | | "der c (UPNTIMES r 0) = NULL" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 208 | | "der c (UPNTIMES r (Suc n)) = der c (ALT (NTIMES r (Suc n)) (UPNTIMES r n))" | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 209 | by pat_completeness auto | 
| 363 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 210 | |
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 211 | lemma bigger1: | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 212 | "\<lbrakk>c < (d::nat); a < b; 0 < a; 0 < c\<rbrakk> \<Longrightarrow> c * a < d * b" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 213 | by (metis le0 mult_strict_mono') | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 214 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 215 | termination der | 
| 361 
9c7eb266594c
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
355diff
changeset | 216 | apply(relation "measure (\<lambda>(c, r). M r)") | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 217 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 218 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 219 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 220 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 221 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 222 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 223 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 224 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 225 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 226 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 227 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 228 | apply(simp_all del: M.simps) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 229 | apply(simp_all only: M.simps) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 230 | defer | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 231 | defer | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 232 | defer | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 233 | apply(subgoal_tac "Suc (Suc m) - Suc (Suc n) < Suc (Suc m) - Suc n") | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 234 | prefer 2 | 
| 970 | 235 | apply(auto)[1] | 
| 236 | ||
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 237 | (* | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 238 | apply (metis Suc_mult_less_cancel1 mult.assoc numeral_eq_Suc) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 239 | apply(subgoal_tac "0 < (Suc (Suc m) - Suc n)") | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 240 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 241 | apply(auto)[1] | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 242 | apply(subgoal_tac "Suc n < Suc m") | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 243 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 244 | apply(auto)[1] | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 245 | apply(subgoal_tac "Suc (M r) * 2 * Suc n < Suc (Suc (M r)) * 2 * Suc m") | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 246 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 247 | apply(subgoal_tac "Suc (M r) * 2 < Suc (Suc (M r)) * 2") | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 248 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 249 | apply(auto)[1] | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 250 | apply(rule bigger1) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 251 | apply(assumption) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 252 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 253 | apply (metis zero_less_Suc) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 254 | apply (metis mult_is_0 neq0_conv old.nat.distinct(2)) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 255 | apply(rotate_tac 4) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 256 | apply(drule_tac a="1" and b="(Suc (Suc m) - Suc n)" in bigger1) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 257 | prefer 4 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 258 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 259 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 260 | apply (metis zero_less_one) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 261 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 262 | done | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 263 | *) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 264 | sorry | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 265 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 266 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 267 | ders :: "string \<Rightarrow> rexp \<Rightarrow> rexp" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 268 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 269 | "ders [] r = r" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 270 | | "ders (c # s) r = ders s (der c r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 271 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 272 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 273 | matcher :: "rexp \<Rightarrow> string \<Rightarrow> bool" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 274 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 275 | "matcher r s = nullable (ders s r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 276 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 277 | |
| 970 | 278 | section \<open>Correctness Proof of the Matcher\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 279 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 280 | lemma nullable_correctness: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 281 | shows "nullable r \<longleftrightarrow> [] \<in> (L r)" | 
| 355 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 282 | apply(induct r) | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 283 | apply(auto simp add: Seq_def) | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 284 | done | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 285 | |
| 970 | 286 | section \<open>Left-Quotient of a Set\<close> | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 287 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 288 | definition | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 289 | Der :: "char \<Rightarrow> string set \<Rightarrow> string set" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 290 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 291 |   "Der c A \<equiv> {s. [c] @ s \<in> A}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 292 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 293 | lemma Der_null [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 294 |   shows "Der c {} = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 295 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 296 | by auto | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 297 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 298 | lemma Der_empty [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 299 |   shows "Der c {[]} = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 300 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 301 | by auto | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 302 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 303 | lemma Der_char [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 304 |   shows "Der c {[d]} = (if c = d then {[]} else {})"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 305 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 306 | by auto | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 307 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 308 | lemma Der_union [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 309 | shows "Der c (A \<union> B) = Der c A \<union> Der c B" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 310 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 311 | by auto | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 312 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 313 | lemma Der_insert_nil [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 314 | shows "Der c (insert [] A) = Der c A" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 315 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 316 | by auto | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 317 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 318 | lemma Der_seq [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 319 |   shows "Der c (A ;; B) = (Der c A) ;; B \<union> (if [] \<in> A then Der c B else {})"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 320 | unfolding Der_def Seq_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 321 | by (auto simp add: Cons_eq_append_conv) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 322 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 323 | lemma Der_star [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 324 | shows "Der c (A\<star>) = (Der c A) ;; A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 325 | proof - | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 326 |   have "Der c (A\<star>) = Der c ({[]} \<union> A ;; A\<star>)"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 327 | by (simp only: star_cases[symmetric]) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 328 | also have "... = Der c (A ;; A\<star>)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 329 | by (simp only: Der_union Der_empty) (simp) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 330 |   also have "... = (Der c A) ;; A\<star> \<union> (if [] \<in> A then Der c (A\<star>) else {})"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 331 | by simp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 332 | also have "... = (Der c A) ;; A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 333 | unfolding Seq_def Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 334 | by (auto dest: star_decomp) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 335 | finally show "Der c (A\<star>) = (Der c A) ;; A\<star>" . | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 336 | qed | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 337 | |
| 970 | 338 | lemma test: | 
| 339 | assumes "[] \<in> A" | |
| 340 | shows "Der c (A \<up> n) \<subseteq> (Der c A) ;; (A \<up> n)" | |
| 341 | using assms | |
| 342 | apply(induct n) | |
| 343 | apply(simp) | |
| 344 | apply(simp) | |
| 345 | apply(auto simp add: Der_def Seq_def) | |
| 346 | apply blast | |
| 347 | by force | |
| 348 | ||
| 349 | lemma Der_ntimes [simp]: | |
| 350 | shows "Der c (A \<up> (Suc n)) = (Der c A) ;; (A \<up> n)" | |
| 351 | proof - | |
| 352 | have "Der c (A \<up> (Suc n)) = Der c (A ;; A \<up> n)" | |
| 353 | by(simp) | |
| 354 |   also have "... = (Der c A) ;; (A \<up> n) \<union> (if [] \<in> A then Der c (A \<up> n) else {})"
 | |
| 355 | by simp | |
| 356 | also have "... = (Der c A) ;; (A \<up> n)" | |
| 357 | using test by force | |
| 358 | finally show "Der c (A \<up> (Suc n)) = (Der c A) ;; (A \<up> n)" . | |
| 359 | qed | |
| 360 | ||
| 361 | ||
| 362 | ||
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 363 | lemma Der_UNIV [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 364 | "Der c (UNIV - A) = UNIV - Der c A" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 365 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 366 | by (auto) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 367 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 368 | lemma Der_pow [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 369 |   shows "Der c (A \<up> (Suc n)) = (Der c A) ;; (A \<up> n) \<union> (if [] \<in> A then Der c (A \<up> n) else {})"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 370 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 371 | by(auto simp add: Cons_eq_append_conv Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 372 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 373 | lemma Der_UNION [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 374 | shows "Der c (\<Union>x\<in>A. B x) = (\<Union>x\<in>A. Der c (B x))" | 
| 970 | 375 | by (auto simp add: Der_def) | 
| 376 | ||
| 377 | lemma if_f: | |
| 378 | shows "f(if B then C else D) = (if B then f(C) else f(D))" | |
| 379 | by simp | |
| 380 | ||
| 381 | ||
| 382 | lemma der_correctness: | |
| 383 | shows "L (der c r) = Der c (L r)" | |
| 384 | proof(induct r) | |
| 385 | case NULL | |
| 386 | then show ?case by simp | |
| 387 | next | |
| 388 | case EMPTY | |
| 389 | then show ?case by simp | |
| 390 | next | |
| 391 | case (CH x) | |
| 392 | then show ?case by simp | |
| 393 | next | |
| 394 | case (SEQ r1 r2) | |
| 395 | then show ?case | |
| 396 | by (simp add: nullable_correctness) | |
| 397 | next | |
| 398 | case (ALT r1 r2) | |
| 399 | then show ?case by simp | |
| 400 | next | |
| 401 | case (STAR r) | |
| 402 | then show ?case | |
| 403 | by simp | |
| 404 | next | |
| 405 | case (NOT r) | |
| 406 | then show ?case by simp | |
| 407 | next | |
| 408 | case (PLUS r) | |
| 409 | then show ?case by simp | |
| 410 | next | |
| 411 | case (OPT r) | |
| 412 | then show ?case by simp | |
| 413 | next | |
| 414 | case (NTIMES r n) | |
| 415 | then show ?case | |
| 416 | apply(induct n) | |
| 417 | apply(simp) | |
| 418 | apply(simp only: L.simps) | |
| 419 | apply(simp only: Der_pow) | |
| 420 | apply(simp only: der.simps L.simps) | |
| 421 | apply(simp only: nullable_correctness) | |
| 422 | apply(simp only: if_f) | |
| 423 | by simp | |
| 424 | next | |
| 425 | case (NMTIMES r n m) | |
| 426 | then show ?case | |
| 427 | apply(case_tac n) | |
| 428 | sorry | |
| 429 | next | |
| 430 | case (UPNTIMES r x2) | |
| 431 | then show ?case sorry | |
| 432 | qed | |
| 433 | ||
| 434 | ||
| 435 | ||
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 436 | |
| 363 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 437 | lemma der_correctness: | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 438 | shows "L (der c r) = Der c (L r)" | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 439 | apply(induct rule: der.induct) | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 440 | apply(simp_all add: nullable_correctness | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 441 | Suc_Union Suc_reduce_Union seq_Union atLeast0AtMost) | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 442 | apply(rule impI)+ | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 443 | apply(subgoal_tac "{n..m} = {n} \<union> {Suc n..m}")
 | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 444 | apply(auto simp add: Seq_def) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 445 | done | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 446 | |
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 447 | lemma L_der_NTIMES: | 
| 456 
4abd90760ffe
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
455diff
changeset | 448 | shows "L(der c (NTIMES r n)) = L (if n = 0 then NULL else if nullable r then | 
| 
4abd90760ffe
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
455diff
changeset | 449 | SEQ (der c r) (UPNTIMES r (n - 1)) else SEQ (der c r) (NTIMES r (n - 1)))" | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 450 | apply(induct n) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 451 | apply(simp) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 452 | apply(simp) | 
| 355 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 453 | apply(auto) | 
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 454 | apply(auto simp add: Seq_def) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 455 | apply(rule_tac x="s1" in exI) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 456 | apply(simp) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 457 | apply(rule_tac x="xa" in bexI) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 458 | apply(simp) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 459 | apply(simp) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 460 | apply(rule_tac x="s1" in exI) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 461 | apply(simp) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 462 | by (metis Suc_pred atMost_iff le_Suc_eq) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 463 | |
| 456 
4abd90760ffe
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
455diff
changeset | 464 | lemma "L(der c (UPNTIMES r 0)) = {}"
 | 
| 
4abd90760ffe
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
455diff
changeset | 465 | by simp | 
| 
4abd90760ffe
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
455diff
changeset | 466 | |
| 455 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 467 | lemma "L(der c (UPNTIMES r (Suc n))) = L(SEQ (der c r) (UPNTIMES r n))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 468 | proof(induct n) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 469 | case 0 show ?case by simp | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 470 | next | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 471 | case (Suc n) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 472 | have IH: "L (der c (UPNTIMES r (Suc n))) = L (SEQ (der c r) (UPNTIMES r n))" by fact | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 473 |   { assume a: "nullable r"
 | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 474 | have "L (der c (UPNTIMES r (Suc (Suc n)))) = Der c (L (UPNTIMES r (Suc (Suc n))))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 475 | by (simp only: der_correctness) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 476 | also have "... = Der c (L (ALT (NTIMES r (Suc (Suc n))) (UPNTIMES r (Suc n))))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 477 | by(simp only: L.simps Suc_Union) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 478 | also have "... = L (der c (ALT (NTIMES r (Suc (Suc n))) (UPNTIMES r (Suc n))))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 479 | by (simp only: der_correctness) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 480 | also have "... = L (der c (NTIMES r (Suc (Suc n)))) \<union> L (der c (UPNTIMES r (Suc n)))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 481 | by(auto simp add: Seq_def) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 482 | also have "... = L (der c (NTIMES r (Suc (Suc n)))) \<union> L (SEQ (der c r) (UPNTIMES r n))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 483 | using IH by simp | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 484 | also have "... = L (SEQ (der c r) (UPNTIMES r (Suc n))) \<union> L (SEQ (der c r) (UPNTIMES r n))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 485 | using a unfolding L_der_NTIMES by simp | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 486 | also have "... = L (SEQ (der c r) (UPNTIMES r (Suc n)))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 487 | by (auto, metis Suc_Union Un_iff seq_Union) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 488 | finally have "L (der c (UPNTIMES r (Suc (Suc n)))) = L (SEQ (der c r) (UPNTIMES r (Suc n)))" . | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 489 | } | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 490 | moreover | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 491 |   { assume a: "\<not>nullable r"
 | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 492 | have "L (der c (UPNTIMES r (Suc (Suc n)))) = Der c (L (UPNTIMES r (Suc (Suc n))))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 493 | by (simp only: der_correctness) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 494 | also have "... = Der c (L (ALT (NTIMES r (Suc (Suc n))) (UPNTIMES r (Suc n))))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 495 | by(simp only: L.simps Suc_Union) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 496 | also have "... = L (der c (ALT (NTIMES r (Suc (Suc n))) (UPNTIMES r (Suc n))))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 497 | by (simp only: der_correctness) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 498 | also have "... = L (der c (NTIMES r (Suc (Suc n)))) \<union> L (der c (UPNTIMES r (Suc n)))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 499 | by(auto simp add: Seq_def) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 500 | also have "... = L (der c (NTIMES r (Suc (Suc n)))) \<union> L (SEQ (der c r) (UPNTIMES r n))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 501 | using IH by simp | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 502 | also have "... = L (SEQ (der c r) (NTIMES r (Suc n))) \<union> L (SEQ (der c r) (UPNTIMES r n))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 503 | using a unfolding L_der_NTIMES by simp | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 504 | also have "... = L (SEQ (der c r) (UPNTIMES r (Suc n)))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 505 | by (simp add: Suc_Union seq_union(1)) | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 506 | finally have "L (der c (UPNTIMES r (Suc (Suc n)))) = L (SEQ (der c r) (UPNTIMES r (Suc n)))" . | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 507 | } | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 508 | ultimately | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 509 | show "L (der c (UPNTIMES r (Suc (Suc n)))) = L (SEQ (der c r) (UPNTIMES r (Suc n)))" | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 510 | by blast | 
| 
192f4c59633e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
397diff
changeset | 511 | qed | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 512 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 513 | lemma matcher_correctness: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 514 | shows "matcher r s \<longleftrightarrow> s \<in> L r" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 515 | by (induct s arbitrary: r) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 516 | (simp_all add: nullable_correctness der_correctness Der_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 517 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 518 | end |