27 Simplification procedure for @{thm [source] unit_eq}. Cannot use |
27 Simplification procedure for @{thm [source] unit_eq}. Cannot use |
28 this rule directly --- it loops! |
28 this rule directly --- it loops! |
29 *} |
29 *} |
30 |
30 |
31 ML_setup {* |
31 ML_setup {* |
32 local |
32 val unit_eq_proc = |
33 val unit_pat = Thm.cterm_of (Theory.sign_of (the_context ())) (Free ("x", HOLogic.unitT)); |
33 let val unit_meta_eq = mk_meta_eq (thm "unit_eq") in |
34 val unit_meta_eq = standard (mk_meta_eq (thm "unit_eq")); |
34 Simplifier.simproc (Theory.sign_of (the_context ())) "unit_eq" ["x::unit"] |
35 fun proc _ _ t = |
35 (fn _ => fn _ => fn t => if HOLogic.is_unit t then None else Some unit_meta_eq) |
36 if HOLogic.is_unit t then None |
36 end; |
37 else Some unit_meta_eq |
|
38 in val unit_eq_proc = Simplifier.mk_simproc "unit_eq" [unit_pat] proc end; |
|
39 |
37 |
40 Addsimprocs [unit_eq_proc]; |
38 Addsimprocs [unit_eq_proc]; |
41 *} |
39 *} |
42 |
40 |
43 lemma unit_all_eq1: "(!!x::unit. PROP P x) == PROP P ()" |
41 lemma unit_all_eq1: "(!!x::unit. PROP P x) == PROP P ()" |
339 | split_pat tp i (Const ("split", _) $ Abs (_, _, t)) = split_pat tp (i+1) t |
337 | split_pat tp i (Const ("split", _) $ Abs (_, _, t)) = split_pat tp (i+1) t |
340 | split_pat tp i _ = None; |
338 | split_pat tp i _ = None; |
341 fun metaeq sg lhs rhs = mk_meta_eq (prove_goalw_cterm [] |
339 fun metaeq sg lhs rhs = mk_meta_eq (prove_goalw_cterm [] |
342 (cterm_of sg (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs,rhs)))) |
340 (cterm_of sg (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs,rhs)))) |
343 (K [simp_tac (HOL_basic_ss addsimps [cond_split_eta]) 1])); |
341 (K [simp_tac (HOL_basic_ss addsimps [cond_split_eta]) 1])); |
344 val sign = sign_of (the_context ()); |
342 |
345 fun simproc name patstr = |
|
346 Simplifier.mk_simproc name [HOLogic.read_cterm sign patstr]; |
|
347 |
|
348 val beta_patstr = "split f z"; |
|
349 val eta_patstr = "split f"; |
|
350 fun beta_term_pat k i (Abs (_, _, t)) = beta_term_pat (k+1) i t |
343 fun beta_term_pat k i (Abs (_, _, t)) = beta_term_pat (k+1) i t |
351 | beta_term_pat k i (t $ u) = Pair_pat k i (t $ u) orelse |
344 | beta_term_pat k i (t $ u) = Pair_pat k i (t $ u) orelse |
352 (beta_term_pat k i t andalso beta_term_pat k i u) |
345 (beta_term_pat k i t andalso beta_term_pat k i u) |
353 | beta_term_pat k i t = no_args k i t; |
346 | beta_term_pat k i t = no_args k i t; |
354 fun eta_term_pat k i (f $ arg) = no_args k i f andalso Pair_pat k i arg |
347 fun eta_term_pat k i (f $ arg) = no_args k i f andalso Pair_pat k i arg |
366 (case split_pat eta_term_pat 1 t of |
359 (case split_pat eta_term_pat 1 t of |
367 Some (_,ft) => Some (metaeq sg s (let val (f $ arg) = ft in f end)) |
360 Some (_,ft) => Some (metaeq sg s (let val (f $ arg) = ft in f end)) |
368 | None => None) |
361 | None => None) |
369 | eta_proc _ _ _ = None; |
362 | eta_proc _ _ _ = None; |
370 in |
363 in |
371 val split_beta_proc = simproc "split_beta" beta_patstr beta_proc; |
364 val split_beta_proc = Simplifier.simproc (Theory.sign_of (the_context ())) |
372 val split_eta_proc = simproc "split_eta" eta_patstr eta_proc; |
365 "split_beta" ["split f z"] beta_proc; |
|
366 val split_eta_proc = Simplifier.simproc (Theory.sign_of (the_context ())) |
|
367 "split_eta" ["split f"] eta_proc; |
373 end; |
368 end; |
374 |
369 |
375 Addsimprocs [split_beta_proc, split_eta_proc]; |
370 Addsimprocs [split_beta_proc, split_eta_proc]; |
376 *} |
371 *} |
377 |
372 |