We begin with a description that corresponds to the standard **STRIPS encoding of the**
domain.

Fluent(on(x, y), block(x)∧ **block**(y)), Fluent(ontable(x)**, block**(x)),
Fluent(holding(x)**, block**(x)), Complex(clear(x)**, block**(x), Defined(clear(x),(¬∃(y, block)on(y,x))∧ ¬**holding**(x)), Complex(**handempty, true**), Defined(handempty, ¬∃(x, block)**holding**(x)),
Causes(on(x, y) ∧ x 6= z, ¬on(**z, y**)),
Causes(on(x, y) ∧ y 6= z, ¬on(**x, z**)),
Causes(on(x, y), ¬**ontable**(x)), Causes(ontable(x), ¬on(**x, y**)),
Causes(on(x, y), ¬**holding**(x)), Causes(on(x, y), ¬**holding**(y)), Causes(holding(x), ¬**ontable**(x)),
Causes(holding(x), ¬on(**x, y**)), Causes(holding(x), ¬on(**y, x**)),
Causes(holding(x) ∧ y 6= x, ¬**holding**(y)),
Action(stack(x, y), block(x)∧ **block**(y) ∧ x 6= y),
Precond(stack(x, y), holding(x)∧ **clear**(y)), Effect(stack(x, y), true, on(**x, y**)), Action(unstack(x, y), block(x)∧ **block**(y) ∧ x 6= y),
Precond(unstack(x, y), clear(x)∧ on(x, y) ∧ **handempty**),
Effect(unstack(x, y)**, true, holding**(x)),
Action(putdown(x)**, block**(x)), Precond(putdown(x)**, holding**(x)), Effect(putdown(x)**, true, ontable**(x)), Action(pickup(x)**, block**(x)), Precond(pickup(x), handempty ∧ ontable(x) ∧ **clear**(x)), Effect(pickup(x)**, true, holding**(x)).

Notice that compared to the description in Example 1, there are two more fluents, **holding** and handempty **here. Thus we have a few more domain rules about them, and the definition** of clear is changed to take into account that when a block is held, it is **not considered to**
be clear.