QuotMain.thy
changeset 41 72d63aa8af68
parent 40 c8187c293587
child 44 f078dbf557b7
--- a/QuotMain.thy	Fri Sep 25 19:26:18 2009 +0200
+++ b/QuotMain.thy	Mon Sep 28 02:39:44 2009 +0200
@@ -154,9 +154,8 @@
     (HOLogic.exists_const ty $ 
        lambda x (HOLogic.mk_eq (c, (rel $ x))))
 end
-*}
 
-ML {*
+
 (* makes the new type definitions and proves non-emptyness*)
 fun typedef_make (qty_name, rel, ty) lthy =
 let  
@@ -172,9 +171,8 @@
          (typedef_term rel ty lthy)
            NONE typedef_tac) lthy
 end
-*}
 
-ML {*
+
 (* tactic to prove the QUOT_TYPE theorem for the new type *)
 fun typedef_quot_type_tac equiv_thm (typedef_info: Typedef.info) =
 let
@@ -195,6 +193,7 @@
           rtac rep_inj]
 end
 
+
 fun typedef_quot_type_thm (rel, abs, rep, equiv_thm, typedef_info) lthy =
 let
   val quot_type_const = Const (@{const_name "QUOT_TYPE"}, dummyT)
@@ -204,9 +203,8 @@
   Goal.prove lthy [] [] goal
     (K (typedef_quot_type_tac equiv_thm typedef_info))
 end
-*}
 
-ML {*
+
 (* proves the quotient theorem *)
 fun typedef_quotient_thm (rel, abs, rep, abs_def, rep_def, quot_type_thm) lthy =
 let
@@ -430,19 +428,22 @@
   in
    (case (lookup (Context.Proof lthy) s) of
       SOME info => (list_comb (Const (#mapfun info, ftys ---> oty --> nty), fs), (oty, nty))
-    | NONE => raise ERROR ("no map association for type " ^ s))
+    | NONE      => raise ERROR ("no map association for type " ^ s))
   end
 
   fun get_const abs = (Const ("QuotMain.ABS_" ^ qty_name, rty --> qty), (rty, qty))
     | get_const rep = (Const ("QuotMain.REP_" ^ qty_name, qty --> rty), (qty, rty))
+
+  fun mk_identity ty = Abs ("x", ty, Bound 0)
+
 in
   if ty = qty
   then (get_const abs_or_rep)
   else (case ty of
-          TFree _ => (Abs ("x", ty, Bound 0), (ty, ty))
-        | Type (_, []) => (Abs ("x", ty, Bound 0), (ty, ty))
+          TFree _ => (mk_identity ty, (ty, ty))
+        | Type (_, []) => (mk_identity ty, (ty, ty))
         | Type (s, tys) => get_fun_aux s (map (get_fun abs_or_rep rty qty lthy) tys)
-        | _ => raise ERROR ("no variables")
+        | _ => raise ERROR ("no type variables")
        )
 end
 *}
@@ -455,6 +456,7 @@
 *}
 
 
+text {* produces the definition for a lifted constant *}
 ML {*
 fun get_const_def nconst oconst rty qty lthy =
 let
@@ -478,11 +480,13 @@
 
 ML {*
 fun exchange_ty rty qty ty =
-  if ty = rty then qty
+  if ty = rty 
+  then qty
   else
     (case ty of
        Type (s, tys) => Type (s, map (exchange_ty rty qty) tys)
-      | _ => ty)
+      | _ => ty
+    )
 *}
 
 ML {*
@@ -498,20 +502,15 @@
 *}
 
 local_setup {*
-  make_const_def @{binding VR} @{term "vr"} NoSyn @{typ "t"} @{typ "qt"} #> snd
-*}
-
-local_setup {*
-  make_const_def @{binding AP} @{term "ap"} NoSyn @{typ "t"} @{typ "qt"} #> snd
-*}
-
-local_setup {*
+  make_const_def @{binding VR} @{term "vr"} NoSyn @{typ "t"} @{typ "qt"} #> snd #>
+  make_const_def @{binding AP} @{term "ap"} NoSyn @{typ "t"} @{typ "qt"} #> snd #>
   make_const_def @{binding LM} @{term "lm"} NoSyn @{typ "t"} @{typ "qt"} #> snd
 *}
 
-thm VR_def
-thm AP_def
-thm LM_def
+term vr
+term ap
+term lm
+thm VR_def AP_def LM_def
 term LM
 term VR
 term AP
@@ -534,20 +533,15 @@
 print_theorems
 
 local_setup {*
-  make_const_def @{binding VR'} @{term "vr'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd
-*}
-
-local_setup {*
-  make_const_def @{binding AP'} @{term "ap'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd
-*}
-
-local_setup {*
+  make_const_def @{binding VR'} @{term "vr'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd #>
+  make_const_def @{binding AP'} @{term "ap'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd #>
   make_const_def @{binding LM'} @{term "lm'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd
 *}
 
-thm VR'_def
-thm AP'_def
-thm LM'_def
+term vr'
+term ap'
+term ap'
+thm VR'_def AP'_def LM'_def
 term LM'
 term VR'
 term AP'
@@ -648,7 +642,7 @@
  Maybe make_const_def should require a theorem that says that the particular lifted function
  respects the relation. With it such a definition would be impossible:
  make_const_def @{binding CARD} @{term "length"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
-*} *)
+*}*)
 
 lemma card1_rsp:
   fixes a b :: "'a list"
@@ -823,34 +817,39 @@
 
 ML {*
   fun mk_rep_abs x = @{term REP_fset} $ (@{term ABS_fset} $ x)
-  val consts = [@{const_name "Nil"}, @{const_name "append"}, @{const_name "Cons"}, @{const_name "membship"}, @{const_name "card1"}]
+  val consts = [@{const_name "Nil"}, @{const_name "append"}, 
+                @{const_name "Cons"}, @{const_name "membship"}, 
+                @{const_name "card1"}]
 *}
 
 ML {*
-fun build_goal thm constructors lifted_type mk_rep_abs =
-  let
+fun build_goal ctxt thm constructors qty mk_rep_abs =
+let
     fun is_const (Const (x, t)) = x mem constructors
       | is_const _ = false
+  
     fun maybe_mk_rep_abs t =
-      let
-        val _ = writeln ("Maybe: " ^ Syntax.string_of_term @{context} t)
-      in
-        if type_of t = lifted_type then mk_rep_abs t else t
-      end
-      handle TYPE _ => t
+    let
+      val _ = writeln ("Maybe: " ^ Syntax.string_of_term ctxt t)
+    in
+      if type_of t = qty then mk_rep_abs t else t
+    end
+    handle TYPE _ => t
+  
     fun build_aux (Abs (s, t, tr)) = (Abs (s, t, build_aux tr))
       | build_aux (f $ a) =
           let
             val (f, args) = strip_comb (f $ a)
-            val _ = writeln (Syntax.string_of_term @{context} f)
+            val _ = writeln (Syntax.string_of_term ctxt f)
            in
             (if is_const f then maybe_mk_rep_abs (list_comb (f, (map maybe_mk_rep_abs (map build_aux args))))
             else list_comb ((build_aux f), (map build_aux args)))
           end
       | build_aux x =
           if is_const x then maybe_mk_rep_abs x else x
+    
     val concl2 = term_of (#prop (crep_thm thm))
-  in
+in
   Logic.mk_equals ((build_aux concl2), concl2)
 end *}
 
@@ -942,7 +941,7 @@
 
 ML {*
   val m1_novars = snd(no_vars ((Context.Theory @{theory}),@{thm m1}))
-  val goal = build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+  val goal = build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
   val cgoal = cterm_of @{theory} goal
   val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
 *}
@@ -958,7 +957,7 @@
 thm length_append (* Not true but worth checking that the goal is correct *)
 ML {*
   val m1_novars = snd(no_vars ((Context.Theory @{theory}),@{thm length_append}))
-  val goal = build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+  val goal = build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
   val cgoal = cterm_of @{theory} goal
   val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
 *}
@@ -970,7 +969,7 @@
 thm m2
 ML {*
   val m1_novars = snd(no_vars ((Context.Theory @{theory}),@{thm m2}))
-  val goal = build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+  val goal = build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
   val cgoal = cterm_of @{theory} goal
   val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
 *}
@@ -982,7 +981,7 @@
 thm list_eq.intros(4)
 ML {*
   val m1_novars = snd(no_vars ((Context.Theory @{theory}),@{thm list_eq.intros(4)}))
-  val goal = build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+  val goal = build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
   val cgoal = cterm_of @{theory} goal
   val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
   val cgoal3 = Thm.rhs_of (MetaSimplifier.rewrite true @{thms QUOT_TYPE_I_fset.thm10} cgoal2)
@@ -1024,7 +1023,7 @@
 thm list_eq.intros(5)
 ML {*
   val m1_novars = snd(no_vars ((Context.Theory @{theory}),@{thm list_eq.intros(5)}))
-  val goal = build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+  val goal = build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
 *}
 ML {*
   val cgoal = 
@@ -1049,7 +1048,7 @@
 ML {*
   val goal =
     Toplevel.program (fn () =>
-      build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+      build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
     )
 *}
 ML {*
@@ -1072,7 +1071,7 @@
   val m1_novars = snd(no_vars ((Context.Theory @{theory}),@{thm card1_suc}))
 *}
 ML {*
-  val goal = build_goal m1_novars consts @{typ "'a list"} mk_rep_abs
+  val goal = build_goal @{context} m1_novars consts @{typ "'a list"} mk_rep_abs
 *}
 ML {*
   val cgoal = cterm_of @{theory} goal