huff-0.1.0.0: README.md
Huff
====
Huff is an implementation of the fast-forward forward-chaining planner in
Haskell. The main interface is the quasi-quoter `huff`, which allows the user to
define re-usable domains that can be used with the planner to solve different
problems.
Example
-------
Consider the blocks world planning domain from [Chapter
11](http://aima.cs.berkeley.edu/2nd-ed/newchap11.pdf) of "Artificial
Intelligence: A Modern Approach". The domain includes two actions, `Move` and
`MoveToTable`, four objects, `A`, `B`, `C`, `Table`, and two predicates, `On`
and `Clear`. Embedding the domain in Haskell using `huff` looks like this:
```haskell
module Main where
import Huff
[huff|
domain BlocksWorld {
object Obj = A | B | C | Table
predicate on(Obj,Obj), clear(Obj)
operator Move(b: Obj, x: Obj, y: Obj) {
requires: on(b,x), clear(b), clear(y)
effect: on(b,y), clear(x), !clear(y)
}
operator MoveToTable(b: Obj, x: Obj) {
requires: on(b,x), clear(b)
effect: on(b,Table), clear(x)
}
}
|]
```
The quasi-quoter will introduce five new declarations:
* A data declaration for the `Obj` object
* A data declaration for the `BlocksWorld` domain, that will consist of two
constructors `Move :: Obj -> Obj -> Obj -> BlocksWorld` and `MoveToTable ::
Obj -> Obj -> BlocksWorld`
* Two classes called `Has_on` and `Has_clear`, that define the `on` and `clear`
functions, respectively
* The `blocksWorld` function of the type `[Literal] -> Term -> Spec BlocksWorld`
The `blocksWorld` function accepts the initial state and goal, and produces a
`Spec BlocksWorld` value that can be used in conjunction with the `findPlan`
function to attempt to find a plan. For example, the problem specified in
chapter 11 Russel and Norvig can be solved as follows:
```haskell
main =
do mb <- findPlan $ blocksWorld [ on A Table, on B Table, on C Table, clear A
, clear B, clear C ]
[on A B, n B C]
print mb
```
Running the example will produce the output:
```shell
$ find dist-newstyle -name blocksWorld -type f -exec {} \;
Just [MoveTo B Table C, MoveTo A Table B]
```