explicit name morphism function for locale interpretation
authorhaftmann
Mon, 17 Nov 2008 17:00:27 +0100
changeset 28822 7ca11ecbc4fb
parent 28821 78a6ed46ad04
child 28823 dcbef866c9e2
explicit name morphism function for locale interpretation
src/Pure/Isar/class.ML
src/Pure/Isar/locale.ML
src/Pure/Isar/theory_target.ML
--- a/src/Pure/Isar/class.ML	Mon Nov 17 17:00:26 2008 +0100
+++ b/src/Pure/Isar/class.ML	Mon Nov 17 17:00:27 2008 +0100
@@ -63,7 +63,7 @@
 (** auxiliary **)
 
 fun prove_interpretation tac prfx_atts expr inst =
-  Locale.interpretation_i I prfx_atts expr inst
+  Locale.interpretation I prfx_atts expr inst
   ##> Proof.global_terminal_proof
       (Method.Basic (fn ctxt => Method.SIMPLE_METHOD (tac ctxt), Position.none), NONE)
   ##> ProofContext.theory_of;
@@ -77,8 +77,11 @@
 
 val class_prefix = Logic.const_of_class o Sign.base_name;
 
+fun class_name_morphism class =
+  Name.map_prefix (K (Name.add_prefix false (class_prefix class)));
+
 fun activate_class_morphism thy class inst morphism =
-  Locale.get_interpret_morph thy class (false, class_prefix class) "" morphism class inst;
+  Locale.get_interpret_morph thy (class_name_morphism class) (class, "") morphism class inst;
 
 fun prove_class_interpretation class inst consts hyp_facts def_facts thy =
   let
@@ -92,7 +95,7 @@
   in
     thy
     |> fold2 add_constraint (map snd consts) no_constraints
-    |> prove_interpretation tac (false, prfx) (Locale.Locale class)
+    |> prove_interpretation tac (class_name_morphism class) (Locale.Locale class)
           (map SOME inst, map (pair (Attrib.no_binding) o Thm.prop_of) def_facts)
     ||> fold2 add_constraint (map snd consts) constraints
   end;
@@ -621,7 +624,7 @@
     val supconsts = map (apsnd fst o snd) (these_params thy sups);
   in
     thy
-    |> Locale.add_locale_i "" bname mergeexpr elems
+    |> Locale.add_locale "" bname mergeexpr elems
     |> snd
     |> ProofContext.theory_of
     |> adjungate_axclass bname class base_sort sups supsort supparams global_syntax
--- a/src/Pure/Isar/locale.ML	Mon Nov 17 17:00:26 2008 +0100
+++ b/src/Pure/Isar/locale.ML	Mon Nov 17 17:00:27 2008 +0100
@@ -63,10 +63,10 @@
   val declarations_of: theory -> string -> declaration list * declaration list;
 
   (* Processing of locale statements *)
-  val read_context_statement: xstring option -> Element.context list ->
+  val read_context_statement: string option -> Element.context list ->
     (string * string list) list list -> Proof.context ->
     string option * Proof.context * Proof.context * (term * term list) list list
-  val read_context_statement_i: string option -> Element.context list ->
+  val read_context_statement_cmd: xstring option -> Element.context list ->
     (string * string list) list list -> Proof.context ->
     string option * Proof.context * Proof.context * (term * term list) list list
   val cert_context_statement: string option -> Element.context_i list ->
@@ -82,9 +82,9 @@
   val print_locale: theory -> bool -> expr -> Element.context list -> unit
   val print_registrations: bool -> string -> Proof.context -> unit
 
-  val add_locale: string -> bstring -> expr -> Element.context list -> theory
+  val add_locale: string -> bstring -> expr -> Element.context_i list -> theory
     -> string * Proof.context
-  val add_locale_i: string -> bstring -> expr -> Element.context_i list -> theory
+  val add_locale_cmd: bstring -> expr -> Element.context list -> theory
     -> string * Proof.context
 
   (* Tactics *)
@@ -101,31 +101,25 @@
   val add_declaration: string -> declaration -> Proof.context -> Proof.context
 
   (* Interpretation *)
-  val get_interpret_morph: theory -> string -> bool * string -> string ->
+  val get_interpret_morph: theory -> (Name.binding -> Name.binding) -> string * string ->
     (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) ->
     string -> term list -> Morphism.morphism
-  val interpretation_i: (Proof.context -> Proof.context) ->
-    bool * string -> expr ->
+  val interpretation: (Proof.context -> Proof.context) ->
+    (Name.binding -> Name.binding) -> expr ->
     term option list * (Attrib.binding * term) list ->
     theory ->
     (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) * Proof.state
-  val interpretation: (Proof.context -> Proof.context) ->
-    bool * string -> expr ->
-    string option list * (Attrib.binding * string) list ->
-    theory ->
-    (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) * Proof.state
+  val interpretation_cmd: string -> expr -> string option list * (Attrib.binding * string) list ->
+    theory -> Proof.state
   val interpretation_in_locale: (Proof.context -> Proof.context) ->
     xstring * expr -> theory -> Proof.state
-  val interpret_i: (Proof.state -> Proof.state Seq.seq) ->
-    bool * string -> expr ->
+  val interpret: (Proof.state -> Proof.state Seq.seq) ->
+    (Name.binding -> Name.binding) -> expr ->
     term option list * (Attrib.binding * term) list ->
     bool -> Proof.state ->
     (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) * Proof.state
-  val interpret: (Proof.state -> Proof.state Seq.seq) ->
-    bool * string -> expr ->
-    string option list * (Attrib.binding * string) list ->
-    bool -> Proof.state ->
-    (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) * Proof.state
+  val interpret_cmd: string -> expr -> string option list * (Attrib.binding * string) list ->
+    bool -> Proof.state -> Proof.state
 end;
 
 structure Locale: LOCALE =
@@ -237,10 +231,8 @@
 (** management of registrations in theories and proof contexts **)
 
 type registration =
-  {prfx: (bool * string) * string,
-      (* first component: interpretation prefix;
-           if the Boolean flag is set, only accesses containing the prefix are generated,
-           otherwise the prefix may be omitted when accessing theorems etc.)
+  {prfx: (Name.binding -> Name.binding) * (string * string),
+      (* first component: interpretation name morphism;
          second component: parameter prefix *)
     exp: Morphism.morphism,
       (* maps content to its originating context *)
@@ -261,18 +253,18 @@
     val join: T * T -> T
     val dest: theory -> T ->
       (term list *
-        (((bool * string) * string) *
+        (((Name.binding -> Name.binding) * (string * string)) *
          (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) *
          Element.witness list *
          thm Termtab.table)) list
     val test: theory -> T * term list -> bool
     val lookup: theory ->
       T * (term list * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) ->
-      (((bool * string) * string) * Element.witness list * thm Termtab.table) option
-    val insert: theory -> term list -> ((bool * string) * string) ->
+      (((Name.binding -> Name.binding) * (string * string)) * Element.witness list * thm Termtab.table) option
+    val insert: theory -> term list -> ((Name.binding -> Name.binding) * (string * string)) ->
       (Morphism.morphism * ((typ Vartab.table * typ list) * (term Vartab.table * term list))) ->
       T ->
-      T * (term list * (((bool * string) * string) * Element.witness list)) list
+      T * (term list * (((Name.binding -> Name.binding) * (string * string)) * Element.witness list)) list
     val add_witness: term list -> Element.witness -> T -> T
     val add_equation: term list -> thm -> T -> T
 (*
@@ -511,7 +503,7 @@
                 ("Subsumed interpretation(s) of locale " ^
                  quote (extern thy name) ^
                  "\nwith the following prefix(es):" ^
-                  commas_quote (map (fn (_, ((_, s), _)) => s) sups))
+                  commas_quote (map (fn (_, ((_, (_, s)), _)) => s) sups))
               else ();
     in Symtab.update (name, reg') regs end) ctxt;
 
@@ -520,7 +512,6 @@
 fun put_local_registration id prfx morphs =
   Context.proof_map (put_registration id prfx morphs);
 
-
 fun put_registration_in_locale name id =
   change_locale name (fn (axiom, elems, params, decls, regs, intros, dests) =>
     (axiom, elems, params, decls, regs @ [(id, [])], intros, dests));
@@ -585,16 +576,10 @@
     fun prt_witns [] = Pretty.str "no witnesses."
       | prt_witns witns = Pretty.block (Pretty.str "witnesses:" :: Pretty.brk 1 ::
           Pretty.breaks (map (Element.pretty_witness ctxt) witns))
-    fun prt_reg (ts, ((_, ""), _, witns, eqns)) =
+    fun prt_reg (ts, (_, _, witns, eqns)) =
         if show_wits
           then Pretty.block (prt_core ts eqns @ [Pretty.fbrk, prt_witns witns])
           else Pretty.block (prt_core ts eqns)
-      | prt_reg (ts, (prfx, _, witns, eqns)) =
-        if show_wits
-          then Pretty.block ((prt_prfx prfx @ [Pretty.str ":", Pretty.brk 1] @
-            prt_core ts eqns @ [Pretty.fbrk, prt_witns witns]))
-          else Pretty.block ((prt_prfx prfx @
-            [Pretty.str ":", Pretty.brk 1] @ prt_core ts eqns));
 
     val loc_int = intern thy loc;
     val regs = RegistrationsData.get (Context.Proof ctxt);
@@ -604,7 +589,7 @@
         NONE => Pretty.str ("no interpretations")
       | SOME r => let
             val r' = Registrations.dest thy r;
-            val r'' = Library.sort_wrt (fn (_, ((_, prfx), _, _, _)) => prfx) r';
+            val r'' = Library.sort_wrt (fn (_, ((_, (_, prfx)), _, _, _)) => prfx) r';
           in Pretty.big_list ("interpretations:") (map prt_reg r'') end)
     |> Pretty.writeln
   end;
@@ -676,7 +661,7 @@
 fun params_of' elemss =
   distinct (eq_fst (op = : string * string -> bool)) (maps (snd o fst o fst) elemss);
 
-fun param_prefix params = space_implode "_" params;
+fun param_prefix locale_name params = (NameSpace.base locale_name, space_implode "_" params);
 
 
 (* CB: param_types has the following type:
@@ -969,9 +954,12 @@
         val mode' = map_mode (map (Element.map_witness (inst_wit all_params))) mode;
         val ren = map fst ps ~~ map (fn p => (p, lookup_syn p)) params;
         val [env] = unify_parms ctxt all_params [map (apfst (Element.rename ren) o apsnd SOME) ps];
+        val (locale_name, pprfx) = param_prefix name params;
+        val add_prefices = pprfx <> "" ? Name.add_prefix false pprfx
+          #> Name.add_prefix false locale_name;
         val elem_morphism =
           Element.rename_morphism ren $>
-          Morphism.name_morphism (Name.add_prefix false (param_prefix params)) $>
+          Morphism.name_morphism add_prefices $>
           Element.instT_morphism thy env;
         val elems' = map (Element.morph_ctxt elem_morphism) elems;
       in (((name, map (apsnd SOME) locale_params'), mode'), elems') end;
@@ -1044,7 +1032,7 @@
               val ps' = map (fn (n, SOME T) => Free (n, T)) ps;
             in if test_local_registration ctxt' (name, ps') then ctxt'
               else let
-                  val ctxt'' = put_local_registration (name, ps') ((true, ""), "")
+                  val ctxt'' = put_local_registration (name, ps') (I, (NameSpace.base name, ""))
                     (Morphism.identity, ((Vartab.empty, []), (Vartab.empty, []) )) ctxt'
                 in case mode of
                     Assumed axs =>
@@ -1582,8 +1570,8 @@
 val read_expr = prep_expr read_context;
 val cert_expr = prep_expr cert_context;
 
-fun read_context_statement loc = prep_statement intern read_ctxt loc;
-fun read_context_statement_i loc = prep_statement (K I) read_ctxt loc;
+fun read_context_statement loc = prep_statement (K I) read_ctxt loc;
+fun read_context_statement_cmd loc = prep_statement intern read_ctxt loc;
 fun cert_context_statement loc = prep_statement (K I) cert_ctxt loc;
 
 end;
@@ -1652,14 +1640,15 @@
 
 (* compute and apply morphism *)
 
-fun add_prefixes loc (sticky, interp_prfx) param_prfx binding =
+fun name_morph phi_name (locale_name, pprfx) binding =
   binding
-  |> (if sticky andalso not (Name.is_nothing binding) andalso param_prfx <> ""
-        then Name.add_prefix false param_prfx else I)
-  |> Name.add_prefix sticky interp_prfx
-  |> Name.add_prefix false (NameSpace.base loc ^ "_locale");
-
-fun inst_morph thy loc (sticky, interp_prfx) param_prfx insts prems eqns export =
+  |> (if not (Name.is_nothing binding) andalso pprfx <> ""
+        then Name.add_prefix false pprfx else I)
+  |> (if not (Name.is_nothing binding)
+        then Name.add_prefix false (locale_name ^ "_locale") else I)
+  |> phi_name;
+
+fun inst_morph thy phi_name param_prfx insts prems eqns export =
   let
     (* standardise export morphism *)
     val exp_fact = Drule.zero_var_indexes_list o map Thm.strip_shyps o Morphism.fact export;
@@ -1669,29 +1658,30 @@
     val export' =
       Morphism.morphism {name = I, var = I, typ = exp_typ, term = exp_term, fact = exp_fact};
   in
-    Morphism.name_morphism (add_prefixes loc (sticky, interp_prfx) param_prfx) $>
-      Element.inst_morphism thy insts $> Element.satisfy_morphism prems $>
+    Morphism.name_morphism (name_morph phi_name param_prfx) $>
+      Element.inst_morphism thy insts $>
+      Element.satisfy_morphism prems $>
       Morphism.term_morphism (MetaSimplifier.rewrite_term thy eqns []) $>
       Morphism.thm_morphism (MetaSimplifier.rewrite_rule eqns) $>
       export'
   end;
 
-fun activate_note thy loc (sticky, interp_prfx) param_prfx attrib insts prems eqns exp =
+fun activate_note thy phi_name param_prfx attrib insts prems eqns exp =
   (Element.facts_map o Element.morph_ctxt)
-      (inst_morph thy loc (sticky, interp_prfx) param_prfx insts prems eqns exp)
+      (inst_morph thy phi_name param_prfx insts prems eqns exp)
   #> Attrib.map_facts attrib;
 
 
 (* public interface to interpretation morphism *)
 
-fun get_interpret_morph thy loc (sticky, interp_prfx) param_prfx (exp, imp) target ext_ts =
+fun get_interpret_morph thy phi_name param_prfx (exp, imp) target ext_ts =
   let
     val parms = the_locale thy target |> #params |> map fst;
     val ids = flatten (ProofContext.init thy, intern_expr thy)
       (([], Symtab.empty), Expr (Locale target)) |> fst |> fst;
     val (insts, prems, eqns) = collect_witnesses (ProofContext.init thy) imp parms ids ext_ts;
   in
-    inst_morph thy loc (sticky, interp_prfx) param_prfx insts prems eqns exp
+    inst_morph thy phi_name param_prfx insts prems eqns exp
   end;
 
 (* store instantiations of args for all registered interpretations
@@ -1706,11 +1696,11 @@
     val regs = get_global_registrations thy target;
     (* add args to thy for all registrations *)
 
-    fun activate (ext_ts, (((sticky, interp_prfx), param_prfx), (exp, imp), _, _)) thy =
+    fun activate (ext_ts, ((phi_name, param_prfx), (exp, imp), _, _)) thy =
       let
         val (insts, prems, eqns) = collect_witnesses (ProofContext.init thy) imp parms ids ext_ts;
         val args' = args
-          |> activate_note thy target (sticky, interp_prfx) param_prfx
+          |> activate_note thy phi_name param_prfx
                (Attrib.attribute_i thy) insts prems eqns exp;
       in
         thy
@@ -2015,15 +2005,15 @@
 
 in
 
-val add_locale = gen_add_locale read_context intern_expr;
-val add_locale_i = gen_add_locale cert_context (K I);
+val add_locale = gen_add_locale cert_context (K I);
+val add_locale_cmd = gen_add_locale read_context intern_expr "";
 
 end;
 
 val _ = Context.>> (Context.map_theory
- (add_locale_i "" "var" empty [Fixes [(Name.binding (Name.internal "x"), NONE, NoSyn)]] #>
+ (add_locale "" "var" empty [Fixes [(Name.binding (Name.internal "x"), NONE, NoSyn)]] #>
   snd #> ProofContext.theory_of #>
-  add_locale_i "" "struct" empty [Fixes [(Name.binding (Name.internal "S"), NONE, Structure)]] #>
+  add_locale "" "struct" empty [Fixes [(Name.binding (Name.internal "S"), NONE, Structure)]] #>
   snd #> ProofContext.theory_of));
 
 
@@ -2032,7 +2022,7 @@
 (** Normalisation of locale statements ---
     discharges goals implied by interpretations **)
 
-local
+                                    local
 
 fun locale_assm_intros thy =
   Symtab.fold (fn (_, {intros = (a, _), ...}) => fn intros => (a @ intros))
@@ -2086,7 +2076,7 @@
 (* activate instantiated facts in theory or context *)
 
 fun gen_activate_facts_elemss mk_ctxt note attrib put_reg add_wit add_eqn
-        prfx all_elemss pss propss eq_attns (exp, imp) thmss thy_ctxt =
+        phi_name all_elemss pss propss eq_attns (exp, imp) thmss thy_ctxt =
   let
     val ctxt = mk_ctxt thy_ctxt;
     fun get_reg thy_ctxt = get_local_registration (mk_ctxt thy_ctxt);
@@ -2104,12 +2094,13 @@
 
     val thy_ctxt' = thy_ctxt
       (* add registrations *)
-      |> fold (fn (((id, _), _), ps) => put_reg id (prfx, param_prefix ps) (exp, imp)) (new_elemss ~~ new_pss)
+      |> fold2 (fn ((id as (loc, _), _), _) => fn ps => put_reg id (phi_name, param_prefix loc ps) (exp, imp))
+           new_elemss new_pss
       (* add witnesses of Assumed elements (only those generate proof obligations) *)
-      |> fold (fn (id, thms) => fold (add_wit id) thms) (map fst new_propss ~~ new_thmss)
+      |> fold2 (fn (id, _) => fold (add_wit id)) new_propss new_thmss
       (* add equations *)
-      |> fold (fn (id, thms) => fold (add_eqn id) thms) (map fst eq_props ~~
-          (map o map) (Drule.abs_def o LocalDefs.meta_rewrite_rule ctxt o
+      |> fold2 (fn (id, _) => fold (add_eqn id)) eq_props
+          ((map o map) (Drule.abs_def o LocalDefs.meta_rewrite_rule ctxt o
             Element.conclude_witness) eq_thms);
 
     val prems = flat (map_filter
@@ -2118,22 +2109,23 @@
 
     val thy_ctxt'' = thy_ctxt'
       (* add witnesses of Derived elements *)
-      |> fold (fn (id, thms) => fold (add_wit id o Element.morph_witness (Element.satisfy_morphism prems)) thms)
+      |> fold (fn (id, thms) => fold
+           (add_wit id o Element.morph_witness (Element.satisfy_morphism prems)) thms)
          (map_filter (fn ((_, Assumed _), _) => NONE
             | ((id, Derived thms), _) => SOME (id, thms)) new_elemss)
 
-    fun activate_elem loc (sticky, interp_prfx) param_prfx insts prems eqns exp (Notes (kind, facts)) thy_ctxt =
+    fun activate_elem phi_name param_prfx insts prems eqns exp (Notes (kind, facts)) thy_ctxt =
         let
           val ctxt = mk_ctxt thy_ctxt;
           val thy = ProofContext.theory_of ctxt;
           val facts' = facts
-            |> activate_note thy loc (sticky, interp_prfx) param_prfx
+            |> activate_note thy phi_name param_prfx
                  (attrib thy_ctxt) insts prems eqns exp;
         in 
           thy_ctxt
           |> fold (snd oo note kind) facts'
         end
-      | activate_elem _ _ _ _ _ _ _ _ thy_ctxt = thy_ctxt;
+      | activate_elem _ _ _ _ _ _ _ thy_ctxt = thy_ctxt;
 
     fun activate_elems (((loc, ext_ts), _), _) ps thy_ctxt =
       let
@@ -2141,13 +2133,13 @@
         val thy = ProofContext.theory_of ctxt;
         val {params, elems, ...} = the_locale thy loc;
         val parms = map fst params;
-        val param_prfx = param_prefix ps;
+        val param_prfx = param_prefix loc ps;
         val ids = flatten (ProofContext.init thy, intern_expr thy)
           (([], Symtab.empty), Expr (Locale loc)) |> fst |> fst;
         val (insts, prems, eqns) = collect_witnesses ctxt imp parms ids ext_ts;
       in
         thy_ctxt
-        |> fold (activate_elem loc prfx param_prfx insts prems eqns exp o fst) elems
+        |> fold (activate_elem phi_name param_prfx insts prems eqns exp o fst) elems
       end;
 
   in
@@ -2236,7 +2228,7 @@
 
 fun gen_prep_registration mk_ctxt test_reg activate
     prep_attr prep_expr prep_insts
-    thy_ctxt prfx raw_expr raw_insts =
+    thy_ctxt phi_name raw_expr raw_insts =
   let
     val ctxt = mk_ctxt thy_ctxt;
     val thy = ProofContext.theory_of ctxt;
@@ -2301,7 +2293,7 @@
     val propss = map extract_asms_elems inst_elemss @ eqn_elems;
 
   in
-    (propss, activate prfx inst_elemss (map (snd o fst) ids) propss eq_attns morphs, morphs)
+    (propss, activate phi_name inst_elemss (map (snd o fst) ids) propss eq_attns morphs, morphs)
   end;
 
 fun gen_prep_global_registration mk_ctxt = gen_prep_registration ProofContext.init
@@ -2313,14 +2305,14 @@
   local_activate_facts_elemss mk_ctxt;
 
 val prep_global_registration = gen_prep_global_registration
+  (K I) (K I) check_instantiations;
+val prep_global_registration_cmd = gen_prep_global_registration
   Attrib.intern_src intern_expr read_instantiations;
-val prep_global_registration_i = gen_prep_global_registration
-  (K I) (K I) check_instantiations;
 
 val prep_local_registration = gen_prep_local_registration
+  (K I) (K I) check_instantiations;
+val prep_local_registration_cmd = gen_prep_local_registration
   Attrib.intern_src intern_expr read_instantiations;
-val prep_local_registration_i = gen_prep_local_registration
-  (K I) (K I) check_instantiations;
 
 fun prep_registration_in_locale target expr thy =
   (* target already in internal form *)
@@ -2362,7 +2354,7 @@
                 |> fold (add_witness_in_locale target id) thms
           | activate_id _ thy = thy;
 
-        fun activate_reg (ext_ts, (((sticky, interp_prfx), param_prfx), (exp, imp), _, _)) thy =
+        fun activate_reg (ext_ts, ((phi_name, param_prfx), (exp, imp), _, _)) thy =
           let
             val (insts, wits, _) = collect_witnesses (ProofContext.init thy) imp fixed target_ids ext_ts;
             val inst_parms = map (the o AList.lookup (op =) (map #1 fixed ~~ ext_ts));
@@ -2376,7 +2368,7 @@
                 if test_global_registration thy (name, ps')
                 then thy
                 else thy
-                  |> put_global_registration (name, ps') ((sticky, interp_prfx), param_prefix ps) (exp, imp)
+                  |> put_global_registration (name, ps') (phi_name, param_prefix name ps) (exp, imp)
                   |> fold (fn witn => fn thy => add_global_witness (name, ps')
                      (Element.morph_witness (Element.inst_morphism thy insts) witn) thy) thms
               end;
@@ -2388,7 +2380,7 @@
                 if test_global_registration thy (name, ps')
                 then thy
                 else thy
-                  |> put_global_registration (name, ps') ((sticky, interp_prfx), param_prefix ps) (exp, imp)
+                  |> put_global_registration (name, ps') (phi_name, param_prefix name ps) (exp, imp)
                   |> fold (fn witn => fn thy => add_global_witness (name, ps')
                        (witn |> Element.map_witness (fn (t, th) =>  (* FIXME *)
                        (Element.inst_term insts t,
@@ -2398,14 +2390,14 @@
             fun activate_elem (loc, ps) (Notes (kind, facts)) thy =
                 let
                   val att_morphism =
-                    Morphism.name_morphism (add_prefixes loc (sticky, interp_prfx) param_prfx) $>
+                    Morphism.name_morphism (name_morph phi_name param_prfx) $>
                     Morphism.thm_morphism satisfy $>
                     Element.inst_morphism thy insts $>
                     Morphism.thm_morphism disch;
                   val facts' = facts
                     |> Attrib.map_facts (Attrib.attribute_i thy o Args.morph_values att_morphism)
                     |> (map o apsnd o map o apfst o map) (disch o Element.inst_thm thy insts o satisfy)
-                    |> (map o apfst o apfst) (add_prefixes loc (sticky, interp_prfx) param_prfx);
+                    |> (map o apfst o apfst) (name_morph phi_name param_prfx);
                 in
                   thy
                   |> fold (snd oo global_note_prefix kind) facts'
@@ -2446,12 +2438,11 @@
     |> pair morphs
   end;
 
-fun gen_interpret prep_registration after_qed prfx expr insts int state =
-  (* prfx = (flag indicating full qualification, name prefix) *)
+fun gen_interpret prep_registration after_qed name_morph expr insts int state =
   let
     val _ = Proof.assert_forward_or_chain state;
     val ctxt = Proof.context_of state;
-    val (propss, activate, morphs) = prep_registration ctxt prfx expr insts;
+    val (propss, activate, morphs) = prep_registration ctxt name_morph expr insts;
     fun after_qed' results =
       Proof.map_context (K (ctxt |> activate (prep_result propss results)))
       #> Proof.put_facts NONE
@@ -2464,11 +2455,19 @@
     |> pair morphs
   end;
 
+fun standard_name_morph interp_prfx binding =
+  if Name.is_nothing binding then binding
+  else Name.map_prefix (fn ((locale_name, _) :: pprfx) =>
+    fold (Name.add_prefix false o fst) pprfx
+    #> interp_prfx <> "" ? Name.add_prefix true interp_prfx
+    #> Name.add_prefix false locale_name
+  ) binding;
+
 in
 
-val interpretation_i = gen_interpretation prep_global_registration_i;
 val interpretation = gen_interpretation prep_global_registration;
-
+fun interpretation_cmd interp_prfx = snd ooo gen_interpretation prep_global_registration_cmd
+  I (standard_name_morph interp_prfx);
 
 fun interpretation_in_locale after_qed (raw_target, expr) thy =
   let
@@ -2489,8 +2488,9 @@
     |> Element.refine_witness |> Seq.hd
   end;
 
-val interpret_i = gen_interpret prep_local_registration_i;
 val interpret = gen_interpret prep_local_registration;
+fun interpret_cmd interp_prfx = snd oooo gen_interpret prep_local_registration_cmd
+  Seq.single (standard_name_morph interp_prfx);
 
 end;
 
--- a/src/Pure/Isar/theory_target.ML	Mon Nov 17 17:00:26 2008 +0100
+++ b/src/Pure/Isar/theory_target.ML	Mon Nov 17 17:00:27 2008 +0100
@@ -186,7 +186,7 @@
   let
     val c' = Morphism.name phi c;
     val rhs' = Morphism.term phi rhs;
-    val name' = Name.name_of c';
+    val name' = Name.name_with_prefix c';
     val legacy_arg = (name', Term.close_schematic_term (Logic.legacy_varify rhs'));
     val arg = (name', Term.close_schematic_term rhs');
     val similar_body = Type.similar_types (rhs, rhs');
@@ -197,7 +197,10 @@
   in
     not (is_class andalso (similar_body orelse class_global)) ?
       (Context.mapping_result
-        (Sign.add_abbrev PrintMode.internal tags legacy_arg)
+        (fn thy => thy |> 
+          Sign.no_base_names
+          |> Sign.add_abbrev PrintMode.internal tags legacy_arg
+          ||> Sign.restore_naming thy)
         (ProofContext.add_abbrev PrintMode.internal tags arg)
       #-> (fn (lhs' as Const (d, _), _) =>
           similar_body ?