| author | Christian Urban <christian dot urban at kcl dot ac dot uk> | 
| Thu, 13 Oct 2016 13:13:27 +0100 | |
| changeset 450 | b93eaa833d31 | 
| parent 397 | cf3ca219c727 | 
| child 455 | 192f4c59633e | 
| 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 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 14 | section {* Regular Expressions *}
 | 
| 
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 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 19 | | CHAR char | 
| 
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 | 
| 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 28 | |
| 
57ea439feaff
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
361diff
changeset | 29 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 30 | section {* Sequential Composition of Sets *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 31 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 32 | definition | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 33 |   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 | 34 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 35 |   "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 | 36 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 37 | text {* Two Simple Properties about Sequential Composition *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 38 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 39 | lemma seq_empty [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 40 |   shows "A ;; {[]} = A"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 41 |   and   "{[]} ;; A = A"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 42 | by (simp_all add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 43 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 44 | lemma seq_null [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 45 |   shows "A ;; {} = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 46 |   and   "{} ;; A = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 47 | by (simp_all add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 48 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 49 | lemma seq_union: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 50 | 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 | 51 | 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 | 52 | by (auto simp add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 53 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 54 | lemma seq_Union: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 55 | 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 | 56 | by (auto simp add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 57 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 58 | lemma seq_empty_in [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 59 | "[] \<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 | 60 | by (simp add: Seq_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 61 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 62 | lemma seq_assoc: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 63 | shows "A ;; (B ;; C) = (A ;; B) ;; C" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 64 | apply(auto simp add: Seq_def) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 65 | apply(metis append_assoc) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 66 | apply(metis) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 67 | done | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 68 | |
| 
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 | section {* Power for Sets *}
 | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 71 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 72 | fun | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 73 |   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 | 74 | where | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 75 |    "A \<up> 0 = {[]}"
 | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 76 | | "A \<up> (Suc n) = A ;; (A \<up> n)" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 77 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 78 | lemma pow_empty [simp]: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 79 | 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 | 80 | by (induct n) (auto) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 81 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 82 | lemma pow_plus: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 83 | "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 | 84 | by (induct n) (simp_all add: seq_assoc) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 85 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 86 | section {* Kleene Star for Sets *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 87 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 88 | inductive_set | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 89 |   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 | 90 | for A :: "string set" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 91 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 92 | start[intro]: "[] \<in> A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 93 | | 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 | 94 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 95 | text {* A Standard Property of Star *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 96 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 97 | lemma star_decomp: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 98 | assumes a: "c # x \<in> A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 99 | 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 | 100 | using a | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 101 | using a | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 102 | 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 | 103 | (auto simp add: append_eq_Cons_conv) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 104 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 105 | lemma star_cases: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 106 |   shows "A\<star> = {[]} \<union> A ;; A\<star>"
 | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 107 | unfolding Seq_def | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 108 | by (auto) (metis Star.simps) | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 109 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 110 | lemma Star_in_Pow: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 111 | assumes a: "s \<in> A\<star>" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 112 | shows "\<exists>n. s \<in> A \<up> n" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 113 | using a | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 114 | apply(induct) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 115 | apply(auto) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 116 | apply(rule_tac x="Suc n" in exI) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 117 | apply(auto simp add: Seq_def) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 118 | done | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 119 | |
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 120 | lemma Pow_in_Star: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 121 | assumes a: "s \<in> A \<up> n" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 122 | shows "s \<in> A\<star>" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 123 | using a | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 124 | 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 | 125 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 126 | |
| 194 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 127 | lemma Star_def2: | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 128 | shows "A\<star> = (\<Union>n. A \<up> n)" | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 129 | using Star_in_Pow Pow_in_Star | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 130 | by (auto) | 
| 
90796ee3c17a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
193diff
changeset | 131 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 132 | |
| 
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 | section {* Semantics of Regular Expressions *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 135 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 136 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 137 | L :: "rexp \<Rightarrow> string set" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 138 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 139 |   "L (NULL) = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 140 | | "L (EMPTY) = {[]}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 141 | | "L (CHAR c) = {[c]}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 142 | | "L (SEQ r1 r2) = (L r1) ;; (L r2)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 143 | | "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 | 144 | | "L (STAR r) = (L r)\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 145 | | "L (NOT r) = UNIV - (L r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 146 | | "L (PLUS r) = (L r) ;; ((L r)\<star>)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 147 | | "L (OPT r) = (L r) \<union> {[]}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 148 | | "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 | 149 | | "L (NMTIMES r n m) = (\<Union>i\<in> {n..m} . ((L r) \<up> i))" 
 | 
| 355 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 150 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 151 | |
| 227 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 152 | lemma "L (NOT NULL) = UNIV" | 
| 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 153 | apply(simp) | 
| 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 154 | done | 
| 
93bd75031ced
added handout
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
198diff
changeset | 155 | |
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 156 | section {* The Matcher *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 157 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 158 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 159 | nullable :: "rexp \<Rightarrow> bool" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 160 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 161 | "nullable (NULL) = False" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 162 | | "nullable (EMPTY) = True" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 163 | | "nullable (CHAR c) = False" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 164 | | "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 | 165 | | "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 | 166 | | "nullable (STAR r) = True" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 167 | | "nullable (NOT r) = (\<not>(nullable r))" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 168 | | "nullable (PLUS r) = (nullable r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 169 | | "nullable (OPT r) = True" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 170 | | "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 | 171 | | "nullable (NMTIMES r n m) = (if m < n then False else (if n = 0 then True else nullable r))" | 
| 361 
9c7eb266594c
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
355diff
changeset | 172 | |
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 173 | fun M :: "rexp \<Rightarrow> nat" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 174 | where | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 175 | "M (NULL) = 0" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 176 | | "M (EMPTY) = 0" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 177 | | "M (CHAR char) = 0" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 178 | | "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 | 179 | | "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 | 180 | | "M (STAR r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 181 | | "M (NOT r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 182 | | "M (PLUS r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 183 | | "M (OPT r) = Suc (M r)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 184 | | "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 | 185 | | "M (NMTIMES r n m) = Suc (Suc (M r)) * 2 * (Suc m) * (Suc (Suc m) - Suc n)" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 186 | |
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 187 | |
| 361 
9c7eb266594c
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
355diff
changeset | 188 | function der :: "char \<Rightarrow> rexp \<Rightarrow> rexp" | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 189 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 190 | "der c (NULL) = NULL" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 191 | | "der c (EMPTY) = NULL" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 192 | | "der c (CHAR d) = (if c = d then EMPTY else NULL)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 193 | | "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 | 194 | | "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 | 195 | | "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 | 196 | | "der c (NOT r) = NOT(der c r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 197 | | "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 | 198 | | "der c (OPT r) = der c r" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 199 | | "der c (NTIMES r 0) = NULL" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 200 | | "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 | 201 | | "der c (NMTIMES r n m) = | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 202 | (if m < n then NULL else | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 203 | (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 | 204 | ALT (der c (NTIMES r n)) (der c (NMTIMES r (Suc n) m))))" | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 205 | by pat_completeness auto | 
| 363 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 206 | |
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 207 | lemma bigger1: | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 208 | "\<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 | 209 | by (metis le0 mult_strict_mono') | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 210 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 211 | termination der | 
| 361 
9c7eb266594c
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
355diff
changeset | 212 | 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 | 213 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 214 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 215 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 216 | apply(simp) | 
| 
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_all del: M.simps) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 225 | apply(simp_all only: M.simps) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 226 | defer | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 227 | 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 | 228 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 229 | apply(auto)[1] | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 230 | 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 | 231 | 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 | 232 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 233 | apply(auto)[1] | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 234 | apply(subgoal_tac "Suc n < Suc m") | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 235 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 236 | apply(auto)[1] | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 237 | 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 | 238 | prefer 2 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 239 | 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 | 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(rule bigger1) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 243 | apply(assumption) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 244 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 245 | apply (metis zero_less_Suc) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 246 | 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 | 247 | apply(rotate_tac 4) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 248 | 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 | 249 | prefer 4 | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 250 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 251 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 252 | apply (metis zero_less_one) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 253 | apply(simp) | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 254 | done | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 255 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 256 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 257 | ders :: "string \<Rightarrow> rexp \<Rightarrow> rexp" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 258 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 259 | "ders [] r = r" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 260 | | "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 | 261 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 262 | fun | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 263 | matcher :: "rexp \<Rightarrow> string \<Rightarrow> bool" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 264 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 265 | "matcher r s = nullable (ders s r)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 266 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 267 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 268 | section {* Correctness Proof of the Matcher *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 269 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 270 | lemma nullable_correctness: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 271 | shows "nullable r \<longleftrightarrow> [] \<in> (L r)" | 
| 355 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 272 | apply(induct r) | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 273 | apply(auto simp add: Seq_def) | 
| 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 274 | done | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 275 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 276 | section {* Left-Quotient of a Set *}
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 277 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 278 | definition | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 279 | Der :: "char \<Rightarrow> string set \<Rightarrow> string set" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 280 | where | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 281 |   "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 | 282 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 283 | lemma Der_null [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 284 |   shows "Der c {} = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 285 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 286 | by auto | 
| 
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 | lemma Der_empty [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 289 |   shows "Der c {[]} = {}"
 | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 290 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 291 | by auto | 
| 
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_char [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 294 |   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 | 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_union [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 299 | 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 | 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_insert_nil [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 304 | shows "Der c (insert [] A) = Der c A" | 
| 
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_seq [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 309 |   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 | 310 | unfolding Der_def Seq_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 311 | by (auto simp add: Cons_eq_append_conv) | 
| 
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_star [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 314 | 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 | 315 | proof - | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 316 |   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 | 317 | by (simp only: star_cases[symmetric]) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 318 | also have "... = Der c (A ;; A\<star>)" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 319 | by (simp only: Der_union Der_empty) (simp) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 320 |   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 | 321 | by simp | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 322 | also have "... = (Der c A) ;; A\<star>" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 323 | unfolding Seq_def Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 324 | by (auto dest: star_decomp) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 325 | 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 | 326 | qed | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 327 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 328 | lemma Der_UNIV [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 329 | "Der c (UNIV - A) = UNIV - Der c A" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 330 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 331 | by (auto) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 332 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 333 | lemma Der_pow [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 334 |   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 | 335 | unfolding Der_def | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 336 | 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 | 337 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 338 | lemma Der_UNION [simp]: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 339 | shows "Der c (\<Union>x\<in>A. B x) = (\<Union>x\<in>A. Der c (B x))" | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 340 | by (auto simp add: Der_def) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 341 | |
| 363 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 342 | lemma der_correctness: | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 343 | 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 | 344 | apply(induct rule: der.induct) | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 345 | apply(simp_all add: nullable_correctness | 
| 
0d6deecdb2eb
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
362diff
changeset | 346 | 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 | 347 | apply(rule impI)+ | 
| 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 348 | apply(subgoal_tac "{n..m} = {n} \<union> {Suc n..m}")
 | 
| 355 
a259eec25156
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
272diff
changeset | 349 | apply(auto) | 
| 397 
cf3ca219c727
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
385diff
changeset | 350 | done | 
| 191 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 351 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 352 | lemma matcher_correctness: | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 353 | 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 | 354 | by (induct s arbitrary: r) | 
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 355 | (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 | 356 | |
| 
ff6665581ced
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 357 | end |