Plan-Space Planning and Partial-Order Planning (POP)
Search over partial plans, not states — causal links, threats, promotion/demotion, and the elegant answer to the Sussman anomaly
The Simplest Explanation
Goal-stack planning forces a goal order and stumbles on the Sussman anomaly. Plan-space planning refuses to commit:
Search the space of partial plans. A plan is finished only when it has no flaws — unresolved goals or unhandled threats. Ordering constraints get added only when a threat forces them.
Π = ⟨A, O, L, B⟩: Actions, Orderings, causal Links, Bindings. Two flaw types: open goals (unsupported preconditions) and threats (actions that might delete a protected fact). Solve flaws until none remain.
The Partial Plan Tuple
| Component | Meaning |
|---|---|
partially instantiated operators (variables written ?x) | |
| ordering links | |
| causal links — " guarantees p for " | |
| binding constraints (, ) |
Initial plan : just two dummy actions —
- : no preconditions; effects = start state
- : preconditions = goal; no effects
plus one ordering . This "empty plan" compactly represents every possible linear plan at once.
Flaws and Their Repairs
| Flaw | Definition | Repairs |
|---|---|---|
| Open goal | precondition p of unsupported by any causal link | reuse an existing producer (add link + order), or insert a new action that adds p |
| Threat | action deletes p on link and could be ordered between them | Promotion , Demotion , or Separation (variable binding) |
Worked Example (the lecture's full trace)
Start: On(B,C), OnTable(C), OnTable(A), Clear(A), Clear(B), ArmEmpty. Goal: OnTable(B) ∧ On(A,B).
- : two open goals — OnTable(B), On(A,B)
- Resolve On(A,B): insert Stack(A,B) → new open goals Holding(A), Clear(B); link Stack
- Clear(B): true in start → link Stack(A,B)
- Holding(A): insert Pickup(A) (A is on table) → opens OnTable(A), Clear(A), ArmEmpty — all satisfied by links from
- OnTable(B): insert Putdown(B) → opens Holding(B)
- Holding(B): insert Unstack(B,C) → its preconditions all from
Now all goals closed — but three threats appear:
| Threat | Threatener | Endangered link |
|---|---|---|
| T1 | Stack(A,B) deletes Clear(B) | Unstack(B,C) |
| T2 | Pickup(A) deletes ArmEmpty | Unstack(B,C) |
| T3 | Putdown(B) deletes ArmEmpty | Pickup(A) |
All resolved by demotion (push threat after consumer):
Linearizing yields the 4-step plan: Unstack(B,C) → Putdown(B) → Pickup(A) → Stack(A,B).
Why This Beats Goal Stack Here
GSP would chase OnTable(B) first or On(A,B) first and clobber itself (Sussman pattern). POP never chose an order — the threats themselves discovered that Unstack(B,C) must precede both other actions. Non-serializable subgoals are handled naturally.
Properties
| Property | Value |
|---|---|
| Search space | partial plans (usually smaller than state spaces) |
| Soundness | yes — every step's preconditions protected by causal links |
| Non-serializable goals | handled via interleaving forced by threats |
| Least-commitment | orderings exist only where conflicts demand them |