src/HOLCF/Tools/domain/domain_library.ML
changeset 31231 9434cd5ef24a
parent 31229 8a890890d143
child 31288 67dff9c5b2bd
equal deleted inserted replaced
31230:50deb3badfba 31231:9434cd5ef24a
    76   val `% : term * string -> term;
    76   val `% : term * string -> term;
    77   val /\ : string -> term -> term;
    77   val /\ : string -> term -> term;
    78   val UU : term;
    78   val UU : term;
    79   val TT : term;
    79   val TT : term;
    80   val FF : term;
    80   val FF : term;
       
    81   val ID : term;
       
    82   val oo : term * term -> term;
    81   val mk_up : term -> term;
    83   val mk_up : term -> term;
    82   val mk_sinl : term -> term;
    84   val mk_sinl : term -> term;
    83   val mk_sinr : term -> term;
    85   val mk_sinr : term -> term;
    84   val mk_stuple : term list -> term;
    86   val mk_stuple : term list -> term;
    85   val mk_ctuple : term list -> term;
    87   val mk_ctuple : term list -> term;
   129   type cons = string * arg list;
   131   type cons = string * arg list;
   130   type eq = (string * typ list) * cons list;
   132   type eq = (string * typ list) * cons list;
   131   val mk_arg : (bool * DatatypeAux.dtyp) * string option * string -> arg;
   133   val mk_arg : (bool * DatatypeAux.dtyp) * string option * string -> arg;
   132   val is_lazy : arg -> bool;
   134   val is_lazy : arg -> bool;
   133   val rec_of : arg -> int;
   135   val rec_of : arg -> int;
       
   136   val dtyp_of : arg -> DatatypeAux.dtyp;
   134   val sel_of : arg -> string option;
   137   val sel_of : arg -> string option;
   135   val vname : arg -> string;
   138   val vname : arg -> string;
   136   val upd_vname : (string -> string) -> arg -> arg;
   139   val upd_vname : (string -> string) -> arg -> arg;
   137   val is_rec : arg -> bool;
   140   val is_rec : arg -> bool;
   138   val is_nonlazy_rec : arg -> bool;
   141   val is_nonlazy_rec : arg -> bool;
   144   val when_funs : 'a list -> string list;
   147   val when_funs : 'a list -> string list;
   145   val bound_arg : ''a list -> ''a -> term; (* ''a = arg or string *)
   148   val bound_arg : ''a list -> ''a -> term; (* ''a = arg or string *)
   146   val idx_name : 'a list -> string -> int -> string;
   149   val idx_name : 'a list -> string -> int -> string;
   147   val app_rec_arg : (int -> term) -> arg -> term;
   150   val app_rec_arg : (int -> term) -> arg -> term;
   148   val con_app : string -> arg list -> term;
   151   val con_app : string -> arg list -> term;
       
   152   val dtyp_of_eq : eq -> DatatypeAux.dtyp;
   149 
   153 
   150 
   154 
   151   (* Name mangling *)
   155   (* Name mangling *)
   152   val strip_esc : string -> string;
   156   val strip_esc : string -> string;
   153   val extern_name : string -> string;
   157   val extern_name : string -> string;
   221 fun rec_of ((_,dtyp),_,_) =
   225 fun rec_of ((_,dtyp),_,_) =
   222   case dtyp of DatatypeAux.DtRec i => i | _ => ~1;
   226   case dtyp of DatatypeAux.DtRec i => i | _ => ~1;
   223 (* FIXME: what about indirect recursion? *)
   227 (* FIXME: what about indirect recursion? *)
   224 
   228 
   225 fun is_lazy arg = fst (first arg);
   229 fun is_lazy arg = fst (first arg);
       
   230 fun dtyp_of arg = snd (first arg);
   226 val sel_of    =       second;
   231 val sel_of    =       second;
   227 val     vname =       third;
   232 val     vname =       third;
   228 val upd_vname =   upd_third;
   233 val upd_vname =   upd_third;
   229 fun is_rec         arg = rec_of arg >=0;
   234 fun is_rec         arg = rec_of arg >=0;
   230 fun is_nonlazy_rec arg = is_rec arg andalso not (is_lazy arg);
   235 fun is_nonlazy_rec arg = is_rec arg andalso not (is_lazy arg);
   231 fun nonlazy     args   = map vname (filter_out is_lazy    args);
   236 fun nonlazy     args   = map vname (filter_out is_lazy    args);
   232 fun nonlazy_rec args   = map vname (List.filter is_nonlazy_rec args);
   237 fun nonlazy_rec args   = map vname (List.filter is_nonlazy_rec args);
       
   238 
       
   239 
       
   240 (* ----- combinators for making dtyps ----- *)
       
   241 
       
   242 fun mk_uD T = DatatypeAux.DtType(@{type_name "u"}, [T]);
       
   243 fun mk_sprodD (T, U) = DatatypeAux.DtType(@{type_name "**"}, [T, U]);
       
   244 fun mk_ssumD (T, U) = DatatypeAux.DtType(@{type_name "++"}, [T, U]);
       
   245 fun mk_liftD T = DatatypeAux.DtType(@{type_name "lift"}, [T]);
       
   246 val unitD = DatatypeAux.DtType(@{type_name "unit"}, []);
       
   247 val boolD = DatatypeAux.DtType(@{type_name "bool"}, []);
       
   248 val oneD = mk_liftD unitD;
       
   249 val trD = mk_liftD boolD;
       
   250 fun big_sprodD ds = case ds of [] => oneD | _ => foldr1 mk_sprodD ds;
       
   251 fun big_ssumD ds = case ds of [] => unitD | _ => foldr1 mk_ssumD ds;
       
   252 
       
   253 fun dtyp_of_arg ((lazy, D), _, _) = if lazy then mk_uD D else D;
       
   254 fun dtyp_of_cons (_, args) = big_sprodD (map dtyp_of_arg args);
       
   255 fun dtyp_of_eq (_, cons) = big_ssumD (map dtyp_of_cons cons);
       
   256 
   233 
   257 
   234 (* ----- support for type and mixfix expressions ----- *)
   258 (* ----- support for type and mixfix expressions ----- *)
   235 
   259 
   236 fun mk_uT T = Type(@{type_name "u"}, [T]);
   260 fun mk_uT T = Type(@{type_name "u"}, [T]);
   237 fun mk_cfunT (T, U) = Type(@{type_name "->"}, [T, U]);
   261 fun mk_cfunT (T, U) = Type(@{type_name "->"}, [T, U]);