diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8850122662c976a8db53ffb2cb3c543f63b04c58 --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# Fix: memoization and fixed points made easy + +`fix` is an OCaml library that helps with various constructions +that involve memoization and recursion. + +## Installation + +Type `opam install fix`. + +## Overview + +At the top of an OCaml module, declare `open Fix`. +This gives you access to the following submodules: + +* [`Gensym`](src/Gensym.mli) offers a simple facility + for **generating fresh integer identifiers**. + +* [`Memoize`](src/Memoize.mli) offers a number of combinators + that help **construct possibly recursive memoizing functions**, that + is, functions that lazily record their input/output graph, + so as to avoid repeated computation. + +* [`Tabulate`](src/Tabulate.mli) offers facilities + for **tabulating a function**, that is, eagerly evaluating this function + at every point in its domain, so as to obtain an equivalent + function that can be queried in constant time. + +* [`Number`](src/Number.mli) offers a facility for + **discovering and numbering the reachable vertices** in a directed graph. + +* [`HashCons`](src/HashCons.mli) offers support for + **setting up a hash-consed data type**, that is, a data type whose + values carry unique integer identifiers. + +* [`Fix`](src/Core.mli) offers support for **computing + the least solution of a set of monotone equations**, + as described in the unpublished paper + [Lazy Least Fixed Points in ML](http://gallium.inria.fr/~fpottier/publis/fpottier-fix.pdf). + In other words, it allows defining a recursive function of + type `variable -> property`, where + **cyclic dependencies** between variables are allowed, + and properties must be equipped with a partial order. + +* `Prop` defines a few common partial orders, including + [`Prop.Boolean`](src/Boolean.mli), + [`Prop.Option`](src/Option.mli), + [`Prop.Set`](src/Set.mli). + +* [`Glue`](src/Glue.mli) contains glue code that helps + build various implementations of association maps. + +The signatures that appear in the above files, +such as `MEMOIZER`, `TABULATOR`, `SOLVER`, and so on, +are defined [here](src/Sigs.ml). + +<!-- demos -->