A fast-foward-based planner.
An implementation of the fast-forward planner, as a quasi-quoter.
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 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:
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 the following declarations:
- A data declaration for the
Obj
object - A data declaration for the
BlocksWorld
domain, that will consist of two constructorsMove :: Obj -> Obj -> Obj -> BlocksWorld
andMoveToTable :: Obj -> Obj -> BlocksWorld
- Two classes called
Has_on
andHas_clear
, that define theon
andclear
functions, respectively - Instances of the two
Has
classes forLiteral
andTerm
- 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:
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:
$ find dist-newstyle -name blocksWorld -type f -exec {} \;
Just [MoveTo B Table C, MoveTo A Table B]