Classical Planning (formerly STRIPS hub)

methods-of-ai planning

ℹ️ Note: This note was originally about STRIPS specifically, then expanded (merge from planning-i_30-04-26.md, 23/05/26) to cover all of Classical Planning: STRIPS + Situation Calculus + PDDL + the three problems (Frame / Qualification / Ramification) + relaxation heuristics. The filename stays STRIPS.md so existing wikilinks across the vault continue to resolve. The original atomic-note material (worked Python planner, PDDL extensions table, “where STRIPS is used today”) lives at the bottom.

Companion files for exam prep:


Table of contents

  1. Core Ideas
  2. Searching vs. Planning
  3. The Three Problems (Frame / Qualification / Ramification)
  4. Situation Calculus
  5. STRIPS — the core formalism
  6. PDDL
  7. Planning Heuristics
  8. Worked Blocksworld Example
  9. Formulas & Notation
  10. Common Exam Traps
  11. Quick Comparison Table (Sit. Calc. vs. STRIPS vs. PDDL)
  12. ALGORITHMS ⭐ — pseudocode for 5 routines
  13. — Original atomic-note material —
  14. See also

Core Ideas

  • Planning = find a sequence of actions that transforms an initial state into a goal state in a fully observable, deterministic, static environment.
  • Unlike local search (don’t care about path) or classical search (treat states as opaque): planning exploits the internal structure of states (collections of properties).
  • Three classical challenges: Frame, Qualification, Ramification.
  • Two main classical formalisms covered in the lecture: Situation Calculus (deductive/logical) and STRIPS (state-based). PDDL is the modern extension of STRIPS.
  • A third family, probabilistic planning (MDPs), is mentioned on the “Planning Formalized” slide and covered separately in Planning II.

Searching vs. Planning

ApproachCares about sequence?Uses internal state structure?
Local SearchNoNo
Classical SearchYesNo (states are opaque)
PlanningYesYes — states are collections of properties

This is the framing slide that motivates everything else.


The Three Problems (Frame / Qualification / Ramification) ⚠️

These are exam-critical. Know each by name and have a concrete example ready.

ProblemDefinitionLecture example (Kiva / Blocksworld)
Frame problemActions change the world, but most things stay the same — how do we represent that efficiently?When moving one PSU, the state of all other PSUs is unchanged. When putting A on the table, A stays clear, B stays on C, C stays on the table.
Qualification problemActions may have an endless list of preconditions we cannot fully enumerate.We may be unable to move a robot because it ran out of power / has a malfunction / its path is blocked / …
Ramification problemActions may have unintended side-effects.When a robot moves a PSU, it also moves every item stored inside the PSU.

⚠️ Exam trap: all three are distinct. Don’t conflate Frame ↔ Ramification. Frame is about what stays unchanged; Ramification is about extra things that change without us asking.

See also: Frame Problem for the dedicated deep-dive note.


Situation Calculus (Deductive Planning)

History. Introduced by McCarthy (1963); used for plan construction via resolution by Green (1969); further developed as Event Calculus (Kowalski 1986) and Fluent Calculus (Thielscher 2000).

Features (slides):

  • States are described by logical formulas (subsets of FOL).
  • Operators are described by logical axioms.
  • Plans can be computed by Theorem Provers.
  • Situation Calculus does NOT use the Closed-World Assumption.

Situations and Fluents

  • Fluent = a predicate that can change over time. It gets an additional argument representing the current situation.
  • Situations are terms, either
    • Atomic (constants like S1), or
    • Complex, built from atomic situations by applying operators, e.g. put_on_table(A, S1) or put(B, A, put_on_table(A, S1)).

⚠️ Note on notation: the slides write the resulting situation as put(A,B,S₁) (the operator name is the function symbol). The R&N textbook uses do(a, S). The slides do not use do(...).

Example (Blocksworld, lecture slide):

S1:              put_on_table(A, S1):
onTable(C, S1)   onTable(C, put_on_table(A,S1))
on(B, C, S1)     on(B, C, put_on_table(A,S1))
on(A, B, S1)     onTable(A, put_on_table(A,S1))
clear(A, S1)     clear(A, put_on_table(A,S1))
                 clear(B, put_on_table(A,S1))

Effect Axioms

Describe preconditions and effects of operators (Horn-clause / implication form: head <- body).

% put(X, Y, S):
on(X, Y, put(X, Y, S))     <- clear(X, S), clear(Y, S)
clear(Z, put(X, Y, S))     <- on(X, Z, S), clear(X, S), clear(Y, S)
 
% put_on_table(X, S):
clear(Y, put_on_table(X, S))   <- on(X, Y, S), clear(X, S)
ontable(X, put_on_table(X, S)) <- clear(X, S)

Remark from the slide: different variables refer to different entities. Some frameworks require an explicit X ≠ Y to enforce this.

Frame Axioms — and the Frame Problem in Situation Calculus

The slides state it bluntly: we need axioms not only for what changes, but also for what stays the same. A frame axiom for put(X, Y, S):

on(Y, Z, put(X, Y, S)) <- on(Y, Z, S)

“After putting X on Y, Y still rests on Z if it did before.”

The slide listing on “Frame Axioms” gives six such axioms for the single operator put. Cost: roughly O(actions × fluents) frame axioms — that is the practical face of the frame problem.

Planning Problem in Situation Calculus

  1. Define initial state as logical axioms (e.g. on(d,c,s1), clear(d,s1), ontable(a,s1) …).
  2. Define goal as a theorem (e.g. on(a,b,G), on(b,c,G)).
  3. Apply a Theorem Prover.

The plan is extracted from the proof (Green’s trick — proof witnesses the situation term that names the goal state).

How Situation Calculus “addresses” the three problems (slide)

  • Qualification: preconditions inside effect axioms can theoretically capture it.
  • Frame: frame axioms can theoretically capture it.
  • Ramification: additional axioms can theoretically capture it.
  • In practice: difficult to guarantee coverage of all cases; runtime can suffer.

Planning with Golog (mention only on slide)

Golog combines Logic Programming with Situation Calculus — high-level programs (while, if, proc) compiled down to situation-calculus reasoning. Not exam-critical detail, but referenced on the slides.

Summary slide (Situation Calculus)

  • The Situation Calculus is the basic example of Deductive Planning.
  • States = sets of fluents (logical atoms).
  • Operators + effects described by logical axioms.
  • Planning reduces to Theorem Proving.
  • Pro: deductive reasoning ability comes for free.
  • Con: verification and computational performance can be a problem.

See Situation Calculus for the dedicated atomic note.


STRIPS (State-Based Planning)

STRIPS = Stanford Research Institute Problem Solver.

History. Developed by Fikes & Nilsson (1971). Foundation of modern state-based planners (PDDL).

STRIPS is what made planning tractable: instead of axiomatizing every (action, fluent) non-effect like Situation Calculus does, STRIPS sidesteps the Frame Problem by saying “anything not in the ADD or DEL list is unchanged.” Imperative, not logical. Pragmatic, not pretty.

Features (slides):

  • States are represented by sets of (ground) atoms.
  • Operators act directly on states.
  • Planning can be performed by Classical Search or tailor-made algorithms.
  • STRIPS uses the Closed-World Assumption (CWA): atoms in the state are true; all others are false.

The core formalism — STRIPS as a 4-tuple

A STRIPS planning problem is a 4-tuple (S, A, I, G):

ComponentWhat it is
S — state spaceSet of all states. Each state = a set of ground atoms (propositions like OnTable(A), Clear(B)).
A — operatorsSet of action schemas, each with PRE/ADD/DEL lists.
I — initial stateA specific state ⊆ S.
G — goalA set of atoms that must hold in the goal state.

States in STRIPS

  • Domain D = {a, b, c, d}; Predicates P = {ontable¹, clear¹, on²}.
  • A state is a set of ground atoms, e.g.
    s = {ontable(a), ontable(c), ontable(d), clear(a), clear(b), clear(d), on(b,c)}.
  • A goal G is also a set of ground atoms, e.g. G = {on(b,c), ontable(c)}.
  • Goal state: s is a goal state iff G ⊆ s.

Operator Schemes

An operator scheme consists of:

  • A name + a sequence of variables, and
  • Three lists:
    • PRE (preconditions),
    • ADD (positive effects),
    • DEL (negative effects — atoms to remove).

Example (Blocksworld, lecture):

Operator: put(X, Y)
  PRE: {ontable(X), clear(X), clear(Y)}
  ADD: {on(X, Y)}
  DEL: {ontable(X), clear(Y)}

⚠️ Convention on ADD/DEL: both lists contain positive atoms.

  • ADD = atoms that become true.
  • DEL = atoms that become false (we list them as positives in the DEL list).
  • A “negative literal becomes true” (e.g. ¬clear(B) becoming true) is encoded as clear(B) ∈ DEL.

Operator Instantiation

Apply a substitution (e.g. X/a, Y/b) to the scheme:

put(a, b)
  PRE: {ontable(a), clear(a), clear(b)}
  ADD: {on(a, b)}
  DEL: {ontable(a), clear(b)}

Operator Application

An instantiated operator o is applicable in state s iff

The successor state is

(First delete, then add.)

⚠️ The Closed-World Assumption (CWA)

States are sets of atoms. Anything not in the set is assumed false. This is the CWA, and it’s the secret sauce that lets STRIPS “solve” the Frame Problem (see Frame Problem):

  • No need for frame axioms — anything not in ADD/DEL stays as it was
  • No need to assert ¬Holding(B) for every block — absence = falsity
  • Cost: STRIPS can’t represent “I don’t know whether P is true” (no Open World)

This is the OPPOSITE of Description Logics, which use the Open World Assumption.

How STRIPS addresses the three problems

ProblemSTRIPS handling
QualificationPRE-list
Frame”solved” — anything not in ADD/DEL is unchanged automatically (closed-world + frame convention)
RamificationADD-list and DEL-list (you must enumerate them)

Slide: “STRIPS ‘solves’ the Frame problem and allows a more convenient problem representation.” The scare quotes are deliberate — STRIPS shifts the bookkeeping from explicit axioms into a convention; it does not eliminate the underlying issue.

  • States = sets of atoms.
  • Successors = states reachable by applying any applicable operator.
  • Two directions:
    • Forward Planning (classical / progression search): uninformed (often DFS variants), or informed (A* variants).
    • Backward Planning (regression / relevant-state search): start from goal, apply operators backwards until an initial state is reached. Advantage: may consider fewer irrelevant actions.

Plan-space search (POP, etc.) is NOT in the slides — only state-space search (forward/backward) is.

Lecture conclusions (STRIPS)

  • STRIPS is the basic example of state-based planning.
  • States = sets of atoms; operators = PRE/ADD/DEL triple.
  • Frame problem “solved” by leaving everything unchanged that is not changed explicitly.
  • Planning comes down to classical search.
  • State-based planning can be more efficient than deductive planning, but planning remains hard in general.

PDDL (Planning Domain Definition Language)

PDDL extends STRIPS significantly. Development driven by the International Planning Competition (IPC) since 1998.

What the slides actually cover for PDDL:

  • LISP-like syntax: f(x,y,z) becomes (f x y z).
  • A PDDL representation contains at least a domain definition (types, actions) and a problem definition (initial state, goal).
  • :requirements flag — e.g. :strips, :typing.
  • :action, :parameters, :precondition, :effect (where :effect combines ADD + DEL via (and (P) (not (Q)))).
  • Numeric fluents — e.g. Contains(P, I, 100) meaning PSU P contains 100 instances of item I.
  • Derived predicates — e.g.
    PSUAt(P, X, Y) :- Carries(R, P), RobotAt(R, X, Y).
    ItemAt(I, X, Y) :- Contains(P, I, N), N > 0, PSUAt(P, X, Y).
    
  • :typing with (:types player location monster element chest) and typed parameters (?p - player ?l1 - location).

⚠️ NOT in the lecture slides (commonly conflated from R&N or PDDL spec): :adl, conditional effects, action costs, durative actions, axioms beyond derived predicates. Mention only with a flag if asked.

Minimal example from the slides (blocksworld)

(define (domain blocksworld)
  (:requirements :strips)
  (:action move
     :parameters (?b ?t1 ?t2)
     :precondition (and (block ?b) (table ?t1) (table ?t2)
                        (on ?b ?t1) (not (on ?b ?t2)))
     :effect (and (on ?b ?t2) (not (on ?b ?t1)))))

And a problem file:

(define (problem move-blocks-from-a-to-b)
  (:domain blocksworld)
  (:init (and (block a) (block b) (table x) (table y)
              (on a x) (on b x)))
  (:goal (and (on a y) (on b y))))

See PDDL and STRIPS for additional notes.


Planning Heuristics

Forward search must be guided. A heuristic estimates the cost from the current state to the goal — usually by solving a relaxed problem.

Ignore-PRE-DEL Heuristic

  • Relax by ignoring both PRE and DEL of every operator.
  • Each operator then simply satisfies a number of goals (0, 1, 2, …).
  • Computing the minimum number of operators needed to cover the goal = set-cover problem ⇒ still NP-hard.
  • A greedy polynomial-time approximation works in practice — but the resulting heuristic is not admissible (it may overestimate; A* optimality not guaranteed).

Blocksworld illustration (slide): initial {ontable(A), on(C,A), ontable(B), clear(C), clear(B)}, goal on(A,B), on(B,C). Identify the goal with U = {onTable(C), on(B,C), on(A,B)}; each operator with the subset of U it satisfies: Put(A,B): {on(A,B)}, Put(A,C): {}, Put(B,C): {on(B,C)}, … Estimated cost = number of unsatisfied literals.

Warehouse illustration (slide): goal = items at a location; PSUs = subsets of items; minimal set cover = PSUs we must carry.

Ignore-DEL Heuristic

  • Relax by ignoring only the DEL list.
  • In the relaxed problem, no operator can undo a goal.
  • Relaxed problem is still NP-hard, but approximate solution computable in polynomial time.
  • The resulting heuristic is again not admissible.

Modern planners use heuristic forward search with these relaxation-based heuristics (h_max, h_add, h_FF all descend from Ignore-DEL).


Worked Blocksworld Example (lecture)

Initial: {on(D,C), on(C,A), clear(D), clear(B), ontable(A), ontable(B)}
Goal: {on(A,B), on(B,C)}

Operators:

put(X,Y):           PRE: {ontable(X), clear(X), clear(Y)}      ADD: {on(X,Y)}              DEL: {ontable(X), clear(Y)}
put(X,Y) [restack]: PRE: {on(X,Z), clear(X), clear(Y)}         ADD: {on(X,Y), clear(Z)}    DEL: {on(X,Z), clear(Y)}
put_on_table(X):    PRE: {clear(X), on(X,Y)}                   ADD: {ontable(X), clear(Y)} DEL: {on(X,Y)}

A valid plan (backward-search idealised, slide):

  1. put_on_table(D) — clear C so we can later put B on C.
  2. put_on_table(C) — bring C to the table.
  3. put(B, C) — restack B on C (using the restack variant since B is on the table; or put if treated symmetrically).
  4. put(A, B) — finally A on B.

Formulas & Notation

SymbolMeaning
Fluent(args, S)Time-varying predicate in situation S
put(X, Y, S)Lecture’s situation term: situation resulting from action put(X,Y) in S (analogous to R&N’s do(a, S), which the slides do not use)
PRE / ADD / DELSTRIPS operator lists
s' = (s \ DEL(o)) ∪ ADD(o)STRIPS state update
PRE(o) ⊆ sSTRIPS applicability test
G ⊆ sSTRIPS goal test
(:requirements :strips :typing)PDDL feature flags actually used in the slides
CWAClosed-World Assumption (STRIPS yes, Situation Calculus no)

Common Exam Traps ⚠️

  • Frame ≠ Qualification ≠ Ramification. Know one concrete example for each. (Confusing them is the single most common exam mistake.)
  • STRIPS uses CWA; Situation Calculus does not.
  • The slides put scare quotes around STRIPS “solving” the frame problem — it’s a representational convenience, not a logical solution. Situation Calculus must write explicit frame axioms.
  • DEL contains positive atoms that are removed; do not write ¬clear(B) into ADD.
  • Ignore-PRE-DEL and Ignore-DEL heuristics are NOT admissible → A* optimality not guaranteed.
  • The lecture’s situation term is put(A, B, S₁), not the R&N do(a, S).
  • PDDL coverage in the slides is limited to :strips, :typing, numeric fluents, derived predicates. Things like :adl, conditional effects, action costs, durative actions are not lecture material — they belong to the broader PDDL spec.
  • Plan-space search (e.g. POP) is NOT in the slides — only state-space (forward / backward) search.
  • The “syntactic vs. ontological frame problem” framing (Shanahan / Dennett) is external philosophy of AI — not the lecture’s framing. Do not invoke it on the exam unless the question explicitly asks.
  • Complexity claim — PSPACE-completeness of classical PROPSTRIPS (R&N background; not in the lecture slides): the slides only state set-cover / NP-hardness for the heuristics’ relaxed subproblems, and the general remark “planning remains hard in general.”
  • “STRIPS solves the Frame Problem.”FALSE. It sidesteps it via CWA + ADD/DEL. The ontological problem (knowing which actions actually change which things) is just pushed onto the modeler.
  • STRIPS can’t handle uncertainty. Actions are deterministic, the world is fully observable, no probabilities. For uncertainty → MDPs (Markov Decision Process (MDP)).
  • Ground operators vs. action schemas. A schema like pickup(X) has free variable X. Grounding substitutes specific blocks: pickup(A), pickup(B). A planner works with grounded operators (potentially many).

Quick Comparison Table

FormalismState representationFrame problemUses CWA?What’s the planning algorithm?
Situation CalculusLogical fluents (subset of FOL)Explicit frame axioms (~O(actions × fluents))NoTheorem proving
STRIPSSet of ground atomsImplicit — only DEL changes thingsYesClassical state-space search
PDDLSTRIPS + types + numeric fluents + derived predicatesImplicit (inherits STRIPS convention)YesClassical state-space search (modern planners, IPC)

ALGORITHMS (full reference) ⭐

Pseudocode + complexity + pros/cons for every routine you might need to write or trace by hand.


1. STRIPS operator application

Goal. Apply an instantiated operator o to a state s and produce the successor s'.

STRIPS-APPLY(o, s):
    if PRE(o) ⊆ s:                       # applicability test
        s' ← (s \ DEL(o)) ∪ ADD(o)       # delete first, then add
        return s'
    else:
        return NOT-APPLICABLE

Cost. O(|PRE| + |DEL| + |ADD|) per application (set ops). Cheap.

Pros.

  • ✅ Conceptually trivial and fast.
  • ✅ Frame problem handled by convention — no axioms to write.
  • ✅ Plugs straight into any classical search algorithm.

Cons.

  • ⚠️ Closed-world assumption means you cannot represent “unknown” facts.
  • ⚠️ ADD/DEL must enumerate every directly-changed atom; ramifications (indirect effects) need to be encoded by hand into ADD/DEL of every operator they apply to.

2. Situation Calculus reasoning (effect + frame axioms)

Goal. Given an initial-state theory T₀, a set of effect axioms E, and a set of frame axioms F, prove the goal G(σ) for some ground situation term σ. The witness σ is the plan.

SIT-CALC-PLAN(T₀, E, F, G):
    T ← T₀ ∪ E ∪ F
    Use a theorem prover (e.g. resolution) to derive:
        ∃σ. G(σ)
    Extract σ from the proof — σ is a nested term like
        put(B, C, put_on_table(A, S₁))
    return σ as the plan

Cost. First-order theorem proving is semi-decidable in general; for restricted Horn-like fragments (as used in the lecture’s examples) it is decidable but can still be expensive.

Pros.

  • ✅ States are first-class logical theories — deductive reasoning comes for free.
  • ✅ No closed-world assumption — explicit handling of unknowns.
  • ✅ All three problems (Frame/Qualification/Ramification) can in principle be addressed by writing the right axioms.

Cons.

  • Frame axiom explosion: roughly O(actions × fluents) axioms — the practical face of the frame problem.
  • ❌ Performance can be a problem; verifying coverage is hard (slide: “difficult to guarantee that all cases are covered, and runtime may suffer”).

3. Ignore-PRE-DEL heuristic

Goal. Estimate the cost from state s to goal G by relaxing the planning problem: drop PRE and DEL of every operator. Each operator then “covers” some subset of the goal literals.

h_PRE-DEL(s, G):
    U ← G \ s                                       # unsatisfied goal literals
    for each operator scheme o, each instantiation i:
        cover(o,i) ← ADD(o,i) ∩ U                   # goals this op would satisfy
    return MIN-SET-COVER({cover(o,i) | over all (o,i)}, U)
    # In practice: a polynomial-time GREEDY set-cover approximation.

Cost. Exact: NP-hard (set cover). Greedy approximation: polynomial.

Pros.

  • ✅ Easy to compute in practice (greedy).
  • ✅ Often informative on planning benchmarks.
  • ✅ Generalises naturally (Blocksworld: count unsatisfied literals; Warehouse: count PSUs to carry).

Cons.

  • ⚠️ Greedy approximation may overestimateNOT admissible ⇒ A* loses its optimality guarantee.
  • ⚠️ Ignoring PRE makes the relaxation very loose — heuristic can be wildly off when preconditions are restrictive.

4. Ignore-DEL heuristic

Goal. Same idea, but only DEL is ignored. PRE still matters. In the relaxed world no action can ever undo a goal, so once a fact becomes true it stays true.

h_DEL(s, G):
    s* ← s
    repeat:
        for each applicable operator o (using ADD only, no DEL):
            s* ← s* ∪ ADD(o)
        until no new atoms are added or G ⊆ s*
    return length of (shortest) sequence of ops used to reach G  (NP-hard)
    # In practice: polynomial-time approximation (e.g. h_max, h_add, h_FF).

Cost. Exact: NP-hard. Approximation: polynomial.

Pros.

  • ✅ Tighter than Ignore-PRE-DEL — respects preconditions.
  • ✅ Underpins the most successful classical planning heuristics in IPC (h_max, h_add, h_FF).

Cons.

  • ⚠️ Approximation is NOT admissible ⇒ A* optimality not guaranteed.
  • ⚠️ Still costly to compute exactly.

Goal. Find a plan = sequence of operators leading from the initial state s₀ to a state satisfying the goal G.

CLASSICAL-PLAN(s₀, G, Operators, heuristic h):
    frontier ← priority queue ordered by f(n) = g(n) + h(n)
    push (s₀, [], 0) onto frontier
    closed ← {}
 
    while frontier not empty:
        (s, plan, g) ← frontier.pop()
        if G ⊆ s:                           # STRIPS goal test
            return plan                     # SUCCESS
 
        if s ∈ closed: continue
        closed.add(s)
 
        for each operator scheme o, each instantiation i:
            if PRE(o,i) ⊆ s:                # applicable?
                s' ← (s \ DEL(o,i)) ∪ ADD(o,i)
                if s' ∉ closed:
                    frontier.push((s', plan + [o,i], g + 1))
 
    return FAILURE                          # no plan exists

Cost. Worst-case exponential in plan length; practical performance dominated by the heuristic h. The general planning decision problem is intractable (slide remark: “planning remains hard in general”; PSPACE-complete for grounded propositional STRIPS — R&N background, not in the lecture slides).

Pros.

  • ✅ Reuses any classical search algorithm (BFS, DFS, A*, IDA*).
  • ✅ Easy to plug different heuristics (Ignore-PRE-DEL, Ignore-DEL, h_FF, …).
  • ✅ Same pattern works for backward search (start from G, apply operators in reverse).

Cons.

  • ⚠️ Branching factor = number of applicable instantiated operators — can be huge.
  • ⚠️ Uninformed search blows up immediately on realistic problems → heuristic quality is everything.
  • ⚠️ Forward search may waste time on irrelevant actions; backward search may waste time on unreachable subgoals — neither dominates in general.

— Original atomic-note material below —

Kept verbatim from the pre-merge STRIPS hub — the runnable Python planner with visualisation, the historical “where STRIPS is used today” map, and the limitations/extensions tables.

Visualisations (Python)

Figures to make STRIPS concepts concrete. Each toggle renders in Obsidian’s Execute Code (Pyodide); the first install line is for the browser sandbox only.

What this figure shows. Classical planning is search over world states. Every node is a complete Blocksworld configuration; every edge is one STRIPS action (move a clear block onto the table or onto another clear block). BFS expands the whole reachable space (13 states for 3 blocks) outward from the initial state (dark) until it reaches the goal (green); the yellow path is the extracted plan. This is exactly the “Planning via Classical Search” idea — the planner never executes, it searches the state graph for a path, then returns the action sequence. Swap GOAL or add a 4th block to watch the tree explode (the reason heuristics like Ignore-DEL exist).

What this shows. Three Blocksworld states laid out as stacks of coloured blocks on a table. Each step applies one STRIPS operator. The visual makes the state-as-set-of-atoms idea concrete: in the rightmost panel, the atoms holding are {on(C,B), on(B,A), ontable(A), ontable(D), clear(C), clear(D)}. Everything else (including clear(A) and clear(B), which were true in the initial state) is false by the Closed-World Assumption — they are simply absent from the set.


What this shows. A real BFS expansion of the STRIPS state space, capped at 12 states for legibility. Each node is one state (compactly labelled by its stacks + the held block); each edge is one ground operator that takes you from parent to child. The green path is the shortest plan BFS found to reach On(A,B) — typically pickup(A) → stack(A,B). The grey siblings are alternative states BFS also generated but didn’t need. This is exactly what CLASSICAL-PLAN (algorithm 5 above) does internally — with a heuristic, A* would prune most of the grey nodes.


What this shows. A single STRIPS operator dissected side-by-side. BEFORE: three blocks on the table; the atom set is shown bottom-left. PRE (green) lists the atoms that must hold for put(A,B) to be applicable — each is checked against the BEFORE set with a ✓. DEL (red) removes ontable(A) and clear(B). ADD (blue) adds on(A,B). The state-update rule s' = (s \ DEL) ∪ ADD is applied — note the order: delete first, then add. AFTER: A now sits on B; the new atom set on the bottom-right confirms on(A,B) is in and the deleted atoms are gone. Anything not mentioned in ADD/DEL (e.g. ontable(C), clear(C)) is unchanged automatically — that is the Frame Convention STRIPS uses to “solve” the frame problem.


Worked Blocksworld example (Python planner)

The canonical STRIPS domain. Blocks on a table; a robot arm picks them up and stacks them.

Operators:

pickup(X)
  PRE:  Clear(X) ∧ OnTable(X) ∧ HandEmpty
  ADD:  Holding(X)
  DEL:  OnTable(X), Clear(X), HandEmpty

putdown(X)
  PRE:  Holding(X)
  ADD:  OnTable(X), Clear(X), HandEmpty
  DEL:  Holding(X)

stack(X, Y)
  PRE:  Holding(X) ∧ Clear(Y)
  ADD:  On(X, Y), Clear(X), HandEmpty
  DEL:  Holding(X), Clear(Y)

unstack(X, Y)
  PRE:  On(X, Y) ∧ Clear(X) ∧ HandEmpty
  ADD:  Holding(X), Clear(Y)
  DEL:  On(X, Y), Clear(X), HandEmpty

Initial state: A on table, B on A, C on table. Robot arm empty.

{ OnTable(A), On(B, A), OnTable(C), Clear(B), Clear(C), HandEmpty }

Goal: { On(A, B), On(B, C) } — stack A on B on C.

See it in code — tiny STRIPS planner with forward BFS

What you’ll see:

  • The planner finds a multi-step sequence like unstack(B,A), putdown(B), pickup(B), stack(B,C), pickup(A), stack(A,B).
  • The plot shows each intermediate state — blocks on the table, blocks being held (✋), blocks stacked.
  • The plan is optimal (BFS finds the shortest one). For larger problems you’d use heuristic search (FF, LAMA, Fast Downward) instead of BFS.
DirectionHow it worksWhen to prefer
Forward (progression)Start at I, apply operators, search forward until G holdsSmall initial state, large goal
Backward (regression)Start at G, find operators whose ADD list contains goal atoms, regress through PRESmall goal, large initial state

Modern planners use heuristic forward search with relaxation-based heuristics (ignore DEL → Ignore-Delete heuristic; ignore PRE → Ignore-Precondition).

Limitations of pure STRIPS

  • No types or numeric fluents — everything is binary atoms (PDDL adds these)
  • No disjunctive preconditions (e.g. “X is red OR blue”)
  • No conditional effects (e.g. “if X is metal, then add Magnetized(X)”)
  • No temporal reasoning (durative actions, deadlines)
  • Deterministic only — no probabilities

PDDL extensions

Each limitation is addressed by some PDDL extension:

ExtensionAdds
PDDL 1.2 (1998)Types, equality, basic STRIPS
PDDL 2.1 (2002)Numeric fluents, durative actions, plan metrics
PDDL 2.2Derived predicates, timed initial literals
PDDL 3.0Preferences, constraints, hard/soft goals
PPDDLProbabilistic effects (for MDP-style problems)

Where STRIPS-style planning is used today

  • PDDL planners (Fast Downward, LAMA, FF, Pyperplan) — all use STRIPS internals + heuristics. Used in academic and industrial planning.
  • International Planning Competition (IPC) — since 1998, runs benchmarks on STRIPS-derived domains
  • Robotics task planning — ROS uses PDDL-based planners (e.g. rosplan) for high-level task sequencing
  • NASA mission planning — Mars rovers (Spirit, Opportunity, Curiosity) use derivatives of STRIPS for daily activity scheduling (ASPEN/Casper systems)
  • Video game AI — F.E.A.R. (2005) famously used GOAP (Goal-Oriented Action Planning), a STRIPS-derived system. Modern game AI systems (HTN planners, behavior trees) trace back to STRIPS.
  • Manufacturing assembly planning — automotive assembly lines use STRIPS-derived planners
  • Logistics scheduling — airline crew scheduling, warehouse robot coordination

Where STRIPS was challenged — and by what

ApplicationWas STRIPS, now …Why
Probabilistic/stochastic domainsMDPs + RL (POMDPs for partial observability)STRIPS can’t model uncertainty in action outcomes
Continuous control / motion planningSampling-based planners (RRT, PRM)STRIPS is symbolic; continuous spaces need geometric reasoning
Long-horizon robotic tasks with perceptionLLM-based planning agents (ReAct, AutoGPT, Devin)LLMs handle qualification problem better, replan when preconditions fail
Task-and-motion planningPDDLStream, hybrid TAMP systemsCombine symbolic STRIPS with geometric/continuous reasoning
Game AI (modern)Behavior trees, utility AI, neural policiesBehavior trees are easier to author by game designers

Where STRIPS still wins: when (a) the domain is genuinely symbolic and discrete, (b) you need a guaranteed-optimal plan, (c) you need explanations (every action’s preconditions are explicit), and (d) the world is deterministic enough to model with binary atoms.


See also

Tags: methods-of-ai planning strips pddl frame-problem ai-generated
Created: 18-05-26 · Merged with planning-i_30-04-26.md: 23-05-26