zlktree: add a paritization based on zielonka trees

* spot/twaalgos/zlktree.hh,
spot/twaalgos/zlktree.cc (zielonka_tree_transform): New function.
* tests/python/_zlktree.ipynb: Test it on three examples.
This commit is contained in:
Alexandre Duret-Lutz 2021-08-04 11:30:19 +02:00
parent c924c63255
commit 8c5bb6c2eb
3 changed files with 877 additions and 11 deletions

View file

@ -20,13 +20,15 @@
#include "config.h"
#include <iostream>
#include <spot/twaalgos/zlktree.hh>
#include <spot/twaalgos/sccinfo.hh>
#include <deque>
#include "spot/priv/bddalloc.hh"
namespace spot
{
zielonka_tree::zielonka_tree(acc_cond& cond)
zielonka_tree::zielonka_tree(const acc_cond& cond)
{
acc_cond::acc_code& code = cond.get_acceptance();
const acc_cond::acc_code& code = cond.get_acceptance();
auto used = code.used_sets();
unsigned c = used.count();
unsigned max = used.max_set();
@ -225,4 +227,124 @@ namespace spot
}
return {branch, lvl};
}
namespace
{
// A state in the zielonka_tree_transform output corresponds to a
// state in the input associated to a branch of the tree.
typedef std::pair<unsigned, unsigned> zlk_state;
struct zlk_state_hash
{
size_t
operator()(const zlk_state& s) const noexcept
{
return wang32_hash(s.first ^ wang32_hash(s.second));
}
};
}
twa_graph_ptr
zielonka_tree_transform(const const_twa_graph_ptr& a)
{
auto res = make_twa_graph(a->get_dict());
res->copy_ap_of(a);
zielonka_tree zlk(a->get_acceptance());
// Preserve determinism, weakness, and stutter-invariance
res->prop_copy(a, { false, true, true, true, true, true });
auto orig_states = new std::vector<unsigned>();
auto branches = new std::vector<unsigned>();
unsigned ns = a->num_states();
orig_states->reserve(ns); // likely more are needed.
res->set_named_prop("original-states", orig_states);
res->set_named_prop("degen-levels", branches);
// Associate each zlk_state to its number.
typedef std::unordered_map<zlk_state, unsigned, zlk_state_hash> zs2num_map;
zs2num_map zs2num;
// Queue of states to be processed.
std::deque<zlk_state> todo;
auto new_state = [&](zlk_state zs)
{
if (auto i = zs2num.find(zs); i != zs2num.end())
return i->second;
unsigned ns = res->new_state();
zs2num[zs] = ns;
todo.emplace_back(zs);
unsigned orig = zs.first;
assert(ns == orig_states->size());
orig_states->emplace_back(orig);
branches->emplace_back(zs.second);
return ns;
};
zlk_state s(a->get_init_state_number(), zlk.first_branch());
new_state(s);
unsigned max_color = 0;
while (!todo.empty())
{
s = todo.front();
todo.pop_front();
int src = zs2num[s];
unsigned branch = s.second;
for (auto& i: a->out(s.first))
{
auto [newbranch, prio] = zlk.step(branch, i.acc);
zlk_state d(i.dst, newbranch);
unsigned dst = new_state(d);
max_color = std::max(max_color, prio);
res->new_edge(src, dst, i.cond, {prio});
}
}
res->set_acceptance(max_color + 1,
acc_cond::acc_code::parity_min(!zlk.is_even(),
max_color + 1));
// compose original-states with the any previously existing one.
// We do that now, because for the bottommost copy below, it's better
// if we compose everything.
if (auto old_orig_states =
a->get_named_prop<std::vector<unsigned>>("original-states"))
for (auto& s: *orig_states)
s = (*old_orig_states)[s];
// Now we will iterate over the SCCs in topological order to
// remember the "bottommost" SCCs that contain each original
// state. If an original state is duplicated in a higher SCC,
// it can be shunted away. Amen.
scc_info si_res(res, scc_info_options::TRACK_STATES);
unsigned res_scc_count = si_res.scc_count();
unsigned maxorig = *std::max_element(orig_states->begin(),
orig_states->end());
std::vector<unsigned> bottommost_occurence(maxorig + 1);
{
unsigned n = res_scc_count;
do
for (unsigned s: si_res.states_of(--n))
bottommost_occurence[(*orig_states)[s]] = s;
while (n);
}
unsigned res_ns = res->num_states();
std::vector<unsigned> retarget(res_ns);
for (unsigned n = 0; n < res_ns; ++n)
{
unsigned other = bottommost_occurence[(*orig_states)[n]];
retarget[n] =
(si_res.scc_of(n) != si_res.scc_of(other)) ? other : n;
}
for (auto& e: res->edges())
e.dst = retarget[e.dst];
res->set_init_state(retarget[res->get_init_state_number()]);
res->purge_unreachable_states();
return res;
}
}

View file

@ -37,7 +37,7 @@ namespace spot
{
public:
/// \brief Build a Zielonka tree from the acceptance condition.
zielonka_tree(acc_cond& cond);
zielonka_tree(const acc_cond& cond);
/// \brief The number of branches in the Zielonka tree.
///
@ -129,4 +129,17 @@ namespace spot
bool has_streett_shape_ = true;
};
/// \ingroup twa_acc_transform
/// \brief Paritize an automaton using Zielonka tree.
///
/// This corresponds to the application of Section 3 of
/// \cite casares.21.icalp
///
/// The resulting automaton has a parity acceptance that is either
/// "min odd" or "min even", depending on the original acceptance.
/// It may uses up to n+1 colors if the input automaton has n
/// colors. Finally, it is colored, i.e., each output transition
/// has exactly one color.
SPOT_API
twa_graph_ptr zielonka_tree_transform(const const_twa_graph_ptr& aut);
}

View file

@ -191,7 +191,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb0897c00> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe7807fa80> >"
]
},
"metadata": {},
@ -755,7 +755,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb10dd300> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe7807fab0> >"
]
},
"metadata": {},
@ -1111,7 +1111,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb083c900> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe6a301e70> >"
]
},
"metadata": {},
@ -1247,7 +1247,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb08a46f0> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe6a301e10> >"
]
},
"metadata": {},
@ -1358,7 +1358,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb08a48a0> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe6a301840> >"
]
},
"metadata": {},
@ -1421,7 +1421,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb08a43f0> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe6a301300> >"
]
},
"metadata": {},
@ -1484,7 +1484,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7fefb08a43c0> >"
"<spot.zielonka_tree; proxy of <Swig Object of type 'spot::zielonka_tree *' at 0x7efe6a305780> >"
]
},
"metadata": {},
@ -1511,10 +1511,741 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 19,
"id": "interesting-seller",
"metadata": {},
"outputs": [],
"source": [
"a = spot.automaton(\"\"\"HOA: v1 name: \"(FGp0 & ((XFp0 & F!p1) | F(Gp1 &\n",
"XG!p0))) | G(F!p0 & (XFp0 | F!p1) & F(Gp1 | G!p0))\" States: 14 Start:\n",
"0 AP: 2 \"p1\" \"p0\" Acceptance: 6 (Fin(0) & Fin(1)) | ((Fin(4)|Fin(5)) &\n",
"(Inf(2)&Inf(3))) properties: trans-labels explicit-labels trans-acc\n",
"complete properties: deterministic --BODY-- State: 0 [!0] 1 [0] 2\n",
"State: 1 [!0&!1] 1 {0 1 2 3 5} [0&!1] 3 [!0&1] 4 [0&1] 5 State: 2\n",
"[0&!1] 2 {1} [!0&1] 4 [!0&!1] 6 [0&1] 7 State: 3 [0&!1] 3 {1 3} [!0&1]\n",
"4 [!0&!1] 6 {0 1 2 3 5} [0&1] 8 State: 4 [!0&!1] 4 {1 2 3 5} [!0&1] 4\n",
"{2 4 5} [0&!1] 5 {1 3} [0&1] 5 {4} State: 5 [!0&1] 4 {2 4 5} [0&!1] 5\n",
"{1 3} [0&1] 8 {2 4} [!0&!1] 9 {1 2 3 5} State: 6 [0&!1] 3 {1 3} [!0&1]\n",
"4 [0&1] 5 [!0&!1] 10 State: 7 [!0&1] 4 [0&!1] 7 {1 3} [!0&!1] 11 [0&1]\n",
"12 {0 4} State: 8 [!0&1] 4 {2 4 5} [0&1] 5 {4} [0&!1] 8 {1 3} [!0&!1]\n",
"11 {1 3 5} State: 9 [!0&1] 4 {2 4 5} [0&!1] 5 {1 3} [0&1] 5 {4}\n",
"[!0&!1] 11 {1 3 5} State: 10 [!0&1] 4 [0&1] 8 [!0&!1] 10 {0 1 2 3 5}\n",
"[0&!1] 13 {1 2 3} State: 11 [!0&1] 4 {2 4 5} [0&!1] 8 {1 2 3} [0&1] 8\n",
"{2 4} [!0&!1] 11 {1 2 3 5} State: 12 [!0&1] 4 [0&1] 7 {0 2 4} [!0&!1]\n",
"9 [0&!1] 12 {1 3} State: 13 [!0&1] 4 [0&1] 5 [!0&!1] 10 {0 1 3 5}\n",
"[0&!1] 13 {1 3} --END--\"\"\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "informative-mainland",
"metadata": {},
"outputs": [],
"source": [
"b = spot.zielonka_tree_transform(a)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "angry-comedy",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"33"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"b.num_states()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "contained-combat",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a.equivalent_to(b)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "paperback-handle",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.43.0 (0)\n",
" -->\n",
"<!-- Pages: 1 -->\n",
"<svg width=\"356pt\" height=\"233pt\"\n",
" viewBox=\"0.00 0.00 356.00 233.30\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 229.3)\">\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-229.3 352,-229.3 352,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">(Fin(</text>\n",
"<text text-anchor=\"start\" x=\"35\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"51\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">) &amp; (Fin(</text>\n",
"<text text-anchor=\"start\" x=\"99\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"<text text-anchor=\"start\" x=\"115\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">)|Fin(</text>\n",
"<text text-anchor=\"start\" x=\"146\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"<text text-anchor=\"start\" x=\"162\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">)) &amp; (Inf(</text>\n",
"<text text-anchor=\"start\" x=\"211\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"227\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">)&amp;Inf(</text>\n",
"<text text-anchor=\"start\" x=\"261\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"277\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">))) | Inf(</text>\n",
"<text text-anchor=\"start\" x=\"320\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"<text text-anchor=\"start\" x=\"336\" y=\"-211.1\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>0</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"120.75\" cy=\"-44.3\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"120.75\" y=\"-40.6\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
"</g>\n",
"<!-- I&#45;&gt;0 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>I&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M65.9,-44.3C67.54,-44.3 81.9,-44.3 95.38,-44.3\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"102.69,-44.3 95.69,-47.45 99.19,-44.3 95.69,-44.3 95.69,-44.3 95.69,-44.3 99.19,-44.3 95.69,-41.15 102.69,-44.3 102.69,-44.3\"/>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M117.51,-62.08C116.96,-71.62 118.04,-80.3 120.75,-80.3 122.74,-80.3 123.85,-75.62 124.08,-69.35\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"123.99,-62.08 127.23,-69.04 124.03,-65.58 124.08,-69.08 124.08,-69.08 124.08,-69.08 124.03,-65.58 120.93,-69.12 123.99,-62.08 123.99,-62.08\"/>\n",
"<text text-anchor=\"start\" x=\"94.25\" y=\"-98.1\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"104.75\" y=\"-84.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"120.75\" y=\"-84.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M115.69,-61.9C112.31,-82.43 114,-108.3 120.75,-108.3 126.74,-108.3 128.74,-87.96 126.76,-69.03\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"125.81,-61.9 129.86,-68.42 126.28,-65.37 126.74,-68.83 126.74,-68.83 126.74,-68.83 126.28,-65.37 123.62,-69.25 125.81,-61.9 125.81,-61.9\"/>\n",
"<text text-anchor=\"start\" x=\"92.25\" y=\"-126.1\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"96.75\" y=\"-112.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"112.75\" y=\"-112.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"<text text-anchor=\"start\" x=\"128.75\" y=\"-112.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>1</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"256.75\" cy=\"-44.3\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"256.75\" y=\"-40.6\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M133.35,-57.44C139.59,-63.52 147.84,-70.09 156.75,-73.3 183.51,-82.95 193.99,-82.95 220.75,-73.3 227.29,-70.94 233.48,-66.77 238.78,-62.32\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"244.15,-57.44 241.08,-64.48 241.56,-59.79 238.97,-62.14 238.97,-62.14 238.97,-62.14 241.56,-59.79 236.85,-59.81 244.15,-57.44 244.15,-57.44\"/>\n",
"<text text-anchor=\"start\" x=\"162.25\" y=\"-84.1\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; !p1</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M138.82,-42.54C144.52,-42.04 150.9,-41.55 156.75,-41.3 185.17,-40.09 192.33,-40.09 220.75,-41.3 224.22,-41.45 227.88,-41.68 231.48,-41.95\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"238.68,-42.54 231.44,-45.11 235.19,-42.26 231.7,-41.97 231.7,-41.97 231.7,-41.97 235.19,-42.26 231.96,-38.83 238.68,-42.54 238.68,-42.54\"/>\n",
"<text text-anchor=\"start\" x=\"164.25\" y=\"-59.1\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"172.75\" y=\"-45.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"188.75\" y=\"-45.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M245.96,-29.56C239.78,-21.64 231.03,-12.64 220.75,-8.3 194.55,2.77 182.95,2.77 156.75,-8.3 148.88,-11.63 141.91,-17.68 136.3,-23.89\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"131.54,-29.56 133.63,-22.17 133.79,-26.88 136.04,-24.2 136.04,-24.2 136.04,-24.2 133.79,-26.88 138.45,-26.22 131.54,-29.56 131.54,-29.56\"/>\n",
"<text text-anchor=\"start\" x=\"160.25\" y=\"-26.1\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"156.75\" y=\"-12.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"172.75\" y=\"-12.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"188.75\" y=\"-12.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"<text text-anchor=\"start\" x=\"204.75\" y=\"-12.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M252.68,-62.08C251.98,-71.62 253.34,-80.3 256.75,-80.3 259.25,-80.3 260.65,-75.62 260.94,-69.35\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"260.82,-62.08 264.09,-69.03 260.88,-65.58 260.94,-69.08 260.94,-69.08 260.94,-69.08 260.88,-65.58 257.79,-69.13 260.82,-62.08 260.82,-62.08\"/>\n",
"<text text-anchor=\"start\" x=\"230.25\" y=\"-99.1\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"248.75\" y=\"-84.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M250.58,-61.22C246.06,-82.45 248.12,-110.3 256.75,-110.3 264.47,-110.3 266.93,-88.02 264.13,-68.12\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"262.92,-61.22 267.23,-67.57 263.53,-64.67 264.13,-68.12 264.13,-68.12 264.13,-68.12 263.53,-64.67 261.03,-68.66 262.92,-61.22 262.92,-61.22\"/>\n",
"<text text-anchor=\"start\" x=\"230.25\" y=\"-128.1\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"240.75\" y=\"-114.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"256.75\" y=\"-114.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M249.23,-61.02C240.3,-91.2 242.8,-138.3 256.75,-138.3 269.66,-138.3 272.77,-97.93 266.07,-68\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"264.27,-61.02 269.07,-67.01 265.14,-64.41 266.02,-67.8 266.02,-67.8 266.02,-67.8 265.14,-64.41 262.97,-68.59 264.27,-61.02 264.27,-61.02\"/>\n",
"<text text-anchor=\"start\" x=\"232.25\" y=\"-156.1\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"232.75\" y=\"-142.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"248.75\" y=\"-142.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"264.75\" y=\"-142.1\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7efe6a34b960> >"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = spot.automaton(\"\"\"\n",
"HOA: v1\n",
"States: 2\n",
"Start: 0\n",
"AP: 2 \"p1\" \"p0\"\n",
"Acceptance: 5 (Fin(0) & (Fin(3)|Fin(4)) & (Inf(1)&Inf(2))) | Inf(3)\n",
"properties: trans-labels explicit-labels trans-acc complete\n",
"properties: deterministic stutter-invariant\n",
"--BODY--\n",
"State: 0\n",
"[0&!1] 0 {2 3}\n",
"[!0&!1] 0 {2 3 4}\n",
"[!0&1] 1\n",
"[0&1] 1 {2 4}\n",
"State: 1\n",
"[!0&!1] 0 {0 2 3 4}\n",
"[!0&1] 1 {1}\n",
"[0&!1] 1 {2 3}\n",
"[0&1] 1 {1 2 4}\n",
"--END--\n",
"\"\"\"); c"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "tired-webcam",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.43.0 (0)\n",
" -->\n",
"<!-- Pages: 1 -->\n",
"<svg width=\"366pt\" height=\"238pt\"\n",
" viewBox=\"0.00 0.00 365.50 238.16\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 234.16)\">\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-234.16 361.5,-234.16 361.5,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"34.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
"<text text-anchor=\"start\" x=\"55.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"71.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\">) | (Fin(</text>\n",
"<text text-anchor=\"start\" x=\"113.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"129.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\">) &amp; (Inf(</text>\n",
"<text text-anchor=\"start\" x=\"175.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"191.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\">) | (Fin(</text>\n",
"<text text-anchor=\"start\" x=\"233.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"<text text-anchor=\"start\" x=\"249.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\">) &amp; Inf(</text>\n",
"<text text-anchor=\"start\" x=\"291.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"<text text-anchor=\"start\" x=\"307.25\" y=\"-215.96\" font-family=\"Lato\" font-size=\"14.00\">))))</text>\n",
"<text text-anchor=\"start\" x=\"121.75\" y=\"-201.96\" font-family=\"Lato\" font-size=\"14.00\">[parity min even 5]</text>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>0</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"56\" cy=\"-44.16\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"56\" y=\"-40.46\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
"</g>\n",
"<!-- I&#45;&gt;0 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>I&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-44.16C2.79,-44.16 17.15,-44.16 30.63,-44.16\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"37.94,-44.16 30.94,-47.31 34.44,-44.16 30.94,-44.16 30.94,-44.16 30.94,-44.16 34.44,-44.16 30.94,-41.01 37.94,-44.16 37.94,-44.16\"/>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M52.76,-61.94C52.21,-71.47 53.29,-80.16 56,-80.16 57.99,-80.16 59.1,-75.48 59.33,-69.21\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"59.24,-61.94 62.48,-68.9 59.28,-65.44 59.33,-68.94 59.33,-68.94 59.33,-68.94 59.28,-65.44 56.18,-68.98 59.24,-61.94 59.24,-61.94\"/>\n",
"<text text-anchor=\"start\" x=\"29.5\" y=\"-98.96\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-83.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M50.99,-61.74C47.55,-82.88 49.21,-110.16 56,-110.16 62.04,-110.16 64.03,-88.52 61.96,-68.85\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"61.01,-61.74 65.06,-68.26 61.47,-65.21 61.93,-68.68 61.93,-68.68 61.93,-68.68 61.47,-65.21 58.81,-69.09 61.01,-61.74 61.01,-61.74\"/>\n",
"<text text-anchor=\"start\" x=\"27.5\" y=\"-128.96\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-113.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>1</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"195.5\" cy=\"-71.16\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"195.5\" y=\"-67.46\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M62.13,-61.3C67.26,-75.07 76.64,-93.49 92,-102.16 114.06,-114.61 124.79,-109.62 149,-102.16 158.75,-99.15 168.29,-93.26 176.09,-87.41\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"181.69,-83 178.14,-89.81 178.94,-85.17 176.19,-87.33 176.19,-87.33 176.19,-87.33 178.94,-85.17 174.24,-84.86 181.69,-83 181.69,-83\"/>\n",
"<text text-anchor=\"start\" x=\"94\" y=\"-127.96\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"112.5\" y=\"-112.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#33a02c\">❹</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M73.86,-47.47C98.09,-52.23 142.86,-61.02 170.52,-66.45\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"177.5,-67.82 170.03,-69.56 174.07,-67.15 170.63,-66.47 170.63,-66.47 170.63,-66.47 174.07,-67.15 171.24,-63.38 177.5,-67.82 177.5,-67.82\"/>\n",
"<text text-anchor=\"start\" x=\"96\" y=\"-79.96\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"112.5\" y=\"-64.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M186.44,-55.56C178.77,-42.58 165.9,-25.02 149,-17.16 126.03,-6.48 115.98,-8.99 92,-17.16 85.84,-19.26 79.92,-22.93 74.76,-26.9\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"69.07,-31.63 72.44,-24.73 71.77,-29.39 74.46,-27.15 74.46,-27.15 74.46,-27.15 71.77,-29.39 76.47,-29.58 69.07,-31.63 69.07,-31.63\"/>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-35.96\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"112.5\" y=\"-20.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M183.74,-85.2C179.35,-96.07 183.27,-107.16 195.5,-107.16 205.06,-107.16 209.54,-100.39 208.95,-92.25\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"207.26,-85.2 211.95,-91.27 208.07,-88.6 208.89,-92.01 208.89,-92.01 208.89,-92.01 208.07,-88.6 205.83,-92.74 207.26,-85.2 207.26,-85.2\"/>\n",
"<text text-anchor=\"start\" x=\"169\" y=\"-125.96\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"187.5\" y=\"-110.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 2 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>2</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"331\" cy=\"-71.16\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"331\" y=\"-67.46\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;2 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>1&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M200.35,-88.7C205.8,-108.8 217.92,-140.82 242,-155.16 262.24,-167.21 275.4,-168.23 295,-155.16 314.55,-142.13 323.2,-115.88 327.01,-96.18\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"328.21,-89.25 330.12,-96.69 327.61,-92.7 327.02,-96.15 327.02,-96.15 327.02,-96.15 327.61,-92.7 323.91,-95.61 328.21,-89.25 328.21,-89.25\"/>\n",
"<text text-anchor=\"start\" x=\"242\" y=\"-182.96\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"260.5\" y=\"-167.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;2 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>1&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M209.31,-83C217.87,-90.07 229.76,-98.39 242,-102.16 264.51,-109.1 272.97,-110.51 295,-102.16 301.94,-99.53 308.4,-94.82 313.82,-89.85\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"318.88,-84.86 316.1,-92.02 316.39,-87.32 313.89,-89.78 313.89,-89.78 313.89,-89.78 316.39,-87.32 311.68,-87.53 318.88,-84.86 318.88,-84.86\"/>\n",
"<text text-anchor=\"start\" x=\"244\" y=\"-125.96\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"260.5\" y=\"-110.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;0 -->\n",
"<g id=\"edge10\" class=\"edge\">\n",
"<title>2&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M322.72,-54.68C316.89,-43.56 307.6,-29.6 295,-22.16 238.74,11.05 214.22,-8.94 149,-5.16 123.71,-3.69 115.13,5.16 92,-5.16 83.43,-8.98 76.09,-16.05 70.37,-23.14\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"65.96,-29.02 67.64,-21.53 68.06,-26.22 70.16,-23.42 70.16,-23.42 70.16,-23.42 68.06,-26.22 72.68,-25.31 65.96,-29.02 65.96,-29.02\"/>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-23.96\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"187.5\" y=\"-8.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;1 -->\n",
"<g id=\"edge12\" class=\"edge\">\n",
"<title>2&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M312.93,-69.4C307.23,-68.89 300.85,-68.41 295,-68.16 271.47,-67.15 265.54,-67.38 242,-68.16 235.14,-68.39 227.72,-68.8 220.89,-69.25\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"213.77,-69.75 220.53,-66.12 217.26,-69.51 220.75,-69.26 220.75,-69.26 220.75,-69.26 217.26,-69.51 220.97,-72.41 213.77,-69.75 213.77,-69.75\"/>\n",
"<text text-anchor=\"start\" x=\"242\" y=\"-86.96\" font-family=\"Lato\" font-size=\"14.00\">!p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"260.5\" y=\"-71.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;1 -->\n",
"<g id=\"edge13\" class=\"edge\">\n",
"<title>2&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M320.67,-56.01C314.54,-47.57 305.68,-37.84 295,-33.16 273.43,-23.7 264.14,-25.13 242,-33.16 230.99,-37.15 220.79,-45.1 212.84,-52.7\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"207.72,-57.85 210.42,-50.66 210.18,-55.37 212.65,-52.89 212.65,-52.89 212.65,-52.89 210.18,-55.37 214.89,-55.11 207.72,-57.85 207.72,-57.85\"/>\n",
"<text text-anchor=\"start\" x=\"244\" y=\"-51.96\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; p1</text>\n",
"<text text-anchor=\"start\" x=\"260.5\" y=\"-36.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;2 -->\n",
"<g id=\"edge11\" class=\"edge\">\n",
"<title>2&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M320.63,-85.95C317.25,-96.58 320.71,-107.16 331,-107.16 338.88,-107.16 342.75,-100.96 342.62,-93.28\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"341.37,-85.95 345.65,-92.32 341.96,-89.4 342.55,-92.85 342.55,-92.85 342.55,-92.85 341.96,-89.4 339.44,-93.38 341.37,-85.95 341.37,-85.95\"/>\n",
"<text text-anchor=\"start\" x=\"304.5\" y=\"-125.96\" font-family=\"Lato\" font-size=\"14.00\">p0 &amp; !p1</text>\n",
"<text text-anchor=\"start\" x=\"323\" y=\"-110.96\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7efe6a34b540> >"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d = spot.zielonka_tree_transform(c); d"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "funny-taylor",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c.equivalent_to(d)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "liable-update",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.43.0 (0)\n",
" -->\n",
"<!-- Pages: 1 -->\n",
"<svg width=\"194pt\" height=\"207pt\"\n",
" viewBox=\"0.00 0.00 194.00 206.51\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 202.51)\">\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-202.51 190,-202.51 190,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"15\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
"<text text-anchor=\"start\" x=\"36\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"52\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\">) &amp; (Fin(</text>\n",
"<text text-anchor=\"start\" x=\"100\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"116\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\">)|Fin(</text>\n",
"<text text-anchor=\"start\" x=\"147\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"163\" y=\"-184.31\" font-family=\"Lato\" font-size=\"14.00\">))</text>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>0</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"56\" cy=\"-63.51\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"56\" y=\"-59.81\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
"</g>\n",
"<!-- I&#45;&gt;0 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>I&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-63.51C2.79,-63.51 17.15,-63.51 30.63,-63.51\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"37.94,-63.51 30.94,-66.66 34.44,-63.51 30.94,-63.51 30.94,-63.51 30.94,-63.51 34.44,-63.51 30.94,-60.36 37.94,-63.51 37.94,-63.51\"/>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M52.76,-81.29C52.21,-90.82 53.29,-99.51 56,-99.51 57.99,-99.51 59.1,-94.83 59.33,-88.56\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"59.24,-81.29 62.48,-88.25 59.28,-84.79 59.33,-88.29 59.33,-88.29 59.33,-88.29 59.28,-84.79 56.18,-88.33 59.24,-81.29 59.24,-81.29\"/>\n",
"<text text-anchor=\"start\" x=\"36\" y=\"-118.31\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-103.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M50.99,-81.09C47.55,-102.23 49.21,-129.51 56,-129.51 62.04,-129.51 64.03,-107.87 61.96,-88.2\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"61.01,-81.09 65.06,-87.61 61.47,-84.56 61.93,-88.03 61.93,-88.03 61.93,-88.03 61.47,-84.56 58.81,-88.44 61.01,-81.09 61.01,-81.09\"/>\n",
"<text text-anchor=\"start\" x=\"38\" y=\"-147.31\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"40\" y=\"-133.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"56\" y=\"-133.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>1</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"168\" cy=\"-63.51\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"168\" y=\"-59.81\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M64.12,-80.11C69.87,-91.22 79.13,-104.97 92,-111.51 107.85,-119.57 116.15,-119.57 132,-111.51 142.56,-106.14 150.69,-95.93 156.44,-86.3\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"159.88,-80.11 159.23,-87.76 158.18,-83.17 156.48,-86.23 156.48,-86.23 156.48,-86.23 158.18,-83.17 153.73,-84.7 159.88,-80.11 159.88,-80.11\"/>\n",
"<text text-anchor=\"start\" x=\"94\" y=\"-136.31\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"104\" y=\"-121.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M74.19,-63.51C92.59,-63.51 121.95,-63.51 142.71,-63.51\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"149.93,-63.51 142.93,-66.66 146.43,-63.51 142.93,-63.51 142.93,-63.51 142.93,-63.51 146.43,-63.51 142.93,-60.36 149.93,-63.51 149.93,-63.51\"/>\n",
"<text text-anchor=\"start\" x=\"96\" y=\"-81.31\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"96\" y=\"-67.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"112\" y=\"-67.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M152.69,-53.64C146.6,-50.02 139.24,-46.35 132,-44.51 114.77,-40.13 109.23,-40.13 92,-44.51 87.14,-45.74 82.22,-47.81 77.67,-50.13\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"71.31,-53.64 75.91,-47.5 74.37,-51.95 77.44,-50.25 77.44,-50.25 77.44,-50.25 74.37,-51.95 78.96,-53.01 71.31,-53.64 71.31,-53.64\"/>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-48.31\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M161.68,-46.39C156.48,-32.88 147.1,-14.96 132,-6.51 116.49,2.17 107.51,2.17 92,-6.51 79.26,-13.64 70.59,-27.51 65.07,-39.79\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"62.32,-46.39 62.1,-38.71 63.66,-43.16 65.01,-39.93 65.01,-39.93 65.01,-39.93 63.66,-43.16 67.92,-41.14 62.32,-46.39 62.32,-46.39\"/>\n",
"<text text-anchor=\"start\" x=\"94\" y=\"-25.31\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"104\" y=\"-10.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M163,-80.92C162.07,-90.6 163.73,-99.51 168,-99.51 171.13,-99.51 172.86,-94.7 173.19,-88.32\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"173,-80.92 176.33,-87.83 173.09,-84.42 173.18,-87.92 173.18,-87.92 173.18,-87.92 173.09,-84.42 170.03,-88 173,-80.92 173,-80.92\"/>\n",
"<text text-anchor=\"start\" x=\"150\" y=\"-118.31\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"160\" y=\"-103.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M160.46,-80.11C154.77,-101.37 157.28,-129.51 168,-129.51 177.59,-129.51 180.61,-107 177.06,-87.02\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"175.54,-80.11 180.12,-86.26 176.29,-83.52 177.05,-86.94 177.05,-86.94 177.05,-86.94 176.29,-83.52 173.97,-87.62 175.54,-80.11 175.54,-80.11\"/>\n",
"<text text-anchor=\"start\" x=\"152\" y=\"-147.31\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"152\" y=\"-133.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"168\" y=\"-133.31\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7efe6a301ed0> >"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.43.0 (0)\n",
" -->\n",
"<!-- Pages: 1 -->\n",
"<svg width=\"306pt\" height=\"283pt\"\n",
" viewBox=\"0.00 0.00 306.00 283.28\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 279.28)\">\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-279.28 302,-279.28 302,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"34.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\">Fin(</text>\n",
"<text text-anchor=\"start\" x=\"57.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"73.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\">) &amp; (Inf(</text>\n",
"<text text-anchor=\"start\" x=\"119.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"135.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\">) | (Fin(</text>\n",
"<text text-anchor=\"start\" x=\"177.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"193.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\">) &amp; Inf(</text>\n",
"<text text-anchor=\"start\" x=\"235.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"<text text-anchor=\"start\" x=\"251.5\" y=\"-261.08\" font-family=\"Lato\" font-size=\"14.00\">)))</text>\n",
"<text text-anchor=\"start\" x=\"95\" y=\"-247.08\" font-family=\"Lato\" font-size=\"14.00\">[parity min odd 4]</text>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>0</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"56\" cy=\"-48.28\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"56\" y=\"-44.58\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
"</g>\n",
"<!-- I&#45;&gt;0 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>I&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-48.28C2.79,-48.28 17.15,-48.28 30.63,-48.28\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"37.94,-48.28 30.94,-51.43 34.44,-48.28 30.94,-48.28 30.94,-48.28 30.94,-48.28 34.44,-48.28 30.94,-45.13 37.94,-48.28 37.94,-48.28\"/>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M52.76,-66.07C52.21,-75.6 53.29,-84.28 56,-84.28 57.99,-84.28 59.1,-79.6 59.33,-73.34\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"59.24,-66.07 62.48,-73.02 59.28,-69.57 59.33,-73.07 59.33,-73.07 59.33,-73.07 59.28,-69.57 56.18,-73.11 59.24,-66.07 59.24,-66.07\"/>\n",
"<text text-anchor=\"start\" x=\"36\" y=\"-103.08\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-88.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M50.99,-65.86C47.55,-87 49.21,-114.28 56,-114.28 62.04,-114.28 64.03,-92.64 61.96,-72.97\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"61.01,-65.86 65.06,-72.38 61.47,-69.33 61.93,-72.8 61.93,-72.8 61.93,-72.8 61.47,-69.33 58.81,-73.22 61.01,-65.86 61.01,-65.86\"/>\n",
"<text text-anchor=\"start\" x=\"38\" y=\"-133.08\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-118.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>1</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"166\" cy=\"-118.28\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"166\" y=\"-114.58\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M65.05,-64.23C71.13,-74.75 80.39,-88.05 92,-96.28 106.48,-106.55 125.81,-112.09 140.94,-115.05\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"148,-116.3 140.55,-118.18 144.55,-115.69 141.1,-115.08 141.1,-115.08 141.1,-115.08 144.55,-115.69 141.66,-111.98 148,-116.3 148,-116.3\"/>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-130.08\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"102\" y=\"-115.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M74.18,-48.05C89.5,-48.63 111.93,-51.51 128,-62.28 140.08,-70.39 149.18,-83.91 155.33,-95.64\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"158.45,-101.92 152.52,-97.05 156.89,-98.79 155.34,-95.65 155.34,-95.65 155.34,-95.65 156.89,-98.79 158.16,-94.25 158.45,-101.92 158.45,-101.92\"/>\n",
"<text text-anchor=\"start\" x=\"94\" y=\"-81.08\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"102\" y=\"-66.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M161,-135.69C160.07,-145.37 161.73,-154.28 166,-154.28 169.13,-154.28 170.86,-149.48 171.19,-143.09\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"171,-135.69 174.33,-142.61 171.09,-139.19 171.18,-142.69 171.18,-142.69 171.18,-142.69 171.09,-139.19 168.03,-142.77 171,-135.69 171,-135.69\"/>\n",
"<text text-anchor=\"start\" x=\"148\" y=\"-173.08\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"158\" y=\"-158.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M158.46,-134.88C152.77,-156.15 155.28,-184.28 166,-184.28 175.59,-184.28 178.61,-161.77 175.06,-141.8\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"173.54,-134.88 178.12,-141.04 174.29,-138.3 175.05,-141.72 175.05,-141.72 175.05,-141.72 174.29,-138.3 171.97,-142.39 173.54,-134.88 173.54,-134.88\"/>\n",
"<text text-anchor=\"start\" x=\"150\" y=\"-203.08\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"158\" y=\"-188.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 2 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>2</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"280\" cy=\"-91.28\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"280\" y=\"-87.58\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;2 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>1&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M169.16,-136.05C172.65,-156.05 181.58,-187.66 204,-202.28 218.89,-212 229.66,-212.8 244,-202.28 270.66,-182.74 277.54,-142.83 279.03,-116.58\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"279.32,-109.56 282.18,-116.69 279.18,-113.06 279.03,-116.56 279.03,-116.56 279.03,-116.56 279.18,-113.06 275.89,-116.43 279.32,-109.56 279.32,-109.56\"/>\n",
"<text text-anchor=\"start\" x=\"204\" y=\"-228.08\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"216\" y=\"-213.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#6a3d9a\">❸</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;2 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>1&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M178.58,-131.68C185.25,-138.35 194.23,-145.73 204,-149.28 220.71,-155.36 228.52,-158.02 244,-149.28 256.96,-141.97 265.66,-127.71 271.15,-115.16\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"273.87,-108.42 274.17,-116.09 272.56,-111.67 271.25,-114.91 271.25,-114.91 271.25,-114.91 272.56,-111.67 268.33,-113.73 273.87,-108.42 273.87,-108.42\"/>\n",
"<text text-anchor=\"start\" x=\"206\" y=\"-173.08\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"216\" y=\"-158.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;0 -->\n",
"<g id=\"edge10\" class=\"edge\">\n",
"<title>2&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M269.08,-76.84C262.85,-69.02 254.1,-60.02 244,-55.28 190.31,-30.11 118.12,-37.27 81.11,-43.46\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"73.76,-44.75 80.11,-40.44 77.21,-44.15 80.65,-43.54 80.65,-43.54 80.65,-43.54 77.21,-44.15 81.2,-46.64 73.76,-44.75 73.76,-44.75\"/>\n",
"<text text-anchor=\"start\" x=\"146\" y=\"-58.08\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"158\" y=\"-43.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;0 -->\n",
"<g id=\"edge11\" class=\"edge\">\n",
"<title>2&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M271.08,-75.57C264.83,-64.25 255.29,-49.13 244,-38.28 222.28,-17.43 215,-11.36 186,-3.28 146.61,7.68 101.77,-16.53 76.69,-33.51\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"70.75,-37.65 74.69,-31.06 73.62,-35.65 76.49,-33.65 76.49,-33.65 76.49,-33.65 73.62,-35.65 78.29,-36.23 70.75,-37.65 70.75,-37.65\"/>\n",
"<text text-anchor=\"start\" x=\"148\" y=\"-22.08\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"158\" y=\"-7.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;1 -->\n",
"<g id=\"edge12\" class=\"edge\">\n",
"<title>2&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M262.2,-95.33C243.26,-99.9 212.33,-107.36 190.89,-112.53\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"184.01,-114.18 190.08,-109.48 187.41,-113.36 190.82,-112.54 190.82,-112.54 190.82,-112.54 187.41,-113.36 191.55,-115.61 184.01,-114.18 184.01,-114.18\"/>\n",
"<text text-anchor=\"start\" x=\"206\" y=\"-127.08\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"216\" y=\"-112.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;1 -->\n",
"<g id=\"edge13\" class=\"edge\">\n",
"<title>2&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M266.53,-78.94C260.3,-73.64 252.34,-68.04 244,-65.28 227.12,-59.7 219.76,-57.06 204,-65.28 191.77,-71.66 182.76,-84.13 176.69,-95.37\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"173.46,-101.79 173.79,-94.12 175.03,-98.66 176.61,-95.54 176.61,-95.54 176.61,-95.54 175.03,-98.66 179.42,-96.95 173.46,-101.79 173.46,-101.79\"/>\n",
"<text text-anchor=\"start\" x=\"208\" y=\"-84.08\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"216\" y=\"-69.08\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7efe6a301720> >"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"e = spot.translate('!(GFa -> (GFb & GF(!b & !Xb)))', 'gen', 'det')\n",
"f = spot.zielonka_tree_transform(e)\n",
"display(e,f)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "complimentary-person",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.equivalent_to(f)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "determined-bankruptcy",
"metadata": {},
"outputs": [],
"source": []
}
],