src/Pure/Isar/local_theory.ML
changeset 28395 984fcc8feb24
parent 28379 0de8a35b866a
child 28406 daeb21fec18f
--- a/src/Pure/Isar/local_theory.ML	Mon Sep 29 10:58:01 2008 +0200
+++ b/src/Pure/Isar/local_theory.ML	Mon Sep 29 10:58:03 2008 +0200
@@ -42,6 +42,9 @@
   val restore: local_theory -> local_theory
   val reinit: local_theory -> local_theory
   val exit: local_theory -> Proof.context
+  val exit_global: local_theory -> theory
+  val exit_result: (morphism -> 'a -> 'b) -> 'a * local_theory -> 'b * Proof.context
+  val exit_result_global: (morphism -> 'a -> 'b) -> 'a * local_theory -> 'b * theory
 end;
 
 structure LocalTheory: LOCAL_THEORY =
@@ -178,15 +181,14 @@
 fun note kind (a, ths) = notes kind [(a, [(ths, [])])] #>> the_single;
 
 fun target_morphism lthy =
-  ProofContext.export_morphism lthy (target_of lthy) $>
-  Morphism.thm_morphism Goal.norm_result;
+  ProofContext.norm_export_morphism lthy (target_of lthy);
 
 fun notation add mode raw_args lthy =
   let val args = map (apfst (Morphism.term (target_morphism lthy))) raw_args
   in term_syntax (ProofContext.target_notation add mode args) lthy end;
 
 
-(* init -- exit *)
+(* init *)
 
 fun init theory_prefix operations target = target |> Data.map
   (fn NONE => SOME (make_lthy ("", theory_prefix, operations, target))
@@ -198,6 +200,24 @@
   in init theory_prefix operations target end;
 
 val reinit = checkpoint o operation #reinit;
+
+
+(* exit *)
+
 val exit = ProofContext.theory Theory.checkpoint o operation #exit;
+val exit_global = ProofContext.theory_of o exit;
+
+fun exit_result f (x, lthy) =
+  let
+    val ctxt = exit lthy;
+    val phi = ProofContext.norm_export_morphism lthy ctxt;
+  in (f phi x, ctxt) end;
+
+fun exit_result_global f (x, lthy) =
+  let
+    val thy = exit_global lthy;
+    val thy_ctxt = ProofContext.init thy;
+    val phi = ProofContext.norm_export_morphism lthy thy_ctxt;
+  in (f phi x, thy) end;
 
 end;