This is a tool for translating MITPPL formulae over timed words into timed automata in
The most common applications are satisfiability and model checking: these TAs can be analysed by Uppaal (for the finite-word case; see also pyuppaal, pyUPPAAL), (multi-core) LTSmin (for the infinite-word case), or TChecker.
MITPPL is a very expressive timed logic that contains the full fragment of MITL (with both future and past modalities)
and Pnueli modalities
of the form
Below are some example formulae supported by MightyPPL (all unsatisfiable over infinite timed words):
(p1 U[1, 2] p2) && G[1, 3] (!p2)
This is unsatisfiable, as you cannot have a
Fn[0, 5](p1, p2, p3) && G(p1 -> G[0, 3](!p2)) && G(p2 -> G[0, 3](!p3))
Clearly unsatisfiable. If the interval is
F( !((p1 -> (p1 && H [0, 20] p1)) || O [0, 30] (p1 -> (p1 && H [0, 20] p1))) )
The formula holds if there is a point where
See some additional sanity checks below.
| Formula | Sat? |
|---|---|
| ✗ | |
| ✓ | |
| ✗ | |
| ✓ | |
| ✗ | |
| ✓ |
See the grammar file Mitl.g4 for the exact syntax of input formulae, but in short: F, G, U, R as in
MightyL,
O(once) is the past version ofF,H(historically) is the past version ofG,S(since) is the past version ofU, andT(trigger) is the past version ofR.
Pnueli modalities (and their past and dual versions) are Fn, On, Gn and Hn.
mitppl <in_spec_file> --{fin|inf} [out_file --{tck|xml} [--{noflatten|compflatten}]] [--debug] [--noback]
in_spec_fileis a formula, written in plain text as the examples above.--finor--inffor finite / infinite timed words (finite / Büchi acceptance).- If
out_fileis specified then either--tckor--xmlmust follow. - Operation modes:
- The "noflatten" mode: individual tester / component TAs, one or more for each temporal subformula;
- The "compflatten" mode (recommended): individual tester TAs, one for each temporal subformula;
- The default "flatten" mode: a single monolithic TA for the entire formula (the synchronous product of the tester and component TAs). For performance reasons MightyPPL constructs only forward-reachable state spaces and transitions.
- If
out_fileis unspecifed, then an implementation of the standard backward fixpoint algorithm will be used as the back end. --debugto pause at various points in the processing.--nobackto disable the backward reachability analysis for simplifying tester TAs (no effect with--noflat).
Currently there are two ways to specify the model xml /
tck file, or hard-code in MightyPPL.cpp. See the model-checking benchmarks to see how this is
done.
Internally MightyPPL uses TA and DBM representations provided by MoniTAal and PARDIBAAL. In particular, TAs are represented semi-symbolically and transitions are synchronised on Boolean formulae over propositions (instead of single letters). Without using two-way or other TA variants, future and past modalities are handled uniformly by good old pure vanilla TAs, thanks to the innocuous fact that timed regular languages are closed under reversal (!). Overlapping obligations from MITL modalities with general intervals and Pnueli modalities are handled by a novel sequentialisation technique; see the tech report for details.
Boost >= 1.40 is needed by MoniTAal.
$ git clone git@github.com:hsimho/MightyPPL.git
$ cd MightyPPLEdit CMakeLists.txt and modify set(ANTLR_EXECUTABLE ...) to point to ANTLR's .jar file (complete Java binaries jar). Then
$ git submodule init
$ git submodule update --force --remoteto check out BuDDy. If these do not work, try
git submodule add -f https://github.com/SSoelvsten/buddy external/buddy
mkdir external/monitaalbeforehand. Finally,
$ mkdir build ; cd build
$ cmake ..
$ makeFor the issue with CMake minimum version, edit the following files, modify cmake_minimum_required(VERSION ...) to at least 3.5,
and make again.
build/antlr4_runtime/src/antlr4_runtime/runtime/Cpp/_deps/googletest-src/CMakeLists.txt
build/antlr4_runtime/src/antlr4_runtime/runtime/Cpp/_deps/googletest-src/googlemock/CMakeLists.txt
build/antlr4_runtime/src/antlr4_runtime/runtime/Cpp/_deps/googletest-src/googletest/CMakeLists.txt
The table below presents the runtime (in seconds) for checking satisfiability over infinite timed words.
All experiments were executed on a desktop machine with an Intel i9-13900K CPU and 64GB of memory.
Note in particular that we used identical back ends for all comparisons!
MightyPPL is used in the "compflatten" mode.
Benchmarks in /testcases/MightyL/.
| Formula | Sat? | MightyL + opaal_ltsmin | MightyPPL + opaal_ltsmin |
|---|---|---|---|
| E-5-12 | ✓ | 225.575 | 0.461 |
| A-5-12 | ✓ | 3.460 | 0.385 |
| U-5-12 | ✓ | 171.445 | 15.242 |
| R-5-12 | ✓ | 2.249 | 0.424 |
| theta3-100-1000 | ✓ | ERR | 0.858 |
| theta4-100-1000 | ✓ | ERR | 10.595 |
Benchmarks in /testcases/newhoxha2/.
| Formula | Sat? | MightyL + opaal_ltsmin | MightyPPL + opaal_ltsmin |
|---|---|---|---|
| 1 | ✓ | 44.444 | 1.045 |
| 2 | ✗ | 62.400 | 7.907 |
| 3 | ✓ | - | 0.568 |
| 4 | ✗ | - | 3.752 |
| 5 | ✓ | - | 0.554 |
| 6 | ✗ | - | 220.276 |
Benchmarks in /testcases/acacia/.
| Formula | Sat? | MightyPPL + TChecker |
|---|---|---|
| 3 | ✓ | 4.441 |
| 4 | ✗ | 0.958 |
| 5 | ✓ | 1.309 |
| 6 | ✗ | 0.945 |
| 9 | ✓ | 6.968 |
@article{hkmmp2025b,
author = {Ho, Hsi-Ming and Krishna, Shankara Narayanan and Madnani, Khushraj and Majumdar, Rupak and Pandya, Paritosh},
title = {MightyPPL: Verification of MITL with Past and Pnueli Modalities},
journal = {CoRR},
volume = {abs/2510.01490},
year = {2025},
url = {https://arxiv.org/abs/2510.01490},
archivePrefix = {arXiv},
eprint = {2510.01490},
}
LGPL-3.0. The MIT License applies to CMake scripts from "Getting started with ANTLR in C++".