Function for checking recursively if lifting is needed
authorCezary Kaliszyk <kaliszyk@in.tum.de>
Wed, 14 Oct 2009 11:23:55 +0200
changeset 91 bdcfb24461f8
parent 90 19c662f8b9d6
child 92 56ad69873907
Function for checking recursively if lifting is needed
QuotMain.thy
--- a/QuotMain.thy	Wed Oct 14 09:50:13 2009 +0200
+++ b/QuotMain.thy	Wed Oct 14 11:23:55 2009 +0200
@@ -331,14 +331,26 @@
   "BAll (R :: 'a \<Rightarrow> prop) (P :: 'a \<Rightarrow> prop) \<equiv> (\<And>x. (PROP R x \<Longrightarrow> PROP P x))"*)
 
 
+ML {* exists *}
+ML {* mem *}
+
+ML {*
+fun needs_lift (rty as Type (rty_s, _)) ty =
+  case ty of
+    Type (s, tys) =>
+      (s = rty_s) orelse (exists (needs_lift rty) tys)
+  | _ => false
+
+*}
+
 ML {*
 (* trm \<Rightarrow> new_trm *)
 fun regularise trm rty rel lthy =
   case trm of
     Abs (x, T, t) =>
-      if T = rty then let
+      if (needs_lift rty T) then let
         val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
-        val v = Free (x', rty);
+        val v = Free (x', T);
         val t' = subst_bound (v, t);
         val rec_term = regularise t' rty rel lthy2;
         val lam_term = Term.lambda_name (x, v) rec_term;
@@ -352,16 +364,16 @@
         rabs_term
       end else let
         val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
-        val v = Free (x', rty);
+        val v = Free (x', fastype_of t);
         val t' = subst_bound (v, t);
         val rec_term = regularise t' rty rel lthy2;
       in
         Term.lambda_name (x, v) rec_term
       end
   | ((Const (@{const_name "All"}, at)) $ (Abs (x, T, t))) =>
-      if T = rty then let
+      if (needs_lift rty T) then let
         val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
-        val v = Free (x', rty);
+        val v = Free (x', T);
         val t' = subst_bound (v, t);
         val rec_term = regularise t' rty rel lthy2;
         val lam_term = Term.lambda_name (x, v) rec_term;
@@ -375,7 +387,7 @@
         rall_term
       end else let
         val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
-        val v = Free (x', rty);
+        val v = Free (x', fastype_of t);
         val t' = subst_bound (v, t);
         val rec_term = regularise t' rty rel lthy2;
         val lam_term = Term.lambda_name (x, v) rec_term
@@ -383,9 +395,9 @@
         Const(@{const_name "All"}, at) $ lam_term
       end
   | ((Const (@{const_name "Ex"}, at)) $ (Abs (x, T, t))) =>
-      if T = rty then let
+      if (needs_lift rty T) then let
         val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
-        val v = Free (x', rty);
+        val v = Free (x', T);
         val t' = subst_bound (v, t);
         val rec_term = regularise t' rty rel lthy2;
         val lam_term = Term.lambda_name (x, v) rec_term;
@@ -399,7 +411,7 @@
         rall_term
       end else let
         val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
-        val v = Free (x', rty);
+        val v = Free (x', fastype_of t);
         val t' = subst_bound (v, t);
         val rec_term = regularise t' rty rel lthy2;
         val lam_term = Term.lambda_name (x, v) rec_term