theory RegExp imports "Functional-Automata.Execute" begin term Atom value "Star (Times(Plus (Atom(CHR ''a'')) (Atom(CHR ''b''))) (Atom(CHR ''c'')))" notation Star ("\(_)\\<^sup>*" [0]100) notation Plus (infixr "||" 55) notation Times (infixr "~~" 60) notation Atom ("\_\" 65) (* datatype 'a rexp = Empty ("<>") | Atom 'a ("\_\" 65) | Alt "('a rexp)" "('a rexp)" (infixr "||" 55) | Conc "('a rexp)" "('a rexp)" (infixr "~~" 60) | Star "('a rexp)" ("\(_)\\<^sup>*" [0]100) *) definition rep1 :: "'a rexp \ 'a rexp" ("\(_)\\<^sup>+") where "\A\\<^sup>+ \ A ~~ \A\\<^sup>*" definition opt :: "'a rexp \ 'a rexp" ("\(_)\") where "\A\ \ A || One" value "Star (Conc(Alt (Atom(CHR ''a'')) (Atom(CHR ''b''))) (Atom(CHR ''c'')))" text\or better equivalently:\ value "\(\CHR ''a''\ || \CHR ''b''\) ~~ \CHR ''c''\\\<^sup>*" section\Definition of a semantic function: the ``language'' of the regular expression\ text\ This is just a reminder - already defined in @{theory Regular_Exp} as @{term lang}.\ text\In the following, we give a semantics for our regular expressions, which so far have just been a term language (i.e. abstract syntax). The semantics is a ``denotational semantics'', i.e. we give a direct meaning for regular expressions in some universe of ``denotations''. This universe of denotations is in our concrete case:\ definition enabled :: "('a,'\ set)da \ '\ set \ 'a list \ 'a list" where "enabled A \ = filter (\x. next A x \ \ {}) " text\Now the denotational semantics for regular expression can be defined on a post-card:\ fun L :: "'a rexp => 'a lang" where L_Emp : "L Zero = {}" |L_One: "L One = {[]}" |L_Atom: "L (\a\) = {[a]}" |L_Un: "L (el || er) = (L el) \ (L er)" |L_Conc: "L (el ~~ er) = {xs@ys | xs ys. xs \ L el \ ys \ L er}" |L_Star: "L (Star e) = Regular_Set.star(L e)" text\A more useful definition is the \ fun L\<^sub>s\<^sub>u\<^sub>b :: "'a::order rexp => 'a lang" where L\<^sub>s\<^sub>u\<^sub>b_Emp: "L\<^sub>s\<^sub>u\<^sub>b Zero = {}" |L\<^sub>s\<^sub>u\<^sub>b_One: "L\<^sub>s\<^sub>u\<^sub>b One = {[]}" |L\<^sub>s\<^sub>u\<^sub>b_Atom: "L\<^sub>s\<^sub>u\<^sub>b (\a\) = {z . \x. x \ a \ z=[x]}" |L\<^sub>s\<^sub>u\<^sub>b_Un: "L\<^sub>s\<^sub>u\<^sub>b (el || er) = (L\<^sub>s\<^sub>u\<^sub>b el) \ (L\<^sub>s\<^sub>u\<^sub>b er)" |L\<^sub>s\<^sub>u\<^sub>b_Conc: "L\<^sub>s\<^sub>u\<^sub>b (el ~~ er) = {xs@ys | xs ys. xs \ L\<^sub>s\<^sub>u\<^sub>b el \ ys \ L\<^sub>s\<^sub>u\<^sub>b er}" |L\<^sub>s\<^sub>u\<^sub>b_Star: "L\<^sub>s\<^sub>u\<^sub>b (Star e) = Regular_Set.star(L\<^sub>s\<^sub>u\<^sub>b e)" definition XX where "XX = (rexp2na example_expression)" definition YY where "YY = na2da(rexp2na example_expression)" (* reminder from execute *) value "NA.accepts (rexp2na example_expression) [0,1,1,0,0,1]" value "DA.accepts (na2da (rexp2na example_expression)) [0,1,1,0,0,1]" definition zero where "zero = (0::nat)" definition one where "one = (1::nat)" typ "'a set" export_code zero one Suc Int.nat nat_of_integer int_of_integer Zero One Atom Plus Times Star rexp2na na2da enabled NA.accepts DA.accepts example_expression in SML module_name RegExpChecker file "RegExpChecker.sml" SML_file "RegExpChecker.sml" no_notation Atom ("\_\") end