Loki is a C++20 library for syntactic and semantic parsing and translation of PDDL files. Loki separates the parsing and translation of domain and problem files, allowing users to effectively work with collection of problems.
The parser is based on the canonical parser structure proposed in the Boost Spirit X3 library.
The translator is based on the method presented in section four of the paper "Concise finite-domain representations for PDDL planning tasks by Malte Helmert (AIJ 2009)".
- :strips
- :typing
- :negative-preconditions
- :disjunctive-preconditions
- :equality
- :existential-preconditions
- :universal-preconditions
- :quantified-preconditions
- :conditional-effects
- :numeric-fluents
- :adl
- :derived-predicates
- :action-costs
- :non-deterministic (unsupported in the translator)
- :probabilistic-effects (unsupported in the translator)
Loki depends on a fraction of Boost's header-only libraries (Fusion, Spirit x3, Container), its performance benchmarking framework depends on GoogleBenchmark, and its testing framework depends on GoogleTest.
Loki consumes native dependencies from Python packages:
pyyggdrasil >= 0.0.9for shared third-party native dependencies.
The shared workspace layout and general Python/CMake integration pattern are documented in the Planning and Learning build instructions.
For offline/local development, install pyyggdrasil from the sibling source
checkout instead:
cd ../yggdrasil
uv pip install --python ../loki/.venv/bin/python .Install Loki's native dependency providers into the active Python environment, then configure CMake with their native prefixes:
python -m pip install 'pyyggdrasil>=0.0.9'
cmake -S . -B build \
-DCMAKE_PREFIX_PATH="$(python -c 'import pyyggdrasil; print(pyyggdrasil.native_prefix())')"
cmake --build build -j4CMake options:
| Option | Default | Description |
|---|---|---|
LOKI_BUILD_TESTS |
OFF |
Build Loki tests. |
LOKI_BUILD_EXECUTABLES |
OFF |
Build Loki executables. |
LOKI_BUILD_PROFILING |
OFF |
Build Loki profiling targets. |
LOKI_BUILD_PYPDDL |
OFF |
Build Loki for the pypddl Python wheel. |
Run tests from a build configured with -DLOKI_BUILD_TESTS=ON:
ctest --test-dir build --output-on-failureInstall Loki from a configured build directory with:
cmake --install build --prefix=<path/to/installation-directory>python -m pip install .The Python package pypddl installs Loki's native headers, shared library, and
CMake package config under pypddl.native_prefix(). It depends on
pyyggdrasil>=0.0.9 for third-party native dependencies:
import pypddl
import pyyggdrasil
print(pypddl.native_prefix())
print(pyyggdrasil.native_prefix())Downstream CMake projects should include the native prefixes of pypddl and
its native package dependencies in CMAKE_PREFIX_PATH:
cmake -S . -B build \
-DCMAKE_PREFIX_PATH="$(python -c 'import os, pyyggdrasil, pypddl; print(os.pathsep.join(map(str, [pyyggdrasil.native_prefix(), pypddl.native_prefix()])))')"Loki exports the loki::parsers target.
The executable illustrates how to use Loki. It is disabled by default and can be
enabled with -DLOKI_BUILD_EXECUTABLES=ON.
./build/exe/loki data/gripper/domain.pddl data/gripper/p-2-0.pddlIf you use Loki in your research, please cite it as follows:
@misc{drexler-zenodo2026,
author = "Dominik Drexler",
title = "{Loki}: A {PDDL} Parser and Normalizer",
publisher = "Zenodo",
year = "2026",
doi = "10.5281/zenodo.20081136",
url = "https://doi.org/10.5281/zenodo.20081136",
}This work was partially supported by the Wallenberg AI, Autonomous Systems and Software Program (WASP) funded by the Knut and Alice Wallenberg Foundation.