405 |
405 |
406 val unfold_lift_sel_rsp = @{lemma "(\<And>x. P1 x \<Longrightarrow> P2 (f x)) \<Longrightarrow> (rel_fun (eq_onp P1) (eq_onp P2)) f f" |
406 val unfold_lift_sel_rsp = @{lemma "(\<And>x. P1 x \<Longrightarrow> P2 (f x)) \<Longrightarrow> (rel_fun (eq_onp P1) (eq_onp P2)) f f" |
407 by (simp add: eq_onp_same_args rel_fun_eq_onp_rel)} |
407 by (simp add: eq_onp_same_args rel_fun_eq_onp_rel)} |
408 |
408 |
409 fun lift_sel_tac exhaust_rule dt_rules wits ctxt i = |
409 fun lift_sel_tac exhaust_rule dt_rules wits ctxt i = |
410 (Method.insert_tac wits THEN' |
410 (Method.insert_tac ctxt wits THEN' |
411 eq_onp_to_top_tac ctxt THEN' (* normalize *) |
411 eq_onp_to_top_tac ctxt THEN' (* normalize *) |
412 rtac ctxt unfold_lift_sel_rsp THEN' |
412 rtac ctxt unfold_lift_sel_rsp THEN' |
413 case_tac exhaust_rule ctxt THEN_ALL_NEW ( |
413 case_tac exhaust_rule ctxt THEN_ALL_NEW ( |
414 EVERY' [hyp_subst_tac ctxt, (* does not kill wits because = was rewritten to eq_onp top *) |
414 EVERY' [hyp_subst_tac ctxt, (* does not kill wits because = was rewritten to eq_onp top *) |
415 Raw_Simplifier.rewrite_goal_tac ctxt (map safe_mk_meta_eq dt_rules), |
415 Raw_Simplifier.rewrite_goal_tac ctxt (map safe_mk_meta_eq dt_rules), |
557 val pred = quot_thm_rel quot_thm |> dest_comb |> snd; |
557 val pred = quot_thm_rel quot_thm |> dest_comb |> snd; |
558 val (pred, lthy) = yield_singleton (Variable.import_terms true) pred lthy; |
558 val (pred, lthy) = yield_singleton (Variable.import_terms true) pred lthy; |
559 val TFrees = Term.add_tfreesT qty [] |
559 val TFrees = Term.add_tfreesT qty [] |
560 |
560 |
561 fun non_empty_typedef_tac non_empty_pred ctxt i = |
561 fun non_empty_typedef_tac non_empty_pred ctxt i = |
562 (Method.insert_tac [non_empty_pred] THEN' |
562 (Method.insert_tac ctxt [non_empty_pred] THEN' |
563 SELECT_GOAL (Local_Defs.unfold_tac ctxt [mem_Collect_eq]) THEN' assume_tac ctxt) i |
563 SELECT_GOAL (Local_Defs.unfold_tac ctxt [mem_Collect_eq]) THEN' assume_tac ctxt) i |
564 val uTname = unique_Tname (rty, qty) |
564 val uTname = unique_Tname (rty, qty) |
565 val Tdef_set = HOLogic.mk_Collect ("x", rty, pred $ Free("x", rty)); |
565 val Tdef_set = HOLogic.mk_Collect ("x", rty, pred $ Free("x", rty)); |
566 val ((_, tcode_dt), lthy) = conceal_naming_result (typedef (Binding.concealed uTname, TFrees, NoSyn) |
566 val ((_, tcode_dt), lthy) = conceal_naming_result (typedef (Binding.concealed uTname, TFrees, NoSyn) |
567 Tdef_set NONE (fn lthy => HEADGOAL (non_empty_typedef_tac non_empty_pred lthy))) lthy; |
567 Tdef_set NONE (fn lthy => HEADGOAL (non_empty_typedef_tac non_empty_pred lthy))) lthy; |