QuotMain.thy
changeset 455 9cb45d022524
parent 453 c22ab554a32d
child 457 48042bacdce2
child 460 3f8c7183ddac
--- a/QuotMain.thy	Sun Nov 29 19:48:55 2009 +0100
+++ b/QuotMain.thy	Sun Nov 29 23:59:37 2009 +0100
@@ -343,64 +343,6 @@
   end
 *}
 
-section {* Infrastructure for special quotient identity *}
-
-definition
-  "qid TYPE('a) TYPE('b) x \<equiv> x"
-
-ML {*
-fun get_typ1 (Type ("itself", [T])) = T 
-fun get_typ2 (Const ("TYPE", T)) = get_typ1 T
-fun get_tys (Const (@{const_name "qid"},_) $ ty1 $ ty2) =
-  (get_typ2 ty1, get_typ2 ty2)
-
-fun is_qid (Const (@{const_name "qid"},_) $ _ $ _) = true
-  | is_qid _ = false
-
-
-fun mk_itself ty = Type ("itself", [ty])
-fun mk_TYPE ty = Const ("TYPE", mk_itself ty)
-fun mk_qid (rty, qty, trm) = 
-  Const (@{const_name "qid"}, [mk_itself rty, mk_itself qty, dummyT] ---> dummyT) 
-    $ mk_TYPE rty $ mk_TYPE qty $ trm
-*}
-
-ML {*
-fun insertion_aux rtrm qtrm =
-  case (rtrm, qtrm) of
-    (Abs (x, ty, t), Abs (x', ty', t')) =>
-       let
-         val (y, s) = Term.dest_abs (x, ty, t)
-         val (_, s') = Term.dest_abs (x', ty', t')
-         val yvar = Free (y, ty)
-         val result = Term.lambda_name (y, yvar) (insertion_aux s s')
-       in     
-         if ty = ty'
-         then result
-         else mk_qid (ty, ty', result)
-       end
-  | (t1 $ t2, t1' $ t2') =>
-       let 
-         val rty = fastype_of rtrm
-         val qty = fastype_of qtrm 
-         val subtrm1 = insertion_aux t1 t1' 
-         val subtrm2 = insertion_aux t2 t2'
-       in
-         if rty = qty
-         then subtrm1 $ subtrm2
-         else mk_qid (rty, qty, subtrm1 $ subtrm2)
-       end
-  | (Free (_, ty), Free (_, ty')) =>
-       if ty = ty'
-       then rtrm 
-       else mk_qid (ty, ty', rtrm)
-  | (Const (s, ty), Const (s', ty')) =>
-       if s = s' andalso ty = ty'
-       then rtrm
-       else mk_qid (ty, ty', rtrm) 
-  | (_, _) => raise (LIFT_MATCH "insertion")
-*}
-
 section {* Regularization *} 
 
 (*
@@ -794,10 +736,38 @@
         else mk_repabs lthy (rty, qty) result
       end
   | _ =>
-      (* FIXME / TODO: this is a case that needs to be looked at          *)
-      (* - variables get a rep-abs insde and outside an application       *)
-      (* - constants only get a rep-abs on the outside of the application *)
-      (* - applications get a rep-abs insde and outside an application    *)
+      (**************************************************)
+      (*  new
+      let
+        val (rhead, rargs) = strip_comb rtrm
+        val (qhead, qargs) = strip_comb qtrm
+        val rargs' = map (inj_repabs_trm lthy) (rargs ~~ qargs)
+      in
+        case (rhead, qhead, length rargs') of
+          (Const (_, T), Const (_, T'), 0) => 
+             if T = T'
+             then rhead 
+             else mk_repabs lthy (T, T') rhead
+        | (Free (_, T), Free (_, T'), 0) => 
+             if T = T'
+             then rhead 
+             else mk_repabs lthy (T, T') rhead
+        | (Const (_, T), Const (_, T'), _) => (* FIXME/TODO: check this case exactly*)  
+             if rty = qty                   
+             then list_comb (rhead, rargs') 
+             else mk_repabs lthy (rty, qty) (list_comb (rhead, rargs')) 
+        | (Free (x, T), Free (x', T'), _) => 
+             if T = T'
+             then list_comb (rhead, rargs')
+             else list_comb (mk_repabs lthy (T, T') rhead, rargs')
+        | (Abs _, Abs _, _ ) =>
+             list_comb (inj_repabs_trm lthy (rhead, qhead), rargs') 
+        | _ => raise (LIFT_MATCH "injection")
+      end
+      *)
+
+      (*************************************************)
+      (* old *)
       let
         val (rhead, rargs) = strip_comb rtrm
         val (qhead, qargs) = strip_comb qtrm
@@ -821,6 +791,7 @@
                mk_repabs lthy (rty, qty) (list_comb (inj_repabs_trm lthy (rhead, qhead), rargs')) 
           | _ => raise (LIFT_MATCH "injection")
       end
+      (**)
 end
 *}