src/HOLCF/IOA/meta_theory/automaton.ML
changeset 36960 01594f816e3a
parent 36692 54b64d4ad524
child 37146 f652333bbf8e
equal deleted inserted replaced
36959:f5417836dbea 36960:01594f816e3a
   483   add_rename aut source_aut rename_f;
   483   add_rename aut source_aut rename_f;
   484 
   484 
   485 
   485 
   486 (* outer syntax *)
   486 (* outer syntax *)
   487 
   487 
   488 local structure P = OuterParse and K = OuterKeyword in
   488 val _ = List.app Keyword.keyword ["signature", "actions", "inputs",
   489 
       
   490 val _ = List.app OuterKeyword.keyword ["signature", "actions", "inputs",
       
   491   "outputs", "internals", "states", "initially", "transitions", "pre",
   489   "outputs", "internals", "states", "initially", "transitions", "pre",
   492   "post", "transrel", ":=", "compose", "hide_action", "in", "restrict", "to",
   490   "post", "transrel", ":=", "compose", "hide_action", "in", "restrict", "to",
   493   "rename"];
   491   "rename"];
   494 
   492 
   495 val actionlist = P.list1 P.term;
   493 val actionlist = Parse.list1 Parse.term;
   496 val inputslist = P.$$$ "inputs" |-- P.!!! actionlist;
   494 val inputslist = Parse.$$$ "inputs" |-- Parse.!!! actionlist;
   497 val outputslist = P.$$$ "outputs" |-- P.!!! actionlist;
   495 val outputslist = Parse.$$$ "outputs" |-- Parse.!!! actionlist;
   498 val internalslist = P.$$$ "internals" |-- P.!!! actionlist;
   496 val internalslist = Parse.$$$ "internals" |-- Parse.!!! actionlist;
   499 val stateslist = P.$$$ "states" |-- P.!!! (Scan.repeat1 (P.name --| P.$$$ "::" -- P.typ));
   497 val stateslist =
   500 val initial = P.$$$ "initially" |-- P.!!! P.term;
   498   Parse.$$$ "states" |-- Parse.!!! (Scan.repeat1 (Parse.name --| Parse.$$$ "::" -- Parse.typ));
   501 val assign_list = P.list1 (P.name --| P.$$$ ":=" -- P.!!! P.term);
   499 val initial = Parse.$$$ "initially" |-- Parse.!!! Parse.term;
   502 val pre = P.$$$ "pre" |-- P.!!! P.term;
   500 val assign_list = Parse.list1 (Parse.name --| Parse.$$$ ":=" -- Parse.!!! Parse.term);
   503 val post = P.$$$ "post" |-- P.!!! assign_list;
   501 val pre = Parse.$$$ "pre" |-- Parse.!!! Parse.term;
       
   502 val post = Parse.$$$ "post" |-- Parse.!!! assign_list;
   504 val pre1 = (pre -- (Scan.optional post [])) >> mk_trans_of_prepost;
   503 val pre1 = (pre -- (Scan.optional post [])) >> mk_trans_of_prepost;
   505 val post1 = ((Scan.optional pre "True") -- post) >> mk_trans_of_prepost;
   504 val post1 = ((Scan.optional pre "True") -- post) >> mk_trans_of_prepost;
   506 val transrel =  (P.$$$ "transrel" |-- P.!!! P.term) >> mk_trans_of_rel;
   505 val transrel =  (Parse.$$$ "transrel" |-- Parse.!!! Parse.term) >> mk_trans_of_rel;
   507 val transition = P.term -- (transrel || pre1 || post1);
   506 val transition = Parse.term -- (transrel || pre1 || post1);
   508 val translist = P.$$$ "transitions" |-- P.!!! (Scan.repeat1 transition);
   507 val translist = Parse.$$$ "transitions" |-- Parse.!!! (Scan.repeat1 transition);
   509 
   508 
   510 val ioa_decl =
   509 val ioa_decl =
   511   (P.name -- (P.$$$ "=" |--
   510   (Parse.name -- (Parse.$$$ "=" |--
   512     (P.$$$ "signature" |--
   511     (Parse.$$$ "signature" |--
   513       P.!!! (P.$$$ "actions" |--
   512       Parse.!!! (Parse.$$$ "actions" |--
   514         (P.typ --
   513         (Parse.typ --
   515           (Scan.optional inputslist []) --
   514           (Scan.optional inputslist []) --
   516           (Scan.optional outputslist []) --
   515           (Scan.optional outputslist []) --
   517           (Scan.optional internalslist []) --
   516           (Scan.optional internalslist []) --
   518           stateslist --
   517           stateslist --
   519           (Scan.optional initial "True") --
   518           (Scan.optional initial "True") --
   520         translist))))) >> mk_ioa_decl ||
   519         translist))))) >> mk_ioa_decl ||
   521   (P.name -- (P.$$$ "=" |-- (P.$$$ "compose" |-- P.!!! (P.list1 P.name))))
   520   (Parse.name -- (Parse.$$$ "=" |-- (Parse.$$$ "compose" |-- Parse.!!! (Parse.list1 Parse.name))))
   522     >> mk_composition_decl ||
   521     >> mk_composition_decl ||
   523   (P.name -- (P.$$$ "=" |-- (P.$$$ "hide_action" |--
   522   (Parse.name -- (Parse.$$$ "=" |-- (Parse.$$$ "hide_action" |--
   524       P.!!! (P.list1 P.term -- (P.$$$ "in" |-- P.name))))) >> mk_hiding_decl ||
   523       Parse.!!! (Parse.list1 Parse.term -- (Parse.$$$ "in" |-- Parse.name))))) >> mk_hiding_decl ||
   525   (P.name -- (P.$$$ "=" |-- (P.$$$ "restrict" |--
   524   (Parse.name -- (Parse.$$$ "=" |-- (Parse.$$$ "restrict" |--
   526       P.!!! (P.name -- (P.$$$ "to" |-- P.list1 P.term))))) >> mk_restriction_decl ||
   525       Parse.!!! (Parse.name -- (Parse.$$$ "to" |-- Parse.list1 Parse.term))))) >> mk_restriction_decl ||
   527   (P.name -- (P.$$$ "=" |-- (P.$$$ "rename" |-- (P.!!! (P.name -- (P.$$$ "to" |-- P.term))))))
   526   (Parse.name -- (Parse.$$$ "=" |--
       
   527       (Parse.$$$ "rename" |-- (Parse.!!! (Parse.name -- (Parse.$$$ "to" |-- Parse.term))))))
   528     >> mk_rename_decl;
   528     >> mk_rename_decl;
   529 
   529 
   530 val _ =
   530 val _ =
   531   OuterSyntax.command "automaton" "define Lynch/Vaandrager-style I/O automaton" K.thy_decl
   531   Outer_Syntax.command "automaton" "define Lynch/Vaandrager-style I/O automaton" Keyword.thy_decl
   532     (ioa_decl >> Toplevel.theory);
   532     (ioa_decl >> Toplevel.theory);
   533 
   533 
   534 end;
   534 end;
   535 
       
   536 end;