
diff -r bcf558c445a4 -r 90779aefbf1a Nominal/Nominal2.thy
--- a/Nominal/Nominal2.thy	Wed Dec 08 13:16:25 2010 +0000
+++ b/Nominal/Nominal2.thy	Wed Dec 08 17:07:08 2010 +0000
@@ -15,6 +15,47 @@
 use "nominal_dt_quot.ML"
 ML {* open Nominal_Dt_Quot *}
 
+ML {*
+fun strip_prems_concl trm =
+  (Logic.strip_imp_prems trm, Logic.strip_imp_concl trm)
+
+fun strip_outer_params (Const("all", _) $ Abs (a, T, t)) = strip_outer_params t |>> cons (a, T)
+  | strip_outer_params B = ([], B)
+*}
+
+ML {*
+fun prove_strong_exhausts lthy qexhausts qtrms bclausess =
+  let
+    val (cses, main_concls) = qexhausts
+      |> map prop_of
+      |> map strip_prems_concl
+      |> split_list
+
+    fun process_case cse bclauses =
+      let
+        val (params, (body, concl)) = cse
+          |> strip_outer_params
+          ||> Logic.dest_implies
+      in
+        Logic.mk_implies (body, concl) 
+      end  
+  
+    val cses' = map2 (map2 process_case) cses bclausess
+      |> map (map (Syntax.string_of_term lthy))
+      |> map commas
+      |> cat_lines
+
+    val _ = tracing ("cases\n " ^ cses')
+  in
+    ()
+  end
+*}
+
+ML {*
+val eqvt_attr = Attrib.internal (K Nominal_ThmDecls.eqvt_add)
+val rsp_attr = Attrib.internal (K Quotient_Info.rsp_rules_add)
+val simp_attr = Attrib.internal (K Simplifier.simp_add)
+*}
 
 section{* Interface for nominal_datatype *}
 
@@ -165,6 +206,7 @@
     then define_raw_dts dts bn_funs bn_eqs bclauses lthy
     else raise TEST lthy
 
+  val _ = tracing ("bclauses\n" ^ cat_lines (map @{make_string} bclauses))
   val _ = tracing ("raw_bclauses\n" ^ cat_lines (map @{make_string} raw_bclauses))
 
   val dtinfo = Datatype.the_info (ProofContext.theory_of lthy0) (hd raw_dt_names)
@@ -524,6 +566,8 @@
     then prove_permute_bn_thms qtys qbns qperm_bns qinduct qperm_bn_simps qbn_defs qfv_qbn_eqvts lthyC
     else []
 
+  val qstrong_exhaust_thms = prove_strong_exhausts lthyC qexhausts qtrms bclauses
+
   (* noting the theorems *)  
 
   (* generating the prefix for the theorem names *)




