src/Pure/tactic.ML
changeset 230 ec8a2b6aa8a7
parent 214 ed6a3e2b1a33
child 270 d506ea00c825
equal deleted inserted replaced
229:4002c4cd450c 230:ec8a2b6aa8a7
    97 (*convert all Vars in a theorem to Frees -- export??*)
    97 (*convert all Vars in a theorem to Frees -- export??*)
    98 fun freeze th =
    98 fun freeze th =
    99   let val fth = freezeT th
    99   let val fth = freezeT th
   100       val {prop,sign,...} = rep_thm fth
   100       val {prop,sign,...} = rep_thm fth
   101       fun mk_inst (Var(v,T)) = 
   101       fun mk_inst (Var(v,T)) = 
   102 	  (Sign.cterm_of sign (Var(v,T)),
   102 	  (cterm_of sign (Var(v,T)),
   103 	   Sign.cterm_of sign (Free(string_of v, T)))
   103 	   cterm_of sign (Free(string_of v, T)))
   104       val insts = map mk_inst (term_vars prop)
   104       val insts = map mk_inst (term_vars prop)
   105   in  instantiate ([],insts) fth  end;
   105   in  instantiate ([],insts) fth  end;
   106 
   106 
   107 (*Makes a rule by applying a tactic to an existing rule*)
   107 (*Makes a rule by applying a tactic to an existing rule*)
   108 fun rule_by_tactic (Tactic tf) rl =
   108 fun rule_by_tactic (Tactic tf) rl =
   182     fun liftvar (Var ((a,j), T)) = Var((a, j+inc), paramTs---> incr_tvar inc T)
   182     fun liftvar (Var ((a,j), T)) = Var((a, j+inc), paramTs---> incr_tvar inc T)
   183       | liftvar t = raise TERM("Variable expected", [t]);
   183       | liftvar t = raise TERM("Variable expected", [t]);
   184     fun liftterm t = list_abs_free (params, 
   184     fun liftterm t = list_abs_free (params, 
   185 				    Logic.incr_indexes(paramTs,inc) t)
   185 				    Logic.incr_indexes(paramTs,inc) t)
   186     (*Lifts instantiation pair over params*)
   186     (*Lifts instantiation pair over params*)
   187     fun liftpair (cv,ct) = (Sign.cfun liftvar cv, Sign.cfun liftterm ct)
   187     fun liftpair (cv,ct) = (cterm_fun liftvar cv, cterm_fun liftterm ct)
   188     fun lifttvar((a,i),ctyp) =
   188     fun lifttvar((a,i),ctyp) =
   189 	let val {T,sign} = Sign.rep_ctyp ctyp
   189 	let val {T,sign} = rep_ctyp ctyp
   190 	in  ((a,i+inc), Sign.ctyp_of sign (incr_tvar inc T)) end
   190 	in  ((a,i+inc), ctyp_of sign (incr_tvar inc T)) end
   191     val rts = types_sorts rule and (types,sorts) = types_sorts state
   191     val rts = types_sorts rule and (types,sorts) = types_sorts state
   192     fun types'(a,~1) = (case assoc(params,a) of None => types(a,~1) | sm => sm)
   192     fun types'(a,~1) = (case assoc(params,a) of None => types(a,~1) | sm => sm)
   193       | types'(ixn) = types ixn;
   193       | types'(ixn) = types ixn;
   194     val (Tinsts,insts) = Sign.read_insts sign rts (types',sorts) sinsts
   194     val (Tinsts,insts) = read_insts sign rts (types',sorts) sinsts
   195 in instantiate (map lifttvar Tinsts, map liftpair insts)
   195 in instantiate (map lifttvar Tinsts, map liftpair insts)
   196 		(lift_rule (state,i) rule)
   196 		(lift_rule (state,i) rule)
   197 end;
   197 end;
   198 
   198 
   199 
   199