src/Pure/tactic.ML
changeset 19532 dae447f2b0b4
parent 19482 9f11af8f7ef9
child 19743 0843210d3756
equal deleted inserted replaced
19531:89970e06351f 19532:dae447f2b0b4
   228 fun innermost_params i st =
   228 fun innermost_params i st =
   229   let val (_, _, Bi, _) = dest_state (st, i)
   229   let val (_, _, Bi, _) = dest_state (st, i)
   230   in rename_wrt_term Bi (Logic.strip_params Bi) end;
   230   in rename_wrt_term Bi (Logic.strip_params Bi) end;
   231 
   231 
   232 (*params of subgoal i as they are printed*)
   232 (*params of subgoal i as they are printed*)
   233 fun params_of_state st i =
   233 fun params_of_state i st = rev (innermost_params i st);
   234   let val (_, _, Bi, _) = dest_state(st,i)
       
   235       val params = Logic.strip_params Bi
       
   236   in rev(rename_wrt_term Bi params) end;
       
   237 
   234 
   238 (*read instantiations with respect to subgoal i of proof state st*)
   235 (*read instantiations with respect to subgoal i of proof state st*)
   239 fun read_insts_in_state (st, i, sinsts, rule) =
   236 fun read_insts_in_state (st, i, sinsts, rule) =
   240   let val thy = Thm.theory_of_thm st
   237   let val thy = Thm.theory_of_thm st
   241       and params = params_of_state st i
   238       and params = params_of_state i st
   242       and rts = types_sorts rule and (types,sorts) = types_sorts st
   239       and rts = types_sorts rule and (types,sorts) = types_sorts st
   243       fun types'(a, ~1) = (case AList.lookup (op =) params a of NONE => types (a, ~1) | sm => sm)
   240       fun types'(a, ~1) = (case AList.lookup (op =) params a of NONE => types (a, ~1) | sm => sm)
   244         | types' ixn = types ixn;
   241         | types' ixn = types ixn;
   245       val used = Drule.add_used rule (Drule.add_used st []);
   242       val used = Drule.add_used rule (Drule.add_used st []);
   246   in read_insts thy rts (types',sorts) used sinsts end;
   243   in read_insts thy rts (types',sorts) used sinsts end;
   247 
   244 
   248 (*Lift and instantiate a rule wrt the given state and subgoal number *)
   245 (*Lift and instantiate a rule wrt the given state and subgoal number *)
   249 fun lift_inst_rule' (st, i, sinsts, rule) =
   246 fun lift_inst_rule' (st, i, sinsts, rule) =
   250 let val (Tinsts,insts) = read_insts_in_state (st, i, sinsts, rule)
   247 let val (Tinsts,insts) = read_insts_in_state (st, i, sinsts, rule)
   251     and {maxidx,...} = rep_thm st
   248     and {maxidx,...} = rep_thm st
   252     and params = params_of_state st i
   249     and params = params_of_state i st
   253     val paramTs = map #2 params
   250     val paramTs = map #2 params
   254     and inc = maxidx+1
   251     and inc = maxidx+1
   255     fun liftvar (Var ((a,j), T)) = Var((a, j+inc), paramTs---> Logic.incr_tvar inc T)
   252     fun liftvar (Var ((a,j), T)) = Var((a, j+inc), paramTs---> Logic.incr_tvar inc T)
   256       | liftvar t = raise TERM("Variable expected", [t]);
   253       | liftvar t = raise TERM("Variable expected", [t]);
   257     fun liftterm t = list_abs_free (params,
   254     fun liftterm t = list_abs_free (params,
   281 NB: the types in insts must be correctly instantiated already,
   278 NB: the types in insts must be correctly instantiated already,
   282     i.e. Tinsts is not applied to insts.
   279     i.e. Tinsts is not applied to insts.
   283 *)
   280 *)
   284 fun term_lift_inst_rule (st, i, Tinsts, insts, rule) =
   281 fun term_lift_inst_rule (st, i, Tinsts, insts, rule) =
   285 let val {maxidx,thy,...} = rep_thm st
   282 let val {maxidx,thy,...} = rep_thm st
   286     val paramTs = map #2 (params_of_state st i)
   283     val paramTs = map #2 (params_of_state i st)
   287     and inc = maxidx+1
   284     and inc = maxidx+1
   288     fun liftvar ((a,j), T) = Var((a, j+inc), paramTs---> Logic.incr_tvar inc T)
   285     fun liftvar ((a,j), T) = Var((a, j+inc), paramTs---> Logic.incr_tvar inc T)
   289     (*lift only Var, not term, which must be lifted already*)
   286     (*lift only Var, not term, which must be lifted already*)
   290     fun liftpair (v,t) = (cterm_of thy (liftvar v), cterm_of thy t)
   287     fun liftpair (v,t) = (cterm_of thy (liftvar v), cterm_of thy t)
   291     fun liftTpair (((a, i), S), T) =
   288     fun liftTpair (((a, i), S), T) =