src/HOL/Tools/split_rule.ML
changeset 59621 291934bac95e
parent 59582 0fbed69ff081
child 60362 befdc10ebb42
equal deleted inserted replaced
59620:92d7d8e4f1bf 59621:291934bac95e
    40 
    40 
    41 (*Curries any Var of function type in the rule*)
    41 (*Curries any Var of function type in the rule*)
    42 fun split_rule_var' (t as Var (v, Type ("fun", [T1, T2]))) rl =
    42 fun split_rule_var' (t as Var (v, Type ("fun", [T1, T2]))) rl =
    43       let val T' = HOLogic.flatten_tupleT T1 ---> T2;
    43       let val T' = HOLogic.flatten_tupleT T1 ---> T2;
    44           val newt = ap_split T1 T2 (Var (v, T'));
    44           val newt = ap_split T1 T2 (Var (v, T'));
    45           val cterm = Thm.cterm_of (Thm.theory_of_thm rl);
    45           val cterm = Thm.global_cterm_of (Thm.theory_of_thm rl);
    46       in Thm.instantiate ([], [(cterm t, cterm newt)]) rl end
    46       in Thm.instantiate ([], [(cterm t, cterm newt)]) rl end
    47   | split_rule_var' _ rl = rl;
    47   | split_rule_var' _ rl = rl;
    48 
    48 
    49 
    49 
    50 (* complete splitting of partially split rules *)
    50 (* complete splitting of partially split rules *)
    54         (incr_boundvars 1 u) $ Bound 0))
    54         (incr_boundvars 1 u) $ Bound 0))
    55   | ap_split' _ _ u = u;
    55   | ap_split' _ _ u = u;
    56 
    56 
    57 fun complete_split_rule_var (t as Var (v, T), ts) (rl, vs) =
    57 fun complete_split_rule_var (t as Var (v, T), ts) (rl, vs) =
    58       let
    58       let
    59         val cterm = Thm.cterm_of (Thm.theory_of_thm rl)
    59         val cterm = Thm.global_cterm_of (Thm.theory_of_thm rl)
    60         val (Us', U') = strip_type T;
    60         val (Us', U') = strip_type T;
    61         val Us = take (length ts) Us';
    61         val Us = take (length ts) Us';
    62         val U = drop (length ts) Us' ---> U';
    62         val U = drop (length ts) Us' ---> U';
    63         val T' = maps HOLogic.flatten_tupleT Us ---> U;
    63         val T' = maps HOLogic.flatten_tupleT Us ---> U;
    64         fun mk_tuple (v as Var ((a, _), T)) (xs, insts) =
    64         fun mk_tuple (v as Var ((a, _), T)) (xs, insts) =
    68               in (xs @ ys, (cterm v, cterm (HOLogic.mk_ptuple (HOLogic.flat_tupleT_paths T) T
    68               in (xs @ ys, (cterm v, cterm (HOLogic.mk_ptuple (HOLogic.flat_tupleT_paths T) T
    69                 (map (Var o apfst (rpair 0)) (ys ~~ Ts))))::insts)
    69                 (map (Var o apfst (rpair 0)) (ys ~~ Ts))))::insts)
    70               end
    70               end
    71           | mk_tuple _ x = x;
    71           | mk_tuple _ x = x;
    72         val newt = ap_split' Us U (Var (v, T'));
    72         val newt = ap_split' Us U (Var (v, T'));
    73         val cterm = Thm.cterm_of (Thm.theory_of_thm rl);
    73         val cterm = Thm.global_cterm_of (Thm.theory_of_thm rl);
    74         val (vs', insts) = fold mk_tuple ts (vs, []);
    74         val (vs', insts) = fold mk_tuple ts (vs, []);
    75       in
    75       in
    76         (Drule.instantiate_normalize ([], [(cterm t, cterm newt)] @ insts) rl, vs')
    76         (Drule.instantiate_normalize ([], [(cterm t, cterm newt)] @ insts) rl, vs')
    77       end
    77       end
    78   | complete_split_rule_var _ x = x;
    78   | complete_split_rule_var _ x = x;