Hi,
things have changed a bit since the cited paper was published.
On SMV files
Now, Electrum relies on Pardinus, a temporal extension of Kodkod. When solving with NuSMV or nuXmv, Pardinus sends its output to a compiler named Electrod, which takes care of (1) producing an SMV file, (2) passing it to NuSMV or nuXmv, (3) interpreting the result and (4) passing it back to Pardinus.
Zooming in the solving part, Electrod takes as input a Pardinus problem and generates an SMV file. The former can be retrieved as an .elo
file in the directory of temporary files (/tmp
on Unix). OTOH, the SMV file is deleted after solving as it may be huge, depending on the size of the domain.
Currently, the only way to read an SMV file is to reproduce it by yourself, by running Electrod by hand on the said .elo
file (which means you need to install Electrod on your machine). I reckon that one may wish for Electrum to show this file, as is done for ordinary Pardinus/Kodkod code.
On the translation
Having said that, I can give some details on the translation, which is actually quite simple (no fancy stuff). Essentially, Electrod unfolds all quantifications as well as relational construct into an LTL formula to be satisfied. As NuSMV is a model-checker (not a satisfiability solver), it’s a bit more subtle than that as some parts of the formula may have to be negated before solving (this part is explained in footnote 7 in the paper).
In practice the LTL formula isn’t issued bluntly as an LTLSPEC
(in NuSMV parlance). We extract non-temporal subformulas and put them in an INIT
section, formulas stating an invariant are put in an INVAR
section, while formulas specifying transitions are put in a TRANS
section. The rest goes in the LTLSPEC
section. We prefer using a TRANS
section than an ASSIGN
one because the former has a laxer syntax (and because the solving algorithm that we use transforms the ASSIGN
section in a TRANS
one anyway).
So, we do have a transition system, albeit -possibly- a quite nondeterministic one. Now remark that, for Electrum and NuSMV, an instance is a trace of a transition system, not the transition system itself. Ignoring once again dualization, the trace output by SMV gives rise to an instance or a counter-example for Electrum.
Now, how can we get another trace for the same problem? As NuSMV doesn’t have such a feature, it’s only possible if we implement it. This can be done naively by reifying the first trace as an LTL formula and then re-run NuSMV on an updated problem where we explicitly reject the reified first trace (by negating the formula representing the first trace).
Considering that SMV verification is meant to be used when one is quite sure the specification is correct, it shouldn’t yield any counter-example trace. Furthermore, such a verification is likely to be inefficient. For these reasons, we decided not to implement the trace navigation sketched just above: therefore, so-called “scenario exploration” is only implemented when using the bounded solver directly implemented by Pardinus.