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