src/HOL/Tools/Datatype/datatype_case.ML
changeset 44121 44adaa6db327
parent 43324 2b47822868e4
child 45156 a9b6c2ea7bec
equal deleted inserted replaced
44120:01de796250a0 44121:44adaa6db327
   316           let
   316           let
   317             val zs = strip_abs_vars t;
   317             val zs = strip_abs_vars t;
   318             val _ = if length zs < i then raise CASE_ERROR ("", 0) else ();
   318             val _ = if length zs < i then raise CASE_ERROR ("", 0) else ();
   319             val (xs, ys) = chop i zs;
   319             val (xs, ys) = chop i zs;
   320             val u = list_abs (ys, strip_abs_body t);
   320             val u = list_abs (ys, strip_abs_body t);
   321             val xs' = map Free (Name.variant_list (OldTerm.add_term_names (u, used))
   321             val xs' = map Free (Name.variant_list (Misc_Legacy.add_term_names (u, used))
   322               (map fst xs) ~~ map snd xs)
   322               (map fst xs) ~~ map snd xs)
   323           in (xs', subst_bounds (rev xs', u)) end;
   323           in (xs', subst_bounds (rev xs', u)) end;
   324         fun is_dependent i t =
   324         fun is_dependent i t =
   325           let val k = length (strip_abs_vars t) - i
   325           let val k = length (strip_abs_vars t) - i
   326           in k < 0 orelse exists (fn j => j >= k) (loose_bnos (strip_abs_body t)) end;
   326           in k < 0 orelse exists (fn j => j >= k) (loose_bnos (strip_abs_body t)) end;
   377 (* destruct nested patterns *)
   377 (* destruct nested patterns *)
   378 
   378 
   379 fun strip_case'' dest (pat, rhs) =
   379 fun strip_case'' dest (pat, rhs) =
   380   (case dest (Term.add_free_names pat []) rhs of
   380   (case dest (Term.add_free_names pat []) rhs of
   381     SOME (exp as Free _, clauses) =>
   381     SOME (exp as Free _, clauses) =>
   382       if member op aconv (OldTerm.term_frees pat) exp andalso
   382       if member op aconv (Misc_Legacy.term_frees pat) exp andalso
   383         not (exists (fn (_, rhs') =>
   383         not (exists (fn (_, rhs') =>
   384           member op aconv (OldTerm.term_frees rhs') exp) clauses)
   384           member op aconv (Misc_Legacy.term_frees rhs') exp) clauses)
   385       then
   385       then
   386         maps (strip_case'' dest) (map (fn (pat', rhs') =>
   386         maps (strip_case'' dest) (map (fn (pat', rhs') =>
   387           (subst_free [(exp, pat')] pat, rhs')) clauses)
   387           (subst_free [(exp, pat')] pat, rhs')) clauses)
   388       else [(pat, rhs)]
   388       else [(pat, rhs)]
   389   | _ => [(pat, rhs)]);
   389   | _ => [(pat, rhs)]);