src/HOL/Nominal/nominal_primrec.ML
changeset 33037 b22e44496dc2
parent 32196 bda40fb76a65
child 33038 8f9594c31de4
equal deleted inserted replaced
33015:575bd6548df9 33037:b22e44496dc2
   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);