src/HOL/Product_Type.thy
changeset 59582 0fbed69ff081
parent 59498 50b60f501b05
child 59880 30687c3f2b10
equal deleted inserted replaced
59580:cbc38731d42f 59582:0fbed69ff081
    73   this rule directly --- it loops!
    73   this rule directly --- it loops!
    74 *}
    74 *}
    75 
    75 
    76 simproc_setup unit_eq ("x::unit") = {*
    76 simproc_setup unit_eq ("x::unit") = {*
    77   fn _ => fn _ => fn ct =>
    77   fn _ => fn _ => fn ct =>
    78     if HOLogic.is_unit (term_of ct) then NONE
    78     if HOLogic.is_unit (Thm.term_of ct) then NONE
    79     else SOME (mk_meta_eq @{thm unit_eq})
    79     else SOME (mk_meta_eq @{thm unit_eq})
    80 *}
    80 *}
    81 
    81 
    82 free_constructors case_unit for "()"
    82 free_constructors case_unit for "()"
    83   by auto
    83   by auto
   577           SOME (_, ft) => SOME (metaeq ctxt s (let val f $ _ = ft in f end))
   577           SOME (_, ft) => SOME (metaeq ctxt s (let val f $ _ = ft in f end))
   578         | NONE => NONE)
   578         | NONE => NONE)
   579     | eta_proc _ _ = NONE;
   579     | eta_proc _ _ = NONE;
   580 end;
   580 end;
   581 *}
   581 *}
   582 simproc_setup split_beta ("split f z") = {* fn _ => fn ctxt => fn ct => beta_proc ctxt (term_of ct) *}
   582 simproc_setup split_beta ("split f z") =
   583 simproc_setup split_eta ("split f") = {* fn _ => fn ctxt => fn ct => eta_proc ctxt (term_of ct) *}
   583   {* fn _ => fn ctxt => fn ct => beta_proc ctxt (Thm.term_of ct) *}
       
   584 simproc_setup split_eta ("split f") =
       
   585   {* fn _ => fn ctxt => fn ct => eta_proc ctxt (Thm.term_of ct) *}
   584 
   586 
   585 lemmas split_beta [mono] = prod.case_eq_if
   587 lemmas split_beta [mono] = prod.case_eq_if
   586 
   588 
   587 lemma split_beta': "(\<lambda>(x,y). f x y) = (\<lambda>x. f (fst x) (snd x))"
   589 lemma split_beta': "(\<lambda>(x,y). f x y) = (\<lambda>x. f (fst x) (snd x))"
   588   by (auto simp: fun_eq_iff)
   590   by (auto simp: fun_eq_iff)
  1307 subsection {* Inductively defined sets *}
  1309 subsection {* Inductively defined sets *}
  1308 
  1310 
  1309 (* simplify {(x1, ..., xn). (x1, ..., xn) : S} to S *)
  1311 (* simplify {(x1, ..., xn). (x1, ..., xn) : S} to S *)
  1310 simproc_setup Collect_mem ("Collect t") = {*
  1312 simproc_setup Collect_mem ("Collect t") = {*
  1311   fn _ => fn ctxt => fn ct =>
  1313   fn _ => fn ctxt => fn ct =>
  1312     (case term_of ct of
  1314     (case Thm.term_of ct of
  1313       S as Const (@{const_name Collect}, Type (@{type_name fun}, [_, T])) $ t =>
  1315       S as Const (@{const_name Collect}, Type (@{type_name fun}, [_, T])) $ t =>
  1314         let val (u, _, ps) = HOLogic.strip_psplits t in
  1316         let val (u, _, ps) = HOLogic.strip_psplits t in
  1315           (case u of
  1317           (case u of
  1316             (c as Const (@{const_name Set.member}, _)) $ q $ S' =>
  1318             (c as Const (@{const_name Set.member}, _)) $ q $ S' =>
  1317               (case try (HOLogic.strip_ptuple ps) q of
  1319               (case try (HOLogic.strip_ptuple ps) q of