aboutsummaryrefslogtreecommitdiff
path: root/lib/explore.ml
diff options
context:
space:
mode:
authorfilliatr2001-03-05 14:11:40 +0000
committerfilliatr2001-03-05 14:11:40 +0000
commitc034197e869cdc418b225b9abf25dee63a47e237 (patch)
tree42b5c9ecc4840c00ac1d31e5caf38b432953f7da /lib/explore.ml
parent9c88d6021a178cb64360bca75adbb6db030c480f (diff)
module Explore générique et réécriture EAuto avec ce module; occur check dans clenv_merge
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@1425 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'lib/explore.ml')
-rw-r--r--lib/explore.ml87
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/explore.ml b/lib/explore.ml
new file mode 100644
index 0000000000..c336a4b3b8
--- /dev/null
+++ b/lib/explore.ml
@@ -0,0 +1,87 @@
+
+(*i $Id$ i*)
+
+open Format
+
+(*s Definition of a search problem. *)
+
+module type SearchProblem = sig
+ type state
+ val branching : state -> state list
+ val success : state -> bool
+ val pp : state -> unit
+end
+
+module Make = functor(S : SearchProblem) -> struct
+
+ type position = int list
+
+ let rec pp_position = function
+ | [] -> ()
+ | [i] -> printf "%d" i
+ | i :: l -> pp_position l; printf ".%d" i
+
+ (*s Depth first search. *)
+
+ let rec depth_first s =
+ if S.success s then s else depth_first_many (S.branching s)
+ and depth_first_many = function
+ | [] -> raise Not_found
+ | s :: l -> try depth_first s with Not_found -> depth_first_many l
+
+ let debug_depth_first s =
+ let rec explore p s =
+ pp_position p; S.pp s;
+ if S.success s then s else explore_many 1 p (S.branching s)
+ and explore_many i p = function
+ | [] ->
+ raise Not_found
+ | s :: l ->
+ try explore (i::p) s with Not_found -> explore_many (succ i) p l
+ in
+ explore [1] s
+
+ (*s Breadth first search. We use functional FIFOS à la Okasaki. *)
+
+ type 'a queue = 'a list * 'a list
+
+ exception Empty
+
+ let empty = [],[]
+
+ let push x (h,t) = (x::h,t)
+
+ let pop = function
+ | h, x::t -> x, (h,t)
+ | h, [] -> match List.rev h with x::t -> x, ([],t) | [] -> raise Empty
+
+ let breadth_first s =
+ let rec explore q =
+ try
+ let (s, q') = pop q in enqueue q' (S.branching s)
+ with Empty ->
+ raise Not_found
+ and enqueue q = function
+ | [] -> explore q
+ | s :: l -> if S.success s then s else enqueue (push s q) l
+ in
+ enqueue empty [s]
+
+ let debug_breadth_first s =
+ let rec explore q =
+ try
+ let ((p,s), q') = pop q in
+ enqueue 1 p q' (S.branching s)
+ with Empty ->
+ raise Not_found
+ and enqueue i p q = function
+ | [] ->
+ explore q
+ | s :: l ->
+ let ps = i::p in
+ pp_position ps; S.pp s;
+ if S.success s then s else enqueue (succ i) p (push (ps,s) q) l
+ in
+ enqueue 1 [] empty [s]
+
+end