New scanner in abstract form.
authornipkow
Tue, 10 Mar 1998 13:27:13 +0100
changeset 4714 bcdf68c78e18
parent 4713 bea2ab2e360b
child 4715 245d70532eed
New scanner in abstract form.
src/HOL/Lex/AutoMaxChop.ML
src/HOL/Lex/AutoMaxChop.thy
src/HOL/Lex/MaxChop.ML
src/HOL/Lex/MaxChop.thy
src/HOL/Lex/MaxPrefix.ML
src/HOL/Lex/MaxPrefix.thy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Lex/AutoMaxChop.ML	Tue Mar 10 13:27:13 1998 +0100
@@ -0,0 +1,44 @@
+(*  Title:      HOL/Lex/AutoMaxChop.ML
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1998 TUM
+*)
+
+goal thy "!q ys. nexts A q (xs@ys) = nexts A (nexts A q xs) ys";
+by(induct_tac "xs" 1);
+by (ALLGOALS Asm_simp_tac);
+qed "nexts_append";
+Addsimps [nexts_append];
+
+goal thy "nexts A q (xs@[y]) = next A (nexts A q xs) y";
+by(Simp_tac 1);
+qed "nexts_snoc";
+Addsimps [nexts_append];
+
+goal thy
+ "!q ps res. auto_split A (nexts A q ps) ps xs res = \
+\            maxsplit (%ys. fin A (nexts A q ys)) ps xs res";
+by(induct_tac "xs" 1);
+by(Simp_tac 1);
+by(asm_simp_tac (simpset() addsimps [nexts_snoc RS sym]
+                           delsimps [nexts_append]) 1);
+qed_spec_mp "auto_split_lemma";
+
+goalw thy [accepts_def]
+ "auto_split A (start A) [] xs res = maxsplit (accepts A) [] xs res";
+by(stac ((read_instantiate [("st","start A")] nexts_Nil) RS sym) 1);
+by(stac auto_split_lemma 1);
+by(Simp_tac 1);
+qed_spec_mp "auto_split_is_maxsplit";
+
+goal thy
+ "is_maxsplitter (accepts A) (%xs. auto_split A (start A) [] xs ([],xs))";
+by(simp_tac (simpset() addsimps
+        [auto_split_is_maxsplit,is_maxsplitter_maxsplit]) 1);
+qed "is_maxsplitter_auto_split";
+
+goalw thy [auto_chop_def]
+ "is_maxchopper (accepts A) (auto_chop A)";
+br is_maxchopper_chop 1;
+br is_maxsplitter_auto_split 1;
+qed "is_maxchopper_auto_chop";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Lex/AutoMaxChop.thy	Tue Mar 10 13:27:13 1998 +0100
@@ -0,0 +1,20 @@
+(*  Title:      HOL/Lex/AutoMaxChop.thy
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1998 TUM
+*)
+
+AutoMaxChop = Auto + MaxChop +
+
+consts
+ auto_split :: "('a,'s)auto => 's => 'a list => 'a list => 'a list * 'a list
+                => 'a list * 'a list"
+primrec auto_split list
+"auto_split A q ps []     res = (if fin A q then (ps,[]) else res)"
+"auto_split A q ps (x#xs) res = auto_split A (next A q x) (ps@[x]) xs
+                                     (if fin A q then (ps,x#xs) else res)"
+
+constdefs
+ auto_chop :: "('a,'s)auto => 'a chopper"
+"auto_chop A == chop (%xs. auto_split A (start A) [] xs ([],xs))"
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Lex/MaxChop.ML	Tue Mar 10 13:27:13 1998 +0100
@@ -0,0 +1,106 @@
+(*  Title:      HOL/Lex/MaxChop.ML
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1998 TUM
+*)
+
+(* Termination of chop *)
+
+goalw thy [reducing_def] "reducing(%qs. maxsplit P [] qs ([],qs))";
+by(asm_full_simp_tac (simpset() addsimps [maxsplit_eq]) 1);
+qed "reducing_maxsplit";
+
+val [tc] = chopr.tcs;
+goalw_cterm [reducing_def] (cterm_of (sign_of thy) (HOLogic.mk_Trueprop tc));
+by(blast_tac (claset() addDs [sym]) 1);
+val lemma = result();
+
+val chopr_rule = let val [chopr_rule] = chopr.rules in lemma RS chopr_rule end;
+
+goalw thy [chop_def] "!!splitf. reducing splitf ==> \
+\ chop splitf xs = (let (pre,post) = splitf xs \
+\                   in if pre=[] then ([],xs) \
+\                      else let (xss,zs) = chop splitf post \
+\                             in (pre#xss,zs))";
+by(asm_simp_tac (simpset() addsimps [chopr_rule] addcongs [if_weak_cong]) 1);
+by(simp_tac (simpset() addsimps [Let_def] addsplits [expand_split]) 1);
+qed "chop_rule";
+
+goalw thy [is_maxsplitter_def,reducing_def]
+ "!!splitf. is_maxsplitter P splitf ==> reducing splitf";
+by(Asm_full_simp_tac 1);
+qed "is_maxsplitter_reducing";
+
+goal thy "!!P. is_maxsplitter P splitf ==> \
+\ !yss zs. chop splitf xs = (yss,zs) --> xs = concat yss @ zs";
+by(res_inst_tac [("xs","xs")] length_induct 1);
+by(asm_simp_tac (simpset() delsplits [expand_if]
+                           addsimps [chop_rule,is_maxsplitter_reducing]
+                           addcongs [if_weak_cong]) 1);
+by(asm_full_simp_tac (simpset() addsimps [Let_def,is_maxsplitter_def]
+                                addsplits [expand_split]) 1);
+qed_spec_mp "chop_concat";
+
+goal thy "!!P. is_maxsplitter P splitf ==> \
+\ !yss zs. chop splitf xs = (yss,zs) --> (!ys : set yss. ys ~= [])";
+by(res_inst_tac [("xs","xs")] length_induct 1);
+by(asm_simp_tac (simpset() addsimps [chop_rule,is_maxsplitter_reducing]
+                           addcongs [if_weak_cong]) 1);
+by(asm_full_simp_tac (simpset() addsimps [Let_def,is_maxsplitter_def]
+                                addsplits [expand_split]) 1);
+by(simp_tac (simpset() addsimps [Let_def,maxsplit_eq]
+                       addsplits [expand_split]) 1);
+be thin_rl 1;
+by(strip_tac 1);
+br ballI 1;
+be exE 1;
+be allE 1;
+auto();
+qed_spec_mp "chop_nonempty";
+
+val [prem] = goalw thy [is_maxchopper_def]
+ "is_maxsplitter P splitf ==> is_maxchopper P (chop splitf)";
+by(Clarify_tac 1);
+br iffI 1;
+ br conjI 1;
+  be (prem RS chop_concat) 1;
+ br conjI 1;
+  be (prem RS chop_nonempty) 1;
+ be rev_mp 1;
+ by(stac (prem RS is_maxsplitter_reducing RS chop_rule) 1);
+ by(simp_tac (simpset() addsimps [Let_def,rewrite_rule[is_maxsplitter_def]prem]
+                        addsplits [expand_split]) 1);
+ by(Clarify_tac 1);
+ br conjI 1;
+  by(Clarify_tac 1);
+  by(Asm_full_simp_tac 1);
+ by(Clarify_tac 1);
+ by(Asm_full_simp_tac 1);
+ by(forward_tac [prem RS chop_concat] 1);
+ by(Clarify_tac 1);
+ ba 1;
+by(stac (prem RS is_maxsplitter_reducing RS chop_rule) 1);
+ by(simp_tac (simpset() addsimps [Let_def,rewrite_rule[is_maxsplitter_def]prem]
+                        addsplits [expand_split]) 1);
+by(Clarify_tac 1);
+br conjI 1;
+ by(Clarify_tac 1);
+ by(exhaust_tac "yss" 1);
+  by(Asm_simp_tac 1);
+ by(Asm_full_simp_tac 1);
+ by(full_simp_tac (simpset() addsimps [is_maxpref_def]) 1);
+ by(blast_tac (claset() addIs [prefix_append RS iffD2]) 1);
+by(exhaust_tac "yss" 1);
+ by(Asm_full_simp_tac 1);
+ by(full_simp_tac (simpset() addsimps [is_maxpref_def]) 1);
+ by(blast_tac (claset() addIs [prefix_append RS iffD2]) 1);
+by(Clarify_tac 1);
+by(Asm_full_simp_tac 1);
+by(subgoal_tac "x=a" 1);
+ by(Clarify_tac 1);
+ by(Asm_full_simp_tac 1);
+by(rotate_tac ~2 1);
+by(Asm_full_simp_tac 1);
+by(full_simp_tac (simpset() addsimps [is_maxpref_def]) 1);
+by(blast_tac (claset() addIs [prefix_append RS iffD2,prefix_antisym]) 1);
+qed "is_maxchopper_chop";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Lex/MaxChop.thy	Tue Mar 10 13:27:13 1998 +0100
@@ -0,0 +1,39 @@
+(*  Title:      HOL/Lex/MaxChop.thy
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1998 TUM
+*)
+
+MaxChop = MaxPrefix +
+
+types   'a chopper = "'a list => 'a list list * 'a list"
+
+constdefs
+ is_maxchopper :: ('a list => bool) => 'a chopper => bool
+"is_maxchopper P chopper ==
+ !xs zs yss.
+    (chopper(xs) = (yss,zs)) =
+    (xs = concat yss @ zs & (!ys : set yss. ys ~= []) &
+     (case yss of
+        [] => is_maxpref P [] xs
+      | us#uss => is_maxpref P us xs & chopper(concat(uss)@zs) = (uss,zs)))"
+
+constdefs
+ reducing :: "'a splitter => bool"
+"reducing splitf ==
+ !xs ys zs. splitf xs = (ys,zs) & ys ~= [] --> length zs < length xs"
+
+consts
+ chopr :: "'a splitter * 'a list => 'a list list * 'a list"
+recdef chopr "measure (length o snd)"
+"chopr (splitf,xs) = (if reducing splitf
+                      then let pp = splitf xs
+                           in if fst(pp)=[] then ([],xs)
+                           else let qq = chopr (splitf,snd pp)
+                                in (fst pp # fst qq,snd qq)
+                      else arbitrary)"
+constdefs
+ chop :: 'a splitter  => 'a chopper
+"chop splitf xs == chopr(splitf,xs)"
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Lex/MaxPrefix.ML	Tue Mar 10 13:27:13 1998 +0100
@@ -0,0 +1,65 @@
+(*  Title:      HOL/Lex/MaxPrefix.ML
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1998 TUM
+*)
+
+Delsplits [expand_if];
+goalw thy [is_maxpref_def] "!(ps::'a list) res. \
+\ (maxsplit P ps qs res = (xs,ys)) = \
+\ (if (? us. us <= qs & P(ps@us)) then xs@ys=ps@qs & is_maxpref P xs (ps@qs) \
+\  else (xs,ys)=res)";
+by(induct_tac "qs" 1);
+ by(simp_tac (simpset() addsplits [expand_if]) 1);
+ by(Blast_tac 1);
+by(Asm_simp_tac 1);
+be thin_rl 1;
+by(Clarify_tac 1);
+by(case_tac "? us. us <= list & P (ps @ a # us)" 1);
+ by(Asm_simp_tac 1);
+ by(subgoal_tac "? us. us <= a # list & P (ps @ us)" 1);
+  by(Asm_simp_tac 1);
+ by(blast_tac (claset() addIs [prefix_Cons RS iffD2]) 1);
+by(subgoal_tac "~P(ps@[a])" 1);
+ by(Blast_tac 2);
+by(Asm_simp_tac 1);
+by(case_tac "? us. us <= a#list & P (ps @ us)" 1);
+ by(Asm_simp_tac 1);
+ by(Clarify_tac 1);
+ by(exhaust_tac "us" 1);
+  br iffI 1;
+   by(asm_full_simp_tac (simpset() addsimps [prefix_Cons,prefix_append]) 1);
+   by(Blast_tac 1);
+  by(asm_full_simp_tac (simpset() addsimps [prefix_Cons,prefix_append]) 1);
+  by(Clarify_tac 1);
+  be disjE 1;
+   by(fast_tac (claset() addDs [prefix_antisym]) 1);
+  by(Clarify_tac 1);
+  be disjE 1;
+   by(Clarify_tac 1);
+   by(Asm_full_simp_tac 1);
+  be disjE 1;
+   by(Clarify_tac 1);
+   by(Asm_full_simp_tac 1);
+ by(Blast_tac 1);
+ by(Asm_full_simp_tac 1);
+ by(Blast_tac 1);
+by(subgoal_tac "~P(ps)" 1);
+by(Asm_simp_tac 1);
+by(fast_tac (claset() addss simpset()) 1);
+qed_spec_mp "maxsplit_lemma";
+Addsplits [expand_if];
+
+goalw thy [is_maxpref_def]
+ "!!P. ~(? us. us<=xs & P us) ==> is_maxpref P ps xs = (ps = [])";
+by(Blast_tac 1);
+qed "is_maxpref_Nil";
+Addsimps [is_maxpref_Nil];
+
+goalw thy [is_maxsplitter_def]
+ "is_maxsplitter P (%xs. maxsplit P [] xs ([],xs))";
+by(simp_tac (simpset() addsimps [maxsplit_lemma]) 1);
+by(fast_tac (claset() addss simpset()) 1);
+qed "is_maxsplitter_maxsplit";
+
+val maxsplit_eq = rewrite_rule [is_maxsplitter_def] is_maxsplitter_maxsplit;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Lex/MaxPrefix.thy	Tue Mar 10 13:27:13 1998 +0100
@@ -0,0 +1,27 @@
+(*  Title:      HOL/Lex/MaxPrefix.thy
+    ID:         $Id$
+    Author:     Tobias Nipkow
+    Copyright   1998 TUM
+*)
+
+MaxPrefix = Prefix +
+
+constdefs
+ is_maxpref :: ('a list => bool) => 'a list => 'a list => bool
+"is_maxpref P xs ys ==
+ xs <= ys & (xs=[] | P xs) & (!zs. zs <= ys & P zs --> zs <= xs)"
+
+types 'a splitter = "'a list => 'a list * 'a list"
+constdefs
+ is_maxsplitter :: "('a list => bool) => 'a splitter => bool"
+"is_maxsplitter P f ==
+ (!xs ps qs. f xs = (ps,qs) = (xs=ps@qs & is_maxpref P ps xs))"
+
+consts
+ maxsplit :: "('a list => bool) => 'a list => 'a list => 'a list * 'a list
+              => 'a list * 'a list"
+primrec maxsplit list
+"maxsplit P ps []     res = (if P ps then (ps,[]) else res)"
+"maxsplit P ps (q#qs) res = maxsplit P (ps@[q]) qs
+                               (if P ps then (ps,q#qs) else res)"
+end