(* Title: HOL/Tools/function_package/auto_term.ML ID: $Id: auto_term.ML,v 1.12 2007/04/20 08:06:11 krauss Exp $ 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 = FundefCommon.apply_termination_rule ctxt i THEN PRIMITIVE (inst_thm ctxt rel) val setup = Method.add_methods [("relation", (Method.SIMPLE_METHOD' o (fn (rel, ctxt) => relation_tac ctxt rel)) oo (Method.syntax Args.term), "proves termination using a user-specified wellfounded relation")] end