src/HOL/Tools/function_package/fundef_common.ML
changeset 28287 c86fa4e0aedb
parent 28083 103d9282a946
child 28524 644b62cf678f
     1.1 --- a/src/HOL/Tools/function_package/fundef_common.ML	Thu Sep 18 10:57:30 2008 +0200
     1.2 +++ b/src/HOL/Tools/function_package/fundef_common.ML	Thu Sep 18 12:13:50 2008 +0200
     1.3 @@ -26,6 +26,22 @@
     1.4  val rel_name = suffix "_rel"
     1.5  val dom_name = suffix "_dom"
     1.6  
     1.7 +(* Termination rules *)
     1.8 +
     1.9 +structure TerminationRule = GenericDataFun
    1.10 +(
    1.11 +  type T = thm list
    1.12 +  val empty = []
    1.13 +  val extend = I
    1.14 +  fun merge _ = Thm.merge_thms
    1.15 +);
    1.16 +
    1.17 +val get_termination_rules = TerminationRule.get
    1.18 +val store_termination_rule = TerminationRule.map o cons
    1.19 +val apply_termination_rule = resolve_tac o get_termination_rules o Context.Proof
    1.20 +
    1.21 +
    1.22 +(* Function definition result data *)
    1.23  
    1.24  datatype fundef_result =
    1.25    FundefResult of
    1.26 @@ -119,27 +135,33 @@
    1.27  
    1.28  val all_fundef_data = NetRules.rules o FundefData.get
    1.29  
    1.30 +fun add_fundef_data (data as FundefCtxData {fs, termination, ...}) =
    1.31 +    FundefData.map (fold (fn f => NetRules.insert (f, data)) fs)
    1.32 +    #> store_termination_rule termination
    1.33 +
    1.34 +
    1.35 +(* Simp rules for termination proofs *)
    1.36 +
    1.37  structure TerminationSimps = NamedThmsFun
    1.38  (
    1.39    val name = "termination_simp" 
    1.40    val description = "Simplification rule for termination proofs"
    1.41  );
    1.42  
    1.43 -structure TerminationRule = GenericDataFun
    1.44 +
    1.45 +(* Default Termination Prover *)
    1.46 +
    1.47 +structure TerminationProver = GenericDataFun
    1.48  (
    1.49 -  type T = thm list
    1.50 -  val empty = []
    1.51 +  type T = (Proof.context -> Method.method)
    1.52 +  val empty = (fn _ => error "Termination prover not configured")
    1.53    val extend = I
    1.54 -  fun merge _ = Thm.merge_thms
    1.55 +  fun merge _ (a,b) = b (* FIXME *)
    1.56  );
    1.57  
    1.58 -val get_termination_rules = TerminationRule.get
    1.59 -val store_termination_rule = TerminationRule.map o cons
    1.60 -val apply_termination_rule = resolve_tac o get_termination_rules o Context.Proof
    1.61 +val set_termination_prover = TerminationProver.put
    1.62 +val get_termination_prover = TerminationProver.get
    1.63  
    1.64 -fun add_fundef_data (data as FundefCtxData {fs, termination, ...}) =
    1.65 -    FundefData.map (fold (fn f => NetRules.insert (f, data)) fs)
    1.66 -    #> store_termination_rule termination
    1.67  
    1.68  (* Configuration management *)
    1.69  datatype fundef_opt 
    1.70 @@ -170,15 +192,13 @@
    1.71    FundefConfig { sequential=false, default="%x. arbitrary", domintros=false, tailrec=false }
    1.72  
    1.73  
    1.74 -(* Common operations on equations *)
    1.75 -
    1.76 -fun open_all_all (Const ("all", _) $ Abs (n, T, b)) = apfst (cons (n, T)) (open_all_all b)
    1.77 -  | open_all_all t = ([], t)
    1.78 +(* Analyzing function equations *)
    1.79  
    1.80  fun split_def ctxt geq =
    1.81      let
    1.82        fun input_error msg = cat_lines [msg, Syntax.string_of_term ctxt geq]
    1.83 -      val (qs, imp) = open_all_all geq
    1.84 +      val qs = Term.strip_qnt_vars "all" geq
    1.85 +      val imp = Term.strip_qnt_body "all" geq
    1.86        val (gs, eq) = Logic.strip_horn imp
    1.87  
    1.88        val (f_args, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop eq)