src/HOL/Statespace/state_fun.ML
changeset 30280 eb98b49ef835
parent 29302 eb782d1dc07c
child 30289 b28caca9157f
equal deleted inserted replaced
30279:84097bba7bdc 30280:eb98b49ef835
   334 fun mkUpper str = 
   334 fun mkUpper str = 
   335   (case String.explode str of
   335   (case String.explode str of
   336     [] => ""
   336     [] => ""
   337    | c::cs => String.implode (Char.toUpper c::cs ))
   337    | c::cs => String.implode (Char.toUpper c::cs ))
   338 
   338 
   339 fun mkName (Type (T,args)) = concat (map mkName args) ^ mkUpper (NameSpace.base T)
   339 fun mkName (Type (T,args)) = concat (map mkName args) ^ mkUpper (NameSpace.base_name T)
   340   | mkName (TFree (x,_)) = mkUpper (NameSpace.base x)
   340   | mkName (TFree (x,_)) = mkUpper (NameSpace.base_name x)
   341   | mkName (TVar ((x,_),_)) = mkUpper (NameSpace.base x);
   341   | mkName (TVar ((x,_),_)) = mkUpper (NameSpace.base_name x);
   342 
   342 
   343 fun is_datatype thy n = is_some (Symtab.lookup (DatatypePackage.get_datatypes thy) n);
   343 fun is_datatype thy n = is_some (Symtab.lookup (DatatypePackage.get_datatypes thy) n);
   344 
   344 
   345 fun mk_map ("List.list") = Syntax.const "List.map"
   345 fun mk_map "List.list" = Syntax.const "List.map"
   346   | mk_map n = Syntax.const ("StateFun." ^  "map_" ^ NameSpace.base n);
   346   | mk_map n = Syntax.const ("StateFun.map_" ^ NameSpace.base_name n);
   347 
   347 
   348 fun gen_constr_destr comp prfx thy (Type (T,[])) = 
   348 fun gen_constr_destr comp prfx thy (Type (T,[])) = 
   349       Syntax.const (deco prfx (mkUpper (NameSpace.base T)))
   349       Syntax.const (deco prfx (mkUpper (NameSpace.base_name T)))
   350   | gen_constr_destr comp prfx thy (T as Type ("fun",_)) =
   350   | gen_constr_destr comp prfx thy (T as Type ("fun",_)) =
   351      let val (argTs,rangeT) = strip_type T;
   351      let val (argTs,rangeT) = strip_type T;
   352      in comp 
   352      in comp 
   353           (Syntax.const (deco prfx (concat (map mkName argTs) ^ "Fun")))
   353           (Syntax.const (deco prfx (concat (map mkName argTs) ^ "Fun")))
   354           (fold (fn x => fn y => x$y)
   354           (fold (fn x => fn y => x$y)
   358   | gen_constr_destr comp prfx thy (T' as Type (T,argTs)) = 
   358   | gen_constr_destr comp prfx thy (T' as Type (T,argTs)) = 
   359      if is_datatype thy T
   359      if is_datatype thy T
   360      then (* datatype args are recursively embedded into val *)
   360      then (* datatype args are recursively embedded into val *)
   361          (case argTs of
   361          (case argTs of
   362            [argT] => comp 
   362            [argT] => comp 
   363                      ((Syntax.const (deco prfx (mkUpper (NameSpace.base T)))))
   363                      ((Syntax.const (deco prfx (mkUpper (NameSpace.base_name T)))))
   364                      ((mk_map T $ gen_constr_destr comp prfx thy argT))
   364                      ((mk_map T $ gen_constr_destr comp prfx thy argT))
   365           | _ => raise (TYPE ("StateFun.gen_constr_destr",[T'],[])))
   365           | _ => raise (TYPE ("StateFun.gen_constr_destr",[T'],[])))
   366      else (* type args are not recursively embedded into val *)
   366      else (* type args are not recursively embedded into val *)
   367            Syntax.const (deco prfx (concat (map mkName argTs) ^ mkUpper (NameSpace.base T)))
   367            Syntax.const (deco prfx (concat (map mkName argTs) ^ mkUpper (NameSpace.base_name T)))
   368   | gen_constr_destr thy _ _ T = raise (TYPE ("StateFun.gen_constr_destr",[T],[]));
   368   | gen_constr_destr thy _ _ T = raise (TYPE ("StateFun.gen_constr_destr",[T],[]));
   369                    
   369                    
   370 val mk_constr = gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ a $ b) ""
   370 val mk_constr = gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ a $ b) ""
   371 val mk_destr =  gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ b $ a) "the_"
   371 val mk_destr =  gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ b $ a) "the_"
   372 
   372