Last updated: 2018-06-02 15:24:59 +0100
Upstream URL: git clone http://chriswarbo.net/git/mlspec.git
Contents of README follows
This project constructs “theories” for the QuickSpec system to explore.
It reads from stdin or a filename argument, and parses a JSON array of arrays of function descriptions.
A function description looks like:
{
"package" : "foo"
, "module" : "Bar.Baz"
, "name" : "quux"
, "type" : "Bar.T a -> Baz.U b"
, "arity" : 1
}
Each array will be turned into a QuickSpec signature and explored.
Equations found by all of these explorations are printed to stdout as JSON objects, one per line.
Each equation is an object with the following fields:
relation: This has no real meaning, it’s basically a
tag for distinguishing that this is an equation. The value will be
"~=", to indicate that it was found by QuickSpec and is
hence only tested rather than formally proven.lhs: a term representing the left-hand-side of the
equation. There’s no conceptual difference between the left and right,
they’re just names.rhs: a term representing the right-hand-side of the
equation. Again, no real difference from the left hand side except the
name.A term is an object, with a role field containing one of
"constant", "variable" or
"application". The other fields depend on the term’s
role:
type: The type of the constant, a string written in
Haskell’s type notation. This is taken from the given function
descriptions. For example
"Int -> (Int -> Bool) -> IO Float"symbol: The name of the constant, as a string. For
example "reverse".type: The type of the variable, a string written in
Haskell’s type notation. Variables are automatically added to a
signature to be used as arguments to the given functions. For example
"[Int]"."id": A numeric ID for the variable. IDs start at
0. Three variables are added for each argument type. For
example, to represent three integer variables we might use
{"role": "variable", "type": "Int", "id":0},
{"role": "variable", "type": "Int", "id":1} and
{"role": "variable", "type": "Int", "id":2}.lhs: A term representing a function to apply.rhs: A term representing the argument to apply the
lhs function to. Functions are curried, so calling with
multiple arguments should be done via a left-leaning tree.We use the nix-eval package to run QuickSpec with all of
the required packages available. If some packages aren’t in the default
GHC package database, nix-eval will call the
nix-shell command, so you’ll need a working installation of
Nix in your path.
We include a Cabal test suite to check internal function behaviour.
We also include an executable mlspec-test-quickspec for
integration tests which use QuickSpec. We also have a
test.sh script which invokes these as well as running
various examples through the MLSpec executable.