407 | Pair_pat _ _ _ = false; |
407 | Pair_pat _ _ _ = false; |
408 fun no_args k i (Abs (_, _, t)) = no_args (k+1) i t |
408 fun no_args k i (Abs (_, _, t)) = no_args (k+1) i t |
409 | no_args k i (t $ u) = no_args k i t andalso no_args k i u |
409 | no_args k i (t $ u) = no_args k i t andalso no_args k i u |
410 | no_args k i (Bound m) = m < k orelse m > k+i |
410 | no_args k i (Bound m) = m < k orelse m > k+i |
411 | no_args _ _ _ = true; |
411 | no_args _ _ _ = true; |
412 fun split_pat tp i (Abs (_,_,t)) = if tp 0 i t then Some (i,t) else None |
412 fun split_pat tp i (Abs (_,_,t)) = if tp 0 i t then SOME (i,t) else NONE |
413 | split_pat tp i (Const ("split", _) $ Abs (_, _, t)) = split_pat tp (i+1) t |
413 | split_pat tp i (Const ("split", _) $ Abs (_, _, t)) = split_pat tp (i+1) t |
414 | split_pat tp i _ = None; |
414 | split_pat tp i _ = NONE; |
415 fun metaeq sg lhs rhs = mk_meta_eq (Tactic.prove sg [] [] |
415 fun metaeq sg lhs rhs = mk_meta_eq (Tactic.prove sg [] [] |
416 (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs,rhs))) |
416 (HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs,rhs))) |
417 (K (simp_tac (HOL_basic_ss addsimps [cond_split_eta]) 1))); |
417 (K (simp_tac (HOL_basic_ss addsimps [cond_split_eta]) 1))); |
418 |
418 |
419 fun beta_term_pat k i (Abs (_, _, t)) = beta_term_pat (k+1) i t |
419 fun beta_term_pat k i (Abs (_, _, t)) = beta_term_pat (k+1) i t |
426 | subst arg k i (t $ u) = if Pair_pat k i (t $ u) then incr_boundvars k arg |
426 | subst arg k i (t $ u) = if Pair_pat k i (t $ u) then incr_boundvars k arg |
427 else (subst arg k i t $ subst arg k i u) |
427 else (subst arg k i t $ subst arg k i u) |
428 | subst arg k i t = t; |
428 | subst arg k i t = t; |
429 fun beta_proc sg _ (s as Const ("split", _) $ Abs (_, _, t) $ arg) = |
429 fun beta_proc sg _ (s as Const ("split", _) $ Abs (_, _, t) $ arg) = |
430 (case split_pat beta_term_pat 1 t of |
430 (case split_pat beta_term_pat 1 t of |
431 Some (i,f) => Some (metaeq sg s (subst arg 0 i f)) |
431 SOME (i,f) => SOME (metaeq sg s (subst arg 0 i f)) |
432 | None => None) |
432 | NONE => NONE) |
433 | beta_proc _ _ _ = None; |
433 | beta_proc _ _ _ = NONE; |
434 fun eta_proc sg _ (s as Const ("split", _) $ Abs (_, _, t)) = |
434 fun eta_proc sg _ (s as Const ("split", _) $ Abs (_, _, t)) = |
435 (case split_pat eta_term_pat 1 t of |
435 (case split_pat eta_term_pat 1 t of |
436 Some (_,ft) => Some (metaeq sg s (let val (f $ arg) = ft in f end)) |
436 SOME (_,ft) => SOME (metaeq sg s (let val (f $ arg) = ft in f end)) |
437 | None => None) |
437 | NONE => NONE) |
438 | eta_proc _ _ _ = None; |
438 | eta_proc _ _ _ = NONE; |
439 in |
439 in |
440 val split_beta_proc = Simplifier.simproc (Theory.sign_of (the_context ())) |
440 val split_beta_proc = Simplifier.simproc (Theory.sign_of (the_context ())) |
441 "split_beta" ["split f z"] beta_proc; |
441 "split_beta" ["split f z"] beta_proc; |
442 val split_eta_proc = Simplifier.simproc (Theory.sign_of (the_context ())) |
442 val split_eta_proc = Simplifier.simproc (Theory.sign_of (the_context ())) |
443 "split_eta" ["split f"] eta_proc; |
443 "split_eta" ["split f"] eta_proc; |
808 let |
808 let |
809 val (gr1, pl) = Codegen.invoke_codegen thy dep false (gr, l); |
809 val (gr1, pl) = Codegen.invoke_codegen thy dep false (gr, l); |
810 val (gr2, pr) = Codegen.invoke_codegen thy dep false (gr1, r); |
810 val (gr2, pr) = Codegen.invoke_codegen thy dep false (gr1, r); |
811 in (gr2, (pl, pr)) end |
811 in (gr2, (pl, pr)) end |
812 in case dest_let t of |
812 in case dest_let t of |
813 ([], _) => None |
813 ([], _) => NONE |
814 | (ps, u) => |
814 | (ps, u) => |
815 let |
815 let |
816 val (gr1, qs) = foldl_map mk_code (gr, ps); |
816 val (gr1, qs) = foldl_map mk_code (gr, ps); |
817 val (gr2, pu) = Codegen.invoke_codegen thy dep false (gr1, u) |
817 val (gr2, pu) = Codegen.invoke_codegen thy dep false (gr1, u) |
818 in |
818 in |
819 Some (gr2, Pretty.blk (0, [Pretty.str "let ", Pretty.blk (0, flat |
819 SOME (gr2, Pretty.blk (0, [Pretty.str "let ", Pretty.blk (0, flat |
820 (separate [Pretty.str ";", Pretty.brk 1] (map (fn (pl, pr) => |
820 (separate [Pretty.str ";", Pretty.brk 1] (map (fn (pl, pr) => |
821 [Pretty.block [Pretty.str "val ", pl, Pretty.str " =", |
821 [Pretty.block [Pretty.str "val ", pl, Pretty.str " =", |
822 Pretty.brk 1, pr]]) qs))), |
822 Pretty.brk 1, pr]]) qs))), |
823 Pretty.brk 1, Pretty.str "in ", pu, |
823 Pretty.brk 1, Pretty.str "in ", pu, |
824 Pretty.brk 1, Pretty.str "end"])) |
824 Pretty.brk 1, Pretty.str "end"])) |
825 end |
825 end |
826 end |
826 end |
827 | let_codegen thy gr dep brack t = None; |
827 | let_codegen thy gr dep brack t = NONE; |
828 |
828 |
829 fun split_codegen thy gr dep brack (t as Const ("split", _) $ _) = |
829 fun split_codegen thy gr dep brack (t as Const ("split", _) $ _) = |
830 (case strip_abs 1 t of |
830 (case strip_abs 1 t of |
831 ([p], u) => |
831 ([p], u) => |
832 let |
832 let |
833 val (gr1, q) = Codegen.invoke_codegen thy dep false (gr, p); |
833 val (gr1, q) = Codegen.invoke_codegen thy dep false (gr, p); |
834 val (gr2, pu) = Codegen.invoke_codegen thy dep false (gr1, u) |
834 val (gr2, pu) = Codegen.invoke_codegen thy dep false (gr1, u) |
835 in |
835 in |
836 Some (gr2, Pretty.block [Pretty.str "(fn ", q, Pretty.str " =>", |
836 SOME (gr2, Pretty.block [Pretty.str "(fn ", q, Pretty.str " =>", |
837 Pretty.brk 1, pu, Pretty.str ")"]) |
837 Pretty.brk 1, pu, Pretty.str ")"]) |
838 end |
838 end |
839 | _ => None) |
839 | _ => NONE) |
840 | split_codegen thy gr dep brack t = None; |
840 | split_codegen thy gr dep brack t = NONE; |
841 |
841 |
842 in |
842 in |
843 |
843 |
844 val prod_codegen_setup = |
844 val prod_codegen_setup = |
845 [Codegen.add_codegen "let_codegen" let_codegen, |
845 [Codegen.add_codegen "let_codegen" let_codegen, |