complete_split_rule: all Vars;
authorwenzelm
Sat, 27 May 2006 17:42:00 +0200
changeset 19735ff13585fbdab
parent 19734 e9a06ce3a97a
child 19736 d8d0f8f51d69
complete_split_rule: all Vars;
tuned;
src/HOL/Tools/split_rule.ML
     1.1 --- a/src/HOL/Tools/split_rule.ML	Sat May 27 17:41:59 2006 +0200
     1.2 +++ b/src/HOL/Tools/split_rule.ML	Sat May 27 17:42:00 2006 +0200
     1.3 @@ -14,7 +14,7 @@
     1.4  signature SPLIT_RULE =
     1.5  sig
     1.6    include BASIC_SPLIT_RULE
     1.7 -  val split_rule_var: term * thm -> thm
     1.8 +  val split_rule_var: term -> thm -> thm
     1.9    val split_rule_goal: string list list -> thm -> thm
    1.10    val setup: theory -> theory
    1.11  end;
    1.12 @@ -23,6 +23,7 @@
    1.13  struct
    1.14  
    1.15  
    1.16 +
    1.17  (** theory context references **)
    1.18  
    1.19  val split_conv = thm "split_conv";
    1.20 @@ -55,12 +56,12 @@
    1.21    | ap_split T T3 u = u;
    1.22  
    1.23  (*Curries any Var of function type in the rule*)
    1.24 -fun split_rule_var' (t as Var (v, Type ("fun", [T1, T2])), rl) =
    1.25 +fun split_rule_var' (t as Var (v, Type ("fun", [T1, T2]))) rl =
    1.26        let val T' = HOLogic.prodT_factors T1 ---> T2;
    1.27            val newt = ap_split T1 T2 (Var (v, T'));
    1.28 -          val cterm = Thm.cterm_of (#sign (Thm.rep_thm rl));
    1.29 +          val cterm = Thm.cterm_of (Thm.theory_of_thm rl);
    1.30        in Thm.instantiate ([], [(cterm t, cterm newt)]) rl end
    1.31 -  | split_rule_var' (t, rl) = rl;
    1.32 +  | split_rule_var' t rl = rl;
    1.33  
    1.34  
    1.35  (* complete splitting of partially splitted rules *)
    1.36 @@ -70,50 +71,56 @@
    1.37          (incr_boundvars 1 u) $ Bound 0))
    1.38    | ap_split' _ _ u = u;
    1.39  
    1.40 -fun complete_split_rule_var ((t as Var (v, T), ts), (rl, vs)) =
    1.41 +fun complete_split_rule_var (t as Var (v, T), ts) (rl, vs) =
    1.42        let
    1.43 -        val cterm = Thm.cterm_of (#sign (Thm.rep_thm rl))
    1.44 +        val cterm = Thm.cterm_of (Thm.theory_of_thm rl)
    1.45          val (Us', U') = strip_type T;
    1.46          val Us = Library.take (length ts, Us');
    1.47          val U = Library.drop (length ts, Us') ---> U';
    1.48          val T' = List.concat (map HOLogic.prodT_factors Us) ---> U;
    1.49 -        fun mk_tuple ((xs, insts), v as Var ((a, _), T)) =
    1.50 +        fun mk_tuple (v as Var ((a, _), T)) (xs, insts) =
    1.51                let
    1.52                  val Ts = HOLogic.prodT_factors T;
    1.53                  val ys = Term.variantlist (replicate (length Ts) a, xs);
    1.54                in (xs @ ys, (cterm v, cterm (HOLogic.mk_tuple T
    1.55                  (map (Var o apfst (rpair 0)) (ys ~~ Ts))))::insts)
    1.56                end
    1.57 -          | mk_tuple (x, _) = x;
    1.58 +          | mk_tuple _ x = x;
    1.59          val newt = ap_split' Us U (Var (v, T'));
    1.60 -        val cterm = Thm.cterm_of (#sign (Thm.rep_thm rl));
    1.61 -        val (vs', insts) = Library.foldl mk_tuple ((vs, []), ts);
    1.62 +        val cterm = Thm.cterm_of (Thm.theory_of_thm rl);
    1.63 +        val (vs', insts) = fold mk_tuple ts (vs, []);
    1.64        in
    1.65          (instantiate ([], [(cterm t, cterm newt)] @ insts) rl, vs')
    1.66        end
    1.67 -  | complete_split_rule_var (_, x) = x;
    1.68 +  | complete_split_rule_var _ x = x;
    1.69  
    1.70 -fun collect_vars (vs, Abs (_, _, t)) = collect_vars (vs, t)
    1.71 -  | collect_vars (vs, t) = (case strip_comb t of
    1.72 -        (v as Var _, ts) => (v, ts)::vs
    1.73 -      | (t, ts) => Library.foldl collect_vars (vs, ts));
    1.74 +fun collect_vars (Abs (_, _, t)) = collect_vars t
    1.75 +  | collect_vars t =
    1.76 +      (case strip_comb t of
    1.77 +        (v as Var _, ts) => cons (v, ts)
    1.78 +      | (t, ts) => fold collect_vars ts);
    1.79  
    1.80  
    1.81 -val split_rule_var = Drule.standard o remove_internal_split o split_rule_var';
    1.82 +val split_rule_var = (Drule.standard o remove_internal_split) oo split_rule_var';
    1.83  
    1.84  (*curries ALL function variables occurring in a rule's conclusion*)
    1.85  fun split_rule rl =
    1.86 -  foldr split_rule_var' rl (Term.term_vars (concl_of rl))
    1.87 +  fold_rev split_rule_var' (Term.term_vars (concl_of rl)) rl
    1.88    |> remove_internal_split
    1.89    |> Drule.standard;
    1.90  
    1.91 +(*curries ALL function variables*)
    1.92  fun complete_split_rule rl =
    1.93 -  fst (foldr complete_split_rule_var
    1.94 -    (rl, map (fst o fst o dest_Var) (Term.term_vars (#prop (Thm.rep_thm rl))))
    1.95 -    (collect_vars ([], concl_of rl)))
    1.96 -  |> remove_internal_split
    1.97 -  |> Drule.standard
    1.98 -  |> RuleCases.save rl;
    1.99 +  let
   1.100 +    val prop = Thm.prop_of rl;
   1.101 +    val xs = Term.fold_aterms (fn Var ((x, _), _) => insert (op =) x | _ => I) prop [];
   1.102 +    val vars = collect_vars prop [];
   1.103 +  in
   1.104 +    fst (fold_rev complete_split_rule_var vars (rl, xs))
   1.105 +    |> remove_internal_split
   1.106 +    |> Drule.standard
   1.107 +    |> RuleCases.save rl
   1.108 +  end;
   1.109  
   1.110  
   1.111  val split_rule_ss = HOL_basic_ss addsimps [split_conv, fst_conv, snd_conv];
   1.112 @@ -121,12 +128,12 @@
   1.113  fun split_rule_goal xss rl =
   1.114    let
   1.115      fun one_split i s = Tactic.rule_by_tactic (pair_tac s i);
   1.116 -    fun one_goal (i, xs) = fold (one_split (i+1)) xs;
   1.117 +    fun one_goal (i, xs) = fold (one_split (i + 1)) xs;
   1.118    in
   1.119      rl
   1.120 -    |> Library.fold_index one_goal xss
   1.121 +    |> fold_index one_goal xss
   1.122      |> Simplifier.full_simplify split_rule_ss
   1.123 -    |> Drule.standard 
   1.124 +    |> Drule.standard
   1.125      |> RuleCases.save rl
   1.126    end;
   1.127