(**************************************************************************) (* *) (* Copyright (C) Jean-Christophe Filliatre *) (* *) (* This software is free software; you can redistribute it and/or *) (* modify it under the terms of the GNU Library General Public *) (* License version 2.1, with the special exception on linking *) (* described in file LICENSE. *) (* *) (* This software is distributed in the hope that it will be useful, *) (* but WITHOUT ANY WARRANTY; without even the implied warranty of *) (* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *) (* *) (**************************************************************************) (*s Search algorithms, presented both functionally and imperatively. *) (*s Functional search *) module type FunctionalProblem = sig (* states *) type state val success : state -> bool (* moves *) type move val moves : state -> (move * state) list (* visited states are stored in a table using the following type and functions; when it is not necessary/desired to mark visited states, simply provide a function [mem] always returning false. Note: [clear] is used for iterative deepening search only. *) type table val create : unit -> table val add : table -> state -> unit val mem : table -> state -> bool val clear : table -> unit end (* [search s] searches for a successful state starting from state [s]; if there is such a state, it returns it, together with the path from [s]; otherwise, it raises [Not_found]. *) (* Depth-first search *) module FunctionalDFS(P : FunctionalProblem) : sig val search : P.state -> P.state * P.move list end (* Breadth-first search *) module FunctionalBFS(P : FunctionalProblem) : sig val search : P.state -> P.state * P.move list end (* Iterative deepening search *) module FunctionalIDS(P : FunctionalProblem) : sig val search : P.state -> P.state * P.move list end (*s Imperative search *) module type ImperativeProblem = sig (* the state is global and imperative *) val success : unit -> bool (* moves *) type move val moves : unit -> move list val do_move : move -> unit val undo_move : move -> unit (* visited states are stored using the following functions: [add] stores the current state in the table and [mem] checks whether the current state is already in the table *) val add : unit -> unit val mem : unit -> bool val clear : unit -> unit end (* [search ()] searches for a successful state starting from the current state; if there is such a state, it returns the path from the initial state; otherwise, it raises [Not_found]. *) (* Depth-first search *) module ImperativeDFS(P : ImperativeProblem) : sig val iter: (P.move list -> unit) -> unit val search : unit -> P.move list end (* Breadth-first search *) module ImperativeBFS(P : ImperativeProblem) : sig val search : unit -> P.move list end (* Iterative deepening search *) module ImperativeIDS(P : ImperativeProblem) : sig val search : unit -> P.move list end
This document was generated using caml2html