src/HOL/Lex/AutoChopper.ML
author nipkow
Thu, 14 May 1998 16:54:20 +0200
changeset 4931 2ec84dee7911
parent 4832 bc11b5b06f87
child 4955 a9fa93e1a86e
permissions -rw-r--r--
Reordred arguments in AutoChopper. Updated README with ref to paper.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
     1
(*  Title:      HOL/Lex/AutoChopper.ML
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
     3
    Author:     Richard Mayr & Tobias Nipkow
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     4
    Copyright   1995 TUM
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     5
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     6
Main result: auto_chopper satisfies the is_auto_chopper specification.
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     7
*)
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     8
1950
97f1c6bf3ace Miniscoping rules are deleted, as these brittle proofs
paulson
parents: 1894
diff changeset
     9
Delsimps (ex_simps @ all_simps);
97f1c6bf3ace Miniscoping rules are deleted, as these brittle proofs
paulson
parents: 1894
diff changeset
    10
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    11
infix repeat_RS;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    12
fun th1 repeat_RS th2 = ((th1 RS th2) repeat_RS th2) handle _ => th1;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    13
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    14
Addsimps [Let_def];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    15
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    16
goalw thy [acc_prefix_def] "~acc_prefix A [] s";
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    17
by (Simp_tac 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    18
qed"acc_prefix_Nil";
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    19
Addsimps [acc_prefix_Nil];
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    20
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    21
goalw thy [acc_prefix_def]
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    22
 "acc_prefix A (x#xs) s = (fin A (next A x s) | acc_prefix A xs (next A x s))";
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    23
by (simp_tac (simpset() addsimps [prefix_Cons]) 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    24
by Safe_tac;
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    25
  by (Asm_full_simp_tac 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    26
  by (case_tac "zs=[]" 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    27
   by (hyp_subst_tac 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    28
   by (Asm_full_simp_tac 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    29
  by (Fast_tac 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    30
 by (res_inst_tac [("x","[x]")] exI 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    31
 by (asm_simp_tac (simpset() addsimps [eq_sym_conv]) 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    32
by (res_inst_tac [("x","x#us")] exI 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    33
by (Asm_simp_tac 1);
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    34
qed"acc_prefix_Cons";
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    35
Addsimps [acc_prefix_Cons];
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    36
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    37
goal thy "!st us p y ys. acc A st p xs (ys@[y]) us ~= ([],zs)";
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    38
by (induct_tac "xs" 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    39
by (Simp_tac 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    40
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    41
val accept_not_Nil = result() repeat_RS spec;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    42
Addsimps [accept_not_Nil];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    43
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    44
goal thy
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    45
"!st us. acc A st ([],ys) xs [] us = ([], zs) --> \
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    46
\        zs = ys & (!ys. ys ~= [] & ys<=xs --> ~fin A (delta A ys st))";
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    47
by (induct_tac "xs" 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
    48
by (simp_tac (simpset() addcongs [conj_cong]) 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    49
by (Simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    50
by (strip_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
    51
by (rtac conjI 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    52
by (Fast_tac 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
    53
by (simp_tac (simpset() addsimps [prefix_Cons] addcongs [conj_cong]) 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    54
by (strip_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    55
by (REPEAT(eresolve_tac [conjE,exE] 1));
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    56
by (hyp_subst_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    57
by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    58
by (case_tac "zsa = []" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    59
by (Asm_simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    60
by (Fast_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    61
qed_spec_mp "no_acc";
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    62
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    63
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
    64
val [prem] = goal HOL.thy "? x. P(f(x)) ==> ? y. P(y)";
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    65
by (cut_facts_tac [prem] 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    66
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    67
val ex_special = result();
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    68
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    69
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    70
goal thy
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    71
"! r erk l rst st ys yss zs::'a list. \
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    72
\    acc A st (l,rst) xs erk r = (ys#yss, zs) --> \
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    73
\    ys@concat(yss)@zs = (if acc_prefix A xs st then r@xs else erk@concat(l)@rst)";
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    74
by (induct_tac "xs" 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    75
 by (simp_tac (simpset() addcongs [conj_cong]) 1);
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    76
by (Asm_simp_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    77
by (res_inst_tac [("p","acc A (start A) ([],list) list [] []")] PairE 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    78
by (rename_tac "vss lrst" 1);  
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    79
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    80
by (res_inst_tac[("xs","vss")] list_eq_cases 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    81
 by (hyp_subst_tac 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    82
 by (Simp_tac 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
    83
 by (fast_tac (claset() addSDs [no_acc]) 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    84
by (hyp_subst_tac 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    85
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    86
val step2_a = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    87
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    88
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    89
goal thy
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    90
 "! st erk r l rest ys yss zs.\
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    91
\   acc A st (l,rest) xs erk r = (ys#yss, zs) --> \
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
    92
\     (if acc_prefix A xs st \
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    93
\      then ys ~= [] \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    94
\      else ys ~= [] | (erk=[] & (l,rest) = (ys#yss,zs)))";
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    95
by (Simp_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
    96
by (induct_tac "xs" 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    97
 by (simp_tac (simpset() addcongs [conj_cong]) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    98
 by (Fast_tac 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
    99
by (asm_simp_tac (simpset() addcongs [conj_cong]) 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   100
by (res_inst_tac [("p","acc A (start A) ([],list) list [] []")] PairE 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   101
by (rename_tac "vss lrst" 1);  
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   102
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   103
by (strip_tac 1);
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   104
by (case_tac "acc_prefix A list (next A a st)" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   105
 by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   106
by (subgoal_tac "r @ [a] ~= []" 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   107
 by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   108
by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   109
val step2_b = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   110
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   111
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   112
goal thy  
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   113
 "! st erk r l rest ys yss zs. \
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   114
\   acc A st (l,rest) xs erk r = (ys#yss, zs) --> \
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   115
\     (if acc_prefix A xs st                   \
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   116
\      then ? g. ys=r@g & fin A (delta A g st)  \
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   117
\      else (erk~=[] & erk=ys) | (erk=[] & (l,rest) = (ys#yss,zs)))";
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   118
by (Simp_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   119
by (induct_tac "xs" 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   120
 by (simp_tac (simpset() addcongs [conj_cong]) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   121
 by (Fast_tac 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   122
by (asm_simp_tac (simpset() addcongs [conj_cong]) 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   123
by (strip_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   124
by (rtac conjI 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   125
 by (res_inst_tac [("p","acc A (start A) ([],list) list [] []")] PairE 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   126
 by (rename_tac "vss lrst" 1);  
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   127
 by (Asm_simp_tac 1);
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   128
 by (case_tac "acc_prefix A list (next A a st)" 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   129
  by (strip_tac 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   130
  by (res_inst_tac [("f","%k. a#k")] ex_special 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   131
  by (Simp_tac 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   132
  by (res_inst_tac [("t","%k. ys=r@a#k"),("s","%k. ys=(r@[a])@k")] subst 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   133
   by (Simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   134
  by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   135
 by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   136
 by (res_inst_tac [("x","[a]")] exI 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   137
 by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   138
 by (subgoal_tac "r @ [a] ~= []" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   139
  by (rtac sym 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   140
  by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   141
 by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   142
by (strip_tac 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   143
by (res_inst_tac [("f","%k. a#k")] ex_special 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   144
by (Simp_tac 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   145
by (res_inst_tac [("t","%k. ys=r@a#k"),("s","%k. ys=(r@[a])@k")] subst 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   146
 by (Simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   147
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   148
val step2_c = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   149
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   150
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   151
goal thy
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   152
 "! st erk r l rest ys yss zs. \
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   153
\   acc A st (l,rest) xs erk r = (ys#yss, zs) --> \
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   154
\     (if acc_prefix A xs st       \
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   155
\      then acc A (start A) ([],concat(yss)@zs) (concat(yss)@zs) [] [] = (yss,zs) \
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   156
\      else (erk~=[] & (l,rest)=(yss,zs)) | (erk=[] & (l, rest)=(ys#yss,zs)))";
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   157
by (Simp_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   158
by (induct_tac "xs" 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   159
 by (simp_tac (simpset() addcongs [conj_cong]) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   160
 by (Fast_tac 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   161
by (asm_simp_tac (simpset() addcongs [conj_cong]) 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   162
by (res_inst_tac [("p","acc A (start A) ([],list) list [] []")] PairE 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   163
by (rename_tac "vss lrst" 1);  
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   164
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   165
by (strip_tac 1);
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   166
by (case_tac "acc_prefix A list (next A a st)" 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   167
 by (Asm_simp_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   168
by (subgoal_tac "acc A (start A) ([],list) list [] [] = (yss,zs)" 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   169
 by (Asm_simp_tac 2);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   170
 by (subgoal_tac "r@[a] ~= []" 2);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   171
  by (Fast_tac 2);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   172
 by (Simp_tac 2);
2609
4370e5f0fa3f New class "order" and accompanying changes.
nipkow
parents: 2056
diff changeset
   173
by (subgoal_tac "concat(yss) @ zs = list" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   174
 by (hyp_subst_tac 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   175
 by (atac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   176
by (case_tac "yss = []" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   177
 by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   178
 by (hyp_subst_tac 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
   179
 by (fast_tac (claset() addSDs [no_acc]) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   180
by (etac ((neq_Nil_conv RS iffD1) RS exE) 1);
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   181
by (etac exE 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   182
by (hyp_subst_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   183
by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   184
by (rtac trans 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   185
 by (etac step2_a 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   186
by (Simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   187
val step2_d = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   188
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   189
Delsimps [split_paired_All];
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   190
goal thy 
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   191
"! st erk r p ys yss zs. \
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   192
\  acc A st p xs erk r = (ys#yss, zs) --> \
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   193
\  (if acc_prefix A xs st  \
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   194
\   then ? g. ys=r@g & (!as. as<=xs & g<=as & g~=as --> ~fin A (delta A as st))\
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   195
\   else (erk~=[] & ys=erk) | (erk=[] & (ys#yss,zs)=p))";
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   196
by (Simp_tac 1);
4931
2ec84dee7911 Reordred arguments in AutoChopper.
nipkow
parents: 4832
diff changeset
   197
by (induct_tac "xs" 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   198
 by (simp_tac (simpset() addcongs [conj_cong]) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   199
 by (Fast_tac 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   200
by (asm_simp_tac (simpset() addcongs [conj_cong]) 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   201
by (strip_tac 1);
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   202
by (case_tac "acc_prefix A list (next A a st)" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   203
 by (rtac conjI 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   204
  by (strip_tac 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   205
  by (res_inst_tac [("f","%k. a#k")] ex_special 1);
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   206
  by (res_inst_tac [("t","%k. ys=r@a#k"),("s","%k. ys=(r@[a])@k")] subst 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   207
   by (Simp_tac 1);
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   208
  by (res_inst_tac [("P","%k. ys = (r@[a])@k & (!as. as<=list & k<=as & k ~= as --> ~ fin A (delta A as (next A a st)))")] exE 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   209
   by (asm_simp_tac HOL_ss 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   210
  by (res_inst_tac [("x","x")] exI 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   211
  by (Asm_simp_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   212
  by (rtac list_cases 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   213
   by (Simp_tac 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
   214
  by (asm_simp_tac (simpset() addcongs[conj_cong]) 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   215
 by (strip_tac 1);
3842
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   216
 by (res_inst_tac [("f","%k. a#k")] ex_special 1);
b55686a7b22c fixed dots;
wenzelm
parents: 2609
diff changeset
   217
 by (res_inst_tac [("t","%k. ys=r@a#k"),("s","%k. ys=(r@[a])@k")] subst 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   218
  by (Simp_tac 1);
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   219
 by (res_inst_tac [("P","%k. ys=(r@[a])@k & (!as. as<=list & k<=as & k~=as --> ~ fin A (delta A as (next A a st)))")] exE 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   220
  by (asm_simp_tac HOL_ss 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   221
 by (res_inst_tac [("x","x")] exI 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   222
 by (Asm_simp_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   223
 by (rtac list_cases 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   224
  by (Simp_tac 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
   225
 by (asm_simp_tac (simpset() addcongs[conj_cong]) 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   226
by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   227
by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   228
by (res_inst_tac [("x","[a]")] exI 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   229
by (rtac conjI 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   230
 by (subgoal_tac "r @ [a] ~= []" 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   231
  by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   232
 by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   233
by (rtac list_cases 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   234
 by (Simp_tac 1);
4089
96fba19bcbe2 isatool fixclasimp;
wenzelm
parents: 3919
diff changeset
   235
by (asm_full_simp_tac (simpset() addsimps [acc_prefix_def] addcongs[conj_cong]) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   236
by (etac thin_rl 1); (* speed up *)
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   237
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   238
val step2_e = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   239
Addsimps[split_paired_All];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   240
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   241
goalw thy [accepts_def, is_auto_chopper_def, auto_chopper_def,
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4686
diff changeset
   242
           Chopper.is_longest_prefix_chopper_def]
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   243
 "is_auto_chopper(auto_chopper)";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   244
by (REPEAT(ares_tac [no_acc,allI,impI,conjI] 1));
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   245
 by (rtac mp 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   246
  by (etac step2_b 2);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   247
 by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   248
by (rtac conjI 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   249
 by (rtac mp 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   250
  by (etac step2_c 2);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   251
 by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   252
by (rtac conjI 1);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   253
 by (asm_simp_tac (simpset() addsimps [step2_a]) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   254
by (rtac conjI 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   255
 by (rtac mp 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   256
  by (etac step2_d 2);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   257
 by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   258
by (rtac mp 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   259
 by (etac step2_e 2);
4686
74a12e86b20b Removed `addsplits [expand_if]'
nipkow
parents: 4089
diff changeset
   260
 by (Simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   261
qed"auto_chopper_is_auto_chopper";