src/HOL/Product_Type.thy
changeset 13462 56610e2ba220
parent 12338 de0f4a63baa5
child 13480 bb72bd43c6c3
equal deleted inserted replaced
13461:f93f7d766895 13462:56610e2ba220
    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