src/HOL/Lex/MaxPrefix.ML
author nipkow
Tue, 10 Mar 1998 13:27:13 +0100
changeset 4714 bcdf68c78e18
child 4726 6b7027b9e3f4
permissions -rw-r--r--
New scanner in abstract form.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4714
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/Lex/MaxPrefix.ML
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     4
    Copyright   1998 TUM
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     5
*)
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     6
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     7
Delsplits [expand_if];
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     8
goalw thy [is_maxpref_def] "!(ps::'a list) res. \
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     9
\ (maxsplit P ps qs res = (xs,ys)) = \
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    10
\ (if (? us. us <= qs & P(ps@us)) then xs@ys=ps@qs & is_maxpref P xs (ps@qs) \
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    11
\  else (xs,ys)=res)";
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    12
by(induct_tac "qs" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    13
 by(simp_tac (simpset() addsplits [expand_if]) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    14
 by(Blast_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    15
by(Asm_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    16
be thin_rl 1;
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    17
by(Clarify_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    18
by(case_tac "? us. us <= list & P (ps @ a # us)" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    19
 by(Asm_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    20
 by(subgoal_tac "? us. us <= a # list & P (ps @ us)" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    21
  by(Asm_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    22
 by(blast_tac (claset() addIs [prefix_Cons RS iffD2]) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    23
by(subgoal_tac "~P(ps@[a])" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    24
 by(Blast_tac 2);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    25
by(Asm_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    26
by(case_tac "? us. us <= a#list & P (ps @ us)" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    27
 by(Asm_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    28
 by(Clarify_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    29
 by(exhaust_tac "us" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    30
  br iffI 1;
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    31
   by(asm_full_simp_tac (simpset() addsimps [prefix_Cons,prefix_append]) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    32
   by(Blast_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    33
  by(asm_full_simp_tac (simpset() addsimps [prefix_Cons,prefix_append]) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    34
  by(Clarify_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    35
  be disjE 1;
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    36
   by(fast_tac (claset() addDs [prefix_antisym]) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    37
  by(Clarify_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    38
  be disjE 1;
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    39
   by(Clarify_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    40
   by(Asm_full_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    41
  be disjE 1;
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    42
   by(Clarify_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    43
   by(Asm_full_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    44
 by(Blast_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    45
 by(Asm_full_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    46
 by(Blast_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    47
by(subgoal_tac "~P(ps)" 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    48
by(Asm_simp_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    49
by(fast_tac (claset() addss simpset()) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    50
qed_spec_mp "maxsplit_lemma";
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    51
Addsplits [expand_if];
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    52
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    53
goalw thy [is_maxpref_def]
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    54
 "!!P. ~(? us. us<=xs & P us) ==> is_maxpref P ps xs = (ps = [])";
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    55
by(Blast_tac 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    56
qed "is_maxpref_Nil";
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    57
Addsimps [is_maxpref_Nil];
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    58
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    59
goalw thy [is_maxsplitter_def]
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    60
 "is_maxsplitter P (%xs. maxsplit P [] xs ([],xs))";
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    61
by(simp_tac (simpset() addsimps [maxsplit_lemma]) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    62
by(fast_tac (claset() addss simpset()) 1);
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    63
qed "is_maxsplitter_maxsplit";
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    64
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    65
val maxsplit_eq = rewrite_rule [is_maxsplitter_def] is_maxsplitter_maxsplit;