src/HOL/Tools/Ctr_Sugar/case_translation.ML
changeset 74525 c960bfcb91db
parent 71224 54a7ad860a76
child 74561 8e6c973003c8
equal deleted inserted replaced
74524:8ee3d5d3c1bf 74525:c960bfcb91db
   449   let
   449   let
   450     fun decode_case (Const (\<^const_name>\<open>case_guard\<close>, _) $ b $ u $ t) =
   450     fun decode_case (Const (\<^const_name>\<open>case_guard\<close>, _) $ b $ u $ t) =
   451           make_case ctxt (if b = \<^term>\<open>True\<close> then Error else Warning)
   451           make_case ctxt (if b = \<^term>\<open>True\<close> then Error else Warning)
   452             Name.context (decode_case u) (decode_cases t)
   452             Name.context (decode_case u) (decode_cases t)
   453       | decode_case (t $ u) = decode_case t $ decode_case u
   453       | decode_case (t $ u) = decode_case t $ decode_case u
   454       | decode_case (Abs (x, T, u)) =
   454       | decode_case (t as Abs _) =
   455           let val (x', u') = Term.dest_abs (x, T, u);
   455           let val (v, t') = Term.dest_abs_global t;
   456           in Term.absfree (x', T) (decode_case u') end
   456           in Term.absfree v (decode_case t') end
   457       | decode_case t = t;
   457       | decode_case t = t;
   458   in
   458   in
   459     map decode_case
   459     map decode_case
   460   end;
   460   end;
   461 
   461 
   585       encode_case (strip_case_full ctxt d)
   585       encode_case (strip_case_full ctxt d)
   586         (strip_case_full ctxt d x, maps (strip_case' ctxt d) clauses)
   586         (strip_case_full ctxt d x, maps (strip_case' ctxt d) clauses)
   587   | NONE =>
   587   | NONE =>
   588       (case t of
   588       (case t of
   589         t $ u => strip_case_full ctxt d t $ strip_case_full ctxt d u
   589         t $ u => strip_case_full ctxt d t $ strip_case_full ctxt d u
   590       | Abs (x, T, u) =>
   590       | Abs _ =>
   591           let val (x', u') = Term.dest_abs (x, T, u);
   591           let val (v, t') = Term.dest_abs_global t;
   592           in Term.absfree (x', T) (strip_case_full ctxt d u') end
   592           in Term.absfree v (strip_case_full ctxt d t') end
   593       | _ => t));
   593       | _ => t));
   594 
   594 
   595 
   595 
   596 (* term uncheck *)
   596 (* term uncheck *)
   597 
   597