src/HOL/Lex/AutoMaxChop.thy
author webertj
Wed, 10 Mar 2004 22:33:48 +0100
changeset 14456 cca28ec5f9a6
parent 14431 ade3d26e0caf
permissions -rw-r--r--
support for non-recursive IDTs, The, arbitrary, Hilbert_Choice.Eps
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/AutoMaxChop.thy
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
14428
bb2b0e10d9be Conversion of ML files to Isar.
nipkow
parents: 5184
diff changeset
     7
theory AutoMaxChop = DA + MaxChop:
4714
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     8
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     9
consts
4910
697d17fe1665 Reordered a few parameters.
nipkow
parents: 4832
diff changeset
    10
 auto_split :: "('a,'s)da => 's  => 'a list * 'a list => 'a list => 'a splitter"
5184
9b8547a9496a Adapted to new datatype package.
berghofe
parents: 4910
diff changeset
    11
primrec
4910
697d17fe1665 Reordered a few parameters.
nipkow
parents: 4832
diff changeset
    12
"auto_split A q res ps []     = (if fin A q then (ps,[]) else res)"
697d17fe1665 Reordered a few parameters.
nipkow
parents: 4832
diff changeset
    13
"auto_split A q res ps (x#xs) =
697d17fe1665 Reordered a few parameters.
nipkow
parents: 4832
diff changeset
    14
   auto_split A (next A x q) (if fin A q then (ps,x#xs) else res) (ps@[x]) xs"
4714
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    15
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    16
constdefs
4832
bc11b5b06f87 Added conversion of reg.expr. to automata.
nipkow
parents: 4714
diff changeset
    17
 auto_chop :: "('a,'s)da => 'a chopper"
4910
697d17fe1665 Reordered a few parameters.
nipkow
parents: 4832
diff changeset
    18
"auto_chop A == chop (%xs. auto_split A (start A) ([],xs) [] xs)"
14431
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    19
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    20
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    21
lemma delta_snoc: "delta A (xs@[y]) q = next A y (delta A xs q)";
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    22
by simp
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    23
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    24
lemma auto_split_lemma:
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    25
 "!!q ps res. auto_split A (delta A ps q) res ps xs =
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    26
              maxsplit (%ys. fin A (delta A ys q)) res ps xs"
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    27
apply (induct xs)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    28
 apply simp
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    29
apply (simp add: delta_snoc[symmetric] del: delta_append)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    30
done
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    31
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    32
lemma auto_split_is_maxsplit:
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    33
 "auto_split A (start A) res [] xs = maxsplit (accepts A) res [] xs"
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    34
apply (unfold accepts_def)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    35
apply (subst delta_Nil[where s = "start A", symmetric])
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    36
apply (subst auto_split_lemma)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    37
apply simp
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    38
done
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    39
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    40
lemma is_maxsplitter_auto_split:
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    41
 "is_maxsplitter (accepts A) (%xs. auto_split A (start A) ([],xs) [] xs)"
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    42
by (simp add: auto_split_is_maxsplit is_maxsplitter_maxsplit)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    43
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    44
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    45
lemma is_maxchopper_auto_chop:
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    46
 "is_maxchopper (accepts A) (auto_chop A)"
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    47
apply (unfold auto_chop_def)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    48
apply (rule is_maxchopper_chop)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    49
apply (rule is_maxsplitter_auto_split)
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    50
done
ade3d26e0caf ML -> Isar
nipkow
parents: 14428
diff changeset
    51
4714
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    52
end