--- a/thys/ReStar.thy Thu Jan 21 12:47:20 2016 +0000
+++ b/thys/ReStar.thy Sat Jan 30 13:12:36 2016 +0000
@@ -108,7 +108,6 @@
apply(simp)
done
-
lemma star_decomp:
assumes a: "c # x \<in> A\<star>"
shows "\<exists>a b. x = a @ b \<and> c # a \<in> A \<and> b \<in> A\<star>"
@@ -116,6 +115,22 @@
by (induct x\<equiv>"c # x" rule: Star.induct)
(auto simp add: append_eq_Cons_conv)
+(*
+lemma star_induct[consumes 1, case_names Nil append, induct set: Star]:
+assumes "w \<in> A\<star>"
+ and "P []"
+ and step: "\<And>u v. u \<in> A \<Longrightarrow> v \<in> A\<star> \<Longrightarrow> P v \<Longrightarrow> P (u @ v)"
+shows "P w"
+proof -
+ { fix n have "w \<in> A \<up> n \<Longrightarrow> P w"
+ apply(induct n arbitrary: w)
+ apply(auto intro: `P []` step star2 simp add: Sequ_def)
+ done
+ }
+ with `w \<in> A\<star>` show "P w" by (auto simp: star3)
+qed
+*)
+
section {* Regular Expressions *}
datatype rexp =
@@ -177,6 +192,12 @@
| "flat (Star []) = []"
| "flat (Star (v#vs)) = (flat v) @ (flat (Star vs))"
+lemma [simp]:
+ "flat (Star vs) = concat (map flat vs)"
+apply(induct vs)
+apply(auto)
+done
+
section {* Relation between values and regular expressions *}
inductive
@@ -205,20 +226,34 @@
apply(auto simp add: Sequ_def)
done
+lemma Prf_Star:
+ assumes "\<forall>v \<in> set vs. \<turnstile> v : r"
+ shows "\<turnstile> Star vs : STAR r"
+using assms
+apply(induct vs)
+apply (metis Prf.intros(6))
+by (metis Prf.intros(7) insert_iff set_simps(2))
-lemma Prf_Star_flat_L:
- assumes "\<turnstile> v : STAR r" shows "flat v \<in> (L r)\<star>"
+lemma Star_string:
+ assumes "s \<in> A\<star>"
+ shows "\<exists>ss. concat ss = s \<and> (\<forall>s \<in> set ss. s \<in> A)"
using assms
-apply(induct v r\<equiv>"STAR r" arbitrary: r rule: Prf.induct)
+apply(induct rule: Star.induct)
apply(auto)
-apply(simp add: star3)
+apply(rule_tac x="[]" in exI)
+apply(simp)
+apply(rule_tac x="s1#ss" in exI)
+apply(simp)
+done
+
+lemma Star_val:
+ assumes "\<forall>s\<in>set ss. \<exists>v. s = flat v \<and> \<turnstile> v : r"
+ shows "\<exists>vs. concat (map flat vs) = concat ss \<and> (\<forall>v\<in>set vs. \<turnstile> v : r)"
+using assms
+apply(induct ss)
apply(auto)
-apply(rule_tac x="Suc x" in exI)
-apply(auto simp add: Sequ_def)
-apply(rule_tac x="flat v" in exI)
-apply(rule_tac x="flat (Star vs)" in exI)
-apply(auto)
-by (metis Prf_flat_L)
+apply (metis empty_iff list.set(1))
+by (metis concat.simps(2) list.simps(9) set_ConsD)
lemma L_flat_Prf:
"L(r) = {flat v | v. \<turnstile> v : r}"
@@ -231,150 +266,18 @@
apply (metis Prf.intros(3) flat.simps(4))
apply(erule Prf.cases)
apply(auto)
-apply(simp add: star3)
+apply(subgoal_tac "\<exists>vs::val list. concat (map flat vs) = x \<and> (\<forall>v \<in> set vs. \<turnstile> v : r)")
+apply(auto)[1]
+apply(rule_tac x="Star vs" in exI)
+apply(simp)
+apply(rule Prf_Star)
+apply(simp)
+apply(drule Star_string)
apply(auto)
-sorry
-
-section {* Greedy Ordering according to Frisch/Cardelli *}
-
-inductive
- GrOrd :: "val \<Rightarrow> val \<Rightarrow> bool" ("_ gr\<succ> _")
-where
- "v1 gr\<succ> v1' \<Longrightarrow> (Seq v1 v2) gr\<succ> (Seq v1' v2')"
-| "v2 gr\<succ> v2' \<Longrightarrow> (Seq v1 v2) gr\<succ> (Seq v1 v2')"
-| "v1 gr\<succ> v2 \<Longrightarrow> (Left v1) gr\<succ> (Left v2)"
-| "v1 gr\<succ> v2 \<Longrightarrow> (Right v1) gr\<succ> (Right v2)"
-| "(Left v2) gr\<succ>(Right v1)"
-| "(Char c) gr\<succ> (Char c)"
-| "(Void) gr\<succ> (Void)"
-
-lemma Gr_refl:
- assumes "\<turnstile> v : r"
- shows "v gr\<succ> v"
-using assms
-apply(induct)
-apply(auto intro: GrOrd.intros)
-done
-
-lemma Gr_total:
- assumes "\<turnstile> v1 : r" "\<turnstile> v2 : r"
- shows "v1 gr\<succ> v2 \<or> v2 gr\<succ> v1"
-using assms
-apply(induct v1 r arbitrary: v2 rule: Prf.induct)
-apply(rotate_tac 4)
-apply(erule Prf.cases)
-apply(simp_all)[5]
-apply(clarify)
-apply (metis GrOrd.intros(1) GrOrd.intros(2))
-apply(rotate_tac 2)
-apply(erule Prf.cases)
-apply(simp_all)
-apply(clarify)
-apply (metis GrOrd.intros(3))
-apply(clarify)
-apply (metis GrOrd.intros(5))
-apply(rotate_tac 2)
-apply(erule Prf.cases)
-apply(simp_all)
-apply(clarify)
-apply (metis GrOrd.intros(5))
-apply(clarify)
-apply (metis GrOrd.intros(4))
-apply(erule Prf.cases)
-apply(simp_all)
-apply (metis GrOrd.intros(7))
-apply(erule Prf.cases)
-apply(simp_all)
-apply (metis GrOrd.intros(6))
+apply(rule Star_val)
+apply(simp)
done
-lemma Gr_trans:
- assumes "v1 gr\<succ> v2" "v2 gr\<succ> v3"
- and "\<turnstile> v1 : r" "\<turnstile> v2 : r" "\<turnstile> v3 : r"
- shows "v1 gr\<succ> v3"
-using assms
-apply(induct r arbitrary: v1 v2 v3)
-apply(erule Prf.cases)
-apply(simp_all)[5]
-apply(erule Prf.cases)
-apply(simp_all)[5]
-apply(erule Prf.cases)
-apply(simp_all)[5]
-apply(erule Prf.cases)
-apply(simp_all)[5]
-apply(erule Prf.cases)
-apply(simp_all)[5]
-defer
-(* ALT case *)
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply (metis GrOrd.intros(3))
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply (metis GrOrd.intros(5))
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply (metis GrOrd.intros(5))
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply (metis GrOrd.intros(4))
-(* SEQ case *)
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(erule Prf.cases)
-apply(simp_all (no_asm_use))[5]
-apply(clarify)
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply(clarify)
-apply (metis GrOrd.intros(1))
-apply (metis GrOrd.intros(1))
-apply(erule GrOrd.cases)
-apply(simp_all (no_asm_use))[7]
-apply (metis GrOrd.intros(1))
-by (metis GrOrd.intros(1) Gr_refl)
-
section {* Values Sets *}
@@ -458,31 +361,32 @@
apply(auto)
(*NULL*)
apply(erule Prf.cases)
-apply(simp_all)[5]
+apply(simp_all)[7]
(*EMPTY*)
apply(erule Prf.cases)
-apply(simp_all)[5]
+apply(simp_all)[7]
apply(rule Prf.intros)
apply (metis append_Nil prefix_def)
(*CHAR*)
apply(erule Prf.cases)
-apply(simp_all)[5]
+apply(simp_all)[7]
apply(rule Prf.intros)
apply(erule Prf.cases)
-apply(simp_all)[5]
+apply(simp_all)[7]
(*ALT*)
apply(erule Prf.cases)
-apply(simp_all)[5]
+apply(simp_all)[7]
apply (metis Prf.intros(2))
apply (metis Prf.intros(3))
(*SEQ*)
apply(erule Prf.cases)
-apply(simp_all)[5]
+apply(simp_all)[7]
apply (simp add: append_eq_conv_conj prefix_def rest_def)
apply (metis Prf.intros(1))
apply (simp add: append_eq_conv_conj prefix_def rest_def)
done
+(* This lemma needs to be adapted to Star
lemma Values_finite:
"finite (Values r s)"
apply(induct r arbitrary: s)
@@ -499,6 +403,7 @@
apply(rule finite_Suffixes)
apply(simp)
done
+*)
section {* Sulzmann functions *}
@@ -508,6 +413,7 @@
"mkeps(EMPTY) = Void"
| "mkeps(SEQ r1 r2) = Seq (mkeps r1) (mkeps r2)"
| "mkeps(ALT r1 r2) = (if nullable(r1) then Left (mkeps r1) else Right (mkeps r2))"
+| "mkeps(STAR r) = Star []"
section {* Derivatives *}
@@ -522,6 +428,7 @@
(if nullable r1
then ALT (SEQ (der c r1) r2) (der c r2)
else SEQ (der c r1) r2)"
+| "der c (STAR r) = SEQ (der c r) (STAR r)"
fun
ders :: "string \<Rightarrow> rexp \<Rightarrow> rexp"
@@ -589,6 +496,8 @@
apply(auto)
done
+(* HERE *)
+
lemma v3:
assumes "\<turnstile> v : der c r"
shows "\<turnstile> (injval r c v) : r"