@hackage huff0.1.0.1

A fast-foward-based planner

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 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
  • Instances of the two Has classes for Literal and Term
  • 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]