src/HOL/Lex/AutoChopper.thy
author clasohm
Mon, 05 Feb 1996 21:29:06 +0100
changeset 1476 608483c2122a
parent 1374 5e407f2a3323
child 1900 c7a869229091
permissions -rw-r--r--
expanded tabs; incorporated Konrad's changes
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.
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    15
*)
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    16
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    17
AutoChopper = Auto + Chopper +
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    18
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    19
consts
1374
5e407f2a3323 removed quotes from consts and syntax sections
clasohm
parents: 1365
diff changeset
    20
  is_auto_chopper :: (('a,'b)auto => 'a chopper) => bool
5e407f2a3323 removed quotes from consts and syntax sections
clasohm
parents: 1365
diff changeset
    21
  auto_chopper :: ('a,'b)auto => 'a chopper
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    22
  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
    23
          => 'a list list * 'a list"
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    24
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    25
defs
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    26
  is_auto_chopper_def "is_auto_chopper(chopperf) ==
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    27
                       !A. is_longest_prefix_chopper(accepts A)(chopperf A)"
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    28
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    29
  auto_chopper_def "auto_chopper A xs == acc xs (start A) [] [] ([],xs) A"
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    30
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    31
primrec acc List.list
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    32
  acc_Nil  "acc [] st ys zs chopsr A =
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    33
              (if ys=[] then chopsr else (ys#fst(chopsr),snd(chopsr)))" 
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    34
  acc_Cons "acc(x#xs) st ys zs chopsr A =
1476
608483c2122a expanded tabs; incorporated Konrad's changes
clasohm
parents: 1374
diff changeset
    35
            (let s0 = start(A); nxt = next(A); fin = fin(A)
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    36
             in if fin(nxt st x)
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    37
                then acc xs (nxt st x) (zs@[x]) (zs@[x])
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    38
                         (acc xs s0 [] [] ([],xs) A) A
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    39
                else acc xs (nxt st x) ys (zs@[x]) chopsr A)"
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    40
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    41
end
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    42
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    43
(* The following definition of acc should also work:
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    44
consts
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    45
  acc1 :: [('a,'b)auto, 'a list, 'b, 'a list list, 'a list, 'a list]
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    46
          => 'a list list * 'a list
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    47
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    48
acc1 A [] s xss zs xs =
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    49
  (if xs=[] then (xss, zs)
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    50
   else acc1 A zs (start A) (xss @ [xs]) [] [])
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    51
acc1 A (y#ys) s xss zs rec =
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    52
  let s' = next A s;
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    53
      zs' = (if fin A s' then [] else zs@[y])
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    54
      xs' = (if fin A s' then xs@zs@[y] else xs)
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    55
  in acc1 A ys s' xss zs' xs'
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    56
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    57
Advantage: does not need lazy evaluation for reasonable (quadratic)
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    58
performance.
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    59
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    60
Disadavantage: not primrec.
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    61
  
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    62
Termination measure:
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    63
  size(A,ys,s,xss,zs,rec) = (|xs| + |ys| + |zs|, |ys|)
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    64
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    65
Termination proof: the first clause reduces the first component by |xs|,
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    66
the second clause leaves the first component alone but reduces the second by 1.
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    67
1365
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    68
Claim: acc1 A xs s [] [] [] = acc xs s [] [] ([],xs) A
0defae128e43 Updated comments
nipkow
parents: 1362
diff changeset
    69
Generalization?
1362
5fdd4da11d49 Added lots of comments
nipkow
parents: 1344
diff changeset
    70
*)