src/HOL/Tools/function_package/mutual.ML
changeset 23189 4574ab8f3b21
parent 22733 0b14bb35be90
child 23203 a5026e73cfcf
--- a/src/HOL/Tools/function_package/mutual.ML	Fri Jun 01 15:20:53 2007 +0200
+++ b/src/HOL/Tools/function_package/mutual.ML	Fri Jun 01 15:57:45 2007 +0200
@@ -13,7 +13,6 @@
                               -> string (* defname *)
                               -> ((string * typ) * mixfix) list
                               -> term list
-                              -> string (* default, unparsed term *)
                               -> local_theory
                               -> ((thm (* goalstate *)
                                    * (thm -> FundefCommon.fundef_result) (* proof continuation *)
@@ -72,50 +71,6 @@
     if n < 5 then fst (chop n ["P","Q","R","S"])
     else map (fn i => "P" ^ string_of_int i) (1 upto n)
 
-
-fun open_all_all (Const ("all", _) $ Abs (n, T, b)) = apfst (cons (n, T)) (open_all_all b)
-  | open_all_all t = ([], t)
-
-(* Builds a curried clause description in abstracted form *)
-fun split_def ctxt fnames geq arities =
-    let
-      fun input_error msg = cat_lines [msg, ProofContext.string_of_term ctxt geq]
-                            
-      val (qs, imp) = open_all_all geq
-
-      val gs = Logic.strip_imp_prems imp
-      val eq = Logic.strip_imp_concl imp
-
-      val (f_args, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop eq)
-      val (head, args) = strip_comb f_args
-
-      val invalid_head_msg = "Head symbol of left hand side must be " ^ plural "" "one out of " fnames ^ commas_quote fnames
-      val fname = fst (dest_Free head)
-          handle TERM _ => error (input_error invalid_head_msg)
-
-      val _ = fname mem fnames orelse error (input_error invalid_head_msg)
-
-      fun add_bvs t is = add_loose_bnos (t, 0, is)
-      val rvs = (add_bvs rhs [] \\ fold add_bvs args [])
-                  |> map (fst o nth (rev qs))
-                
-      val _ = null rvs orelse error (input_error ("Variable" ^ plural " " "s " rvs ^ commas_quote rvs
-                                              ^ " occur" ^ plural "s" "" rvs ^ " on right hand side only:"))
-
-      val _ = forall (forall_aterms (fn Free (n, _) => not (n mem fnames) | _ => true)) gs orelse
-                     error (input_error "Recursive Calls not allowed in premises")
-
-      val k = length args
-
-      val arities' = case Symtab.lookup arities fname of
-                       NONE => Symtab.update (fname, k) arities
-                     | SOME i => (i = k orelse
-                                  error (input_error ("Function " ^ quote fname ^ " has different numbers of arguments in different equations"));
-                                  arities)
-    in
-      ((fname, qs, gs, args, rhs), arities')
-    end
-    
 fun get_part fname =
     the o find_first (fn (MutualPart {fvar=(n,_), ...}) => n = fname)
                      
@@ -133,7 +88,8 @@
 fun analyze_eqs ctxt defname fs eqs =
     let
         val fnames = map fst fs
-        val (fqgars, arities) = fold_map (split_def ctxt fnames) eqs Symtab.empty
+        val fqgars = map split_def eqs
+        val arities = mk_arities fqgars
 
         fun curried_types (fname, fT) =
             let
@@ -325,15 +281,17 @@
       fun mk_mpsimp fqgar sum_psimp =
           in_context lthy fqgar (recover_mutual_psimp all_orig_fdefs parts) sum_psimp
           
+      val rew_ss = HOL_basic_ss addsimps all_f_defs
       val mpsimps = map2 mk_mpsimp fqgars psimps
       val mtrsimps = map_option (map2 mk_mpsimp fqgars) trsimps
       val minducts = mutual_induct_rules lthy simple_pinduct all_f_defs m
-      val mtermination = full_simplify (HOL_basic_ss addsimps all_f_defs) termination
+      val mtermination = full_simplify rew_ss termination
+      val mdomintros = map_option (map (full_simplify rew_ss)) domintros
     in
       FundefResult { fs=fs, G=G, R=R,
                      psimps=mpsimps, subset_pinducts=[subset_pinduct], simple_pinducts=minducts,
                      cases=cases, termination=mtermination,
-                     domintros=domintros,
+                     domintros=mdomintros,
                      trsimps=mtrsimps}
     end
       
@@ -351,13 +309,13 @@
              |> map (snd #> map snd)                     (* and remove the labels afterwards *)
 
 
-fun prepare_fundef_mutual config defname fixes eqss default lthy =
+fun prepare_fundef_mutual config defname fixes eqss lthy =
     let
       val mutual = analyze_eqs lthy defname (map fst fixes) (map Envir.beta_eta_contract eqss)
       val Mutual {fsum_var=(n, T), qglrs, ...} = mutual
           
       val ((fsum, goalstate, cont), lthy') =
-          FundefCore.prepare_fundef config defname (n, T, NoSyn) qglrs default lthy
+          FundefCore.prepare_fundef config defname [((n, T), NoSyn)] qglrs lthy
           
       val (mutual', lthy'') = define_projections fixes mutual fsum lthy'