equal
deleted
inserted
replaced
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; |