I'm very pleased to announce the release of Spot 1.2.
Spot is a model-checking library developed collaboratively by LRDE and LIP6. It provides algorithms and data structures to implement the automata-theoretic approach to LTL model checking.
This release contains several new features (summarized below), but the most notable are the interface with ltl2dstar (i.e., Spot can read deterministic Rabin and Streett automata and convert them into Büchi automata) and algorithms for minimizing deterministic TGBA or BA using a SAT-solver.
You can find the new version here:
http://spot.lip6.fr/dl/spot-1.2.tar.gz
Please report any issue to spot@lrde.epita.fr.
New in spot 1.2 (2013-10-01)
* Changes to command-line tools:
- ltlcross has a new option --color to color its output. It is enabled by default when the output is a terminal.
- ltlcross will give an example of infinite word accepted by the two automata when the product between a positive automaton and a negative automaton is non-empty.
- ltlcross can now read the Rabin and Streett automata output by ltl2dstar. This type of output should be specified using '%D':
ltlcross 'ltl2dstar --ltl2nba=spin:path/to/ltl2tgba@-s %L %D'
However because Spot only supports Büchi acceptance, these Rabin and Streett automata are immediately converted to TGBAs before further processing by ltlcross. This is still interesting to search for bugs in translators to Rabin or Streett automata, but the statistics (of the resulting TGBAs) might not be very relevant.
- When ltlcross obtains a deterministic automaton from a translator it will now complement this automaton to perform additional intersection checks. This is complementation is done only for deterministic automata (because that is cheap) and can be disabled with --no-complement.
- To help with debugging problems detected by ltlcross, the environment variables SPOT_TMPDIR and SPOT_TMPKEEP control where temporary files are created and if they should be erased. Read the man page of ltlcross for details.
- There is a new command, named dstar2tgba, that converts a deterministic Rabin or Streett automaton (expressed in the output format of ltl2dstar) into a TGBA, BA or Monitor.
In the case of Rabin acceptance, the conversion will output a deterministic Büchi automaton if one such automaton exist. Even if no such automaton exists, the conversion will actually preserves the determinism of any SCC that can be kept deterministic.
In the case of Streett acceptance, the conversion produces non-deterministic Büchi automata with Generalized acceptance. These are then degeneralized if requested.
See http://spot.lip6.fr/userdoc/dstar2tgba.html for some examples, and the man page for more reference.
- The %S escape sequence used by ltl2tgba --stats to display the number of SCCs in the output automaton has been renamed to %c. This makes it more homogeneous with the --stats option of the new dstar2tgba command.
Additionally, the %p escape can now be used to show whether the output automaton is complete, and the %r escape will give the number of seconds spent building the output automaton (excluding the time spent parsing the input).
- ltl2tgba, ltl2tgta, and dstar2tgba have a --complete option to output complete automata.
- ltl2tgba, ltl2tgta, and dstar2tgba can use a SAT-solver to minimize deterministic automata. Doing so is only needed on properties that are stronger than obligations (for obligations our WDBA-minimization procedure will return a minimimal deterministic automaton more efficiently) and is disabled by default. See the spot-x(7) man page for documentation about the related options: sat-minimize, sat-states, sat-acc, state-based. See also http://spot.lip6.fr/userdoc/satmin.html for some examples.
- ltlfilt, genltl, and randltl now have a --latex option to output formulas in a way that its easier to embed in a LaTeX document. Each operator is output as a command such as \U, \F, etc. doc/tl/spotltl.sty gives one possible definition for each macro.
- ltlfilt, genltl, and randltl have a new --format option to indicate how to present the output formula, possibly with information about the input.
- ltlfilt as a new option, --relabel-bool, to abstract independent Boolean subformulae as if they were atomic propositions. For instance "a & GF(c | d) & b & X(c | d)" would be rewritten as "p0 & GF(p1) & Xp1".
* New functions and classes in the library:
- dtba_sat_synthetize(): Use a SAT-solver to build an equivalent deterministic TBA with a fixed number of states.
- dtba_sat_minimize(), dtba_sat_minimize_dichotomy(): Iterate dtba_sat_synthetize() to reduce the number of states of a TBA.
- dtgba_sat_synthetize(), dtgba_sat_minimize(), dtgba_sat_minimize_dichotomy(): Likewise, for deterministic TGBA.
- is_complete(): Check whether a TGBA is complete.
- tgba_complete(): Complete an automaton by adding a sink state if needed.
- dtgba_complement(): Complement a deterministic TGBA.
- satsolver(): Run an (external) SAT solver, honoring the SPOT_SATSOLVER environment variable if set.
- tba_determinize(): Run a power-set construction, and attempt to fix the acceptance simulation to build a deterministic TBA.
- dstar_parse(): Read a Streett or Rabin automaton in ltl2dstar's format. Note that this format allows only deterministic automata.
- nra_to_nba(): Convert a (possibly non-deterministic) Rabin automaton to a non-deterministic Büchi automaton.
- dra_to_ba(): Convert a deterministic Rabin automaton to a Büchi automaton, preserving acceptance in all SCCs where this is possible.
- nsa_to_tgba(): Convert a (possibly non-deterministic) Streett automaton to a non-deterministic TGBA.
- dstar_to_tgba(): Convert any automaton returned by dstar_parse() into a TGBA.
- build_tgba_mask_keep(): Build a masked TGBA that shows only a subset of states of another TGBA.
- build_tgba_mask_ignore(): Build a masked TGBA that ignore a subset of states of another TGBA.
- class tgba_proxy: Helps writing on-the-fly algorithms that delegate most of their methods to the original automaton.
- class bitvect: A dynamic bit vector implementation.
- class word: An infinite word, stored as prefix + cycle, with a simplify() methods to simplify cycle and prefix in obvious ways.
- class temporary_file: A temporary file. Can be instanciated with create_tmp_file() or create_open_tmpfile().
- count_state(): Return the number of states of a TGBA. Implement a couple of specializations for classes where is can be know without exploration.
- to_latex_string(): Output a formula using LaTeX syntax.
- relabel_bse(): Relabeling of Boolean Sub-Expressions. Implements ltlfilt's --relabel-bool option describe above.
* Noteworthy internal changes:
- When minimize_obligation() is not given the formula associated to the input automaton, but that automaton is deterministic, it can still attempt to call minimize_wdba() and check the correcteness using dtgba_complement(). This allows dstar2tgba to apply WDBA-minimization on deterministic Rabin automata.
- tgba_reachable_iterator_depth_first has been redesigned to effectively perform a DFS. As a consequence, it does not inherit from tgba_reachable_iterator anymore.
- postproc::set_pref() was used to accept an argument among Any, Small or Deterministic. These can now be combined with Complete as Any|Complete, Small|Complete, or Deterministic|Complete.
- operands of n-ary operators (like & and |) are now ordered so that Boolean terms come first. This speeds up syntactic implication checks slightly. Also, literals are now sorted using strverscmp(), so that p5 comes before p12.
- Syntactic implication checks have been generalized slightly (for instance 'a & b & F(a & b)' is now reduced to 'a & b' while it was not changed in previous versions).
- All the parsers implemented in Spot now use the same type to store locations.
- Cleanup of exported symbols
All symbols in the library now have hidden visibility on ELF systems. Public classes and functions have been marked explicitely for export with the SPOT_API macro.
During this massive update, some of functions that should not have been made public in the first place have been moved away so that they can only be used from the library. Some old of unused functions have been removed.
removed: - class loopless_modular_mixed_radix_gray_code
hidden: - class acc_compl - class acceptance_convertor - class bdd_allocator - class free_list
* Bug fixes:
- Degeneralization was not indempotant on automata with an accepting initial state that was on a cycle, but without self-loop.
- Configuring with --enable-optimization would reset the value of CXXFLAGS.