src/HOL/Tools/hologic.ML
changeset 30450 7655e6533209
parent 30304 d8e4cd2ac2a1
child 30453 1e7e0d171653
--- a/src/HOL/Tools/hologic.ML	Wed Mar 11 15:56:50 2009 +0100
+++ b/src/HOL/Tools/hologic.ML	Wed Mar 11 15:56:51 2009 +0100
@@ -11,13 +11,20 @@
   val typeT: typ
   val boolN: string
   val boolT: typ
+  val Trueprop: term
+  val mk_Trueprop: term -> term
+  val dest_Trueprop: term -> term
   val true_const: term
   val false_const: term
   val mk_setT: typ -> typ
   val dest_setT: typ -> typ
-  val Trueprop: term
-  val mk_Trueprop: term -> term
-  val dest_Trueprop: term -> term
+  val Collect_const: typ -> term
+  val mk_Collect: string * typ * term -> term
+  val mk_mem: term * term -> term
+  val dest_mem: term -> term * term
+  val mk_set: typ -> term list -> term
+  val dest_set: term -> term list
+  val mk_UNIV: typ -> term
   val conj_intr: thm -> thm -> thm
   val conj_elim: thm -> thm * thm
   val conj_elims: thm -> thm list
@@ -43,12 +50,7 @@
   val exists_const: typ -> term
   val mk_exists: string * typ * term -> term
   val choice_const: typ -> term
-  val Collect_const: typ -> term
-  val mk_Collect: string * typ * term -> term
   val class_eq: string
-  val mk_mem: term * term -> term
-  val dest_mem: term -> term * term
-  val mk_UNIV: typ -> term
   val mk_binop: string -> term * term -> term
   val mk_binrel: string -> term * term -> term
   val dest_bin: string -> typ -> term -> term * term
@@ -139,6 +141,30 @@
 fun dest_setT (Type ("fun", [T, Type ("bool", [])])) = T
   | dest_setT T = raise TYPE ("dest_setT: set type expected", [T], []);
 
+fun mk_set T ts =
+  let
+    val sT = mk_setT T;
+    val empty = Const ("Orderings.bot", sT);
+    fun insert t u = Const ("insert", T --> sT --> sT) $ t $ u;
+  in fold_rev insert ts empty end;
+
+fun mk_UNIV T = Const ("Set.UNIV", mk_setT T);
+
+fun dest_set (Const ("Orderings.bot", _)) = []
+  | dest_set (Const ("insert", _) $ t $ u) = t :: dest_set u
+  | dest_set t = raise TERM ("dest_set", [t]);
+
+fun Collect_const T = Const ("Collect", (T --> boolT) --> mk_setT T);
+fun mk_Collect (a, T, t) = Collect_const T $ absfree (a, T, t);
+
+fun mk_mem (x, A) =
+  let val setT = fastype_of A in
+    Const ("op :", dest_setT setT --> setT --> boolT) $ x $ A
+  end;
+
+fun dest_mem (Const ("op :", _) $ x $ A) = (x, A)
+  | dest_mem t = raise TERM ("dest_mem", [t]);
+
 
 (* logic *)
 
@@ -212,21 +238,8 @@
 
 fun choice_const T = Const("Hilbert_Choice.Eps", (T --> boolT) --> T);
 
-fun Collect_const T = Const ("Collect", [T --> boolT] ---> mk_setT T);
-fun mk_Collect (a, T, t) = Collect_const T $ absfree (a, T, t);
-
 val class_eq = "HOL.eq";
 
-fun mk_mem (x, A) =
-  let val setT = fastype_of A in
-    Const ("op :", [dest_setT setT, setT] ---> boolT) $ x $ A
-  end;
-
-fun dest_mem (Const ("op :", _) $ x $ A) = (x, A)
-  | dest_mem t = raise TERM ("dest_mem", [t]);
-
-fun mk_UNIV T = Const ("Set.UNIV", mk_setT T);
-
 
 (* binary operations and relations *)