src/HOL/Product_Type.thy
changeset 15531 08c8dad8e399
parent 15481 fc075ae929e4
child 15570 8d8c70b41bab
equal deleted inserted replaced
15530:6f43714517ee 15531:08c8dad8e399
    32 
    32 
    33 ML_setup {*
    33 ML_setup {*
    34   val unit_eq_proc =
    34   val unit_eq_proc =
    35     let val unit_meta_eq = mk_meta_eq (thm "unit_eq") in
    35     let val unit_meta_eq = mk_meta_eq (thm "unit_eq") in
    36       Simplifier.simproc (Theory.sign_of (the_context ())) "unit_eq" ["x::unit"]
    36       Simplifier.simproc (Theory.sign_of (the_context ())) "unit_eq" ["x::unit"]
    37       (fn _ => fn _ => fn t => if HOLogic.is_unit t then None else Some unit_meta_eq)
    37       (fn _ => fn _ => fn t => if HOLogic.is_unit t then NONE else SOME unit_meta_eq)
    38     end;
    38     end;
    39 
    39 
    40   Addsimprocs [unit_eq_proc];
    40   Addsimprocs [unit_eq_proc];
    41 *}
    41 *}
    42 
    42 
   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,