src/HOL/Tools/Function/function.ML
changeset 63004 f507e6fe1d77
parent 62996 1c52ea2954f5
child 63005 d743bb1b6c23
--- a/src/HOL/Tools/Function/function.ML	Sun Apr 17 20:11:02 2016 +0200
+++ b/src/HOL/Tools/Function/function.ML	Sun Apr 17 20:54:17 2016 +0200
@@ -51,7 +51,7 @@
   @{attributes [nitpick_psimp]}
 
 fun note_qualified suffix attrs (fname, thms) =
-  Local_Theory.note ((Binding.qualify true fname (Binding.name suffix),
+  Local_Theory.note ((Binding.qualify_name true fname suffix,
     map (Attrib.internal o K) attrs), thms)
   #> apfst snd
 
@@ -68,13 +68,9 @@
     val saved_simps = maps snd saved_spec_simps
     val simps_by_f = sort saved_simps
 
-    fun add_for_f fname simps =
-      Local_Theory.note
-        ((mod_binding (Binding.qualify true fname (Binding.name label)), []), simps)
-      #> snd
-  in
-    (saved_simps, fold2 add_for_f fnames simps_by_f lthy)
-  end
+    fun note fname simps =
+      Local_Theory.note ((mod_binding (Binding.qualify_name true fname label), []), simps) #> snd
+  in (saved_simps, fold2 note fnames simps_by_f lthy) end
 
 fun prepare_function do_print prep fixspec eqns config lthy =
   let
@@ -83,8 +79,12 @@
     val spec = map (fn (bnd, prop) => (bnd, [prop])) spec0
     val (eqs, post, sort_cont, cnames) = get_preproc lthy config ctxt' fixes spec
 
-    val fnames = map (fst o fst) fixes
-    val defname = space_implode "_" fnames
+    val fnames = map (fst o fst) fixes0
+    val f_base_names = map (fst o fst) fixes
+    val defname =
+      (case fixes0 of
+        [((b, _), _)] => b
+      | _ => Binding.name (space_implode "_" f_base_names))
 
     val FunctionConfig {partials, default, ...} = config
     val _ =
@@ -103,8 +103,7 @@
 
         val pelims = Function_Elims.mk_partial_elim_rules lthy result
 
-        fun qualify n = Binding.name n
-          |> Binding.qualify true defname
+        val qualify = Binding.qualify_name true defname
         val concealed_partial = if partials then I else Binding.concealed
 
         val addsmps = add_simps fnames post sort_cont
@@ -118,13 +117,17 @@
                  [Attrib.internal (K (Rule_Cases.case_names cnames)),
                   Attrib.internal (K (Rule_Cases.consumes (1 - Thm.nprems_of th))),
                   Attrib.internal (K (Induct.induct_pred ""))])))]
-          ||>> (apfst snd o Local_Theory.note ((Binding.concealed (qualify "termination"), []), [termination]))
-          ||>> fold_map (note_qualified "cases" [Rule_Cases.case_names cnames]) (fnames ~~ map single cases) (* TODO: case names *)
-          ||>> fold_map (note_qualified "pelims" [Rule_Cases.consumes 1, Rule_Cases.constraints 1]) (fnames ~~ pelims)
+          ||>> (apfst snd o
+            Local_Theory.note ((Binding.concealed (qualify "termination"), []), [termination]))
+          ||>> fold_map (note_qualified "cases" [Rule_Cases.case_names cnames])
+            (fnames ~~ map single cases) (* TODO: case names *)
+          ||>> fold_map (note_qualified "pelims" [Rule_Cases.consumes 1, Rule_Cases.constraints 1])
+            (fnames ~~ pelims)
           ||> (case domintros of NONE => I | SOME thms =>
-                   Local_Theory.note ((qualify "domintros", []), thms) #> snd)
+                Local_Theory.note ((qualify "domintros", []), thms) #> snd)
 
-        val info = { add_simps=addsmps, fnames=fnames, case_names=cnames, psimps=psimps',
+        val info =
+          { add_simps=addsmps, fnames=fnames, case_names=cnames, psimps=psimps',
           pinducts=snd pinducts', simps=NONE, inducts=NONE, termination=termination',
           fs=fs, R=R, dom=dom, defname=defname, is_partial=true, cases=flat cases',
           pelims=pelims',elims=NONE}
@@ -135,7 +138,7 @@
       in
         (info,
          lthy |> Local_Theory.declaration {syntax = false, pervasive = false}
-          (add_function_data o transform_function_data info))
+          (fn phi => add_function_data (transform_function_data phi info)))
       end
   in
     ((goal_state, afterqed), lthy')
@@ -197,18 +200,15 @@
         val tsimps = map remove_domain_condition psimps
         val tinduct = map remove_domain_condition pinducts
         val telims = map (map remove_domain_condition) pelims
-
-        fun qualify n = Binding.name n
-          |> Binding.qualify true defname
-
       in
         lthy
         |> add_simps I "simps" I simp_attribs tsimps
         ||>> Local_Theory.note
-           ((qualify "induct",
+           ((Binding.qualify_name true defname "induct",
              [Attrib.internal (K (Rule_Cases.case_names case_names))]),
             tinduct)
-        ||>> fold_map (note_qualified "elims" [Rule_Cases.consumes 1, Rule_Cases.constraints 1]) (fnames ~~ telims)
+        ||>> fold_map (note_qualified "elims" [Rule_Cases.consumes 1, Rule_Cases.constraints 1])
+          (fnames ~~ telims)
         |-> (fn ((simps,(_,inducts)), elims) => fn lthy =>
           let val info' = { is_partial=false, defname=defname, fnames=fnames, add_simps=add_simps,
             case_names=case_names, fs=fs, R=R, dom=dom, psimps=psimps, pinducts=pinducts,
@@ -217,7 +217,7 @@
             (info',
              lthy
              |> Local_Theory.declaration {syntax = false, pervasive = false}
-               (add_function_data o transform_function_data info')
+               (fn phi => add_function_data (transform_function_data phi info'))
              |> Spec_Rules.add Spec_Rules.Equational (fs, tsimps))
           end)
       end
@@ -291,5 +291,4 @@
     "prove termination of a recursive function"
     (Scan.option Parse.term >> termination_cmd)
 
-
 end