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 |