diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..14ed55b2331889c0ee097071b87018e21265007a --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +## Feat + +Feat is a library that offers support for counting, enumerating, and sampling +objects of a certain kind, such as (say) the inhabitants of an algebraic data +type. + +Feat was inspired by the paper +[Feat: Functional Enumeration of Algebraic Types](https://kar.kent.ac.uk/47486/) +by Jonas Duregård, Patrik Jansson and Meng Wang (2012). +It can perhaps be compared with the Haskell library +[testing-feat](https://hackage.haskell.org/package/testing-feat), +although a detailed comparison has not been carried out. + +The library is laid out as follows: + +* The module [Feat.IFSeq](src/IFSeq.ml) implements + the signature [Feat.IFSEQ](src/IFSeqSig.ml) + of (implicit, finite) **sequences**. + + These sequences are implicit, which means that they are not explicitly + epresented in memory as an actual sequence of elements; instead, they are + *described* by a data structure which contains enough information to + produce an arbitrary element upon request. This design decision imposes + some constraints on the operations that can be efficiently supported; for + instance, `filter` is not supported. + +* The module [Feat.Enum](src/Enum.mli) implements + **enumerations**. + An enumeration of type `'a enum` is a function of a size `s` + to a sequence of elements of size `s`. + +* The module [Feat.Bigint](src/Bigint.mli) + offers a function `random` of type `Z.t -> Z.t`, + thus repairing an unfortunate omission in the library `zarith`. + +* The external library + [Fix](https://gitlab.inria.fr/fpottier/fix/) + comes in handy when building enumerations + of recursive algebraic data types: + see the [demo](demo/Test.ml).