src/Pure/Isar/proof_context.ML
changeset 49674 dbadb4d03cbc
parent 48992 0518bf89c777
child 49685 4341e4d86872
--- a/src/Pure/Isar/proof_context.ML	Mon Oct 01 12:05:05 2012 +0200
+++ b/src/Pure/Isar/proof_context.ML	Mon Oct 01 16:37:22 2012 +0200
@@ -70,7 +70,8 @@
   val read_arity: Proof.context -> xstring * string list * string -> arity
   val cert_arity: Proof.context -> arity -> arity
   val allow_dummies: Proof.context -> Proof.context
-  val prepare_sorts: Proof.context -> typ list -> typ list
+  val prepare_sortsT: Proof.context -> typ list -> string * typ list
+  val prepare_sorts: Proof.context -> term list -> string * term list
   val check_tfree: Proof.context -> string * sort -> string * sort
   val intern_skolem: Proof.context -> string -> string option
   val read_term_pattern: Proof.context -> string -> term
@@ -615,13 +616,15 @@
 
 (* sort constraints *)
 
-fun prepare_sorts ctxt tys =
+local
+
+fun prepare_sorts_env ctxt tys =
   let
     val tsig = tsig_of ctxt;
     val defaultS = Type.defaultS tsig;
 
     fun constraint (xi, S) env =
-      if S = dummyS then env
+      if S = dummyS orelse Term_Position.is_positionS S then env
       else
         Vartab.insert (op =) (xi, Type.minimize_sort tsig S) env
           handle Vartab.DUP _ =>
@@ -644,18 +647,57 @@
             error ("Sort constraint " ^ Syntax.string_of_sort ctxt S ^
               " inconsistent with default " ^ Syntax.string_of_sort ctxt S' ^
               " for type variable " ^ quote (Term.string_of_vname' xi)));
-  in
-    (map o map_atyps)
-      (fn T =>
-        if Term_Position.is_positionT T then T
-        else
-          (case T of
-            TFree (x, _) => TFree (x, get_sort (x, ~1))
-          | TVar (xi, _) => TVar (xi, get_sort xi)
-          | _ => T)) tys
-  end;
+
+    fun add_report raw_S S reports =
+      (case Term_Position.decode_positionS raw_S of
+        SOME pos =>
+          if Position.is_reported pos andalso not (AList.defined (op =) reports pos) then
+            (pos, Position.reported_text pos Isabelle_Markup.sorting (Syntax.string_of_sort ctxt S))
+              :: reports
+          else reports
+      | NONE => reports);
+
+    val reports =
+      (fold o fold_atyps)
+        (fn T =>
+          if Term_Position.is_positionT T then I
+          else
+            (case T of
+              TFree (x, raw_S) => add_report raw_S (get_sort (x, ~1))
+            | TVar (xi, raw_S) => add_report raw_S (get_sort xi)
+            | _ => I)) tys [];
+
+  in (implode (map #2 reports), get_sort) end;
 
-fun check_tfree ctxt v = dest_TFree (singleton (prepare_sorts ctxt) (TFree v));
+fun replace_sortsT get_sort =
+  map_atyps
+    (fn T =>
+      if Term_Position.is_positionT T then T
+      else
+        (case T of
+          TFree (x, _) => TFree (x, get_sort (x, ~1))
+        | TVar (xi, _) => TVar (xi, get_sort xi)
+        | _ => T));
+
+in
+
+fun prepare_sortsT ctxt tys =
+  let val (sorting_report, get_sort) = prepare_sorts_env ctxt tys
+  in (sorting_report, map (replace_sortsT get_sort) tys) end;
+
+fun prepare_sorts ctxt tms =
+  let
+    val tys = rev ((fold o fold_types) cons tms []);
+    val (sorting_report, get_sort) = prepare_sorts_env ctxt tys;
+  in (sorting_report, (map o map_types) (replace_sortsT get_sort) tms) end;
+
+fun check_tfree ctxt v =
+  let
+    val (sorting_report, [TFree a]) = prepare_sortsT ctxt [TFree v];
+    val _ = Context_Position.if_visible ctxt Output.report sorting_report;
+  in a end;
+
+end;
 
 
 (* certify terms *)