from IPython.display import display
import spot
spot.setup()
To build an automaton, simply call translate()
with a formula, and a list of options to characterize the automaton you want (those options have the same name as the long options name of the ltl2tgba
tool, and they can be abbreviated).
a = spot.translate('(a U b) & GFc & GFd', 'BA', 'complete'); a
The call the spot.setup()
in the first cells has installed a default style for the graphviz output. If you want to change this style temporarily, you can call the show(style)
method explicitely. For instance here is a vertical layout with the default font of GraphViz.
a.show("v")
If you want to add some style options to the existing one, pass a dot to the show()
function in addition to your own style options:
a.show(".ast")
The translate()
function can also be called with a formula object. Either as a function, or as a method.
f = spot.formula('a U b'); f
spot.translate(f)
f.translate()
When used as a method, all the arguments are translation options. Here is a monitor:
f.translate('mon')
The following three cells show a formulas for which it makes a difference to select 'small'
or 'deterministic'
.
f = spot.formula('Ga | Gb | Gc'); f
f.translate('ba', 'small').show('.v')
f.translate('ba', 'det').show('v.')
Here is how to build an unambiguous automaton:
spot.translate('GFa -> GFb', 'unambig')
Compare with the standard translation:
spot.translate('GFa -> GFb')
And here is the automaton above with state-based acceptance:
spot.translate('GFa -> GFb', 'sbacc')
Some example of running the self-loopization algorithm on an automaton:
a = spot.translate('F(a & X(!a &Xb))', "any"); a
spot.sl(a)
a.is_empty()
Reading from file (see automaton-io.ipynb
for more examples).
%%file example1.aut
HOA: v1
States: 3
Start: 0
AP: 2 "a" "b"
acc-name: Buchi
Acceptance: 4 Inf(0)&Fin(1)&Fin(3) | Inf(2)&Inf(3) | Inf(1)
--BODY--
State: 0 {3}
[t] 0
[0] 1 {1}
[!0] 2 {0}
State: 1 {3}
[1] 0
[0&1] 1 {0}
[!0&1] 2 {2}
State: 2
[!1] 0
[0&!1] 1 {0}
[!0&!1] 2 {0}
--END--
a = spot.automaton('example1.aut')
display(a.show('.a'))
display(spot.remove_fin(a).show('.a'))
display(a.postprocess('TGBA', 'complete').show('.a'))
display(a.postprocess('BA'))
!rm example1.aut
spot.complete(a)
spot.complete(spot.translate('Ga'))
# Using +1 in the display options is a convient way to shift the
# set numbers in the output, as an aid in reading the product.
a1 = spot.translate('a W c'); display(a1.show('.bat'))
a2 = spot.translate('a U b'); display(a2.show('.bat+1'))
# the product should display pairs of states, unless asked not to (using 1).
p = spot.product(a1, a2); display(p.show('.bat')); display(p.show('.bat1'))
Explicit determinization after translation:
a = spot.translate('FGa')
display(a)
display(a.is_deterministic())
spot.tgba_determinize(a).show('.ba')
Determinization by translate()
. The generic
option allows any acceptance condition to be used instead of the default generalized Büchi.
aut = spot.translate('FGa', 'generic', 'deterministic'); aut
Adding an atomic proposition to all edges
import buddy
b = buddy.bdd_ithvar(aut.register_ap('b'))
for e in aut.edges():
e.cond &= b
aut
Adding an atomic proposition to the edge between 0 and 1:
c = buddy.bdd_ithvar(aut.register_ap('c'))
for e in aut.out(0):
if e.dst == 1:
e.cond &= c
aut