Quot/Nominal/Perm.thy
changeset 1252 4b0563bc4b03
parent 1249 ea6a52a4f5bf
child 1253 cff8a67691d2
--- a/Quot/Nominal/Perm.thy	Wed Feb 24 17:32:22 2010 +0100
+++ b/Quot/Nominal/Perm.thy	Wed Feb 24 17:32:43 2010 +0100
@@ -9,7 +9,55 @@
 *}
 
 ML {*
+fun prove_perm_empty lthy induct perm_def perm_frees =
+let
+  val perm_types = map fastype_of perm_frees;
+  val perm_indnames = Datatype_Prop.make_tnames (map body_type perm_types);
+  val gl =
+    HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj
+      (map (fn ((perm, T), x) => HOLogic.mk_eq
+          (perm $ @{term "0 :: perm"} $ Free (x, T),
+           Free (x, T)))
+       (perm_frees ~~
+        map body_type perm_types ~~ perm_indnames)));
+  fun tac _ =
+    EVERY [
+      indtac induct perm_indnames 1,
+      ALLGOALS (asm_full_simp_tac (HOL_ss addsimps (@{thm permute_zero} :: perm_def)))
+    ];
+in
+  split_conj_thm (Goal.prove lthy perm_indnames [] gl tac)
+end;
+*}
 
+ML {*
+fun prove_perm_append lthy induct perm_def perm_frees =
+let
+  val add_perm = @{term "op + :: (perm \<Rightarrow> perm \<Rightarrow> perm)"}
+  val pi1 = Free ("pi1", @{typ perm});
+  val pi2 = Free ("pi2", @{typ perm});
+  val perm_types = map fastype_of perm_frees
+  val perm_indnames = Datatype_Prop.make_tnames (map body_type perm_types);
+  val gl =
+    (HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj
+      (map (fn ((perm, T), x) =>
+          let
+            val lhs = perm $ (add_perm $ pi1 $ pi2) $ Free (x, T)
+            val rhs = perm $ pi1 $ (perm $ pi2 $ Free (x, T))
+          in HOLogic.mk_eq (lhs, rhs)
+          end)
+        (perm_frees ~~ map body_type perm_types ~~ perm_indnames))))
+  fun tac _ =
+    EVERY [
+      indtac induct perm_indnames 1,
+      ALLGOALS (asm_full_simp_tac (HOL_ss addsimps (@{thm permute_plus} :: perm_def)))
+    ]
+in
+  split_conj_thm (Goal.prove lthy ("pi1" :: "pi2" :: perm_indnames) [] gl tac)
+end;
+*}
+
+ML {*
 (* TODO: full_name can be obtained from new_type_names with Datatype *)
 fun define_raw_perms new_type_names full_tnames thy =
 let
@@ -22,7 +70,6 @@
   val perm_types = map (fn (i, _) =>
     let val T = nth_dtyp i
     in @{typ perm} --> T --> T end) descr;
-  val perm_indnames = Datatype_Prop.make_tnames (map body_type perm_types);
   val perm_names_types' = perm_names' ~~ perm_types;
   val pi = Free ("pi", @{typ perm});
   fun perm_eq_constr i (cname, dts) =
@@ -60,48 +107,21 @@
         (map (fn s => (Binding.name s, NONE, NoSyn)) perm_names') perm_eqs lthy;
     val perm_frees =
       (distinct (op =)) (map (fst o strip_comb o fst o HOLogic.dest_eq o HOLogic.dest_Trueprop o prop_of) perm_ldef);
-    val perm_empty_thms =
-      let
-        val gl =
-          HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj
-            (map (fn ((perm, T), x) => HOLogic.mk_eq
-                (perm $ @{term "0 :: perm"} $ Free (x, T),
-                 Free (x, T)))
-             (perm_frees ~~
-              map body_type perm_types ~~ perm_indnames)));
-        fun tac {context = ctxt, ...} =
-          EVERY [
-            indtac induct perm_indnames 1,
-            ALLGOALS (asm_full_simp_tac (@{simpset} addsimps perm_ldef))
-          ];
-      in
-        (List.take (split_conj_thm (Goal.prove lthy' perm_indnames [] gl tac), length new_type_names))
-      end;
-    val add_perm = @{term "op + :: (perm \<Rightarrow> perm \<Rightarrow> perm)"}
-    val pi1 = Free ("pi1", @{typ perm});
-    val pi2 = Free ("pi2", @{typ perm});
-    val perm_append_thms =
-       List.take ((split_conj_thm
-         (Goal.prove lthy' ("pi1" :: "pi2" :: perm_indnames) []
-            (HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj
-               (map (fn ((perm, T), x) =>
-                   let
-                     val lhs = perm $ (add_perm $ pi1 $ pi2) $ Free (x, T)
-                     val rhs = perm $ pi1 $ (perm $ pi2 $ Free (x, T))
-                   in HOLogic.mk_eq (lhs, rhs)
-                   end)
-                 (perm_frees ~~
-                  map body_type perm_types ~~ perm_indnames))))
-            (fn _ => EVERY [indtac induct perm_indnames 1,
-               ALLGOALS (asm_full_simp_tac (@{simpset} addsimps perm_ldef))]))),
-          length new_type_names);
-    fun tac ctxt perm_thms =
+    val perm_empty_thms = List.take (prove_perm_empty lthy' induct perm_ldef perm_frees, length new_type_names);
+    val perm_append_thms = List.take (prove_perm_append lthy' induct perm_ldef perm_frees, length new_type_names)
+    val perms_name = space_implode "_" perm_names'
+    val perms_zero_bind = Binding.name (perms_name ^ "_zero")
+    val perms_append_bind = Binding.name (perms_name ^ "_append")
+    fun tac _ perm_thms =
       (Class.intro_classes_tac []) THEN (ALLGOALS (
-        simp_tac (@{simpset} addsimps perm_thms
+        simp_tac (HOL_ss addsimps perm_thms
       )));
     fun morphism phi = map (Morphism.thm phi);
   in
-    Class_Target.prove_instantiation_exit_result morphism tac (perm_empty_thms @ perm_append_thms) lthy'
+  lthy'
+  |> snd o (Local_Theory.note ((perms_zero_bind, []), perm_empty_thms))
+  |> snd o (Local_Theory.note ((perms_append_bind, []), perm_append_thms))
+  |> Class_Target.prove_instantiation_exit_result morphism tac (perm_empty_thms @ perm_append_thms)
   end
 
 *}