src/HOL/Tools/function_package/auto_term.ML
author wenzelm
Sat, 28 Mar 2009 17:53:33 +0100
changeset 30763 6976521b4263
parent 30515 bca05b17b618
permissions -rw-r--r--
renamed ProofContext.add_fixes_i to ProofContext.add_fixes, eliminated obsolete external version;

(*  Title:      HOL/Tools/function_package/auto_term.ML
    ID:         $Id$
    Author:     Alexander Krauss, TU Muenchen

A package for general recursive function definitions.
Method "relation" to commence a termination proof using a user-specified relation.
*)

signature FUNDEF_RELATION =
sig
  val relation_tac: Proof.context -> term -> int -> tactic
  val setup: theory -> theory
end

structure FundefRelation : FUNDEF_RELATION =
struct

fun inst_thm ctxt rel st =
    let
      val cert = Thm.cterm_of (ProofContext.theory_of ctxt)
      val rel' = cert (singleton (Variable.polymorphic ctxt) rel)
      val st' = Thm.incr_indexes (#maxidx (Thm.rep_cterm rel') + 1) st
      val Rvar = cert (Var (the_single (Term.add_vars (prop_of st') [])))
    in 
      Drule.cterm_instantiate [(Rvar, rel')] st' 
    end

fun relation_tac ctxt rel i = 
    TRY (FundefCommon.apply_termination_rule ctxt i)
    THEN PRIMITIVE (inst_thm ctxt rel)

val setup =
  Method.setup @{binding relation}
    (Args.term >> (fn rel => fn ctxt => SIMPLE_METHOD' (relation_tac ctxt rel)))
    "proves termination using a user-specified wellfounded relation"

end