more error handling
authorkrauss
Tue, 07 Aug 2007 15:20:24 +0200
changeset 24170 33f055a0f3a1
parent 24169 29c9da443edc
child 24171 25381ce95316
more error handling
src/HOL/Tools/function_package/fundef_common.ML
src/HOL/Tools/function_package/fundef_datatype.ML
src/HOL/Tools/function_package/mutual.ML
--- a/src/HOL/Tools/function_package/fundef_common.ML	Tue Aug 07 15:04:35 2007 +0200
+++ b/src/HOL/Tools/function_package/fundef_common.ML	Tue Aug 07 15:20:24 2007 +0200
@@ -173,22 +173,21 @@
 fun open_all_all (Const ("all", _) $ Abs (n, T, b)) = apfst (cons (n, T)) (open_all_all b)
   | open_all_all t = ([], t)
 
-exception MalformedEquation of term
-
-fun split_def geq =
+fun split_def ctxt geq =
     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)
-          handle TERM _ => raise MalformedEquation geq
+          handle TERM _ => error (input_error "Not an equation")
 
       val (head, args) = strip_comb f_args
 
       val fname = fst (dest_Free head)
-          handle TERM _ => raise MalformedEquation geq
+          handle TERM _ => error (input_error "Head symbol must not be a bound variable")
     in
       (fname, qs, gs, args, rhs)
     end
@@ -217,7 +216,7 @@
           let
             fun input_error msg = cat_lines [msg, ProofContext.string_of_term ctxt geq]
                                   
-            val fqgar as (fname, qs, gs, args, rhs) = split_def geq
+            val fqgar as (fname, qs, gs, args, rhs) = split_def ctxt geq
                                  
             val _ = fname mem fnames 
                     orelse error (input_error ("Head symbol of left hand side must be " ^ plural "" "one out of " fnames 
@@ -235,6 +234,12 @@
           in
             fqgar
           end
+          
+      fun check_sorts ((fname, fT), _) =
+          Sorts.of_sort (Sign.classes_of (ProofContext.theory_of ctxt)) (fT, HOLogic.typeS)
+          orelse error ("Type of " ^ quote fname ^ " is not of sort " ^ quote "type" ^ ".")
+
+      val _ = map check_sorts fixes
 
       val _ = mk_arities (map check eqs)
           handle ArgumentCount fname => 
--- a/src/HOL/Tools/function_package/fundef_datatype.ML	Tue Aug 07 15:04:35 2007 +0200
+++ b/src/HOL/Tools/function_package/fundef_datatype.ML	Tue Aug 07 15:20:24 2007 +0200
@@ -41,13 +41,13 @@
              ())
           end
           
-      val (fname, qs, gs, args, rhs) = split_def geq 
+      val (fname, qs, gs, args, rhs) = split_def ctxt geq 
                                        
       val _ = if not (null gs) then err "Conditional equations" else ()
       val _ = map check_constr_pattern args
                   
                   (* just count occurrences to check linearity *)
-      val _ = if fold (fold_aterms (fn Bound _ => curry (op +) 1 | _ => I)) args 0 < length qs
+      val _ = if fold (fold_aterms (fn Bound _ => curry (op +) 1 | _ => I)) args 0 > length qs
               then err "Nonlinear patterns" else ()
     in
       ()
@@ -226,9 +226,9 @@
       map mk_eqn fixes
     end
 
-fun add_catchall fixes spec =
+fun add_catchall ctxt fixes spec =
     let 
-      val catchalls = mk_catchall fixes (mk_arities (map split_def (map snd spec)))
+      val catchalls = mk_catchall fixes (mk_arities (map (split_def ctxt) (map snd spec)))
     in
       spec @ map (pair true) catchalls
     end
@@ -249,7 +249,7 @@
                            |> tap (check_defs ctxt fixes) (* Standard checks *)
                            |> tap (map (check_pats ctxt))    (* More checks for sequential mode *)
                            |> curry op ~~ flags'
-                           |> add_catchall fixes   (* Completion *)
+                           |> add_catchall ctxt fixes   (* Completion *)
                            |> FundefSplit.split_some_equations ctxt
 
           fun restore_spec thms =
--- a/src/HOL/Tools/function_package/mutual.ML	Tue Aug 07 15:04:35 2007 +0200
+++ b/src/HOL/Tools/function_package/mutual.ML	Tue Aug 07 15:20:24 2007 +0200
@@ -121,7 +121,7 @@
     let
       val num = length fs
         val fnames = map fst fs
-        val fqgars = map split_def eqs
+        val fqgars = map (split_def ctxt) eqs
         val arities = mk_arities fqgars
 
         fun curried_types (fname, fT) =