src/HOL/Product_Type.thy
changeset 61425 fb95d06fb21f
parent 61424 c3658c18b7bc
child 61630 608520e0e8e2
equal deleted inserted replaced
61424:c3658c18b7bc 61425:fb95d06fb21f
   351             end)
   351             end)
   352       | case_prod_guess_names_tr' _ _ = raise Match;
   352       | case_prod_guess_names_tr' _ _ = raise Match;
   353   in [(@{const_syntax case_prod}, K case_prod_guess_names_tr')] end
   353   in [(@{const_syntax case_prod}, K case_prod_guess_names_tr')] end
   354 \<close>
   354 \<close>
   355 
   355 
       
   356 text \<open>reconstruct pattern from (nested) @{const case_prod}s,
       
   357   avoiding eta-contraction of body; required for enclosing "let",
       
   358   if "let" does not avoid eta-contraction, which has been observed to occur\<close>
       
   359 
       
   360 print_translation \<open>
       
   361   let
       
   362     fun case_prod_tr' [Abs (x, T, t as (Abs abs))] =
       
   363           (* case_prod (\<lambda>x y. t) \<Rightarrow> \<lambda>(x, y) t *)
       
   364           let
       
   365             val (y, t') = Syntax_Trans.atomic_abs_tr' abs;
       
   366             val (x', t'') = Syntax_Trans.atomic_abs_tr' (x, T, t');
       
   367           in
       
   368             Syntax.const @{syntax_const "_abs"} $
       
   369               (Syntax.const @{syntax_const "_pattern"} $ x' $ y) $ t''
       
   370           end
       
   371       | case_prod_tr' [Abs (x, T, (s as Const (@{const_syntax case_prod}, _) $ t))] =
       
   372           (* case_prod (\<lambda>x. (case_prod (\<lambda>y z. t))) \<Rightarrow> \<lambda>(x, y, z). t *)
       
   373           let
       
   374             val Const (@{syntax_const "_abs"}, _) $
       
   375               (Const (@{syntax_const "_pattern"}, _) $ y $ z) $ t' =
       
   376                 case_prod_tr' [t];
       
   377             val (x', t'') = Syntax_Trans.atomic_abs_tr' (x, T, t');
       
   378           in
       
   379             Syntax.const @{syntax_const "_abs"} $
       
   380               (Syntax.const @{syntax_const "_pattern"} $ x' $
       
   381                 (Syntax.const @{syntax_const "_patterns"} $ y $ z)) $ t''
       
   382           end
       
   383       | case_prod_tr' [Const (@{const_syntax case_prod}, _) $ t] =
       
   384           (* case_prod (case_prod (\<lambda>x y z. t)) \<Rightarrow> \<lambda>((x, y), z). t *)
       
   385           case_prod_tr' [(case_prod_tr' [t])]
       
   386             (* inner case_prod_tr' creates next pattern *)
       
   387       | case_prod_tr' [Const (@{syntax_const "_abs"}, _) $ x_y $ Abs abs] =
       
   388           (* case_prod (\<lambda>pttrn z. t) \<Rightarrow> \<lambda>(pttrn, z). t *)
       
   389           let val (z, t) = Syntax_Trans.atomic_abs_tr' abs in
       
   390             Syntax.const @{syntax_const "_abs"} $
       
   391               (Syntax.const @{syntax_const "_pattern"} $ x_y $ z) $ t
       
   392           end
       
   393       | case_prod_tr' _ = raise Match;
       
   394   in [(@{const_syntax case_prod}, K case_prod_tr')] end
       
   395 \<close>
       
   396 
   356 
   397 
   357 subsubsection \<open>Code generator setup\<close>
   398 subsubsection \<open>Code generator setup\<close>
   358 
   399 
   359 code_printing
   400 code_printing
   360   type_constructor prod \<rightharpoonup>
   401   type_constructor prod \<rightharpoonup>