src/HOL/Lex/AutoChopper.thy
author wenzelm
Thu, 12 Feb 1998 17:53:05 +0100
changeset 4628 0c7e97836e3c
parent 4137 2ce2e659c2b1
child 4832 bc11b5b06f87
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
     1
(*  Title:      HOL/Lex/AutoChopper.thy
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
     3
    Author:     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
auto_chopper turns an automaton into a chopper. Tricky, because primrec.
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     7
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     8
is_auto_chopper requires its argument to produce longest_prefix_choppers
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     9
wrt the language accepted by the automaton.
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    10
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    11
Main result: auto_chopper satisfies the is_auto_chopper specification.
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    12
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    13
WARNING: auto_chopper is exponential(?)
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    14
if the recursive calls in the penultimate argument are evaluated eagerly.
4137
2ce2e659c2b1 Added an alternativ version of AutoChopper and a theory for the conversion of
nipkow
parents: 1900
diff changeset
    15
2ce2e659c2b1 Added an alternativ version of AutoChopper and a theory for the conversion of
nipkow
parents: 1900
diff changeset
    16
A more efficient version is defined in AutoChopper1.
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    17
*)
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    18
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    19
AutoChopper = Auto + Chopper +
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    20
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    21
consts
1374
5e407f2a3323 removed quotes from consts and syntax sections
clasohm
parents: 1365
diff changeset
    22
  is_auto_chopper :: (('a,'b)auto => 'a chopper) => bool
5e407f2a3323 removed quotes from consts and syntax sections
clasohm
parents: 1365
diff changeset
    23
  auto_chopper :: ('a,'b)auto => 'a chopper
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    24
  acc :: "['a list, 'b, 'a list, 'a list, 'a list list*'a list, ('a,'b)auto]
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    25
          => 'a list list * 'a list"
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    26
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    27
defs
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    28
  is_auto_chopper_def "is_auto_chopper(chopperf) ==
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    29
                       !A. is_longest_prefix_chopper(accepts A)(chopperf A)"
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    30
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    31
  auto_chopper_def "auto_chopper A xs == acc xs (start A) [] [] ([],xs) A"
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    32
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    33
primrec acc List.list
1900
c7a869229091 Simplified primrec definitions.
berghofe
parents: 1476
diff changeset
    34
  "acc [] st ys zs chopsr A =
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    35
              (if ys=[] then chopsr else (ys#fst(chopsr),snd(chopsr)))" 
1900
c7a869229091 Simplified primrec definitions.
berghofe
parents: 1476
diff changeset
    36
  "acc(x#xs) st ys zs chopsr A =
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    37
            (let s0 = start(A); nxt = next(A); fin = fin(A)
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    38
             in if fin(nxt st x)
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    39
                then acc xs (nxt st x) (zs@[x]) (zs@[x])
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    40
                         (acc xs s0 [] [] ([],xs) A) A
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    41
                else acc xs (nxt st x) ys (zs@[x]) chopsr A)"
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    42
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    43
end