In [1]:
import spot
from spot.seminator import seminator
from spot.jupyter import display_inline
spot.setup(show_default=".ns")

The level-skipping and jump-to-bottommost options

When running the breakpoint construction with multiple acceptance sets, we have to order these sets and after we finish a breakpoint for sets $i$, we start a breakpoint for set $i+1$. We the skip_levels option if a transition is labeled by multiple consecutive sets (say $i$, $i+1$, $i+2$) we will start the breakpoint a the next absent level ($i+3$). This trick is well-know from the degenerazation algorithms.

Looking at the second and third automata in the following example, you can see that skip_level merges the states ({1},∅,0) and ({1},∅,1), and it also reduce the larger bottom component, while creating a trivial SCC ({2},∅,1) above it. This kind of trivial SCC can be removed by the jump_to_bottommost option.

With the jump_to_bottommost option, any state of the form (X,Y,z) can be merged into another state (X,Y',z') that is in a lower SCC of the automaton (the notion of "lower" is here a total order based on a topological ordering of the SCCs). Compare the last two automata of the following example. All edges going to state ({3},∅,0) in the third automaton have been redirected to state ({3},∅,1) instead. Similarly, ({2},∅,1) is fused with ({2},∅,0), and ({1},∅,1) is fused with ({1},∅,0).


In [2]:
in_a = spot.translate("FG(a | XF(a & XFb))")
in_a.set_name("input")
out_a = seminator(in_a, highlight=True, pure=True)
out_a.set_name("without skip-levels")
skip_a = seminator(in_a, highlight=True, pure=True, skip_levels=True)
skip_a.set_name("with skip-levels")
rem_a = seminator(in_a, highlight=True, pure=True, skip_levels=True, jump_to_bottommost=True)
rem_a.set_name("with skip-levels + jump-to-bottommost")
display_inline(in_a, out_a, skip_a, rem_a)


input input Inf( )&Inf( ) [gen. Büchi 2] cluster_0 cluster_1 0 0 I->0 0->0 1 1 1 0->1 a 2 2 0->2 !a 1->1 a 1->2 !a 2->2 1 3 3 2->3 a 3->1 a & b 3->2 !a & b 3->3 a & !b 4 4 3->4 !a & !b 4->2 b 4->3 a & !b 4->3 a & b 4->4 !a & !b
without skip-levels without skip-levels Inf( ) [Büchi] cluster_0 cluster_1 cluster_2 cluster_3 cluster_4 cluster_5 0 0 I->0 0->0 1 1 1 0->1 a 2 2 0->2 !a 6 {2} , ∅ , 0 6->6 !a 10 {2,3} , {3} , 0 6->10 a 10->10 a & !b 8 {2} , ∅ , 1 10->8 !a & b 13 {2,4} , {4} , 0 10->13 !a & !b 14 {1,2,3} , {1,3} , 0 10->14 a & b 8->6 !a 8->10 a 13->10 a & !b 13->8 !a & b 13->13 !a & !b 15 {2,3} , ∅ , 1 13->15 a & b 15->6 !a & b 15->10 a & !b 15->14 a & b 16 {2,4} , {2} , 1 15->16 !a & !b 14->8 !a & b 14->14 a 14->16 !a & !b 16->6 !a & b 16->10 a 16->16 !a & !b 9 {1} , ∅ , 1 9->6 !a 5 {1} , ∅ , 0 9->5 a 5->8 !a 5->9 a 11 {4} , ∅ , 1 11->6 !a & b 11->10 a & b 11->11 !a & !b 12 {3} , ∅ , 1 11->12 a & !b 12->6 !a & b 12->5 a & b 12->11 !a & !b 12->12 a & !b 7 {3} , ∅ , 0 7->8 !a & b 7->9 a & b 7->11 !a & !b 7->12 a & !b 1->6 !a 1->5 a 1->1 a 1->2 !a 2->6 1 2->7 a 2->2 1 3 3 2->3 a 3->6 !a & b 3->5 a & b 3->1 a & b 3->2 !a & b 3->3 a & !b 4 4 3->4 !a & !b 4->6 b 4->7 a & b 4->2 b 4->3 a 4->4 !a & !b
with skip-levels with skip-levels Inf( ) [Büchi] cluster_0 cluster_1 cluster_2 cluster_3 cluster_4 cluster_5 cluster_6 cluster_7 0 0 I->0 0->0 1 1 1 0->1 a 2 2 0->2 !a 6 {2} , ∅ , 0 6->6 !a 8 {2,3} , {3} , 0 6->8 a 8->6 !a & b 8->8 a & !b 11 {2,4} , {4} , 0 8->11 !a & !b 12 {1,2,3} , {1,3} , 0 8->12 a & b 11->6 !a & b 11->8 a & !b 11->8 a & b 11->11 !a & !b 12->6 !a & b 12->12 a 15 {2,4} , {2} , 1 12->15 !a & !b 15->6 !a & b 15->8 a 15->15 !a & !b 5 {1} , ∅ , 0 5->6 !a 5->5 a 13 {2} , ∅ , 1 13->6 !a 13->8 a 14 {1} , ∅ , 1 14->13 !a 14->14 a 9 {4} , ∅ , 1 9->6 !a & b 9->8 a & b 9->9 !a & !b 10 {3} , ∅ , 1 9->10 a & !b 10->13 !a & b 10->14 a & b 10->9 !a & !b 10->10 a & !b 7 {3} , ∅ , 0 7->6 !a & b 7->5 a & b 7->9 !a & !b 7->10 a & !b 1->6 !a 1->5 a 1->1 a 1->2 !a 2->6 1 2->7 a 2->2 1 3 3 2->3 a 3->6 !a & b 3->5 a & b 3->1 a & b 3->2 !a & b 3->3 a & !b 4 4 3->4 !a & !b 4->6 b 4->7 a & b 4->2 b 4->3 a 4->4 !a & !b
with skip-levels + jump-to-bottommost with skip-levels + jump-to-bottommost Inf( ) [Büchi] cluster_0 cluster_1 cluster_2 cluster_3 cluster_4 0 0 I->0 0->0 1 1 1 0->1 a 2 2 0->2 !a 6 {2} , ∅ , 0 6->6 !a 7 {2,3} , {3} , 0 6->7 a 7->6 !a & b 7->7 a & !b 10 {2,4} , {4} , 0 7->10 !a & !b 11 {1,2,3} , {1,3} , 0 7->11 a & b 10->6 !a & b 10->7 a & !b 10->7 a & b 10->10 !a & !b 11->6 !a & b 11->11 a 12 {2,4} , {2} , 1 11->12 !a & !b 12->6 !a & b 12->7 a 12->12 !a & !b 5 {1} , ∅ , 0 5->6 !a 5->5 a 9 {3} , ∅ , 1 9->6 !a & b 9->5 a & b 9->9 a & !b 8 {4} , ∅ , 1 9->8 !a & !b 8->6 !a & b 8->7 a & b 8->9 a & !b 8->8 !a & !b 1->6 !a 1->5 a 1->1 a 1->2 !a 2->6 1 2->9 a 2->2 1 3 3 2->3 a 3->6 !a & b 3->5 a & b 3->1 a & b 3->2 !a & b 3->3 a & !b 4 4 3->4 !a & !b 4->6 b 4->9 a & b 4->2 b 4->3 a 4->4 !a & !b