src/HOL/Lex/AutoChopper.ML
author nipkow
Wed, 12 Feb 1997 18:54:39 +0100
changeset 2609 4370e5f0fa3f
parent 2056 93c093620c28
child 3842 b55686a7b22c
permissions -rw-r--r--
New class "order" and accompanying changes.
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
open AutoChopper;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    12
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    13
infix repeat_RS;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    14
fun th1 repeat_RS th2 = ((th1 RS th2) repeat_RS th2) handle _ => th1;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    15
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    16
Addsimps [Let_def];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    17
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    18
goal AutoChopper.thy "!st us p y ys. acc xs st (ys@[y]) us p A ~= ([],zs)";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    19
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    20
by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    21
by (asm_simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    22
val accept_not_Nil = result() repeat_RS spec;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    23
Addsimps [accept_not_Nil];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    24
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    25
goal AutoChopper.thy
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    26
"!st us. acc xs st [] us ([],ys) A = ([], zs) --> \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    27
\        zs = ys & (!ys. ys ~= [] & ys<=xs --> ~fin A (nexts A st ys))";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    28
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    29
by (simp_tac (!simpset addcongs [conj_cong]) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    30
by (simp_tac (!simpset setloop (split_tac[expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    31
by (strip_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
    32
by (rtac conjI 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    33
by (Fast_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    34
by (simp_tac (!simpset addsimps [prefix_Cons] addcongs [conj_cong]) 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    35
by (strip_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    36
by (REPEAT(eresolve_tac [conjE,exE] 1));
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    37
by (hyp_subst_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    38
by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    39
by (case_tac "zsa = []" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    40
by (Asm_simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    41
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    42
bind_thm("no_acc", result() RS spec RS spec RS mp);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    43
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    44
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    45
val [prem] = goal HOL.thy "? x.P(f(x)) ==> ? y.P(y)";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    46
by (cut_facts_tac [prem] 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    47
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    48
val ex_special = result();
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    49
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    50
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    51
goal AutoChopper.thy
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    52
"! r erk l rst st ys yss zs::'a list. \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    53
\    acc xs st erk r (l,rst) A = (ys#yss, zs) --> \
2609
4370e5f0fa3f New class "order" and accompanying changes.
nipkow
parents: 2056
diff changeset
    54
\    ys@concat(yss)@zs = (if acc_prefix A st xs then r@xs else erk@concat(l)@rst)";
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    55
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    56
 by (simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    57
by (asm_simp_tac (!simpset setloop (split_tac [expand_if])) 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    58
by (res_inst_tac [("p","acc list (start A) [] [] ([],list) A")] PairE 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    59
by (rename_tac "vss lrst" 1);  
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    60
by (asm_simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    61
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
    62
 by (hyp_subst_tac 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    63
 by (Simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    64
 by (fast_tac (!claset addSDs [no_acc]) 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    65
by (hyp_subst_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    66
by (asm_simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    67
val step2_a = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    68
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    69
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    70
goal AutoChopper.thy
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    71
 "! st erk r l rest ys yss zs.\
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    72
\   acc xs st erk r (l,rest) A = (ys#yss, zs) --> \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    73
\     (if acc_prefix A st xs \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    74
\      then ys ~= [] \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    75
\      else ys ~= [] | (erk=[] & (l,rest) = (ys#yss,zs)))";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    76
by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    77
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    78
 by (simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    79
 by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    80
by (asm_simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    81
by (res_inst_tac [("p","acc list (start A) [] [] ([],list) A")] PairE 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    82
by (rename_tac "vss lrst" 1);  
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    83
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    84
by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    85
by (case_tac "acc_prefix A (next A st a) list" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
    86
 by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    87
by (subgoal_tac "r @ [a] ~= []" 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    88
 by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    89
by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    90
val step2_b = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    91
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    92
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    93
goal AutoChopper.thy  
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    94
 "! st erk r l rest ys yss zs. \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    95
\   acc xs st erk r (l,rest) A = (ys#yss, zs) --> \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    96
\     (if acc_prefix A st xs                   \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    97
\      then ? g. ys=r@g & fin A (nexts A st g)  \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    98
\      else (erk~=[] & erk=ys) | (erk=[] & (l,rest) = (ys#yss,zs)))";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    99
by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   100
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   101
 by (simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   102
 by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   103
by (asm_simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   104
by (strip_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   105
by (rtac conjI 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   106
 by (res_inst_tac [("p","acc list (start A) [] [] ([],list) A")] PairE 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   107
 by (rename_tac "vss lrst" 1);  
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   108
 by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   109
 by (case_tac "acc_prefix A (next A st a) list" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   110
  by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   111
  by (res_inst_tac [("f","%k.a#k")] ex_special 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   112
  by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   113
  by (res_inst_tac [("t","%k.ys=r@a#k"),("s","%k.ys=(r@[a])@k")] subst 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   114
   by (Simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   115
  by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   116
 by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   117
 by (res_inst_tac [("x","[a]")] exI 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   118
 by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   119
 by (subgoal_tac "r @ [a] ~= []" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   120
  by (rtac sym 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   121
  by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   122
 by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   123
by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   124
by (res_inst_tac [("f","%k.a#k")] ex_special 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   125
by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   126
by (res_inst_tac [("t","%k.ys=r@a#k"),("s","%k.ys=(r@[a])@k")] subst 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   127
 by (Simp_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   128
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   129
val step2_c = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   130
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   131
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   132
goal AutoChopper.thy
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   133
 "! st erk r l rest ys yss zs. \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   134
\   acc xs st erk r (l,rest) A = (ys#yss, zs) --> \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   135
\     (if acc_prefix A st xs       \
2609
4370e5f0fa3f New class "order" and accompanying changes.
nipkow
parents: 2056
diff changeset
   136
\      then acc(concat(yss)@zs)(start A) [] [] ([],concat(yss)@zs) A = (yss,zs) \
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   137
\      else (erk~=[] & (l,rest)=(yss,zs)) | (erk=[] & (l, rest)=(ys#yss,zs)))";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   138
by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   139
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   140
 by (simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   141
 by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   142
by (asm_simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   143
by (res_inst_tac [("p","acc list (start A) [] [] ([],list) A")] PairE 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   144
by (rename_tac "vss lrst" 1);  
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   145
by (Asm_simp_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   146
by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   147
by (case_tac "acc_prefix A (next A st a) list" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   148
 by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   149
by (subgoal_tac "acc list (start A) [] [] ([],list) A = (yss,zs)" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   150
 by (Asm_simp_tac 2);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   151
 by (subgoal_tac "r@[a] ~= []" 2);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   152
  by (Fast_tac 2);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   153
 by (Simp_tac 2);
2609
4370e5f0fa3f New class "order" and accompanying changes.
nipkow
parents: 2056
diff changeset
   154
by (subgoal_tac "concat(yss) @ zs = list" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   155
 by (hyp_subst_tac 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   156
 by (atac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   157
by (case_tac "yss = []" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   158
 by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   159
 by (hyp_subst_tac 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   160
 by (fast_tac (!claset addSDs [no_acc]) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   161
by (etac ((neq_Nil_conv RS iffD1) RS exE) 1);
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   162
by (etac exE 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   163
by (hyp_subst_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   164
by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   165
by (rtac trans 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   166
 by (etac step2_a 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   167
by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   168
val step2_d = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   169
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   170
Delsimps [split_paired_All];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   171
goal AutoChopper.thy 
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   172
"! st erk r p ys yss zs. \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   173
\  acc xs st erk r p A = (ys#yss, zs) --> \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   174
\  (if acc_prefix A st xs  \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   175
\   then ? g.ys=r@g & (!as. as<=xs & g<=as & g~=as --> ~fin A (nexts A st as))\
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   176
\   else (erk~=[] & ys=erk) | (erk=[] & (ys#yss,zs)=p))";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   177
by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   178
by (list.induct_tac "xs" 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   179
 by (simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   180
 by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   181
by (asm_simp_tac (!simpset addcongs [conj_cong] setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   182
by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   183
by (case_tac "acc_prefix A (next A st a) list" 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   184
 by (rtac conjI 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   185
  by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   186
  by (res_inst_tac [("f","%k.a#k")] ex_special 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   187
  by (res_inst_tac [("t","%k.ys=r@a#k"),("s","%k.ys=(r@[a])@k")] subst 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   188
   by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   189
  by (res_inst_tac [("P","%k.ys = (r@[a])@k & (!as. as<=list & k<=as & k ~= as --> ~ fin A (nexts A (next A st a) as))")] exE 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   190
   by (asm_simp_tac HOL_ss 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   191
  by (res_inst_tac [("x","x")] exI 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   192
  by (Asm_simp_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   193
  by (rtac list_cases 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   194
   by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   195
  by (asm_simp_tac (!simpset addcongs[conj_cong]) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   196
 by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   197
 by (res_inst_tac [("f","%k.a#k")] ex_special 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   198
 by (res_inst_tac [("t","%k.ys=r@a#k"),("s","%k.ys=(r@[a])@k")] subst 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   199
  by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   200
 by (res_inst_tac [("P","%k.ys=(r@[a])@k & (!as. as<=list & k<=as & k~=as --> ~ fin A (nexts A (next A st a) as))")] exE 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   201
  by (asm_simp_tac HOL_ss 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   202
 by (res_inst_tac [("x","x")] exI 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   203
 by (Asm_simp_tac 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   204
 by (rtac list_cases 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   205
  by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   206
 by (asm_simp_tac (!simpset addcongs[conj_cong]) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   207
by (Asm_simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   208
by (strip_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   209
by (res_inst_tac [("x","[a]")] exI 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   210
by (rtac conjI 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   211
 by (subgoal_tac "r @ [a] ~= []" 1);
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   212
  by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   213
 by (Simp_tac 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   214
by (rtac list_cases 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   215
 by (Simp_tac 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   216
by (asm_full_simp_tac (!simpset addsimps [acc_prefix_def] addcongs[conj_cong]) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   217
by (etac thin_rl 1); (* speed up *)
1894
c2c8279d40f0 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
   218
by (Fast_tac 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   219
val step2_e = (result() repeat_RS spec) RS mp;
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   220
Addsimps[split_paired_All];
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   221
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   222
goalw AutoChopper.thy [accepts_def, is_auto_chopper_def, auto_chopper_def,
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   223
                       Chopper.is_longest_prefix_chopper_def]
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   224
 "is_auto_chopper(auto_chopper)";
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   225
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
   226
 by (rtac mp 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   227
  by (etac step2_b 2);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   228
 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   229
by (rtac conjI 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   230
 by (rtac mp 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   231
  by (etac step2_c 2);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   232
 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   233
by (rtac conjI 1);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   234
 by (asm_simp_tac (!simpset addsimps [step2_a] setloop (split_tac [expand_if])) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   235
by (rtac conjI 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   236
 by (rtac mp 1);
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   237
  by (etac step2_d 2);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   238
 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1344
diff changeset
   239
by (rtac mp 1);
2056
93c093620c28 Removed commands made redundant by new one-point rules
paulson
parents: 1950
diff changeset
   240
 by (etac step2_e 2);
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   241
 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
   242
qed"auto_chopper_is_auto_chopper";