package aima.core.search.nondeterministic; import java.util.LinkedList; import aima.core.agent.Action; /** * Represents a solution plan for an AND-OR search; according to page 135 * AIMA3e, the plan must be "a subtree that (1) has a goal node at every leaf, * (2) specifies one Object at each of its OR nodes, and (3) includes every * outcome branch at each of its AND nodes." As demonstrated on page 136, this * subtree is implemented as a linked list where every OR node is an Object-- * satisfying (2)--and every AND node is an if-state-then-plan-else * chain--satisfying (3). * * @author Andrew Brown */ public class Plan extends LinkedList<Object> { private static final long serialVersionUID = 1L; /** * Each step is either an IfStateThenPlan, a Plan, or an Action. */ LinkedList<Object> steps = new LinkedList<Object>(); /** * Empty constructor */ public Plan() { } /** * Construct a plan based on a sequence of steps (IfStateThenPlan or a * Plan). * * @param steps */ public Plan(Object... steps) { for (int i = 0; i < steps.length; i++) { add(steps[i]); } } /** * Prepend an action to the plan and return itself. * * @param action * the action to be prepended to this plan. * @return this plan with action prepended to it. */ public Plan prepend(Action action) { this.offerFirst(action); return this; } /** * Returns the string representation of this plan * * @return a string representation of this plan. */ @Override public String toString() { StringBuilder s = new StringBuilder(); s.append("["); int count = 0; int size = this.size(); for (Object step : this) { s.append(step); if (count < size - 1) { s.append(", "); } count++; } s.append("]"); return s.toString(); } }