src/HOL/Lex/Chopper.thy
author nipkow
Sat, 18 Nov 1995 14:55:44 +0100
changeset 1344 f172a7f14e49
child 1374 5e407f2a3323
permissions -rw-r--r--
Half a lexical analyzer generator.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1344
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     1
(*  Title: 	HOL/Lex/Chopper.thy
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     3
    Author: 	Tobias Nipkow
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
A 'chopper' is a function which returns
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     7
  1. a chopped up prefix of the input string
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     8
  2. together with the remaining suffix.
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
     9
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    10
It is a longest_prefix_chopper if it
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    11
  1. chops up as much of the input as possible and
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    12
  2. chops it up into the longest substrings possible.
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    13
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    14
A chopper is parametrized by a language ('a list => bool),
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    15
i.e. a set of strings.
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    16
*)
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    17
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    18
Chopper = Prefix +
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    19
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    20
types   'a chopper = "'a list => 'a list list * 'a list"
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    21
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    22
consts
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    23
  is_longest_prefix_chopper :: "['a list => bool, 'a chopper] => bool"
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    24
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    25
defs
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    26
  is_longest_prefix_chopper_def
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    27
    "is_longest_prefix_chopper L chopper == !xs.   \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    28
\	 (!zs. chopper(xs) = ([],zs) --> \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    29
\	       zs=xs & (!ys. ys ~= [] & ys <= xs --> ~L(ys))) &  \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    30
\ 	 (!ys yss zs. chopper(xs) = (ys#yss,zs) -->                \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    31
\	    ys ~= [] & L(ys) & xs=ys@flat(yss)@zs &   \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    32
\           chopper(flat(yss)@zs) = (yss,zs) &     \
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    33
\           (!as. as <= xs & ys <= as & ys ~= as --> ~L(as)))"
f172a7f14e49 Half a lexical analyzer generator.
nipkow
parents:
diff changeset
    34
end