226 fun find_dts (dt_info : NominalDatatype.nominal_datatype_info Symtab.table) _ [] = [] |
226 fun find_dts (dt_info : NominalDatatype.nominal_datatype_info Symtab.table) _ [] = [] |
227 | find_dts dt_info tnames' (tname::tnames) = |
227 | find_dts dt_info tnames' (tname::tnames) = |
228 (case Symtab.lookup dt_info tname of |
228 (case Symtab.lookup dt_info tname of |
229 NONE => primrec_err (quote tname ^ " is not a nominal datatype") |
229 NONE => primrec_err (quote tname ^ " is not a nominal datatype") |
230 | SOME dt => |
230 | SOME dt => |
231 if tnames' subset (map (#1 o snd) (#descr dt)) then |
231 if gen_subset (op =) (tnames', map (#1 o snd) (#descr dt)) then |
232 (tname, dt)::(find_dts dt_info tnames' tnames) |
232 (tname, dt)::(find_dts dt_info tnames' tnames) |
233 else find_dts dt_info tnames' tnames); |
233 else find_dts dt_info tnames' tnames); |
234 |
234 |
235 fun common_prefix eq ([], _) = [] |
235 fun common_prefix eq ([], _) = [] |
236 | common_prefix eq (_, []) = [] |
236 | common_prefix eq (_, []) = [] |
249 orelse exists (fn ((w, _), _) => v = Binding.name_of w) fixes)) spec' []; |
249 orelse exists (fn ((w, _), _) => v = Binding.name_of w) fixes)) spec' []; |
250 val dt_info = NominalDatatype.get_nominal_datatypes (ProofContext.theory_of lthy); |
250 val dt_info = NominalDatatype.get_nominal_datatypes (ProofContext.theory_of lthy); |
251 val lsrs :: lsrss = maps (fn (_, (_, _, eqns)) => |
251 val lsrs :: lsrss = maps (fn (_, (_, _, eqns)) => |
252 map (fn (_, (ls, _, rs, _, _)) => ls @ rs) eqns) eqns |
252 map (fn (_, (ls, _, rs, _, _)) => ls @ rs) eqns) eqns |
253 val _ = |
253 val _ = |
254 (if forall (curry eq_set lsrs) lsrss andalso forall |
254 (if forall (curry (gen_eq_set (op =)) lsrs) lsrss andalso forall |
255 (fn (_, (_, _, (_, (ls, _, rs, _, _)) :: eqns)) => |
255 (fn (_, (_, _, (_, (ls, _, rs, _, _)) :: eqns)) => |
256 forall (fn (_, (ls', _, rs', _, _)) => |
256 forall (fn (_, (ls', _, rs', _, _)) => |
257 ls = ls' andalso rs = rs') eqns |
257 ls = ls' andalso rs = rs') eqns |
258 | _ => true) eqns |
258 | _ => true) eqns |
259 then () else primrec_err param_err); |
259 then () else primrec_err param_err); |