src/HOL/Tools/case_translation.ML
changeset 54398 100c0eaf63d5
parent 52705 c12602c1b13b
--- a/src/HOL/Tools/case_translation.ML	Tue Nov 12 13:47:24 2013 +0100
+++ b/src/HOL/Tools/case_translation.ML	Tue Nov 12 13:47:24 2013 +0100
@@ -8,6 +8,9 @@
 
 signature CASE_TRANSLATION =
 sig
+  val indexify_names: string list -> string list
+  val make_tnames: typ list -> string list
+
   datatype config = Error | Warning | Quiet
   val case_tr: bool -> Proof.context -> term list -> term
   val lookup_by_constr: Proof.context -> string * typ -> (term * term list) option
@@ -25,6 +28,30 @@
 structure Case_Translation: CASE_TRANSLATION =
 struct
 
+(** general utilities **)
+
+fun indexify_names names =
+  let
+    fun index (x :: xs) tab =
+        (case AList.lookup (op =) tab x of
+          NONE =>
+            if member (op =) xs x
+            then (x ^ "1") :: index xs ((x, 2) :: tab)
+            else x :: index xs tab
+        | SOME i => (x ^ string_of_int i) :: index xs ((x, i + 1) :: tab))
+      | index [] _ = [];
+  in index names [] end;
+
+fun make_tnames Ts =
+  let
+    fun type_name (TFree (name, _)) = unprefix "'" name
+      | type_name (Type (name, _)) =
+          let val name' = Long_Name.base_name name
+          in if Symbol_Pos.is_identifier name' then name' else "x" end;
+  in indexify_names (map type_name Ts) end;
+
+
+
 (** data management **)
 
 datatype data = Data of
@@ -228,8 +255,7 @@
     val (_, T) = dest_Const c;
     val Ts = binder_types T;
     val (names, _) =
-      fold_map Name.variant
-        (Datatype_Prop.make_tnames (map Logic.unvarifyT_global Ts)) used;
+      fold_map Name.variant (make_tnames (map Logic.unvarifyT_global Ts)) used;
     val ty = body_type T;
     val ty_theta = Type.raw_match (ty, colty) Vartab.empty
       handle Type.TYPE_MATCH => raise CASE_ERROR ("type mismatch", ~1);