Running the Fast Downward benchmark suite through the translator: 25 of 34 ADL domains translate, 9 fail. Two parser holes were fixed in 4a6a4db (a conjunction nested inside when/forall, and not around a compound condition). These nine fail later, in three groups.
Group 1: condition atom with no SAS variable
caldera-opt18-adl, caldera-sat18-adl, caldera-split-opt18-adl, caldera-split-sat18-adl, folding-opt23-adl, folding-sat23-adl
panicked at planforge-translate/src/translate.rs:354:
condition atom Atom { predicate: "prop_host", args: ["id_birat", "id_zhost"] }
has no SAS variable; it is neither reachable nor statically decided
The assertion is correct to fire: silently dropping the condition would make the operator hold in states where it must not. The question is why a condition atom survives instantiation without being reachable or statically decided, since Condition::instantiate_action is supposed to resolve exactly that. Six domains hitting the same assertion suggests one cause.
Group 2: action cost with no numeric variable
cavediving-14-adl
panicked at planforge-translate/src/translate.rs:740:
cost expression PNE hiring-cost(?d1) of action (hire-diver d0) has no numeric variable
Note the argument: the ground action is (hire-diver d0) but its cost still mentions ?d1. A variable that is not the action's own parameter is unsubstituted in the cost expression, which points at the cost being carried from a scope whose parameters were not applied.
Group 3: settlers
settlers-opt18-adl, settlers-sat18-adl
panicked at planforge-translate/src/translate.rs:283
Not yet examined.
Reproducing
planforge-translator translate \
/path/to/downward-benchmarks/caldera-opt18-adl/domain.pddl \
/path/to/downward-benchmarks/caldera-opt18-adl/p01.pddl
The benchmarks are the standard aibasel/downward-benchmarks checkout.
Why this matters more than the count suggests
ADL support is validated by hand-written fixtures under tests/assets/adl, and those fixtures were written from the constructs rather than from real domains. They missed both parser holes that the benchmark run found immediately. A corpus of minimal fixtures proves the constructs work in isolation; it says nothing about the combinations real domains use.
Worth considering: a test that translates a sample of real benchmark domains, skipped when the benchmark checkout is absent, so this class of gap is caught by CI rather than by hand.
Running the Fast Downward benchmark suite through the translator: 25 of 34 ADL domains translate, 9 fail. Two parser holes were fixed in
4a6a4db(a conjunction nested insidewhen/forall, andnotaround a compound condition). These nine fail later, in three groups.Group 1: condition atom with no SAS variable
caldera-opt18-adl,caldera-sat18-adl,caldera-split-opt18-adl,caldera-split-sat18-adl,folding-opt23-adl,folding-sat23-adlThe assertion is correct to fire: silently dropping the condition would make the operator hold in states where it must not. The question is why a condition atom survives instantiation without being reachable or statically decided, since
Condition::instantiate_actionis supposed to resolve exactly that. Six domains hitting the same assertion suggests one cause.Group 2: action cost with no numeric variable
cavediving-14-adlNote the argument: the ground action is
(hire-diver d0)but its cost still mentions?d1. A variable that is not the action's own parameter is unsubstituted in the cost expression, which points at the cost being carried from a scope whose parameters were not applied.Group 3: settlers
settlers-opt18-adl,settlers-sat18-adlNot yet examined.
Reproducing
The benchmarks are the standard
aibasel/downward-benchmarkscheckout.Why this matters more than the count suggests
ADL support is validated by hand-written fixtures under
tests/assets/adl, and those fixtures were written from the constructs rather than from real domains. They missed both parser holes that the benchmark run found immediately. A corpus of minimal fixtures proves the constructs work in isolation; it says nothing about the combinations real domains use.Worth considering: a test that translates a sample of real benchmark domains, skipped when the benchmark checkout is absent, so this class of gap is caught by CI rather than by hand.