aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/extraction/mlutil.ml23
-rw-r--r--contrib/extraction/mlutil.mli4
2 files changed, 27 insertions, 0 deletions
diff --git a/contrib/extraction/mlutil.ml b/contrib/extraction/mlutil.ml
new file mode 100644
index 0000000000..33c1e32bfe
--- /dev/null
+++ b/contrib/extraction/mlutil.ml
@@ -0,0 +1,23 @@
+
+open Util
+open Miniml
+
+(* [occurs : int -> ml_ast -> bool]
+ [occurs k M] returns true if (Rel k) occurs in M. *)
+
+let rec occurs k = function
+ | MLrel i -> i=k
+ | MLapp(t,argl) -> (occurs k t) or (occurs_list k argl)
+ | MLlam(_,t) -> occurs (k+1) t
+ | MLcons(_,_,argl) -> occurs_list k argl
+ | MLcase(t,pv) ->
+ (occurs k t) or
+ (List.exists (fun (k',t') -> occurs (k+k') t')
+ (array_map_to_list (fun (_,l,t') ->
+ let k' = List.length l in (k',t')) pv))
+ | MLfix(_,_,l,cl) -> let k' = List.length l in occurs_list (k+k') cl
+ | _ -> false
+
+and occurs_list k l =
+ List.exists (fun t -> occurs k t) l
+
diff --git a/contrib/extraction/mlutil.mli b/contrib/extraction/mlutil.mli
new file mode 100644
index 0000000000..224236fecf
--- /dev/null
+++ b/contrib/extraction/mlutil.mli
@@ -0,0 +1,4 @@
+
+open Miniml
+
+val occurs : int -> ml_ast -> bool