org: add autfilt decoration examples
* doc/org/autfilt.org: Here. * doc/org/hoa.org: Add a link to it. * bin/autfilt.cc: Typo.
This commit is contained in:
parent
dd6875d5fe
commit
7534f62dba
3 changed files with 175 additions and 8 deletions
|
|
@ -289,7 +289,7 @@ static const argp_option options[] =
|
||||||
"minimize the automaton using a SAT solver (only works for deterministic"
|
"minimize the automaton using a SAT solver (only works for deterministic"
|
||||||
" automata)", 0 },
|
" automata)", 0 },
|
||||||
/**************************************************/
|
/**************************************************/
|
||||||
{ nullptr, 0, nullptr, 0, "Decoration (for -d and -H1.1 output):", 8 },
|
{ nullptr, 0, nullptr, 0, "Decorations (for -d and -H1.1 output):", 8 },
|
||||||
{ "highlight-nondet-states", OPT_HIGHLIGHT_NONDET_STATES, "NUM",
|
{ "highlight-nondet-states", OPT_HIGHLIGHT_NONDET_STATES, "NUM",
|
||||||
OPTION_ARG_OPTIONAL, "highlight nondeterministic states with color NUM",
|
OPTION_ARG_OPTIONAL, "highlight nondeterministic states with color NUM",
|
||||||
0 },
|
0 },
|
||||||
|
|
|
||||||
|
|
@ -359,8 +359,34 @@ autfilt --help | sed -n '/Transformations:/,/^$/p' | sed '1d;$d'
|
||||||
sets
|
sets
|
||||||
#+end_example
|
#+end_example
|
||||||
|
|
||||||
|
* Decorations
|
||||||
|
|
||||||
|
Decorations work by coloring some states or edges in the automaton.
|
||||||
|
They are only useful when the automaton is output in Dot format (with
|
||||||
|
=--dot= or =-d=) or HOA v1.1 format (with =-H1.1= or =--hoa=1.1=).
|
||||||
|
|
||||||
|
#+BEGIN_SRC sh :results verbatim :exports results
|
||||||
|
autfilt --help | sed -n '/^ *Decorations.*:/,/^$/p' | sed '1d;$d'
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
: --highlight-nondet[=NUM] highlight nondeterministic states and edges
|
||||||
|
: with color NUM
|
||||||
|
: --highlight-nondet-edges[=NUM]
|
||||||
|
: highlight nondeterministic edges with color NUM
|
||||||
|
: --highlight-nondet-states[=NUM]
|
||||||
|
: highlight nondeterministic states with color NUM
|
||||||
|
: --highlight-word=[NUM,]WORD
|
||||||
|
: highlight one run matching WORD using color NUM
|
||||||
|
|
||||||
|
Color numbers are indices in some unspecified color palette. It is
|
||||||
|
the same palette that is currently used to display colored acceptance
|
||||||
|
sets, but this might change in the future.
|
||||||
|
|
||||||
* Examples
|
* Examples
|
||||||
|
|
||||||
|
** Acceptance transformations
|
||||||
|
|
||||||
Here is an automaton with transition-based acceptance:
|
Here is an automaton with transition-based acceptance:
|
||||||
|
|
||||||
#+BEGIN_SRC sh :results silent :exports both
|
#+BEGIN_SRC sh :results silent :exports both
|
||||||
|
|
@ -622,6 +648,7 @@ $txt
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
[[file:autfilt-ex5.png]]
|
[[file:autfilt-ex5.png]]
|
||||||
|
|
||||||
|
** Atomic proposition removal
|
||||||
|
|
||||||
Atomic propositions can be removed from an automaton in three ways:
|
Atomic propositions can be removed from an automaton in three ways:
|
||||||
- use ~--remove-ap=a~ to remove =a= by existential quantification, i.e., both =a= and its negation will be replaced by true.
|
- use ~--remove-ap=a~ to remove =a= by existential quantification, i.e., both =a= and its negation will be replaced by true.
|
||||||
|
|
@ -717,16 +744,14 @@ $txt
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
[[file:autfilt-ex6c.png]]
|
[[file:autfilt-ex6c.png]]
|
||||||
|
|
||||||
#+BEGIN_SRC sh :results silent :exports results
|
** Testing word acceptance
|
||||||
rm -f example.hoa aut-ex1.hoa
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
The following example checks whether the formula ~a U b U c~ accepts
|
The following example checks whether the formula ~a U b U c~ accepts
|
||||||
the word ~b; cycle{c}~.
|
the word ~a&!b&!c; cycle{!a&!b&c}~.
|
||||||
|
|
||||||
#+BEGIN_SRC sh :results verbatim :exports both
|
#+BEGIN_SRC sh :results verbatim :exports both
|
||||||
ltl2tgba 'a U b U c' |
|
ltl2tgba 'a U b U c' |
|
||||||
autfilt --accept-word 'b; cycle{c}' -q && echo "word accepted"
|
autfilt --accept-word 'a&!b&!c; cycle{!a&!b&c}' -q && echo "word accepted"
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
: word accepted
|
: word accepted
|
||||||
|
|
@ -770,7 +795,7 @@ Rabin automata that have exactly 4 states:
|
||||||
|
|
||||||
#+BEGIN_SRC sh :results verbatim :exports both
|
#+BEGIN_SRC sh :results verbatim :exports both
|
||||||
randltl -n -1 a b | ltlfilt --simplify --remove-wm |
|
randltl -n -1 a b | ltlfilt --simplify --remove-wm |
|
||||||
ltldo ltl2dstar --name=%f | autfilt --states=4 --stats=%M -n 5
|
ltldo ltl2dstar --name=%f | autfilt --states=4 --stats=%M -n 5
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
|
|
@ -779,3 +804,145 @@ randltl -n -1 a b | ltlfilt --simplify --remove-wm |
|
||||||
: (a & !b & (b | (F!a U (!b & F!a)))) | (!a & (b | (!b & (Ga R (b | Ga)))))
|
: (a & !b & (b | (F!a U (!b & F!a)))) | (!a & (b | (!b & (Ga R (b | Ga)))))
|
||||||
: (a & (a U !b)) | (!a & (!a R b))
|
: (a & (a U !b)) | (!a & (!a R b))
|
||||||
: a | G((a & GFa) | (!a & FG!a))
|
: a | G((a & GFa) | (!a & FG!a))
|
||||||
|
|
||||||
|
** Decorations
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: decorations
|
||||||
|
:END:
|
||||||
|
|
||||||
|
We know from a previous exemple that formula =a U b U c= accepts the
|
||||||
|
word =b; cycle{c}=. We can actually highlight the corresponding
|
||||||
|
run in the automaton:
|
||||||
|
|
||||||
|
#+NAME: highlight-word
|
||||||
|
#+BEGIN_SRC sh :results verbatim :exports code
|
||||||
|
ltl2tgba 'a U b U c' | autfilt --highlight-word='a&!b&!c; cycle{!a&!b&c}' -d
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS: highlight-word
|
||||||
|
#+begin_example
|
||||||
|
digraph G {
|
||||||
|
rankdir=LR
|
||||||
|
node [shape="circle"]
|
||||||
|
node [style="filled", fillcolor="#ffffa0"]
|
||||||
|
fontname="Lato"
|
||||||
|
node [fontname="Lato"]
|
||||||
|
edge [fontname="Lato"]
|
||||||
|
edge[arrowhead=vee, arrowsize=.7]
|
||||||
|
I [label="", style=invis, width=0]
|
||||||
|
I -> 2
|
||||||
|
0 [label="0", peripheries=2]
|
||||||
|
0 -> 0 [label=<1>, style=bold, color="#F17CB0"]
|
||||||
|
1 [label="1"]
|
||||||
|
1 -> 0 [label=<c>]
|
||||||
|
1 -> 1 [label=<b & !c>]
|
||||||
|
2 [label="2"]
|
||||||
|
2 -> 0 [label=<c>, style=bold, color="#F17CB0"]
|
||||||
|
2 -> 1 [label=<!a & b & !c>]
|
||||||
|
2 -> 2 [label=<a & !c>, style=bold, color="#F17CB0"]
|
||||||
|
}
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
#+BEGIN_SRC dot :file autfilt-hlword.png :cmdline -Tpng :var txt=highlight-word :exports results
|
||||||
|
$txt
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:autfilt-hlword.png]]
|
||||||
|
|
||||||
|
|
||||||
|
We can change the color by prefixing the word with a number and a
|
||||||
|
comma. Also it is possible to highlight multiple words, but a
|
||||||
|
transition may only have one color so late highlights will overwrite
|
||||||
|
previous ones.
|
||||||
|
|
||||||
|
#+NAME: highlight-word2
|
||||||
|
#+BEGIN_SRC sh :results verbatim :exports code
|
||||||
|
ltl2tgba 'a U b U c' |
|
||||||
|
autfilt --highlight-word=5,'a&!b&!c; cycle{!a&!b&c}' \
|
||||||
|
--highlight-word=4,'!a&b&!c; cycle{!a&!b&c}' -d
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS: highlight-word2
|
||||||
|
#+begin_example
|
||||||
|
digraph G {
|
||||||
|
rankdir=LR
|
||||||
|
node [shape="circle"]
|
||||||
|
node [style="filled", fillcolor="#ffffa0"]
|
||||||
|
fontname="Lato"
|
||||||
|
node [fontname="Lato"]
|
||||||
|
edge [fontname="Lato"]
|
||||||
|
edge[arrowhead=vee, arrowsize=.7]
|
||||||
|
I [label="", style=invis, width=0]
|
||||||
|
I -> 2
|
||||||
|
0 [label="0", peripheries=2]
|
||||||
|
0 -> 0 [label=<1>, style=bold, color="#60BD68"]
|
||||||
|
1 [label="1"]
|
||||||
|
1 -> 0 [label=<c>, style=bold, color="#60BD68"]
|
||||||
|
1 -> 1 [label=<b & !c>]
|
||||||
|
2 [label="2"]
|
||||||
|
2 -> 0 [label=<c>, style=bold, color="#F15854"]
|
||||||
|
2 -> 1 [label=<!a & b & !c>, style=bold, color="#60BD68"]
|
||||||
|
2 -> 2 [label=<a & !c>, style=bold, color="#F15854"]
|
||||||
|
}
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
#+BEGIN_SRC dot :file autfilt-hlword2.png :cmdline -Tpng :var txt=highlight-word2 :exports results
|
||||||
|
$txt
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:autfilt-hlword2.png]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Another useful thing to highlight is nondeterminism. One can
|
||||||
|
highlight states or edges where nondeterministic choices need to be
|
||||||
|
made.
|
||||||
|
|
||||||
|
#+NAME: highlight-nondet
|
||||||
|
#+BEGIN_SRC sh :results verbatim :exports code
|
||||||
|
ltl2tgba 'F((b R a) W Gb)' |
|
||||||
|
autfilt --highlight-nondet-states=5 --highlight-nondet-edges=1 -d
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS: highlight-nondet
|
||||||
|
#+begin_example
|
||||||
|
digraph G {
|
||||||
|
rankdir=LR
|
||||||
|
node [shape="circle"]
|
||||||
|
node [style="filled", fillcolor="#ffffa0"]
|
||||||
|
fontname="Lato"
|
||||||
|
node [fontname="Lato"]
|
||||||
|
edge [fontname="Lato"]
|
||||||
|
edge[arrowhead=vee, arrowsize=.7]
|
||||||
|
I [label="", style=invis, width=0]
|
||||||
|
I -> 1
|
||||||
|
0 [label="0"]
|
||||||
|
0 -> 0 [label=<b<br/><font color="#5DA5DA">⓿</font>>]
|
||||||
|
1 [label="1", style="bold,filled", color="#F15854"]
|
||||||
|
1 -> 0 [label=<!a & b>, style=bold, color="#5DA5DA"]
|
||||||
|
1 -> 1 [label=<1>, style=bold, color="#5DA5DA"]
|
||||||
|
1 -> 2 [label=<a & b>]
|
||||||
|
1 -> 3 [label=<a & !b>]
|
||||||
|
2 [label="2"]
|
||||||
|
2 -> 0 [label=<!a & b>]
|
||||||
|
2 -> 2 [label=<a & b<br/><font color="#5DA5DA">⓿</font>>]
|
||||||
|
2 -> 3 [label=<a & !b<br/><font color="#5DA5DA">⓿</font>>]
|
||||||
|
3 [label="3"]
|
||||||
|
3 -> 2 [label=<a & b<br/><font color="#5DA5DA">⓿</font>>]
|
||||||
|
3 -> 3 [label=<a & !b<br/><font color="#5DA5DA">⓿</font>>]
|
||||||
|
}
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
#+BEGIN_SRC dot :file autfilt-hlnondet.png :cmdline -Tpng :var txt=highlight-nondet :exports results
|
||||||
|
$txt
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
[[file:autfilt-hlnondet.png]]
|
||||||
|
|
||||||
|
|
||||||
|
#+BEGIN_SRC sh :results silent :exports results
|
||||||
|
rm -f example.hoa aut-ex1.hoa
|
||||||
|
#+END_SRC
|
||||||
|
|
|
||||||
|
|
@ -964,7 +964,7 @@ terminal.
|
||||||
|
|
||||||
Spot supports two additional headers that are not part of the standard
|
Spot supports two additional headers that are not part of the standard
|
||||||
HOA format. These are =spot.highlight.states= and
|
HOA format. These are =spot.highlight.states= and
|
||||||
=spot.highlight.edges=. These are used to decorate states and edges
|
=spot.highlight.edges=. These are used to [[file:autfilt.org::#decoration][decorate states and edges]]
|
||||||
with colors.
|
with colors.
|
||||||
|
|
||||||
#+NAME: decorate
|
#+NAME: decorate
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue