removed type-inference-like behaviour from relation_tac completely; tuned
authorkrauss
Mon, 08 Nov 2010 23:02:20 +0100
changeset 4068965bd37d7d501
parent 40688 19faffbe5066
child 40692 27c1a1c82eba
child 40694 e876e95588ce
child 40696 75e544159549
removed type-inference-like behaviour from relation_tac completely; tuned
src/HOL/Tools/Function/relation.ML
     1.1 --- a/src/HOL/Tools/Function/relation.ML	Mon Nov 08 17:44:47 2010 +0100
     1.2 +++ b/src/HOL/Tools/Function/relation.ML	Mon Nov 08 23:02:20 2010 +0100
     1.3 @@ -7,39 +7,50 @@
     1.4  
     1.5  signature FUNCTION_RELATION =
     1.6  sig
     1.7 -  val relation_tac: Proof.context -> term -> int -> tactic
     1.8 +  val relation_tac: Proof.context -> (typ -> term) -> int -> tactic
     1.9    val setup: theory -> theory
    1.10  end
    1.11  
    1.12  structure Function_Relation : FUNCTION_RELATION =
    1.13  struct
    1.14  
    1.15 -fun gen_inst_state_tac prep ctxt rel st =
    1.16 +(* tactic version *)
    1.17 +
    1.18 +fun inst_state_tac inst st =
    1.19 +  case Term.add_vars (prop_of st) [] of
    1.20 +    [v as (_, T)] =>
    1.21 +      let val cert = Thm.cterm_of (Thm.theory_of_thm st);
    1.22 +      in PRIMITIVE (Thm.instantiate ([], [(cert (Var v), cert (inst T))])) st end
    1.23 +  | _ => Seq.empty;
    1.24 +
    1.25 +fun relation_tac ctxt rel i =
    1.26 +  TRY (Function_Common.apply_termination_rule ctxt i)
    1.27 +  THEN inst_state_tac rel;
    1.28 +
    1.29 +
    1.30 +(* method version (with type inference) *)
    1.31 +
    1.32 +fun inst_state_infer_tac ctxt rel st =
    1.33    case Term.add_vars (prop_of st) [] of
    1.34      [v as (_, T)] =>
    1.35        let
    1.36 -        val cert = Thm.cterm_of (ProofContext.theory_of ctxt)
    1.37 -        val rel' = prep T (singleton (Variable.polymorphic ctxt) rel) 
    1.38 -          |> cert
    1.39 -        val st' = Thm.incr_indexes (#maxidx (Thm.rep_cterm rel') + 1) st (*FIXME??*)
    1.40 -      in        
    1.41 -        PRIMITIVE (Drule.cterm_instantiate [(cert (Var v), rel')]) st'
    1.42 +        val cert = Thm.cterm_of (ProofContext.theory_of ctxt);
    1.43 +        val rel' = singleton (Variable.polymorphic ctxt) rel
    1.44 +          |> map_types Type_Infer.paramify_vars
    1.45 +          |> Type.constraint T
    1.46 +          |> Syntax.check_term ctxt
    1.47 +          |> cert;
    1.48 +      in
    1.49 +        PRIMITIVE (Thm.instantiate ([], [(cert (Var v), rel')])) st
    1.50        end
    1.51    | _ => Seq.empty;
    1.52  
    1.53 -fun gen_relation_tac prep ctxt rel i =
    1.54 +fun relation_meth rel ctxt = SIMPLE_METHOD' (fn i =>
    1.55    TRY (Function_Common.apply_termination_rule ctxt i)
    1.56 -  THEN gen_inst_state_tac prep ctxt rel
    1.57 -
    1.58 -val relation_tac = gen_relation_tac (K I)
    1.59 -
    1.60 -fun relation_meth rel ctxt = SIMPLE_METHOD' 
    1.61 -  (gen_relation_tac (fn T => map_types Type_Infer.paramify_vars
    1.62 -      #> Type.constraint T #> Syntax.check_term ctxt)
    1.63 -    ctxt rel)
    1.64 +  THEN inst_state_infer_tac ctxt rel);
    1.65  
    1.66  val setup =
    1.67    Method.setup @{binding relation} (Args.term >> relation_meth)
    1.68 -    "proves termination using a user-specified wellfounded relation"
    1.69 +    "proves termination using a user-specified wellfounded relation";
    1.70  
    1.71  end