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]); |