Stick with 'standard' goal-oriented action planning techniques; the method you're starting to write ( based on your other thread ) won't scale well to finding a general solution to a general problem.
Do you even need to consider locality of objects ( i.e. actually moving between them ) or just provide the action sequence necessary in order to fulfil the top-level goal? By that I mean, a valid response from one goal planner could be:
kill rabbit := pick up rifle -> shoot rabbit
and from another, different planner, it could be:
kill rabbit := move 1,0 -> move 0,1 -> pick up rifle -> move 0,-1 -> rotate 90 -> fire rifle.
in the first case, the planner spits out abstract commands and expects some other layer to solve the task itself; in the second case, the planner does everything including actuate movement itself.
I guess, the question is, how 'useful', or how complete do you want the output to be?
To make it more complete, you need a more complete specification of the pre-requisite/post-requisite/action set, and you need a somewhat complex symbol-based planner. ( See STRIPS for example, papers for the STRIPs solver implementation are easy to find, and it's not that difficult to implement ).
For a less complete solution, you can almost do without a specialized planner atall ( you can represent the problem as a directed/undirected graph, and use a tree-search/graph-search to get the shortest path between start node and goal node, by equivalence, this represents the optimum action path ).