add function taken_names
authorhuffman
Fri, 27 Feb 2009 18:34:20 -0800
changeset 30157 40919ebde2c9
parent 30156 c621f8b6f4e6
child 30158 83c50c62cf23
add function taken_names
src/HOLCF/Tools/fixrec_package.ML
--- a/src/HOLCF/Tools/fixrec_package.ML	Fri Feb 27 15:39:35 2009 -0800
+++ b/src/HOLCF/Tools/fixrec_package.ML	Fri Feb 27 18:34:20 2009 -0800
@@ -218,13 +218,16 @@
 (* associate match functions with pattern constants *)
 fun add_matchers ms = FixrecMatchData.map (fold Symtab.update ms);
 
-fun add_names (Const(a,_), bs) = insert (op =) (Sign.base_name a) bs
-  | add_names (Free(a,_) , bs) = insert (op =) a bs
-  | add_names (f $ u     , bs) = add_names (f, add_names(u, bs))
-  | add_names (Abs(a,_,t), bs) = add_names (t, insert (op =) a bs)
-  | add_names (_         , bs) = bs;
-
-fun add_terms ts xs = foldr add_names xs ts;
+fun taken_names (t : term) : bstring list =
+  let
+    fun taken (Const(a,_), bs) = insert (op =) (Sign.base_name a) bs
+      | taken (Free(a,_) , bs) = insert (op =) a bs
+      | taken (f $ u     , bs) = taken (f, taken (u, bs))
+      | taken (Abs(a,_,t), bs) = taken (t, insert (op =) a bs)
+      | taken (_         , bs) = bs;
+  in
+    taken (t, [])
+  end;
 
 (* builds a monadic term for matching a constructor pattern *)
 fun pre_build match_name pat rhs vs taken =
@@ -263,8 +266,7 @@
 fun match_eq match_name eq = 
   let val (lhs,rhs) = dest_eqs eq;
   in
-    building match_name lhs (mk_return rhs) []
-      (add_terms [eq] [])
+    building match_name lhs (mk_return rhs) [] (taken_names eq)
   end;
 
 (* returns the sum (using +++) of the terms in ms *)