src/HOL/Product_Type.thy
changeset 20044 92cc2f4c7335
parent 19656 09be06943252
child 20105 454f4be984b7
equal deleted inserted replaced
20043:036128013178 20044:92cc2f4c7335
   405   |   no_args k i (Bound m) = m < k orelse m > k+i
   405   |   no_args k i (Bound m) = m < k orelse m > k+i
   406   |   no_args _ _ _ = true;
   406   |   no_args _ _ _ = true;
   407   fun split_pat tp i (Abs  (_,_,t)) = if tp 0 i t then SOME (i,t) else NONE
   407   fun split_pat tp i (Abs  (_,_,t)) = if tp 0 i t then SOME (i,t) else NONE
   408   |   split_pat tp i (Const ("split", _) $ Abs (_, _, t)) = split_pat tp (i+1) t
   408   |   split_pat tp i (Const ("split", _) $ Abs (_, _, t)) = split_pat tp (i+1) t
   409   |   split_pat tp i _ = NONE;
   409   |   split_pat tp i _ = NONE;
   410   fun metaeq thy ss lhs rhs = mk_meta_eq (Goal.prove thy [] []
   410   fun metaeq ss lhs rhs = mk_meta_eq (Goal.prove (Simplifier.the_context ss) [] []
   411         (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs,rhs)))
   411         (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs,rhs)))
   412         (K (simp_tac (Simplifier.inherit_context ss cond_split_eta_ss) 1)));
   412         (K (simp_tac (Simplifier.inherit_context ss cond_split_eta_ss) 1)));
   413 
   413 
   414   fun beta_term_pat k i (Abs (_, _, t)) = beta_term_pat (k+1) i t
   414   fun beta_term_pat k i (Abs (_, _, t)) = beta_term_pat (k+1) i t
   415   |   beta_term_pat k i (t $ u) = Pair_pat k i (t $ u) orelse
   415   |   beta_term_pat k i (t $ u) = Pair_pat k i (t $ u) orelse
   419   |    eta_term_pat _ _ _ = false;
   419   |    eta_term_pat _ _ _ = false;
   420   fun subst arg k i (Abs (x, T, t)) = Abs (x, T, subst arg (k+1) i t)
   420   fun subst arg k i (Abs (x, T, t)) = Abs (x, T, subst arg (k+1) i t)
   421   |   subst arg k i (t $ u) = if Pair_pat k i (t $ u) then incr_boundvars k arg
   421   |   subst arg k i (t $ u) = if Pair_pat k i (t $ u) then incr_boundvars k arg
   422                               else (subst arg k i t $ subst arg k i u)
   422                               else (subst arg k i t $ subst arg k i u)
   423   |   subst arg k i t = t;
   423   |   subst arg k i t = t;
   424   fun beta_proc thy ss (s as Const ("split", _) $ Abs (_, _, t) $ arg) =
   424   fun beta_proc ss (s as Const ("split", _) $ Abs (_, _, t) $ arg) =
   425         (case split_pat beta_term_pat 1 t of
   425         (case split_pat beta_term_pat 1 t of
   426         SOME (i,f) => SOME (metaeq thy ss s (subst arg 0 i f))
   426         SOME (i,f) => SOME (metaeq ss s (subst arg 0 i f))
   427         | NONE => NONE)
   427         | NONE => NONE)
   428   |   beta_proc _ _ _ = NONE;
   428   |   beta_proc _ _ = NONE;
   429   fun eta_proc thy ss (s as Const ("split", _) $ Abs (_, _, t)) =
   429   fun eta_proc ss (s as Const ("split", _) $ Abs (_, _, t)) =
   430         (case split_pat eta_term_pat 1 t of
   430         (case split_pat eta_term_pat 1 t of
   431           SOME (_,ft) => SOME (metaeq thy ss s (let val (f $ arg) = ft in f end))
   431           SOME (_,ft) => SOME (metaeq ss s (let val (f $ arg) = ft in f end))
   432         | NONE => NONE)
   432         | NONE => NONE)
   433   |   eta_proc _ _ _ = NONE;
   433   |   eta_proc _ _ = NONE;
   434 in
   434 in
   435   val split_beta_proc = Simplifier.simproc (Theory.sign_of (the_context ()))
   435   val split_beta_proc = Simplifier.simproc (Theory.sign_of (the_context ()))
   436     "split_beta" ["split f z"] beta_proc;
   436     "split_beta" ["split f z"] (K beta_proc);
   437   val split_eta_proc = Simplifier.simproc (Theory.sign_of (the_context ()))
   437   val split_eta_proc = Simplifier.simproc (Theory.sign_of (the_context ()))
   438     "split_eta" ["split f"] eta_proc;
   438     "split_eta" ["split f"] (K eta_proc);
   439 end;
   439 end;
   440 
   440 
   441 Addsimprocs [split_beta_proc, split_eta_proc];
   441 Addsimprocs [split_beta_proc, split_eta_proc];
   442 *}
   442 *}
   443 
   443