@hackage huff0.1.0.1
A fast-foward-based planner
Categories
License
BSD-3-Clause
Maintainer
awesomelyawesome@gmail.com
Links
Versions
Installation
Dependencies (9)
- alex-tools
- array
- base >=4.9 && <5
- containers
- hashable
- heaps Show all…
Dependents (0)
Package Flags
examples
(off by default)
Build the examples
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
Objobject - A data declaration for the
BlocksWorlddomain, that will consist of two constructorsMove :: Obj -> Obj -> Obj -> BlocksWorldandMoveToTable :: Obj -> Obj -> BlocksWorld - Two classes called
Has_onandHas_clear, that define theonandclearfunctions, respectively - Instances of the two
Hasclasses forLiteralandTerm - The
blocksWorldfunction 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]