to_pred/set attributes now properly handle variables of type "... => T set"
authorberghofe
Wed, 07 Mar 2012 16:13:49 +0100
changeset 46828 b1d15637381a
parent 46827 9f82058567ce
child 46829 9770573e2172
child 46833 85619a872ab5
to_pred/set attributes now properly handle variables of type "... => T set"
src/HOL/Tools/inductive_set.ML
--- a/src/HOL/Tools/inductive_set.ML	Wed Mar 07 14:30:35 2012 +0100
+++ b/src/HOL/Tools/inductive_set.ML	Wed Mar 07 16:13:49 2012 +0100
@@ -227,12 +227,16 @@
 fun mk_to_pred_inst thy fs =
   map (fn (x, ps) =>
     let
-      val U = HOLogic.dest_setT (fastype_of x);
-      val x' = map_type (K (HOLogic.strip_ptupleT ps U ---> HOLogic.boolT)) x;
+      val (Ts, T) = strip_type (fastype_of x);
+      val U = HOLogic.dest_setT T;
+      val x' = map_type
+        (K (Ts @ HOLogic.strip_ptupleT ps U ---> HOLogic.boolT)) x;
     in
       (cterm_of thy x,
-       cterm_of thy (HOLogic.Collect_const U $
-         HOLogic.mk_psplits ps U HOLogic.boolT x'))
+       cterm_of thy (fold_rev (Term.abs o pair "x") Ts
+         (HOLogic.Collect_const U $
+            HOLogic.mk_psplits ps U HOLogic.boolT
+              (list_comb (x', map Bound (length Ts - 1 downto 0))))))
     end) fs;
 
 fun mk_to_pred_eq p fs optfs' T thm =
@@ -366,12 +370,16 @@
     val insts = map (fn (x, ps) =>
       let
         val Ts = binder_types (fastype_of x);
-        val T = HOLogic.mk_ptupleT ps Ts;
-        val x' = map_type (K (HOLogic.mk_setT T)) x
+        val l = length Ts;
+        val k = length ps;
+        val (Rs, Us) = chop (l - k - 1) Ts;
+        val T = HOLogic.mk_ptupleT ps Us;
+        val x' = map_type (K (Rs ---> HOLogic.mk_setT T)) x
       in
         (cterm_of thy x,
          cterm_of thy (fold_rev (Term.abs o pair "x") Ts
-          (HOLogic.mk_mem (HOLogic.mk_ptuple ps T (map Bound (length ps downto 0)), x'))))
+          (HOLogic.mk_mem (HOLogic.mk_ptuple ps T (map Bound (k downto 0)),
+             list_comb (x', map Bound (l - 1 downto k + 1))))))
       end) fs;
   in
     thm |>