Partial-Order Planning (POP): Planning Without a Strict Linear Action Order

Partial-Order Planning (POP): Planning Without a Strict Linear Action Order

Verified Sources
Nov 4, 2026

Partial-order planning keyword (often abbreviated POP) is a class of AI planning algorithms that construct a plan as a set of actions plus ordering constraints. Instead of committing to one strict timeline up front (as in total-order/linear planning), POP produces a partially ordered plan that remains flexible until the end, ensuring only the orderings needed for correctness are enforced.

Core idea: POP represents which actions must come before or after other actions using ordering constraints, while leaving unrelated actions unordered when they do not interfere. This lets the planner exploit commutativity: independent actions can be executed in any compatible order, and the plan can be “linearized” later by choosing any topological ordering that respects the constraints.
A typical POP formulation uses (1) open conditions to track unsatisfied preconditions, (2) causal links to record which action supports which condition, and (3) threat handling to resolve actions that could negate or undermine a causal link.

Note: In this environment, web research via the required search tool failed (usage limit errors). Because of your course-generation requirements, I cannot provide citation-backed claims. I will still explain partial-order planning thoroughly, but you should treat it as non-cited background rather than a fully verified, source-cited “research” output.

Partial-Order Planning (Conceptual) - Learning Resource

Block-world setup: goal stack without forcing a single linear order

We use a classic blocks-world scenario with actions like “pick up” and “put down.” The key point is to show that POP can leave actions unordered when their order does not matter.

Symbols

  • Blocks: AA, BB, CC
  • Table: TT
  • Predicates:
    • On(x,y)On(x,y): block xx is on block yy
    • OnTable(x)OnTable(x): block xx is on the table
    • Clear(x)Clear(x): nothing is on top of xx
    • Holding(x)Holding(x): the robot is holding xx

Initial state (informal)

  • Clear(A)Clear(A), Clear(B)Clear(B), Clear(C)Clear(C)
  • OnTable(A)OnTable(A), OnTable(B)OnTable(B), OnTable(C)OnTable(C)
  • Hand is empty (not holding anything)

Goals

We want:

  1. On(A,B)On(A, B)
  2. On(C,A)On(C, A)

Intuitively, to get On(C,A)On(C,A), we must make AA available as a support surface (not required to be on a particular thing besides having Clear(A)Clear(A)). To get On(A,B)On(A,B), we must place AA onto BB.

A linear plan might choose an order like:

  • Step 1: move AA onto BB
  • Step 2: move CC onto AA

But POP can represent actions more flexibly by only enforcing the ordering that is truly needed: the placement of CC onto AA must occur after AA is positioned so that AA is in the right place and stable, while other preparations can be partially ordered.

Key terms:

  • Causal link
  • Threat
  • Open condition

How POP builds a partial-order plan (high level)

  1. 1
    Step 1

    Create two special actions: Start (encodes the initial state) and Finish (encodes the goals). Add ordering constraint Start ≺ Finish.

  2. 2
    Step 2

    For each open condition p of some action, choose an action that can achieve p, and add a causal link from achiever to demander.

  3. 3
    Step 3

    If achiever must occur before demander to support the causal link, add that ordering constraint. Leave other actions unordered unless required.

  4. 4
    Step 4

    If some action could invalidate a causal link (e.g., delete a supported condition), resolve by adding ordering constraints or refinement (e.g., re-choosing actions).

  5. 5
    Step 5

    When every precondition/goal has a supporting causal link and all threats are resolved, output the partial order plan.

  6. 6
    Step 6

    Convert the partial order constraints into one valid total order via any topological sort.

A partial-order plan for the block-world goals

We sketch a POP-style plan using representative actions. (Exact action schemas vary by textbook, but POP reasoning is the same.)

Action templates (informal)

  • PickUp(x)PickUp(x): requires Clear(x)Clear(x) and On(x,_)On(x, \_) or OnTable(x)OnTable(x); results in Holding(x)Holding(x) and Clear(_)Clear(\_) effects
  • PutOn(x,y)PutOn(x,y): requires Holding(x)Holding(x) and Clear(y)Clear(y); results in On(x,y)On(x,y) and Clear(x)Clear(x)
  • PutOnTable(x)PutOnTable(x): requires Holding(x)Holding(x); results in OnTable(x)OnTable(x) and Clear(x)Clear(x)

Planning objective

Achieve:

  • On(A,B)On(A,B)
  • On(C,A)On(C,A)

POP will introduce causal links such as:

  • An action PutOn(A,B)PutOn(A,B) supports the goal On(A,B)On(A,B).
  • An action PutOn(C,A)PutOn(C,A) supports the goal On(C,A)On(C,A).

The ordering constraints that matter:

  • To support On(C,A)On(C,A), the action PutOn(C,A)PutOn(C,A) must occur at a time when AA is a suitable support surface (e.g., Clear(A)Clear(A) and appropriately positioned). In many simplified representations, Clear(A)Clear(A) is true initially and remains true unless actions interfere; but placing AA on BB should not destroy Clear(A)Clear(A)—it typically remains clear as long as nothing is stacked on top of AA.
  • Therefore, if both actions only rely on conditions that are satisfied initially and do not interfere, POP can leave PutOn(A,B)PutOn(A,B) and PutOn(C,A)PutOn(C,A) unordered except for any constraint created by how CC is obtained (e.g., PickUp(C)PickUp(C) must precede PutOn(C,A)PutOn(C,A), and PickUp(A)PickUp(A) must precede PutOn(A,B)PutOn(A,B)). Those are standard precondition orderings.

One valid POP partial order structure (with key constraints only)

Let the relevant action nodes be:

  • a1a_1: PickUp(A)PickUp(A)
  • a2a_2: PutOn(A,B)PutOn(A,B)
  • a3a_3: PickUp(C)PickUp(C)
  • a4a_4: PutOn(C,A)PutOn(C,A)

And causal/support links:

  • a2→On(A,B)a_2 \rightarrow On(A,B) (satisfies the first goal)
  • a4→On(C,A)a_4 \rightarrow On(C,A) (satisfies the second goal)

Ordering constraints that are forced:

  • a1≺a2a_1 \prec a_2 because PutOn(A,B)PutOn(A,B) requires Holding(A)Holding(A).
  • a3≺a4a_3 \prec a_4 because PutOn(C,A)PutOn(C,A) requires Holding(C)Holding(C).
  • Additionally, depending on your precise action model, there may be a constraint ensuring PutOn(C,A)PutOn(C,A) occurs after AA is in the correct configuration (if Clear(A)Clear(A) or some “support availability” becomes true only after PutOn(A,B)PutOn(A,B)). For the classic simplified blocks-world where Clear(A)Clear(A) is initially true and placing AA on BB does not put something on top of AA, no strict ordering between a2a_2 and a4a_4 may be required.

So POP can output a partial order like:

  • Required: a1≺a2a_1 \prec a_2, a3≺a4a_3 \prec a_4, Start ≺ all needed steps ≺ Finish
  • Possibly not required: a2a_2 and a4a_4 unordered

Now observe the “partial-order” aspect: there is no edge between a2a_2 and a4a_4. That means there are multiple valid linearizations. Two examples:

  • Linearization 1: a1,a2,a3,a4a_1, a_2, a_3, a_4
  • Linearization 2: a3,a4,a1,a2a_3, a_4, a_1, a_2

Both respect the forced orderings (a1≺a2a_1 \prec a_2 and a3≺a4a_3 \prec a_4). The planner delays commitment on unrelated actions.

Why POP allows multiple action orders (conceptual explanation)

In total-order planning, you pick a single sequence early, and later discoveries may force backtracking. In partial-order planning, you only encode constraints that are necessary for correctness.

  • If action a2a_2 does not affect the preconditions or causal links needed by action a4a_4, then a2a_2 and a4a_4 can be unordered.
  • If they do interfere, POP’s threat detection introduces an ordering constraint (or chooses a different action) to protect the causal link.

Threat resolution is what turns “maybe unordered” into “must be ordered” when interference exists.

Mental model for POP

A POP plan is like a dependency graph: edges are only the dependencies you truly need. Actions without an edge can be executed in any order consistent with the edges.

When actions stop being reorderable

If one action deletes a condition required by another (or can interfere via action effects), POP must add ordering constraints to resolve threats; that can eliminate some reorderings.

From constraints to a final linear plan

Start/Finish and open conditions

1. Initialization

Create Start and Finish actions; mark goal conditions as open."

Add achievers and causal links

2. Refinement

For each open condition, choose an action that can achieve it; add a causal link."

Detect threats

3. Protection

Find actions that could negate a causal link; resolve by ordering or alternative actions."

All preconditions/goal supported

4. Completion

No open conditions remain; all threats resolved."

Topological sort

5. Linearization

Choose any total order consistent with the partial order constraints."

Flexibility gained by partial-order planning (illustrative)

Counts of valid linearizations differ by how many actions remain unordered. (Illustrative, depends on domain/action model.)

Common questions about partial-order planning

Knowledge Check

Question 1 of 4
Q1Single choice

In partial-order planning, what does it mean for two actions to be 'unordered' in the plan?