packages feed

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]
```