equal
deleted
inserted
replaced
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 |