src/HOL/Lex/NAe_of_RegExp.thy
changeset 4907 0eb6730de30f
parent 4906 0537ee95d004
child 4908 7a155899ef9c
equal deleted inserted replaced
4906:0537ee95d004 4907:0eb6730de30f
     1 (*  Title:      HOL/Lex/NAe_of_RegExp.thy
       
     2     ID:         $Id$
       
     3     Author:     Tobias Nipkow
       
     4     Copyright   1998 TUM
       
     5 
       
     6 Conversion of regular expressions
       
     7 into nondeterministic automata with epsilon transitions
       
     8 *)
       
     9 
       
    10 NAe_of_RegExp = NAe + RegExp +
       
    11 
       
    12 types 'a r2nae = ('a,bool list)nae
       
    13 
       
    14 syntax "##" :: 'a => 'a list set => 'a list set (infixr 65)
       
    15 translations "x ## S" == "op # x `` S"
       
    16 
       
    17 constdefs
       
    18  atom  :: 'a => 'a r2nae
       
    19 "atom a == ([True],
       
    20             %b s. if s=[True] & b=Some a then {[False]} else {},
       
    21             %s. s=[False])"
       
    22 
       
    23  union :: 'a r2nae => 'a r2nae => 'a r2nae
       
    24 "union == %(ql,dl,fl)(qr,dr,fr).
       
    25    ([],
       
    26     %a s. case s of
       
    27             [] => if a=None then {True#ql,False#qr} else {}
       
    28           | left#s => if left then True ## dl a s
       
    29                               else False ## dr a s,
       
    30     %s. case s of [] => False | left#s => if left then fl s else fr s)"
       
    31 
       
    32  conc :: 'a r2nae => 'a r2nae => 'a r2nae
       
    33 "conc == %(ql,dl,fl)(qr,dr,fr).
       
    34    (True#ql,
       
    35     %a s. case s of
       
    36             [] => {}
       
    37           | left#s => if left then (True ## dl a s) Un
       
    38                                    (if fl s & a=None then {False#qr} else {})
       
    39                               else False ## dr a s,
       
    40     %s. case s of [] => False | left#s => ~left & fr s)"
       
    41 
       
    42  star :: 'a r2nae => 'a r2nae
       
    43 "star == %(q,d,f).
       
    44    ([],
       
    45     %a s. case s of
       
    46             [] => if a=None then {True#q} else {}
       
    47           | left#s => if left then (True ## d a s) Un
       
    48                                    (if f s & a=None then {True#q} else {})
       
    49                               else {},
       
    50     %s. case s of [] => True | left#s => left & f s)"
       
    51 
       
    52 consts r2n :: 'a rexp => 'a r2nae
       
    53 primrec r2n rexp
       
    54 "r2n Empty = ([], %a s. {}, %s. False)"
       
    55 "r2n(Atom a) = atom a"
       
    56 "r2n(Union el er) = union(r2n el)(r2n er)"
       
    57 "r2n(Conc el er) = conc(r2n el)(r2n er)"
       
    58 "r2n(Star e) = star(r2n e)"
       
    59 
       
    60 end