src/HOL/Lex/MaxChop.thy
author paulson
Wed, 07 Oct 1998 10:31:30 +0200
changeset 5619 76a8c72e3fd4
parent 4714 bcdf68c78e18
child 6481 dbf2d9b3d6c8
permissions -rw-r--r--
new theorems
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/MaxChop.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
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     7
MaxChop = MaxPrefix +
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     8
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
     9
types   'a chopper = "'a list => 'a list list * 'a list"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    10
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    11
constdefs
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    12
 is_maxchopper :: ('a list => bool) => 'a chopper => bool
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    13
"is_maxchopper P chopper ==
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    14
 !xs zs yss.
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    15
    (chopper(xs) = (yss,zs)) =
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    16
    (xs = concat yss @ zs & (!ys : set yss. ys ~= []) &
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    17
     (case yss of
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    18
        [] => is_maxpref P [] xs
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    19
      | us#uss => is_maxpref P us xs & chopper(concat(uss)@zs) = (uss,zs)))"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    20
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    21
constdefs
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    22
 reducing :: "'a splitter => bool"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    23
"reducing splitf ==
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    24
 !xs ys zs. splitf xs = (ys,zs) & ys ~= [] --> length zs < length xs"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    25
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    26
consts
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    27
 chopr :: "'a splitter * 'a list => 'a list list * 'a list"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    28
recdef chopr "measure (length o snd)"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    29
"chopr (splitf,xs) = (if reducing splitf
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    30
                      then let pp = splitf xs
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    31
                           in if fst(pp)=[] then ([],xs)
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    32
                           else let qq = chopr (splitf,snd pp)
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    33
                                in (fst pp # fst qq,snd qq)
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    34
                      else arbitrary)"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    35
constdefs
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    36
 chop :: 'a splitter  => 'a chopper
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    37
"chop splitf xs == chopr(splitf,xs)"
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    38
bcdf68c78e18 New scanner in abstract form.
nipkow
parents:
diff changeset
    39
end