src/HOL/Tools/Function/relation.ML
changeset 47701 157e6108a342
parent 42361 23f352990944
child 59159 9312710451f5
equal deleted inserted replaced
47700:27a04da9c6e6 47701:157e6108a342
     1 (*  Title:      HOL/Tools/Function/relation.ML
     1 (*  Title:      HOL/Tools/Function/relation.ML
     2     Author:     Alexander Krauss, TU Muenchen
     2     Author:     Alexander Krauss, TU Muenchen
     3 
     3 
     4 Method "relation" to start a termination proof using a user-specified relation.
     4 Tactics to start a termination proof using a user-specified relation.
     5 *)
     5 *)
     6 
     6 
     7 signature FUNCTION_RELATION =
     7 signature FUNCTION_RELATION =
     8 sig
     8 sig
     9   val relation_tac: Proof.context -> (typ -> term) -> int -> tactic
     9   val relation_tac: Proof.context -> (typ -> term) -> int -> tactic
    10   val setup: theory -> theory
    10   val relation_infer_tac: Proof.context -> term -> int -> tactic
    11 end
    11 end
    12 
    12 
    13 structure Function_Relation : FUNCTION_RELATION =
    13 structure Function_Relation : FUNCTION_RELATION =
    14 struct
    14 struct
    15 
    15 
    25 fun relation_tac ctxt rel i =
    25 fun relation_tac ctxt rel i =
    26   TRY (Function_Common.apply_termination_rule ctxt i)
    26   TRY (Function_Common.apply_termination_rule ctxt i)
    27   THEN inst_state_tac rel;
    27   THEN inst_state_tac rel;
    28 
    28 
    29 
    29 
    30 (* method version (with type inference) *)
    30 (* version with type inference *)
    31 
    31 
    32 fun inst_state_infer_tac ctxt rel st =
    32 fun inst_state_infer_tac ctxt rel st =
    33   case Term.add_vars (prop_of st) [] of
    33   case Term.add_vars (prop_of st) [] of
    34     [v as (_, T)] =>
    34     [v as (_, T)] =>
    35       let
    35       let
    42       in
    42       in
    43         PRIMITIVE (Thm.instantiate ([], [(cert (Var v), rel')])) st
    43         PRIMITIVE (Thm.instantiate ([], [(cert (Var v), rel')])) st
    44       end
    44       end
    45   | _ => Seq.empty;
    45   | _ => Seq.empty;
    46 
    46 
    47 fun relation_meth rel ctxt = SIMPLE_METHOD' (fn i =>
    47 fun relation_infer_tac ctxt rel i =
    48   TRY (Function_Common.apply_termination_rule ctxt i)
    48   TRY (Function_Common.apply_termination_rule ctxt i)
    49   THEN inst_state_infer_tac ctxt rel);
    49   THEN inst_state_infer_tac ctxt rel;
    50 
       
    51 val setup =
       
    52   Method.setup @{binding relation} (Args.term >> relation_meth)
       
    53     "proves termination using a user-specified wellfounded relation";
       
    54 
    50 
    55 end
    51 end