Commit 838bfb2a authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

dotty: colored acceptance sets

This implement several new options for --dot in order to
allow emptiness sets to be output as colored ⓿ or ❶...
Also add a SPOT_DOTDEFAULT environment variable.

* NEWS, src/bin/man/spot-x.x, src/bin/common_aoutput.cc,
src/bin/dstar2tgba.cc: Document the new options.
* doc/org/.dir-locals.el, doc/org/init.el.in: Setup
SPOT_DOTEXTRA and SPOT_DOTDEFAULT for all documents.
* doc/org/autfilt.org, doc/org/dstar2tgba.org, doc/org/ltl2tgba.org,
doc/org/ltldo.org, doc/org/oaut.org, doc/org/randaut.org,
doc/org/satmin.org: Adjust to this new setup.
* src/misc/escape.cc, src/misc/escape.hh (escape_html): New function.
* src/tgba/acc.cc, src/tgba/acc.hh (to_text, to_html): New method.
* src/tgbaalgos/dotty.cc: Implement the new options.
* src/tgbatest/readsave.test, wrap/python/tests/automata.ipynb: More
tests.
* wrap/python/spot.py: Make sure the default argument for
dotty_reachable is None, so that SPOT_DOTDEFAULT is honored.
parent 7caf2b83
......@@ -110,9 +110,11 @@ New in spot 1.99b (not yet released)
- GraphViz output now uses an horizontal layout by default. The
--dot option of the various command-line tools takes an optional
parameter to fine-tune the GraphViz output (including vertical
layout, round states, and named automata). The environment
variable SPOT_DOTEXTRA can also be used to add extra attributes
to the output graph.
layout, round states, named automata, and different ways to
colorize the acceptance sets). The environment
variables SPOT_DOTDEFAULT and SPOT_DOTEXTRA can also be used
to respectively provide a default argument to --dot, and
add extra attributes to the output graph.
- Never claims can now be output in the style usd by Spin since
version 6.2.4 (i.e., using do..od instead of if..fi, and with
......
......@@ -8,6 +8,8 @@
(setq org-babel-sh-command (concat "PATH=../../src/bin"
path-separator
"$PATH sh"))
(setenv "SPOT_DOTDEFAULT" "brf(Lato)")
(setenv "SPOT_DOTEXTRA" "node[style=filled, fillcolor=\"#ffffa0\"]")
(org-babel-do-load-languages 'org-babel-load-languages
'((sh . t)
(python . t)
......
......@@ -27,7 +27,7 @@ same stream, =autfilt= will process them in batch.
The output format can be controlled using [[file:oaut.org][the common output options]]
(like =--spin=, =--lbtt=, =--dot=, =--hoaf=...).
#+BEGIN_SRC sh :results verbatim :exports both
#+BEGIN_SRC sh :results verbatim :exports code
cat >example.hoa <<EOF
HOA: v1
States: 1
......@@ -43,13 +43,18 @@ EOF
autfilt example.hoa --dot
#+END_SRC
#+BEGIN_SRC sh :results verbatim :exports results
SPOT_DOTEXTRA= autfilt example.hoa --dot=
#+END_SRC
#+RESULTS:
: digraph G {
: 0 [label="", style=invis, height=0]
: 0 -> 1
: 1 [label="0"]
: 1 -> 1 [label="p0\n{0}"]
: 1 -> 1 [label="!p0"]
: rankdir=LR
: I [label="", style=invis, width=0]
: I -> 0
: 0 [label="0"]
: 0 -> 0 [label="p0\n{0}"]
: 0 -> 0 [label="!p0"]
: }
The =--spin= options implicitly requires a degeneralization:
......
......@@ -68,48 +68,58 @@ a Monitor, using the same options as [[file:ltl2tgba.org][=ltl2tgba=]].
For instance here is the conversion to a Büchi automaton (=-B=) in [[http://http://www.graphviz.org/][GraphViz]]'s format:
#+BEGIN_SRC sh :results verbatim :exports both
#+BEGIN_SRC sh :results verbatim :exports code
dstar2tgba -B fagfb
#+END_SRC
#+BEGIN_SRC sh :results verbatim :exports results
SPOT_DOTEXTRA= dstar2tgba -B fagfb --dot=
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="!a"]
0 -> 1 [label="a"]
1 [label="1", peripheries=2]
1 -> 1 [label="b"]
1 -> 2 [label="!b"]
I -> 1
0 [label="0", peripheries=2]
0 -> 0 [label="b"]
0 -> 2 [label="!b"]
1 [label="1"]
1 -> 0 [label="a"]
1 -> 1 [label="!a"]
2 [label="2"]
2 -> 1 [label="b"]
2 -> 0 [label="b"]
2 -> 2 [label="!b"]
}
#+end_example
Which can be rendered as:
Which can be rendered as (note that in this documentation
we use some [[file:aout.org][environement variables]] to produce a more colorful
output by default):
#+NAME: fagfb2ba
#+BEGIN_SRC sh :results verbatim :exports none
dstar2tgba -B fagfb | sed 's/\\/\\\\/'
#+BEGIN_SRC sh :results verbatim :exports code
dstar2tgba -B fagfb
#+END_SRC
#+RESULTS: fagfb2ba
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="!a"]
0 -> 1 [label="a"]
1 [label="1", peripheries=2]
1 -> 1 [label="b"]
1 -> 2 [label="!b"]
I -> 1
0 [label="0", peripheries=2]
0 -> 0 [label=<b>]
0 -> 2 [label=<!b>]
1 [label="1"]
1 -> 0 [label=<a>]
1 -> 1 [label=<!a>]
2 [label="2"]
2 -> 1 [label="b"]
2 -> 2 [label="!b"]
2 -> 0 [label=<b>]
2 -> 2 [label=<!b>]
}
#+end_example
......@@ -153,7 +163,7 @@ T0_S3:
Here is the translation of =GFa & GFb= to a 4-state Streett automaton:
#+BEGIN_SRC sh :results verbatim :exports both
ltlfilt -f 'GFa & GFb' -l | ltl2dstar --automata=streett --ltl2nba=spin:../../src/bin/ltl2tgba@-sD - gfagfb
ltlfilt -f 'GFa & GFb' -l | ltl2dstar --automata=streett --ltl2nba=spin:ltl2tgba@-Ds - gfagfb
cat gfagfb
#+END_SRC
#+RESULTS:
......@@ -195,42 +205,27 @@ And now its conversion by =dstar2tgba= to a 2-state Büchi automaton.
We don't pass any option to =dstar2tgba= because converting to TGBA in
GraphViz's format is the default:
#+NAME: gfagfb2ba
#+BEGIN_SRC sh :results verbatim :exports code
dstar2tgba gfagfb
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 1 [label="1"]
1 [label="1"]
1 -> 1 [label="!a & !b"]
1 -> 1 [label="a & !b\n{0}"]
1 -> 1 [label="!a & b\n{1}"]
1 -> 1 [label="a & b\n{0,1}"]
}
#+end_example
#+NAME: gfagfb2ba
#+BEGIN_SRC sh :results verbatim :exports none
dstar2tgba gfagfb | sed 's/\\/\\\\/g'
#+END_SRC
#+RESULTS: gfagfb2ba
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 1 [label="1"]
0 -> 1 [label=<1>]
1 [label="1"]
1 -> 1 [label="!a & !b"]
1 -> 1 [label="a & !b\\n{0}"]
1 -> 1 [label="!a & b\\n{1}"]
1 -> 1 [label="a & b\\n{0,1}"]
1 -> 1 [label=<!a &amp; !b>]
1 -> 1 [label=<a &amp; !b<br/><font color="#5DA5DA">⓿</font>>]
1 -> 1 [label=<!a &amp; b<br/><font color="#F17CB0">❶</font>>]
1 -> 1 [label=<a &amp; b<br/><font color="#5DA5DA">⓿</font><font color="#F17CB0">❶</font>>]
}
#+end_example
......@@ -355,33 +350,33 @@ head -n 10 |
while read f; do
echo "$f"
ltlfilt -l -f "$f" |
ltl2dstar --ltl2nba=spin:../../src/bin/ltl2tgba@-sD - - |
ltl2dstar --ltl2nba=spin:../../src/bin/ltl2tgba@-Ds - - |
dstar2tgba -B --stats=' DRA: %Sst.; BA: %sst.; det.? %d; complete? %p'
done
#+END_SRC
#+RESULTS:
#+begin_example
c U (c & (a | b | (Xc U (a & Xc))))
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
!b | F!c
DRA: 3st.; BA: 3st.; det.? 1; complete? 1
(!a R F!b) R !b
DRA: 6st.; BA: 5st.; det.? 1; complete? 0
b U !c
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
(b | Fa) R Fc
DRA: 9st.; BA: 6st.; det.? 1; complete? 1
Ga U (Gc R (!a | Gc))
DRA: 7st.; BA: 7st.; det.? 0; complete? 0
GFc
DRA: 3st.; BA: 3st.; det.? 1; complete? 1
(F!c U a) R !a
DRA: 6st.; BA: 5st.; det.? 1; complete? 0
b | G!b
DRA: 4st.; BA: 3st.; det.? 1; complete? 0
!a R (!c & (!a | (F!b U (!a & F!b))))
DRA: 5st.; BA: 4st.; det.? 1; complete? 0
F(a & !b & G!c)
DRA: 2st.; BA: 3st.; det.? 0; complete? 0
GF!c
DRA: 3st.; BA: 3st.; det.? 1; complete? 1
!a | (a R b)
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
Xc R (G!c R (b | G!c))
DRA: 4st.; BA: 2st.; det.? 1; complete? 0
c & G(b | F(a & c))
DRA: 5st.; BA: 3st.; det.? 1; complete? 0
XXFc
DRA: 4st.; BA: 4st.; det.? 1; complete? 1
XFc | Gb
DRA: 5st.; BA: 4st.; det.? 1; complete? 1
G(((!a & Gc) | (a & F!c)) U (!a | Ga))
DRA: 6st.; BA: 5st.; det.? 1; complete? 1
a & !b
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
#+end_example
An important point you should be aware of when comparing these numbers
......@@ -426,6 +421,6 @@ states and $n$ acceptance pairs. Our translation to TGBA limits this
to $|Q|\cdot(2^n+1)$ states.
Sometimes, as in the [[#streett_to_tgba_example][example for =GFa & GFb=]] the output of this
conversion will happen to be deterministic. Let's say that this is
luck: Spot does not implement any algorithm to preserve the
determinism of Streett automata.
conversion happens to be deterministic. This is pure luck: Spot does
not implement any algorithm to preserve the determinism of Streett
automata.
......@@ -24,6 +24,9 @@
(setq org-babel-sh-command
(concat "PATH=@abs_top_builddir@/src/bin" path-separator "$PATH sh"))
(setenv "SPOT_DOTDEFAULT" "brf(Lato)")
(setenv "SPOT_DOTEXTRA" "node[style=filled, fillcolor=\"#ffffa0\"]")
(setq org-export-html-home/up-format
"<div id=\"org-div-home-and-up\" style=\"text-align:center;white-space:nowrap;\">
<a accesskey=\"h\" href=\"%s\">UP</a> | <a accesskey=\"H\" href=\"%s\">HOME</a>
......
......@@ -14,9 +14,12 @@ option.
Formulas to translate may be specified using [[file:ioltl.org][common input options for
LTL/PSL formulas]].
#+BEGIN_SRC sh :results verbatim :exports both
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba -f 'Fa & GFb'
#+END_SRC
#+BEGIN_SRC sh :results verbatim :exports results
SPOT_DOTEXTRA= ltl2tgba -f 'Fa & GFb' --dot=
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
......@@ -47,23 +50,29 @@ ltl2tgba "Fa & GFb" | dot -Tpdf > tgba.pdf
#+END_SRC
#+RESULTS:
The result would look like this:
The result would look like this (note that in this documentation
we use some [[file:aout.org][environement variables]] to produce a more colorful
output by default)
#+NAME: dotex
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba "Fa & GFb" | sed 's/\\/\\\\/'
ltl2tgba "Fa & GFb"
#+END_SRC
#+RESULTS: dotex
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 1
0 [label="0"]
0 -> 0 [label="b\\n{0}"]
0 -> 0 [label="!b"]
0 -> 0 [label=<b<br/><font color="#5DA5DA">⓿</font>>]
0 -> 0 [label=<!b>]
1 [label="1"]
1 -> 0 [label="a"]
1 -> 1 [label="!a"]
1 -> 0 [label=<a>]
1 -> 1 [label=<!a>]
}
#+end_example
......@@ -74,53 +83,39 @@ $txt
#+RESULTS:
[[file:dotex.png]]
The string between braces, ={0}=, represents the sets of acceptance
sets a transition belongs to. In this case, there is only one
acceptance set, called =0=, containing a single transition. You may
have many transitions in the same acceptance set, and a transition may
also belong to multiple acceptance sets. An infinite path through
this automaton is accepting iff it visit each acceptance set
infinitely often. Therefore, in the above example, any accepted path
will /necessarily/ leave the initial state after a finite amount of
steps, and then it will verify the property =b= infinitely often. It
is also possible that an automaton do not use any acceptance set at
all, in which any run is accepting.
Characters like ⓿, ❶, etc. denotes the acceptance sets a transition
belongs to. In this case, there is only one acceptance set, called
=0=, containing a single transition. You may have many transitions in
the same acceptance set, and a transition may also belong to multiple
acceptance sets. An infinite path through this automaton is accepting
iff it visit each acceptance set infinitely often. Therefore, in the
above example, any accepted path will /necessarily/ leave the initial
state after a finite amount of steps, and then it will verify the
property =b= infinitely often. It is also possible that an automaton
do not use any acceptance set at all, in which any run is accepting.
Here is a TGBA with multiple acceptance sets (we omit the call to
=dot= to render the output of =ltl2tgba= from now on):
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba 'GFa & GFb'
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\n{0,1}"]
0 -> 0 [label="!a & !b"]
0 -> 0 [label="!a & b\n{1}"]
0 -> 0 [label="a & !b\n{0}"]
}
#+end_example
#+NAME: dotex2
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba "GFa & GFb" | sed 's/\\/\\\\/'
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba "GFa & GFb"
#+END_SRC
#+RESULTS: dotex2
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\\n{0,1}"]
0 -> 0 [label="!a & !b"]
0 -> 0 [label="!a & b\\n{1}"]
0 -> 0 [label="a & !b\\n{0}"]
0 -> 0 [label=<a &amp; b<br/><font color="#5DA5DA">⓿</font><font color="#F17CB0">❶</font>>]
0 -> 0 [label=<!a &amp; !b>]
0 -> 0 [label=<!a &amp; b<br/><font color="#F17CB0">❶</font>>]
0 -> 0 [label=<a &amp; !b<br/><font color="#5DA5DA">⓿</font>>]
}
#+end_example
......@@ -130,57 +125,38 @@ $txt
#+RESULTS:
[[file:dotex2.png]]
The above TGBA has two acceptance sets: =0= and =1=. The position of
The above TGBA has two acceptance sets: and . The position of
these acceptance sets ensures that atomic propositions =a= and =b= must
be true infinitely often.
A Büchi automaton for the previous formula can be obtained with the
=-B= option:
#+NAME: dotex2ba
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba -B 'GFa & GFb'
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a & b"]
0 -> 1 [label="!b"]
0 -> 2 [label="!a & b"]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
}
#+end_example
#+NAME: dotex2ba
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba -B 'GFa & GFb' | sed 's/\\/\\\\/'
#+END_SRC
#+RESULTS: dotex2ba
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a & b"]
0 -> 1 [label="!b"]
0 -> 2 [label="!a & b"]
0 -> 0 [label=<a &amp; b>]
0 -> 1 [label=<!b>]
0 -> 2 [label=<!a &amp; b>]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
1 -> 0 [label=<a &amp; b>]
1 -> 1 [label=<!b>]
1 -> 2 [label=<!a &amp; b>]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
2 -> 0 [label=<a>]
2 -> 2 [label=<!a>]
}
#+end_example
......@@ -201,48 +177,33 @@ is done internally):
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba --dot=t -B 'GFa & GFb'
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\n{0}"]
0 -> 1 [label="!b\n{0}"]
0 -> 2 [label="!a & b\n{0}"]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
}
#+end_example
#+NAME: dotex2ba-t
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba --dot=t -B 'GFa & GFb' | sed 's/\\/\\\\/'
ltl2tgba --dot=.t -B 'GFa & GFb'
#+END_SRC
#+RESULTS: dotex2ba-t
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\\n{0}"]
0 -> 1 [label="!b\\n{0}"]
0 -> 2 [label="!a & b\\n{0}"]
0 -> 0 [label=<a &amp; b<br/><font color="#5DA5DA">⓿</font>>]
0 -> 1 [label=<!b<br/><font color="#5DA5DA">⓿</font>>]
0 -> 2 [label=<!a &amp; b<br/><font color="#5DA5DA">⓿</font>>]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
1 -> 0 [label=<a &amp; b>]
1 -> 1 [label=<!b>]
1 -> 2 [label=<!a &amp; b>]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
2 -> 0 [label=<a>]
2 -> 2 [label=<!a>]
}
#+end_example
......@@ -262,18 +223,28 @@ ltl2tgba --help | sed -n '/Output format:/,/^$/p' | sed '1d;$d'
#+begin_example
-8, --utf8 enable UTF-8 characters in output (ignored with
--lbtt or --spin)
--dot[=c|h|n|N|s|t|v] GraphViz's format (default). Add letters to chose
(c) circular nodes, (h) horizontal layout, (v)
vertical layout, (n) with name, (N) without name,
(s) with SCCs, (t) always transition-based
--dot[=a|b|c|f(FONT)|h|n|N|r|R|s|t|v]
GraphViz's format (default). Add letters for (a)
acceptance display, (b) acceptance sets as
bullets,(c) circular nodes, (f(FONT)) use FONT,
(h) horizontal layout, (v) vertical layout, (n)
with name, (N) without name, (r) rainbow colors
for acceptance set, (R) color acceptance set by
Inf/Fin, (s) with SCCs, (t) force transition-based
acceptance.
-H, --hoaf[=s|t|m|l] Output the automaton in HOA format. Add letters
to select (s) state-based acceptance, (t)
transition-based acceptance, (m) mixed acceptance,
(l) single-line output
-H, --hoaf[=i|s|t|m|l] Output the automaton in HOA format. Add letters
to select (i) use implicit labels for complete
deterministic automata, (s) prefer state-based
acceptance when possible [default], (t) force
transition-based acceptance, (m) mix state and
transition-based acceptance, (l) single-line
output
--lbtt[=t] LBTT's format (add =t to force transition-based
acceptance even on Büchi automata)
--name=FORMAT set the name of the output automaton
-o, --output=FORMAT send output to a file named FORMAT instead of
standard output. The first automaton sent to a
file truncates it unless FORMAT starts with '>>'.
-q, --quiet suppress all normal output
-s, --spin[=6|c] Spin neverclaim (implies --ba). Add letters to
select (6) Spin's 6.2.4 style, (c) comments on
......@@ -284,50 +255,31 @@ ltl2tgba --help | sed -n '/Output format:/,/^$/p' | sed '1d;$d'
Option =-8= can be used to improve the readability of the output
if your system can display UTF-8 correctly.
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba -B8 'GFa & GFb'
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a∧b"]
0 -> 1 [label="b̅"]
0 -> 2 [label="a̅∧b"]
1 [label="1"]
1 -> 0 [label="a∧b"]
1 -> 1 [label="b̅"]
1 -> 2 [label="a̅∧b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="a̅"]
}
#+end_example
#+NAME: dotex2ba8
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba -B8 "GFa & GFb" | sed 's/\\/\\\\/'
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba -B8 "GFa & GFb"
#+END_SRC
#+RESULTS: dotex2ba8
#+begin_example
digraph G {
rankdir=LR
fontname="Lato"
node [fontname="Lato"]
edge [fontname="Lato"]
node[style=filled, fillcolor="#ffffa0"]
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a∧b"]
0 -> 1 [label=""]
0 -> 2 [label="a̅∧b"]
0 -> 0 [label=<a∧b>]
0 -> 1 [label=<>]
0 -> 2 [label=<a̅∧b>]
1 [label="1"]
1 -> 0 [label="a∧b"]
1 -> 1 [label=""]
1 -> 2 [label="a̅∧b"]
1 -> 0 [label=<a∧b>]
1 -> 1 [label=<>]
1 -> 2 [label=<a̅∧b>]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label=""]
2 -> 0 [label=<a>]
2 -> 2 [label=<>]
}
#+end_example
......@@ -423,48 +375,30 @@ automaton.
An example formula where the difference between =-D= and =--small= is
flagrant is =Ga|Gb|Gc=:
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba 'Ga|Gb|Gc'
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 1 [label="a"]
0 -> 2 [label="b"]
0 -> 3 [label="c"]
1 [label="1", peripheries=2]
1 -> 1 [label="a"]
2 [label="2", peripheries=2]
2 -> 2 [label="b"]
3 [label="3", peripheries=2]
3 -> 3 [label="c"]
}
#+end_example