Nominal/NewParser.thy
changeset 2304 8a98171ba1fc
parent 2302 c6db12ddb60c
child 2305 93ab397f5980
--- a/Nominal/NewParser.thy	Thu May 27 18:40:10 2010 +0200
+++ b/Nominal/NewParser.thy	Mon May 31 19:57:29 2010 +0200
@@ -140,7 +140,7 @@
 fun rawify_bn_funs dts_env cnstrs_env bn_fun_env bn_funs bn_eqs =
 let
   val bn_funs' = map (fn (bn, ty, mx) => 
-    (raw_bind bn, replace_typ dts_env ty, mx)) bn_funs
+    (raw_bind bn, SOME (replace_typ dts_env ty), mx)) bn_funs
   
   val bn_eqs' = map (fn (attr, trm) => 
     (attr, replace_term (cnstrs_env @ bn_fun_env) dts_env trm)) bn_eqs
@@ -229,6 +229,8 @@
 end
 *}
 
+ML {* rawify_bn_funs *}
+
 ML {*
 fun raw_nominal_decls dts bn_funs bn_eqs binds lthy =
 let
@@ -254,20 +256,37 @@
     (bn_fun_strs ~~ bn_fun_strs')
   
   val (raw_dt_names, raw_dts) = rawify_dts dt_names dts dts_env
-  val raw_dt_names' =  map (Long_Name.qualify thy_name) raw_dt_names
   val (raw_bn_funs, raw_bn_eqs) = rawify_bn_funs dts_env cnstrs_env bn_fun_env bn_funs bn_eqs 
   val raw_bclauses = rawify_bclauses dts_env cnstrs_env bn_fun_full_env binds 
 
   val (raw_dt_full_names, lthy1) = add_datatype_wrapper raw_dt_names raw_dts lthy
-  val (raw_bn_funs', raw_bn_eqs', lthy2) = add_primrec_wrapper raw_bn_funs raw_bn_eqs lthy1
+   
+in
+  (dt_full_names', raw_dt_full_names, raw_dts, raw_bclauses, raw_bn_funs, raw_bn_eqs, lthy1)
+end
+*}
+
+ML {*
+fun raw_bn_decls dt_names dts raw_bn_funs raw_bn_eqs constr_thms lthy =
+let
+  val (_, lthy2) = Function.add_function raw_bn_funs raw_bn_eqs
+    Function_Common.default_config (pat_completeness_simp constr_thms) lthy
+
+  val (info, lthy3) = prove_termination (Local_Theory.restore lthy2)
+  val {fs, simps, inducts, ...} = info;
+
+  val raw_bn_induct = Rule_Cases.strict_mutual_rule lthy3 (the inducts)
+  val raw_bn_eqs = the simps
 
   val raw_bn_info = 
-    prep_bn_info lthy dt_full_names' raw_dts (map prop_of raw_bn_eqs')
+    prep_bn_info lthy dt_names dts (map prop_of raw_bn_eqs)
+
 in
-  (raw_dt_full_names, raw_bclauses, raw_bn_funs', raw_bn_eqs', raw_bn_info, lthy2)
+  (fs, raw_bn_eqs, raw_bn_info, raw_bn_induct, lthy3)
 end
 *}
 
+
 lemma equivp_hack: "equivp x"
 sorry
 ML {*
@@ -368,24 +387,31 @@
 fun nominal_datatype2 dts bn_funs bn_eqs bclauses lthy =
 let
   (* definition of the raw datatypes *)
-  val (raw_dt_names, raw_bclauses, raw_bn_funs, raw_bn_eqs, raw_bn_info, lthy1) =
+  val (dt_names, raw_dt_names, raw_dts, raw_bclauses, raw_bn_funs, raw_bn_eqs, lthy0) =
     if get_STEPS lthy > 1 
     then raw_nominal_decls dts bn_funs bn_eqs bclauses lthy
     else raise TEST lthy
 
-  val dtinfo = Datatype.the_info (ProofContext.theory_of lthy1) (hd raw_dt_names)
+  val dtinfo = Datatype.the_info (ProofContext.theory_of lthy0) (hd raw_dt_names)
   val {descr, sorts, ...} = dtinfo
   val all_tys = map (fn (i, _) => nth_dtyp descr sorts i) descr
   val all_full_tnames = map (fn (_, (n, _, _)) => n) descr
-  val dtinfos = map (Datatype.the_info (ProofContext.theory_of lthy1)) all_full_tnames
+  val dtinfos = map (Datatype.the_info (ProofContext.theory_of lthy0)) all_full_tnames
   
   val inject_thms = flat (map #inject dtinfos);
   val distinct_thms = flat (map #distinct dtinfos);
+  val constr_thms = inject_thms @ distinct_thms
   val rel_dtinfos = List.take (dtinfos, (length dts)); 
   val raw_constrs_distinct = (map #distinct rel_dtinfos); 
   val induct_thm = #induct dtinfo;
   val exhaust_thms = map #exhaust dtinfos;
 
+  val (raw_bn_funs, raw_bn_eqs, raw_bn_info, raw_bn_induct, lthy1) =
+    if get_STEPS lthy0 > 1 
+    then raw_bn_decls dt_names raw_dts raw_bn_funs raw_bn_eqs constr_thms lthy0
+    else raise TEST lthy0
+
+
   val bn_nos = map (fn (_, i, _) => i) raw_bn_info;
   val bns = raw_bn_funs ~~ bn_nos;
 
@@ -407,7 +433,7 @@
 
   val (raw_fvs, raw_fv_bns, raw_fv_defs, lthy3a) = 
     if get_STEPS lthy2 > 3 
-    then define_raw_fvs descr sorts raw_bn_info raw_bclauses lthy3
+    then define_raw_fvs descr sorts raw_bn_info raw_bclauses constr_thms lthy3
     else raise TEST lthy3
 
   (* definition of raw alphas *)