| 4714 |      1 | (*  Title:      HOL/Lex/MaxPrefix.thy
 | 
|  |      2 |     ID:         $Id$
 | 
|  |      3 |     Author:     Tobias Nipkow
 | 
|  |      4 |     Copyright   1998 TUM
 | 
|  |      5 | *)
 | 
|  |      6 | 
 | 
|  |      7 | MaxPrefix = Prefix +
 | 
|  |      8 | 
 | 
|  |      9 | constdefs
 | 
|  |     10 |  is_maxpref :: ('a list => bool) => 'a list => 'a list => bool
 | 
|  |     11 | "is_maxpref P xs ys ==
 | 
|  |     12 |  xs <= ys & (xs=[] | P xs) & (!zs. zs <= ys & P zs --> zs <= xs)"
 | 
|  |     13 | 
 | 
|  |     14 | types 'a splitter = "'a list => 'a list * 'a list"
 | 
|  |     15 | constdefs
 | 
|  |     16 |  is_maxsplitter :: "('a list => bool) => 'a splitter => bool"
 | 
|  |     17 | "is_maxsplitter P f ==
 | 
|  |     18 |  (!xs ps qs. f xs = (ps,qs) = (xs=ps@qs & is_maxpref P ps xs))"
 | 
|  |     19 | 
 | 
|  |     20 | consts
 | 
| 4910 |     21 |  maxsplit :: "('a list => bool) => 'a list * 'a list => 'a list => 'a splitter"
 | 
| 5184 |     22 | primrec
 | 
| 4910 |     23 | "maxsplit P res ps []     = (if P ps then (ps,[]) else res)"
 | 
|  |     24 | "maxsplit P res ps (q#qs) = maxsplit P (if P ps then (ps,q#qs) else res)
 | 
|  |     25 |                                      (ps@[q]) qs"
 | 
| 4714 |     26 | end
 |