Since we now require Python 3.6, we can use f-strings instead of format() to make the code more readable. * doc/org/tut01.org, doc/org/tut02.org, doc/org/tut03.org, doc/org/tut21.org, doc/org/tut24.org, doc/org/tut90.org, python/spot/__init__.py, python/spot/jupyter.py, tests/python/acc.py, tests/python/acc_cond.ipynb, tests/python/complement_semidet.py, tests/python/decompose.ipynb, tests/python/formulas.ipynb, tests/python/highlighting.ipynb, tests/python/ipnbdoctest.py, tests/python/ltlf.py, tests/python/parity.ipynb, tests/python/product.ipynb, tests/python/relabel.py, tests/python/satmin.ipynb, tests/python/stutter-inv.ipynb, tests/python/twagraph-internals.ipynb, tests/python/zlktree.ipynb: Use f-strings.
2531 lines
182 KiB
Text
2531 lines
182 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from IPython.display import display, HTML\n",
|
|
"import spot\n",
|
|
"from spot.jupyter import display_inline # display multiple arguments side-by-side\n",
|
|
"import buddy\n",
|
|
"spot.setup(show_default='.tvb')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Anatomy of a product\n",
|
|
"\n",
|
|
"In this notebook, we write a Python function that constructs the product of two automata.\n",
|
|
"\n",
|
|
"This is obviously not a new feature: Spot can already make a product of two automata using its `product()` function. \n",
|
|
"For instance:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div style='vertical-align:text-top;display:inline-block;'><?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=\"148pt\" height=\"205pt\"\n",
|
|
" viewBox=\"0.00 0.00 148.00 205.00\" 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 201)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-201 144,-201 144,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"49.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"70.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"86.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"48.5\" y=\"-168.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-105\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"18\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-159.85C18,-158.21 18,-143.85 18,-130.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-123.06 21.15,-130.06 18,-126.56 18,-130.06 18,-130.06 18,-130.06 18,-126.56 14.85,-130.06 18,-123.06 18,-123.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.04,-111.38C44.86,-112.68 54,-110.55 54,-105 54,-100.83 48.86,-98.6 42.14,-98.29\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.04,-98.62 41.88,-95.15 38.53,-98.46 42.03,-98.29 42.03,-98.29 42.03,-98.29 38.53,-98.46 42.18,-101.44 35.04,-98.62 35.04,-98.62\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1 -->\n",
|
|
"<g id=\"node3\" class=\"node\">\n",
|
|
"<title>1</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"13.5\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-86.8C18,-74.36 18,-57.36 18,-43.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-36.18 21.15,-43.18 18,-39.68 18,-43.18 18,-43.18 18,-43.18 18,-39.68 14.85,-43.18 18,-36.18 18,-36.18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"18\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.78,-21.78C45.31,-22.42 54,-21.16 54,-18 54,-15.68 49.32,-14.39 43.05,-14.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.78,-14.22 42.73,-10.97 39.28,-14.17 42.78,-14.12 42.78,-14.12 42.78,-14.12 39.28,-14.17 42.83,-17.27 35.78,-14.22 35.78,-14.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.43,-23.65C58.35,-27.92 90,-26.04 90,-18 90,-10.75 64.23,-8.5 42.36,-11.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.43,-12.35 41.86,-8.16 38.89,-11.81 42.35,-11.27 42.35,-11.27 42.35,-11.27 38.89,-11.81 42.83,-14.39 35.43,-12.35 35.43,-12.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"90\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"98\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"205pt\" height=\"220pt\"\n",
|
|
" viewBox=\"0.00 0.00 205.04 220.00\" 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 216)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-216 201.04,-216 201.04,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"53.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"74.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"90.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"124.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"140.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"56.02\" y=\"-183.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 2]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"67.04\" cy=\"-120\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-174.85C67.04,-173.21 67.04,-158.85 67.04,-145.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-138.06 70.19,-145.06 67.04,-141.56 67.04,-145.06 67.04,-145.06 67.04,-145.06 67.04,-141.56 63.89,-145.06 67.04,-138.06 67.04,-138.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-123.24C94.36,-123.79 103.04,-122.71 103.04,-120 103.04,-118.01 98.36,-116.9 92.09,-116.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-116.76 91.78,-113.52 88.32,-116.72 91.82,-116.67 91.82,-116.67 91.82,-116.67 88.32,-116.72 91.86,-119.82 84.82,-116.76 84.82,-116.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.04\" y=\"-108.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.47,-124.84C107.39,-128.51 139.04,-126.89 139.04,-120 139.04,-113.81 113.49,-111.88 91.68,-114.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.47,-115.16 91,-111.12 87.94,-114.7 91.41,-114.24 91.41,-114.24 91.41,-114.24 87.94,-114.7 91.82,-117.36 84.47,-115.16 84.47,-115.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"151.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"139.04\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"155.04\" y=\"-109.8\" 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=\"67.04\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M49.64,-114.49C34.86,-109.64 14.58,-100.33 5.04,-84 -1.68,-72.49 -1.68,-65.51 5.04,-54 13.16,-40.09 29.08,-31.28 42.75,-25.97\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"49.64,-23.51 44.11,-28.83 46.34,-24.68 43.05,-25.86 43.05,-25.86 43.05,-25.86 46.34,-24.68 41.99,-22.9 49.64,-23.51 49.64,-23.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"5.04\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-36.22C67.04,-52.21 67.04,-76.21 67.04,-94.25\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-101.58 63.89,-94.58 67.04,-98.08 67.04,-94.58 67.04,-94.58 67.04,-94.58 67.04,-98.08 70.19,-94.58 67.04,-101.58 67.04,-101.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"67.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"77.04\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M81.8,-28.42C90.03,-34.58 99.5,-43.44 104.04,-54 109.31,-66.25 109.31,-71.75 104.04,-84 100.49,-92.25 93.93,-99.46 87.31,-105.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"81.8,-109.58 85.29,-102.74 84.53,-107.39 87.26,-105.2 87.26,-105.2 87.26,-105.2 84.53,-107.39 89.24,-107.66 81.8,-109.58 81.8,-109.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"123.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-22.49C94.36,-23.26 103.04,-21.76 103.04,-18 103.04,-15.24 98.36,-13.7 92.09,-13.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-13.51 91.77,-10.23 88.32,-13.44 91.82,-13.38 91.82,-13.38 91.82,-13.38 88.32,-13.44 91.88,-16.53 84.82,-13.51 84.82,-13.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M83.93,-24.49C107.99,-29.88 143.04,-27.72 143.04,-18 143.04,-9.19 114.26,-6.59 90.95,-10.19\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"83.93,-11.51 90.23,-7.12 87.37,-10.86 90.81,-10.22 90.81,-10.22 90.81,-10.22 87.37,-10.86 91.39,-13.31 83.93,-11.51 83.93,-11.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.04\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"153.04\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"284pt\" height=\"360pt\"\n",
|
|
" viewBox=\"0.00 0.00 283.66 360.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
|
"<g id=\"graph0\" class=\"graph\" transform=\"scale(0.8474576271186441 0.8474576271186441) rotate(0) translate(4 420)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-420 330.09,-420 330.09,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"129.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"163.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"179.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"213.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"229.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"120.54\" y=\"-387.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 3]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"153.09\" cy=\"-324\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.09\" y=\"-320.3\" font-family=\"Lato\" font-size=\"14.00\">0,0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M153.09,-378.85C153.09,-377.21 153.09,-362.85 153.09,-349.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"153.09,-342.06 156.24,-349.06 153.09,-345.56 153.09,-349.06 153.09,-349.06 153.09,-349.06 153.09,-345.56 149.94,-349.06 153.09,-342.06 153.09,-342.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M176.49,-327.35C186.23,-327.58 194.49,-326.46 194.49,-324 194.49,-322.19 190.03,-321.11 183.81,-320.76\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"176.49,-320.65 183.54,-317.6 179.99,-320.7 183.49,-320.75 183.49,-320.75 183.49,-320.75 179.99,-320.7 183.45,-323.9 176.49,-320.65 176.49,-320.65\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"194.49\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"204.49\" y=\"-312.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M175.47,-329.32C199.75,-332.35 230.49,-330.57 230.49,-324 230.49,-318.04 205.24,-316.03 182.44,-317.96\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"175.47,-318.68 182.1,-314.83 178.95,-318.32 182.43,-317.96 182.43,-317.96 182.43,-317.96 178.95,-318.32 182.76,-321.09 175.47,-318.68 175.47,-318.68\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"242.49\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"230.49\" y=\"-313.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"246.49\" y=\"-313.8\" 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=\"92.09\" cy=\"-222\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"82.09\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">0,1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M129.95,-321.23C108.34,-318.21 77.23,-310.05 62.09,-288 54.54,-277.01 57.46,-270.51 62.09,-258 64.28,-252.07 67.98,-246.46 72.05,-241.54\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"76.93,-236.11 74.59,-243.42 74.59,-238.72 72.25,-241.32 72.25,-241.32 72.25,-241.32 74.59,-238.72 69.91,-239.22 76.93,-236.11 76.93,-236.11\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"62.09\" y=\"-269.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2 -->\n",
|
|
"<g id=\"node4\" class=\"node\">\n",
|
|
"<title>2</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"107.09\" cy=\"-18\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"97.09\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1,0</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->2 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>0->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M170.97,-312.31C180.78,-305.96 192.79,-297.33 202.09,-288 265.84,-223.99 317.77,-185.83 284.09,-102 261.13,-44.87 181.84,-27.03 137.57,-21.48\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"130.52,-20.67 137.84,-18.34 134,-21.07 137.47,-21.47 137.47,-21.47 137.47,-21.47 134,-21.07 137.11,-24.6 130.52,-20.67 130.52,-20.67\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"294.09\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"294.09\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"310.09\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M99.21,-239.27C105.37,-252.73 114.88,-272.15 125.09,-288 128.29,-292.97 132.05,-298.07 135.77,-302.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"140.4,-308.52 133.55,-305.05 138.2,-305.79 136,-303.07 136,-303.07 136,-303.07 138.2,-305.79 138.45,-301.09 140.4,-308.52 140.4,-308.52\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"125.09\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"135.09\" y=\"-261.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M114.34,-227.77C130.4,-232.5 150.97,-241.52 161.09,-258 168.72,-270.43 166.7,-286.72 162.78,-299.88\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"160.45,-306.83 159.69,-299.19 161.56,-303.51 162.67,-300.19 162.67,-300.19 162.67,-300.19 161.56,-303.51 165.66,-301.19 160.45,-306.83 160.45,-306.83\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"166.09\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"166.09\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"182.09\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M115.08,-226.63C124.99,-227.01 133.49,-225.47 133.49,-222 133.49,-219.4 128.71,-217.88 122.14,-217.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"115.08,-217.37 122.11,-214.29 118.58,-217.41 122.08,-217.44 122.08,-217.44 122.08,-217.44 118.58,-217.41 122.04,-220.59 115.08,-217.37 115.08,-217.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"133.49\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge9\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M113.96,-229.18C139.55,-233.67 173.49,-231.28 173.49,-222 173.49,-213.56 145.38,-210.82 121.03,-213.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"113.96,-214.82 120.43,-210.69 117.43,-214.31 120.89,-213.8 120.89,-213.8 120.89,-213.8 117.43,-214.31 121.35,-216.92 113.96,-214.82 113.96,-214.82\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"173.49\" y=\"-225.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"183.49\" y=\"-210.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->2 -->\n",
|
|
"<g id=\"edge10\" class=\"edge\">\n",
|
|
"<title>1->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M73.76,-210.29C52.4,-196.63 18.23,-170.78 4.09,-138 -2.25,-123.31 0.41,-117.57 4.09,-102 9.57,-78.79 10.83,-70.47 28.09,-54 42.05,-40.68 61.92,-31.91 78.24,-26.48\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.99,-24.35 79.26,-29.46 81.66,-25.4 78.32,-26.45 78.32,-26.45 78.32,-26.45 81.66,-25.4 77.37,-23.45 84.99,-24.35 84.99,-24.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"4.09\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"16.09\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"32.09\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3 -->\n",
|
|
"<g id=\"node5\" class=\"node\">\n",
|
|
"<title>3</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"92.09\" cy=\"-120\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"82.09\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">1,1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->3 -->\n",
|
|
"<g id=\"edge11\" class=\"edge\">\n",
|
|
"<title>1->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M92.09,-203.58C92.09,-187.52 92.09,-163.52 92.09,-145.52\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"92.09,-138.22 95.24,-145.22 92.09,-141.72 92.09,-145.22 92.09,-145.22 92.09,-145.22 92.09,-141.72 88.94,-145.22 92.09,-138.22 92.09,-138.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92.09\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"114.09\" y=\"-159.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge12\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M130.08,-22.63C139.99,-23.01 148.49,-21.47 148.49,-18 148.49,-15.4 143.71,-13.88 137.14,-13.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"130.08,-13.37 137.11,-10.29 133.58,-13.41 137.08,-13.44 137.08,-13.44 137.08,-13.44 133.58,-13.41 137.04,-16.59 130.08,-13.37 130.08,-13.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"148.49\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"170.49\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge14\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M128.87,-24.65C160.17,-29.84 208.49,-27.62 208.49,-18 208.49,-9.09 167.07,-6.53 136.09,-10.32\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"128.87,-11.35 135.35,-7.24 132.33,-10.85 135.8,-10.36 135.8,-10.36 135.8,-10.36 132.33,-10.85 136.24,-13.48 128.87,-11.35 128.87,-11.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"216.49\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"208.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"224.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"240.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->3 -->\n",
|
|
"<g id=\"edge13\" class=\"edge\">\n",
|
|
"<title>2->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.53,-36.05C102.11,-52.17 98.46,-76.52 95.74,-94.68\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"94.63,-102.04 92.56,-94.65 95.15,-98.58 95.67,-95.11 95.67,-95.11 95.67,-95.11 95.15,-98.58 98.79,-95.58 94.63,-102.04 94.63,-102.04\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"101.09\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge15\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M114.99,-115.41C133.1,-111.23 157.24,-102.4 169.09,-84 176.31,-72.79 175.81,-65.51 169.09,-54 161.78,-41.48 148.15,-33.09 135.53,-27.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"128.67,-24.95 136.34,-24.6 131.93,-26.24 135.18,-27.53 135.18,-27.53 135.18,-27.53 131.93,-26.24 134.02,-30.46 128.67,-24.95 128.67,-24.95\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"174.09\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"196.09\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge17\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M72.84,-109.33C58.63,-101.75 41.09,-91.29 37.09,-84 30.67,-72.31 30.08,-65.34 37.09,-54 46.01,-39.57 62.88,-30.89 77.83,-25.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.52,-23.68 78.79,-28.78 81.18,-24.73 77.84,-25.78 77.84,-25.78 77.84,-25.78 81.18,-24.73 76.9,-22.77 84.52,-23.68 84.52,-23.68\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"37.09\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"41.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"57.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"73.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge16\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M115.08,-124.63C124.99,-125.01 133.49,-123.47 133.49,-120 133.49,-117.4 128.71,-115.88 122.14,-115.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"115.08,-115.37 122.11,-112.29 118.58,-115.41 122.08,-115.44 122.08,-115.44 122.08,-115.44 118.58,-115.41 122.04,-118.59 115.08,-115.37 115.08,-115.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"133.49\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge18\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M113.92,-126.57C146.28,-131.86 197.49,-129.67 197.49,-120 197.49,-111.01 153.23,-108.49 121,-112.42\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"113.92,-113.43 120.41,-109.33 117.38,-112.94 120.85,-112.45 120.85,-112.45 120.85,-112.45 117.38,-112.94 121.29,-115.56 113.92,-113.43 113.92,-113.43\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"197.49\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"211.49\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"227.49\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"a1 = spot.translate('FGa & GFb')\n",
|
|
"a2 = spot.translate('G(Fc U b)')\n",
|
|
"prod = spot.product(a1, a2)\n",
|
|
"display_inline(a1, a2, prod)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The builtin `spot.product()` function produces an automaton whose language is the intersection of the two input languages. It does so by building an automaton that keeps track of the runs in the two input automata. The states are labeled by pairs of input states so that we can more easily follow what is going on, but those labels are purely cosmetic. The acceptance condition is the conjunction of the two acceptance condition, but the acceptance sets of one input automaton have been shifted to not conflict with the other automaton.\n",
|
|
"\n",
|
|
"In fact, that automaton printer has an option to shift those sets in its output, and this is perfect for illustrating products. For instance `a.show('+3')` will display `a1` with all its acceptance sets shifted by 3. \n",
|
|
"\n",
|
|
"Let's define a function for displaying the three automata involved in a product, using this shift option so we can follow what is going on with the acceptance sets."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div style='vertical-align:text-top;display:inline-block;'><?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=\"148pt\" height=\"205pt\"\n",
|
|
" viewBox=\"0.00 0.00 148.00 205.00\" 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 201)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-201 144,-201 144,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"49.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"70.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"86.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"48.5\" y=\"-168.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-105\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"18\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-159.85C18,-158.21 18,-143.85 18,-130.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-123.06 21.15,-130.06 18,-126.56 18,-130.06 18,-130.06 18,-130.06 18,-126.56 14.85,-130.06 18,-123.06 18,-123.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.04,-111.38C44.86,-112.68 54,-110.55 54,-105 54,-100.83 48.86,-98.6 42.14,-98.29\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.04,-98.62 41.88,-95.15 38.53,-98.46 42.03,-98.29 42.03,-98.29 42.03,-98.29 38.53,-98.46 42.18,-101.44 35.04,-98.62 35.04,-98.62\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1 -->\n",
|
|
"<g id=\"node3\" class=\"node\">\n",
|
|
"<title>1</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"13.5\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-86.8C18,-74.36 18,-57.36 18,-43.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-36.18 21.15,-43.18 18,-39.68 18,-43.18 18,-43.18 18,-43.18 18,-39.68 14.85,-43.18 18,-36.18 18,-36.18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"18\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.78,-21.78C45.31,-22.42 54,-21.16 54,-18 54,-15.68 49.32,-14.39 43.05,-14.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.78,-14.22 42.73,-10.97 39.28,-14.17 42.78,-14.12 42.78,-14.12 42.78,-14.12 39.28,-14.17 42.83,-17.27 35.78,-14.22 35.78,-14.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.43,-23.65C58.35,-27.92 90,-26.04 90,-18 90,-10.75 64.23,-8.5 42.36,-11.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.43,-12.35 41.86,-8.16 38.89,-11.81 42.35,-11.27 42.35,-11.27 42.35,-11.27 38.89,-11.81 42.83,-14.39 35.43,-12.35 35.43,-12.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"90\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"98\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"205pt\" height=\"220pt\"\n",
|
|
" viewBox=\"0.00 0.00 205.04 220.00\" 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 216)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-216 201.04,-216 201.04,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"53.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"74.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"90.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"124.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"140.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"56.02\" y=\"-183.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 2]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"67.04\" cy=\"-120\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-174.85C67.04,-173.21 67.04,-158.85 67.04,-145.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-138.06 70.19,-145.06 67.04,-141.56 67.04,-145.06 67.04,-145.06 67.04,-145.06 67.04,-141.56 63.89,-145.06 67.04,-138.06 67.04,-138.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-123.24C94.36,-123.79 103.04,-122.71 103.04,-120 103.04,-118.01 98.36,-116.9 92.09,-116.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-116.76 91.78,-113.52 88.32,-116.72 91.82,-116.67 91.82,-116.67 91.82,-116.67 88.32,-116.72 91.86,-119.82 84.82,-116.76 84.82,-116.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.04\" y=\"-108.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.47,-124.84C107.39,-128.51 139.04,-126.89 139.04,-120 139.04,-113.81 113.49,-111.88 91.68,-114.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.47,-115.16 91,-111.12 87.94,-114.7 91.41,-114.24 91.41,-114.24 91.41,-114.24 87.94,-114.7 91.82,-117.36 84.47,-115.16 84.47,-115.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"151.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"139.04\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"155.04\" y=\"-109.8\" 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=\"67.04\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M49.64,-114.49C34.86,-109.64 14.58,-100.33 5.04,-84 -1.68,-72.49 -1.68,-65.51 5.04,-54 13.16,-40.09 29.08,-31.28 42.75,-25.97\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"49.64,-23.51 44.11,-28.83 46.34,-24.68 43.05,-25.86 43.05,-25.86 43.05,-25.86 46.34,-24.68 41.99,-22.9 49.64,-23.51 49.64,-23.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"5.04\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-36.22C67.04,-52.21 67.04,-76.21 67.04,-94.25\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-101.58 63.89,-94.58 67.04,-98.08 67.04,-94.58 67.04,-94.58 67.04,-94.58 67.04,-98.08 70.19,-94.58 67.04,-101.58 67.04,-101.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"67.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"77.04\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M81.8,-28.42C90.03,-34.58 99.5,-43.44 104.04,-54 109.31,-66.25 109.31,-71.75 104.04,-84 100.49,-92.25 93.93,-99.46 87.31,-105.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"81.8,-109.58 85.29,-102.74 84.53,-107.39 87.26,-105.2 87.26,-105.2 87.26,-105.2 84.53,-107.39 89.24,-107.66 81.8,-109.58 81.8,-109.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"123.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-22.49C94.36,-23.26 103.04,-21.76 103.04,-18 103.04,-15.24 98.36,-13.7 92.09,-13.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-13.51 91.77,-10.23 88.32,-13.44 91.82,-13.38 91.82,-13.38 91.82,-13.38 88.32,-13.44 91.88,-16.53 84.82,-13.51 84.82,-13.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M83.93,-24.49C107.99,-29.88 143.04,-27.72 143.04,-18 143.04,-9.19 114.26,-6.59 90.95,-10.19\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"83.93,-11.51 90.23,-7.12 87.37,-10.86 90.81,-10.22 90.81,-10.22 90.81,-10.22 87.37,-10.86 91.39,-13.31 83.93,-11.51 83.93,-11.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.04\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"153.04\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"284pt\" height=\"360pt\"\n",
|
|
" viewBox=\"0.00 0.00 283.66 360.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
|
"<g id=\"graph0\" class=\"graph\" transform=\"scale(0.8474576271186441 0.8474576271186441) rotate(0) translate(4 420)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-420 330.09,-420 330.09,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"129.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"163.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"179.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"213.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"229.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"120.54\" y=\"-387.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 3]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"153.09\" cy=\"-324\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.09\" y=\"-320.3\" font-family=\"Lato\" font-size=\"14.00\">0,0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M153.09,-378.85C153.09,-377.21 153.09,-362.85 153.09,-349.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"153.09,-342.06 156.24,-349.06 153.09,-345.56 153.09,-349.06 153.09,-349.06 153.09,-349.06 153.09,-345.56 149.94,-349.06 153.09,-342.06 153.09,-342.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M176.49,-327.35C186.23,-327.58 194.49,-326.46 194.49,-324 194.49,-322.19 190.03,-321.11 183.81,-320.76\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"176.49,-320.65 183.54,-317.6 179.99,-320.7 183.49,-320.75 183.49,-320.75 183.49,-320.75 179.99,-320.7 183.45,-323.9 176.49,-320.65 176.49,-320.65\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"194.49\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"204.49\" y=\"-312.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M175.47,-329.32C199.75,-332.35 230.49,-330.57 230.49,-324 230.49,-318.04 205.24,-316.03 182.44,-317.96\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"175.47,-318.68 182.1,-314.83 178.95,-318.32 182.43,-317.96 182.43,-317.96 182.43,-317.96 178.95,-318.32 182.76,-321.09 175.47,-318.68 175.47,-318.68\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"242.49\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"230.49\" y=\"-313.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"246.49\" y=\"-313.8\" 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=\"92.09\" cy=\"-222\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"82.09\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">0,1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M129.95,-321.23C108.34,-318.21 77.23,-310.05 62.09,-288 54.54,-277.01 57.46,-270.51 62.09,-258 64.28,-252.07 67.98,-246.46 72.05,-241.54\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"76.93,-236.11 74.59,-243.42 74.59,-238.72 72.25,-241.32 72.25,-241.32 72.25,-241.32 74.59,-238.72 69.91,-239.22 76.93,-236.11 76.93,-236.11\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"62.09\" y=\"-269.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2 -->\n",
|
|
"<g id=\"node4\" class=\"node\">\n",
|
|
"<title>2</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"107.09\" cy=\"-18\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"97.09\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1,0</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->2 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>0->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M170.97,-312.31C180.78,-305.96 192.79,-297.33 202.09,-288 265.84,-223.99 317.77,-185.83 284.09,-102 261.13,-44.87 181.84,-27.03 137.57,-21.48\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"130.52,-20.67 137.84,-18.34 134,-21.07 137.47,-21.47 137.47,-21.47 137.47,-21.47 134,-21.07 137.11,-24.6 130.52,-20.67 130.52,-20.67\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"294.09\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"294.09\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"310.09\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M99.21,-239.27C105.37,-252.73 114.88,-272.15 125.09,-288 128.29,-292.97 132.05,-298.07 135.77,-302.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"140.4,-308.52 133.55,-305.05 138.2,-305.79 136,-303.07 136,-303.07 136,-303.07 138.2,-305.79 138.45,-301.09 140.4,-308.52 140.4,-308.52\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"125.09\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"135.09\" y=\"-261.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M114.34,-227.77C130.4,-232.5 150.97,-241.52 161.09,-258 168.72,-270.43 166.7,-286.72 162.78,-299.88\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"160.45,-306.83 159.69,-299.19 161.56,-303.51 162.67,-300.19 162.67,-300.19 162.67,-300.19 161.56,-303.51 165.66,-301.19 160.45,-306.83 160.45,-306.83\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"166.09\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"166.09\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"182.09\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M115.08,-226.63C124.99,-227.01 133.49,-225.47 133.49,-222 133.49,-219.4 128.71,-217.88 122.14,-217.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"115.08,-217.37 122.11,-214.29 118.58,-217.41 122.08,-217.44 122.08,-217.44 122.08,-217.44 118.58,-217.41 122.04,-220.59 115.08,-217.37 115.08,-217.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"133.49\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge9\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M113.96,-229.18C139.55,-233.67 173.49,-231.28 173.49,-222 173.49,-213.56 145.38,-210.82 121.03,-213.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"113.96,-214.82 120.43,-210.69 117.43,-214.31 120.89,-213.8 120.89,-213.8 120.89,-213.8 117.43,-214.31 121.35,-216.92 113.96,-214.82 113.96,-214.82\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"173.49\" y=\"-225.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"183.49\" y=\"-210.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->2 -->\n",
|
|
"<g id=\"edge10\" class=\"edge\">\n",
|
|
"<title>1->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M73.76,-210.29C52.4,-196.63 18.23,-170.78 4.09,-138 -2.25,-123.31 0.41,-117.57 4.09,-102 9.57,-78.79 10.83,-70.47 28.09,-54 42.05,-40.68 61.92,-31.91 78.24,-26.48\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.99,-24.35 79.26,-29.46 81.66,-25.4 78.32,-26.45 78.32,-26.45 78.32,-26.45 81.66,-25.4 77.37,-23.45 84.99,-24.35 84.99,-24.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"4.09\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"16.09\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"32.09\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3 -->\n",
|
|
"<g id=\"node5\" class=\"node\">\n",
|
|
"<title>3</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"92.09\" cy=\"-120\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"82.09\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">1,1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->3 -->\n",
|
|
"<g id=\"edge11\" class=\"edge\">\n",
|
|
"<title>1->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M92.09,-203.58C92.09,-187.52 92.09,-163.52 92.09,-145.52\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"92.09,-138.22 95.24,-145.22 92.09,-141.72 92.09,-145.22 92.09,-145.22 92.09,-145.22 92.09,-141.72 88.94,-145.22 92.09,-138.22 92.09,-138.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92.09\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"114.09\" y=\"-159.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge12\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M130.08,-22.63C139.99,-23.01 148.49,-21.47 148.49,-18 148.49,-15.4 143.71,-13.88 137.14,-13.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"130.08,-13.37 137.11,-10.29 133.58,-13.41 137.08,-13.44 137.08,-13.44 137.08,-13.44 133.58,-13.41 137.04,-16.59 130.08,-13.37 130.08,-13.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"148.49\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"170.49\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge14\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M128.87,-24.65C160.17,-29.84 208.49,-27.62 208.49,-18 208.49,-9.09 167.07,-6.53 136.09,-10.32\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"128.87,-11.35 135.35,-7.24 132.33,-10.85 135.8,-10.36 135.8,-10.36 135.8,-10.36 132.33,-10.85 136.24,-13.48 128.87,-11.35 128.87,-11.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"216.49\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"208.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"224.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"240.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->3 -->\n",
|
|
"<g id=\"edge13\" class=\"edge\">\n",
|
|
"<title>2->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.53,-36.05C102.11,-52.17 98.46,-76.52 95.74,-94.68\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"94.63,-102.04 92.56,-94.65 95.15,-98.58 95.67,-95.11 95.67,-95.11 95.67,-95.11 95.15,-98.58 98.79,-95.58 94.63,-102.04 94.63,-102.04\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"101.09\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge15\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M114.99,-115.41C133.1,-111.23 157.24,-102.4 169.09,-84 176.31,-72.79 175.81,-65.51 169.09,-54 161.78,-41.48 148.15,-33.09 135.53,-27.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"128.67,-24.95 136.34,-24.6 131.93,-26.24 135.18,-27.53 135.18,-27.53 135.18,-27.53 131.93,-26.24 134.02,-30.46 128.67,-24.95 128.67,-24.95\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"174.09\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"196.09\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge17\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M72.84,-109.33C58.63,-101.75 41.09,-91.29 37.09,-84 30.67,-72.31 30.08,-65.34 37.09,-54 46.01,-39.57 62.88,-30.89 77.83,-25.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.52,-23.68 78.79,-28.78 81.18,-24.73 77.84,-25.78 77.84,-25.78 77.84,-25.78 81.18,-24.73 76.9,-22.77 84.52,-23.68 84.52,-23.68\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"37.09\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"41.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"57.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"73.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge16\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M115.08,-124.63C124.99,-125.01 133.49,-123.47 133.49,-120 133.49,-117.4 128.71,-115.88 122.14,-115.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"115.08,-115.37 122.11,-112.29 118.58,-115.41 122.08,-115.44 122.08,-115.44 122.08,-115.44 118.58,-115.41 122.04,-118.59 115.08,-115.37 115.08,-115.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"133.49\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge18\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M113.92,-126.57C146.28,-131.86 197.49,-129.67 197.49,-120 197.49,-111.01 153.23,-108.49 121,-112.42\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"113.92,-113.43 120.41,-109.33 117.38,-112.94 120.85,-112.45 120.85,-112.45 120.85,-112.45 117.38,-112.94 121.29,-115.56 113.92,-113.43 113.92,-113.43\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"197.49\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"211.49\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"227.49\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"def show_prod(a1, a2, res):\n",
|
|
" display_inline(a1, a2.show(f'.tvb+{a1.num_sets()}'), res)\n",
|
|
"\n",
|
|
"show_prod(a1, a2, prod)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Building a product\n",
|
|
"\n",
|
|
"Let's now rewrite `product()` in Python. We will do that in three steps.\n",
|
|
"\n",
|
|
"\n",
|
|
"## First attempt\n",
|
|
"\n",
|
|
"First, we build a product without taking care of the acceptance sets. We just want to get the general shape of the algorithm.\n",
|
|
"\n",
|
|
"We will build an automaton of type `twa_graph`, i.e., an automaton represented explicitly using a graph. In those automata, states are numbered by integers, starting from `0`. (Those states can also be given a different name, which is why the the `product()` shows us something that appears to be labeled by pairs, but the real identifier of each state is an integer.)\n",
|
|
"\n",
|
|
"We will use a dictionary to keep track of the association between a pair `(ls,rs)` of input states, and its number in the output."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div style='vertical-align:text-top;display:inline-block;'><?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=\"148pt\" height=\"205pt\"\n",
|
|
" viewBox=\"0.00 0.00 148.00 205.00\" 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 201)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-201 144,-201 144,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"49.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"70.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"86.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"48.5\" y=\"-168.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-105\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"18\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-159.85C18,-158.21 18,-143.85 18,-130.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-123.06 21.15,-130.06 18,-126.56 18,-130.06 18,-130.06 18,-130.06 18,-126.56 14.85,-130.06 18,-123.06 18,-123.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.04,-111.38C44.86,-112.68 54,-110.55 54,-105 54,-100.83 48.86,-98.6 42.14,-98.29\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.04,-98.62 41.88,-95.15 38.53,-98.46 42.03,-98.29 42.03,-98.29 42.03,-98.29 38.53,-98.46 42.18,-101.44 35.04,-98.62 35.04,-98.62\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1 -->\n",
|
|
"<g id=\"node3\" class=\"node\">\n",
|
|
"<title>1</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"13.5\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-86.8C18,-74.36 18,-57.36 18,-43.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-36.18 21.15,-43.18 18,-39.68 18,-43.18 18,-43.18 18,-43.18 18,-39.68 14.85,-43.18 18,-36.18 18,-36.18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"18\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.78,-21.78C45.31,-22.42 54,-21.16 54,-18 54,-15.68 49.32,-14.39 43.05,-14.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.78,-14.22 42.73,-10.97 39.28,-14.17 42.78,-14.12 42.78,-14.12 42.78,-14.12 39.28,-14.17 42.83,-17.27 35.78,-14.22 35.78,-14.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.43,-23.65C58.35,-27.92 90,-26.04 90,-18 90,-10.75 64.23,-8.5 42.36,-11.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.43,-12.35 41.86,-8.16 38.89,-11.81 42.35,-11.27 42.35,-11.27 42.35,-11.27 38.89,-11.81 42.83,-14.39 35.43,-12.35 35.43,-12.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"90\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"98\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"205pt\" height=\"220pt\"\n",
|
|
" viewBox=\"0.00 0.00 205.04 220.00\" 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 216)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-216 201.04,-216 201.04,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"53.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"74.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"90.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"124.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"140.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"56.02\" y=\"-183.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 2]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"67.04\" cy=\"-120\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-174.85C67.04,-173.21 67.04,-158.85 67.04,-145.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-138.06 70.19,-145.06 67.04,-141.56 67.04,-145.06 67.04,-145.06 67.04,-145.06 67.04,-141.56 63.89,-145.06 67.04,-138.06 67.04,-138.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-123.24C94.36,-123.79 103.04,-122.71 103.04,-120 103.04,-118.01 98.36,-116.9 92.09,-116.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-116.76 91.78,-113.52 88.32,-116.72 91.82,-116.67 91.82,-116.67 91.82,-116.67 88.32,-116.72 91.86,-119.82 84.82,-116.76 84.82,-116.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.04\" y=\"-108.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.47,-124.84C107.39,-128.51 139.04,-126.89 139.04,-120 139.04,-113.81 113.49,-111.88 91.68,-114.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.47,-115.16 91,-111.12 87.94,-114.7 91.41,-114.24 91.41,-114.24 91.41,-114.24 87.94,-114.7 91.82,-117.36 84.47,-115.16 84.47,-115.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"151.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"139.04\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"155.04\" y=\"-109.8\" 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=\"67.04\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M49.64,-114.49C34.86,-109.64 14.58,-100.33 5.04,-84 -1.68,-72.49 -1.68,-65.51 5.04,-54 13.16,-40.09 29.08,-31.28 42.75,-25.97\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"49.64,-23.51 44.11,-28.83 46.34,-24.68 43.05,-25.86 43.05,-25.86 43.05,-25.86 46.34,-24.68 41.99,-22.9 49.64,-23.51 49.64,-23.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"5.04\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-36.22C67.04,-52.21 67.04,-76.21 67.04,-94.25\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-101.58 63.89,-94.58 67.04,-98.08 67.04,-94.58 67.04,-94.58 67.04,-94.58 67.04,-98.08 70.19,-94.58 67.04,-101.58 67.04,-101.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"67.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"77.04\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M81.8,-28.42C90.03,-34.58 99.5,-43.44 104.04,-54 109.31,-66.25 109.31,-71.75 104.04,-84 100.49,-92.25 93.93,-99.46 87.31,-105.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"81.8,-109.58 85.29,-102.74 84.53,-107.39 87.26,-105.2 87.26,-105.2 87.26,-105.2 84.53,-107.39 89.24,-107.66 81.8,-109.58 81.8,-109.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"123.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-22.49C94.36,-23.26 103.04,-21.76 103.04,-18 103.04,-15.24 98.36,-13.7 92.09,-13.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-13.51 91.77,-10.23 88.32,-13.44 91.82,-13.38 91.82,-13.38 91.82,-13.38 88.32,-13.44 91.88,-16.53 84.82,-13.51 84.82,-13.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M83.93,-24.49C107.99,-29.88 143.04,-27.72 143.04,-18 143.04,-9.19 114.26,-6.59 90.95,-10.19\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"83.93,-11.51 90.23,-7.12 87.37,-10.86 90.81,-10.22 90.81,-10.22 90.81,-10.22 87.37,-10.86 91.39,-13.31 83.93,-11.51 83.93,-11.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.04\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"153.04\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"300pt\" height=\"360pt\"\n",
|
|
" viewBox=\"0.00 0.00 300.19 360.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
|
"<g id=\"graph0\" class=\"graph\" transform=\"scale(0.9433962264150942 0.9433962264150942) rotate(0) translate(4 377)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-377 313.7,-377 313.7,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"151.85\" y=\"-357.8\" font-family=\"Lato\" font-size=\"14.00\">t</text>\n",
|
|
"<text text-anchor=\"start\" x=\"143.85\" y=\"-342.8\" font-family=\"Lato\" font-size=\"14.00\">[all]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"148.7\" cy=\"-279\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"148.7\" y=\"-275.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M148.7,-333.85C148.7,-332.21 148.7,-317.85 148.7,-304.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"148.7,-297.06 151.85,-304.06 148.7,-300.56 148.7,-304.06 148.7,-304.06 148.7,-304.06 148.7,-300.56 145.55,-304.06 148.7,-297.06 148.7,-297.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M166.48,-282.24C176.01,-282.79 184.7,-281.71 184.7,-279 184.7,-277.01 180.01,-275.9 173.75,-275.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"166.48,-275.76 173.44,-272.52 169.98,-275.72 173.48,-275.67 173.48,-275.67 173.48,-275.67 169.98,-275.72 173.52,-278.82 166.48,-275.76 166.48,-275.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"184.7\" y=\"-275.3\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M166.13,-283.84C189.04,-287.51 220.7,-285.89 220.7,-279 220.7,-272.81 195.15,-270.88 173.34,-273.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"166.13,-274.16 172.66,-270.12 169.6,-273.7 173.07,-273.24 173.07,-273.24 173.07,-273.24 169.6,-273.7 173.48,-276.36 166.13,-274.16 166.13,-274.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"220.7\" y=\"-275.3\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1 -->\n",
|
|
"<g id=\"node3\" class=\"node\">\n",
|
|
"<title>1</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"87.7\" cy=\"-192\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"87.7\" y=\"-188.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M130.68,-276.88C109.18,-274.46 74.08,-266.86 57.7,-243 49.99,-231.77 58.67,-218.54 68.64,-208.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"73.89,-203.58 70.94,-210.66 71.34,-205.97 68.79,-208.36 68.79,-208.36 68.79,-208.36 71.34,-205.97 66.63,-206.07 73.89,-203.58 73.89,-203.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"57.7\" y=\"-231.8\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2 -->\n",
|
|
"<g id=\"node4\" class=\"node\">\n",
|
|
"<title>2</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"107.7\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"107.7\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->2 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>0->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M163.55,-268.6C204.04,-241.72 310.99,-161.67 274.7,-87 249.32,-34.78 173.07,-22.54 132.97,-19.75\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"125.92,-19.33 133.1,-16.6 129.42,-19.54 132.91,-19.75 132.91,-19.75 132.91,-19.75 129.42,-19.54 132.73,-22.89 125.92,-19.33 125.92,-19.33\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"277.7\" y=\"-144.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M96.89,-207.68C103.32,-217.77 112.25,-231.39 120.7,-243 124.51,-248.25 128.82,-253.79 132.88,-258.88\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"137.5,-264.59 130.65,-261.13 135.3,-261.87 133.1,-259.15 133.1,-259.15 133.1,-259.15 135.3,-261.87 135.55,-257.17 137.5,-264.59 137.5,-264.59\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"120.7\" y=\"-231.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M105.41,-196.51C121.91,-200.82 145.59,-209.91 156.7,-228 161.76,-236.24 160.99,-246.62 158.48,-255.79\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"156.28,-262.51 155.46,-254.88 157.36,-259.19 158.45,-255.86 158.45,-255.86 158.45,-255.86 157.36,-259.19 161.45,-256.84 156.28,-262.51 156.28,-262.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"159.7\" y=\"-231.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M105.48,-195.78C115.01,-196.42 123.7,-195.16 123.7,-192 123.7,-189.68 119.01,-188.39 112.75,-188.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"105.48,-188.22 112.43,-184.97 108.98,-188.17 112.48,-188.12 112.48,-188.12 112.48,-188.12 108.98,-188.17 112.53,-191.27 105.48,-188.22 105.48,-188.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"123.7\" y=\"-188.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge9\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.95,-197.52C129,-201.96 163.7,-200.12 163.7,-192 163.7,-184.64 135.2,-182.44 111.96,-185.4\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"104.95,-186.48 111.39,-182.3 108.41,-185.95 111.87,-185.41 111.87,-185.41 111.87,-185.41 108.41,-185.95 112.35,-188.52 104.95,-186.48 104.95,-186.48\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"163.7\" y=\"-188.3\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->2 -->\n",
|
|
"<g id=\"edge10\" class=\"edge\">\n",
|
|
"<title>1->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M71.53,-183.38C51.54,-172.94 18.49,-152.13 4.7,-123 -2.15,-108.54 -0.4,-102.17 4.7,-87 16.16,-52.88 56.93,-34.26 83.61,-25.49\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"90.39,-23.37 84.65,-28.46 87.05,-24.41 83.71,-25.45 83.71,-25.45 83.71,-25.45 87.05,-24.41 82.77,-22.45 90.39,-23.37 90.39,-23.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"4.7\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3 -->\n",
|
|
"<g id=\"node5\" class=\"node\">\n",
|
|
"<title>3</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"87.7\" cy=\"-105\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"87.7\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->3 -->\n",
|
|
"<g id=\"edge11\" class=\"edge\">\n",
|
|
"<title>1->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M87.7,-173.8C87.7,-161.36 87.7,-144.36 87.7,-130.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"87.7,-123.18 90.85,-130.18 87.7,-126.68 87.7,-130.18 87.7,-130.18 87.7,-130.18 87.7,-126.68 84.55,-130.18 87.7,-123.18 87.7,-123.18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"87.7\" y=\"-144.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge12\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M125.48,-21.78C135.01,-22.42 143.7,-21.16 143.7,-18 143.7,-15.68 139.01,-14.39 132.75,-14.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"125.48,-14.22 132.43,-10.97 128.98,-14.17 132.48,-14.12 132.48,-14.12 132.48,-14.12 128.98,-14.17 132.53,-17.27 125.48,-14.22 125.48,-14.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.7\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge14\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M125.37,-23.17C154.65,-28.05 203.7,-26.33 203.7,-18 203.7,-10.32 162.02,-8.26 132.56,-11.81\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"125.37,-12.83 131.85,-8.72 128.83,-12.34 132.3,-11.84 132.3,-11.84 132.3,-11.84 128.83,-12.34 132.74,-14.96 125.37,-12.83 125.37,-12.83\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"203.7\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->3 -->\n",
|
|
"<g id=\"edge13\" class=\"edge\">\n",
|
|
"<title>2->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M103.75,-35.76C100.77,-48.44 96.63,-66.03 93.3,-80.17\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"91.65,-87.21 90.19,-79.67 92.45,-83.8 93.25,-80.39 93.25,-80.39 93.25,-80.39 92.45,-83.8 96.32,-81.11 91.65,-87.21 91.65,-87.21\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"98.7\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge15\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M105.43,-101.74C124.28,-98.29 153.2,-89.75 166.7,-69 178.39,-51.03 152.53,-36.02 131.42,-27.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"124.79,-24.66 132.46,-24.29 128.04,-25.94 131.3,-27.22 131.3,-27.22 131.3,-27.22 128.04,-25.94 130.14,-30.15 124.79,-24.66 124.79,-24.66\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"168.7\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge17\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M72.18,-95.73C58.36,-88 39.71,-76.54 35.7,-69 32.56,-63.12 32.16,-59.65 35.7,-54 46.02,-37.51 66.59,-28.58 83.1,-23.89\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"89.89,-22.12 83.91,-26.93 86.51,-23 83.12,-23.88 83.12,-23.88 83.12,-23.88 86.51,-23 82.33,-20.83 89.89,-22.12 89.89,-22.12\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"35.7\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge16\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M105.48,-108.78C115.01,-109.42 123.7,-108.16 123.7,-105 123.7,-102.68 119.01,-101.39 112.75,-101.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"105.48,-101.22 112.43,-97.97 108.98,-101.17 112.48,-101.12 112.48,-101.12 112.48,-101.12 108.98,-101.17 112.53,-104.27 105.48,-101.22 105.48,-101.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"123.7\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge18\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M105.36,-110.1C135.63,-115.07 187.7,-113.37 187.7,-105 187.7,-97.25 143.07,-95.22 112.43,-98.91\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"105.36,-99.9 111.86,-95.81 108.83,-99.41 112.3,-98.92 112.3,-98.92 112.3,-98.92 108.83,-99.41 112.74,-102.04 105.36,-99.9 105.36,-99.9\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"187.7\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"def product1(left, right):\n",
|
|
" # A bdd_dict object associates BDD variables (that are \n",
|
|
" # used in BDDs labeling the edges) to atomic propositions.\n",
|
|
" bdict = left.get_dict()\n",
|
|
" # If the two automata do not have the same BDD dict, then\n",
|
|
" # we cannot easily detect compatible transitions.\n",
|
|
" if right.get_dict() != bdict:\n",
|
|
" raise RuntimeError(\"automata should share their dictionary\")\n",
|
|
" \n",
|
|
" result = spot.make_twa_graph(bdict)\n",
|
|
" # This will be our state dictionary\n",
|
|
" sdict = {}\n",
|
|
" # The list of output states for which we have not yet\n",
|
|
" # computed the successors. Items on this list are triplets\n",
|
|
" # of the form (ls, rs, p) where ls,rs are the state number in\n",
|
|
" # the left and right automata, and p is the state number if\n",
|
|
" # the output automaton.\n",
|
|
" todo = []\n",
|
|
" # Transform a pair of state number (ls, rs) into a state number in\n",
|
|
" # the output automaton, creating a new state if needed. Whenever\n",
|
|
" # a new state is created, we can add it to todo.\n",
|
|
" def dst(ls, rs):\n",
|
|
" pair = (ls, rs)\n",
|
|
" p = sdict.get(pair)\n",
|
|
" if p is None:\n",
|
|
" p = result.new_state()\n",
|
|
" sdict[pair] = p\n",
|
|
" todo.append((ls, rs, p))\n",
|
|
" return p\n",
|
|
" \n",
|
|
" # Setup the initial state. It always exists.\n",
|
|
" result.set_init_state(dst(left.get_init_state_number(), \n",
|
|
" right.get_init_state_number()))\n",
|
|
"\n",
|
|
" # Build all states and edges in the product\n",
|
|
" while todo:\n",
|
|
" lsrc, rsrc, osrc = todo.pop()\n",
|
|
" for lt in left.out(lsrc):\n",
|
|
" for rt in right.out(rsrc):\n",
|
|
" cond = lt.cond & rt.cond\n",
|
|
" if cond != buddy.bddfalse:\n",
|
|
" result.new_edge(osrc, dst(lt.dst, rt.dst), cond)\n",
|
|
" return result\n",
|
|
"\n",
|
|
"p1 = product1(a1, a2)\n",
|
|
"show_prod(a1, a2, p1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Besides the obvious lack of acceptance condition (which defaults to `t`) and acceptance sets, there is a less obvious problem: we never declared the set of atomic propositions used by the result automaton. This as two consequences:\n",
|
|
"- calling `p1.ap()` will return an empty set of atomic propositions"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"(spot.formula(\"a\"), spot.formula(\"b\"))\n",
|
|
"(spot.formula(\"c\"), spot.formula(\"b\"))\n",
|
|
"()\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(a1.ap())\n",
|
|
"print(a2.ap())\n",
|
|
"print(p1.ap())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"- the `bdd_dict` instance that is shared by the three automata knows that the atomic propositions `a` and `b` are used by automata `a1` and that `b` and `c` are used by `a2`. But it is unaware of `p1`. That means that if we delete automata `a1` and `a2`, then the `bdd_dict` will release the associated BDD variables, and attempting to print automaton `p1` will either crash (because it uses bdd variables that are not associated to any atomic proposition) or display different atomic propositions (in case the BDD variables have been associated to different propositions in the meantime).\n",
|
|
"\n",
|
|
"These two issues are fixed by either calling `p1.register_ap(...)` for each atomic proposition, or in our case `p1.copy_ap_of(...)` to copy the atomic propositions of each input automaton. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Second attempt: a working product\n",
|
|
"\n",
|
|
"This fixes the list of atomic propositions, as discussed above, and also sets the correct acceptance condition.\n",
|
|
"The `set_acceptance` method takes two arguments: a number of sets, and an acceptance function. In our case, both of these arguments are readily computed from the number of states and acceptance functions of the input automata."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div style='vertical-align:text-top;display:inline-block;'><?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=\"148pt\" height=\"205pt\"\n",
|
|
" viewBox=\"0.00 0.00 148.00 205.00\" 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 201)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-201 144,-201 144,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"49.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"70.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"86.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"48.5\" y=\"-168.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-105\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"18\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-159.85C18,-158.21 18,-143.85 18,-130.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-123.06 21.15,-130.06 18,-126.56 18,-130.06 18,-130.06 18,-130.06 18,-126.56 14.85,-130.06 18,-123.06 18,-123.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.04,-111.38C44.86,-112.68 54,-110.55 54,-105 54,-100.83 48.86,-98.6 42.14,-98.29\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.04,-98.62 41.88,-95.15 38.53,-98.46 42.03,-98.29 42.03,-98.29 42.03,-98.29 38.53,-98.46 42.18,-101.44 35.04,-98.62 35.04,-98.62\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1 -->\n",
|
|
"<g id=\"node3\" class=\"node\">\n",
|
|
"<title>1</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"13.5\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-86.8C18,-74.36 18,-57.36 18,-43.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-36.18 21.15,-43.18 18,-39.68 18,-43.18 18,-43.18 18,-43.18 18,-39.68 14.85,-43.18 18,-36.18 18,-36.18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"18\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.78,-21.78C45.31,-22.42 54,-21.16 54,-18 54,-15.68 49.32,-14.39 43.05,-14.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.78,-14.22 42.73,-10.97 39.28,-14.17 42.78,-14.12 42.78,-14.12 42.78,-14.12 39.28,-14.17 42.83,-17.27 35.78,-14.22 35.78,-14.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.43,-23.65C58.35,-27.92 90,-26.04 90,-18 90,-10.75 64.23,-8.5 42.36,-11.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.43,-12.35 41.86,-8.16 38.89,-11.81 42.35,-11.27 42.35,-11.27 42.35,-11.27 38.89,-11.81 42.83,-14.39 35.43,-12.35 35.43,-12.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"90\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"98\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"205pt\" height=\"220pt\"\n",
|
|
" viewBox=\"0.00 0.00 205.04 220.00\" 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 216)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-216 201.04,-216 201.04,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"53.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"74.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"90.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"124.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"140.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"56.02\" y=\"-183.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 2]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"67.04\" cy=\"-120\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-174.85C67.04,-173.21 67.04,-158.85 67.04,-145.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-138.06 70.19,-145.06 67.04,-141.56 67.04,-145.06 67.04,-145.06 67.04,-145.06 67.04,-141.56 63.89,-145.06 67.04,-138.06 67.04,-138.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-123.24C94.36,-123.79 103.04,-122.71 103.04,-120 103.04,-118.01 98.36,-116.9 92.09,-116.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-116.76 91.78,-113.52 88.32,-116.72 91.82,-116.67 91.82,-116.67 91.82,-116.67 88.32,-116.72 91.86,-119.82 84.82,-116.76 84.82,-116.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.04\" y=\"-108.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.47,-124.84C107.39,-128.51 139.04,-126.89 139.04,-120 139.04,-113.81 113.49,-111.88 91.68,-114.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.47,-115.16 91,-111.12 87.94,-114.7 91.41,-114.24 91.41,-114.24 91.41,-114.24 87.94,-114.7 91.82,-117.36 84.47,-115.16 84.47,-115.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"151.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"139.04\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"155.04\" y=\"-109.8\" 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=\"67.04\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M49.64,-114.49C34.86,-109.64 14.58,-100.33 5.04,-84 -1.68,-72.49 -1.68,-65.51 5.04,-54 13.16,-40.09 29.08,-31.28 42.75,-25.97\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"49.64,-23.51 44.11,-28.83 46.34,-24.68 43.05,-25.86 43.05,-25.86 43.05,-25.86 46.34,-24.68 41.99,-22.9 49.64,-23.51 49.64,-23.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"5.04\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-36.22C67.04,-52.21 67.04,-76.21 67.04,-94.25\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-101.58 63.89,-94.58 67.04,-98.08 67.04,-94.58 67.04,-94.58 67.04,-94.58 67.04,-98.08 70.19,-94.58 67.04,-101.58 67.04,-101.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"67.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"77.04\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M81.8,-28.42C90.03,-34.58 99.5,-43.44 104.04,-54 109.31,-66.25 109.31,-71.75 104.04,-84 100.49,-92.25 93.93,-99.46 87.31,-105.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"81.8,-109.58 85.29,-102.74 84.53,-107.39 87.26,-105.2 87.26,-105.2 87.26,-105.2 84.53,-107.39 89.24,-107.66 81.8,-109.58 81.8,-109.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"123.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-22.49C94.36,-23.26 103.04,-21.76 103.04,-18 103.04,-15.24 98.36,-13.7 92.09,-13.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-13.51 91.77,-10.23 88.32,-13.44 91.82,-13.38 91.82,-13.38 91.82,-13.38 88.32,-13.44 91.88,-16.53 84.82,-13.51 84.82,-13.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M83.93,-24.49C107.99,-29.88 143.04,-27.72 143.04,-18 143.04,-9.19 114.26,-6.59 90.95,-10.19\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"83.93,-11.51 90.23,-7.12 87.37,-10.86 90.81,-10.22 90.81,-10.22 90.81,-10.22 87.37,-10.86 91.39,-13.31 83.93,-11.51 83.93,-11.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.04\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"153.04\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"273pt\" height=\"360pt\"\n",
|
|
" viewBox=\"0.00 0.00 273.29 360.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
|
"<g id=\"graph0\" class=\"graph\" transform=\"scale(0.8474576271186441 0.8474576271186441) rotate(0) translate(4 420)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-420 317.88,-420 317.88,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"86.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"107.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"123.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"157.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"173.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"207.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"223.44\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"114.44\" y=\"-387.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 3]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"147.88\" cy=\"-324\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"147.88\" y=\"-320.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M147.88,-378.85C147.88,-377.21 147.88,-362.85 147.88,-349.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"147.88,-342.06 151.03,-349.06 147.88,-345.56 147.88,-349.06 147.88,-349.06 147.88,-349.06 147.88,-345.56 144.73,-349.06 147.88,-342.06 147.88,-342.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M165.66,-327.24C175.2,-327.79 183.88,-326.71 183.88,-324 183.88,-322.01 179.2,-320.9 172.93,-320.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"165.66,-320.76 172.62,-317.52 169.16,-320.72 172.66,-320.67 172.66,-320.67 172.66,-320.67 169.16,-320.72 172.7,-323.82 165.66,-320.76 165.66,-320.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"183.88\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"193.88\" y=\"-312.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M165.31,-328.84C188.23,-332.51 219.88,-330.89 219.88,-324 219.88,-317.81 194.33,-315.88 172.52,-318.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"165.31,-319.16 171.84,-315.12 168.78,-318.7 172.25,-318.24 172.25,-318.24 172.25,-318.24 168.78,-318.7 172.66,-321.36 165.31,-319.16 165.31,-319.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"231.88\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"219.88\" y=\"-313.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"235.88\" y=\"-313.8\" 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=\"86.88\" cy=\"-222\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"86.88\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M129.87,-321.88C108.36,-319.46 73.27,-311.86 56.88,-288 49.33,-277.01 52.25,-270.51 56.88,-258 59.42,-251.13 63.98,-244.7 68.79,-239.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"73.61,-234.2 71.07,-241.45 71.2,-236.74 68.79,-239.27 68.79,-239.27 68.79,-239.27 71.2,-236.74 66.5,-237.1 73.61,-234.2 73.61,-234.2\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"56.88\" y=\"-269.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2 -->\n",
|
|
"<g id=\"node4\" class=\"node\">\n",
|
|
"<title>2</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"106.88\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"106.88\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->2 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>0->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M163.27,-314.29C173.61,-307.93 187.08,-298.59 196.88,-288 257.67,-222.35 303.28,-186.5 273.88,-102 264.94,-76.3 258.59,-68.98 235.88,-54 204.01,-32.98 159.82,-24.52 132.31,-21.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"125.02,-20.34 132.33,-17.99 128.5,-20.73 131.97,-21.12 131.97,-21.12 131.97,-21.12 128.5,-20.73 131.62,-24.25 125.02,-20.34 125.02,-20.34\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"281.88\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"281.88\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"297.88\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M93.76,-238.73C99.91,-252.21 109.53,-271.93 119.88,-288 123.39,-293.45 127.59,-299.07 131.65,-304.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"136.3,-309.85 129.43,-306.43 134.09,-307.14 131.87,-304.43 131.87,-304.43 131.87,-304.43 134.09,-307.14 134.31,-302.44 136.3,-309.85 136.3,-309.85\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"119.88\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"129.88\" y=\"-261.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.59,-226.51C121.09,-230.82 144.78,-239.91 155.88,-258 163.61,-270.59 161.43,-287.14 157.41,-300.4\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"155.04,-307.37 154.31,-299.73 156.17,-304.06 157.3,-300.74 157.3,-300.74 157.3,-300.74 156.17,-304.06 160.28,-301.76 155.04,-307.37 155.04,-307.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"160.88\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"160.88\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"176.88\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.66,-226.49C114.2,-227.26 122.88,-225.76 122.88,-222 122.88,-219.24 118.2,-217.7 111.93,-217.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"104.66,-217.51 111.6,-214.23 108.16,-217.44 111.66,-217.38 111.66,-217.38 111.66,-217.38 108.16,-217.44 111.72,-220.53 104.66,-217.51 104.66,-217.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"122.88\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge9\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M103.77,-228.49C127.83,-233.88 162.88,-231.72 162.88,-222 162.88,-213.19 134.1,-210.59 110.79,-214.19\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"103.77,-215.51 110.07,-211.12 107.21,-214.86 110.65,-214.22 110.65,-214.22 110.65,-214.22 107.21,-214.86 111.23,-217.31 103.77,-215.51 103.77,-215.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"162.88\" y=\"-225.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"172.88\" y=\"-210.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->2 -->\n",
|
|
"<g id=\"edge10\" class=\"edge\">\n",
|
|
"<title>1->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M71.99,-211.69C52.08,-198.24 17.68,-171.32 3.88,-138 -2.24,-123.22 0.6,-117.66 3.88,-102 8.65,-79.21 8.34,-70.39 24.88,-54 40.7,-38.32 64.64,-29.21 82.58,-24.24\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"89.37,-22.47 83.39,-27.28 85.99,-23.35 82.6,-24.23 82.6,-24.23 82.6,-24.23 85.99,-23.35 81.81,-21.18 89.37,-22.47 89.37,-22.47\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"3.88\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"15.88\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"31.88\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3 -->\n",
|
|
"<g id=\"node5\" class=\"node\">\n",
|
|
"<title>3</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"86.88\" cy=\"-120\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"86.88\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->3 -->\n",
|
|
"<g id=\"edge11\" class=\"edge\">\n",
|
|
"<title>1->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M86.88,-203.58C86.88,-187.52 86.88,-163.52 86.88,-145.52\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"86.88,-138.22 90.03,-145.22 86.88,-141.72 86.88,-145.22 86.88,-145.22 86.88,-145.22 86.88,-141.72 83.73,-145.22 86.88,-138.22 86.88,-138.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"86.88\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"108.88\" y=\"-159.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge12\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M124.66,-22.49C134.2,-23.26 142.88,-21.76 142.88,-18 142.88,-15.24 138.2,-13.7 131.93,-13.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"124.66,-13.51 131.6,-10.23 128.16,-13.44 131.66,-13.38 131.66,-13.38 131.66,-13.38 128.16,-13.44 131.72,-16.53 124.66,-13.51 124.66,-13.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"142.88\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"164.88\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge14\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M124.12,-24.07C153.35,-29.98 202.88,-27.96 202.88,-18 202.88,-8.82 160.79,-6.38 131.31,-10.69\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"124.12,-11.93 130.48,-7.64 127.57,-11.33 131.02,-10.74 131.02,-10.74 131.02,-10.74 127.57,-11.33 131.55,-13.84 124.12,-11.93 124.12,-11.93\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"210.88\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"202.88\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"218.88\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"234.88\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->3 -->\n",
|
|
"<g id=\"edge13\" class=\"edge\">\n",
|
|
"<title>2->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M103.54,-35.71C100.29,-51.96 95.32,-76.79 91.66,-95.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"90.27,-102.04 88.56,-94.55 90.96,-98.6 91.65,-95.17 91.65,-95.17 91.65,-95.17 90.96,-98.6 94.73,-95.79 90.27,-102.04 90.27,-102.04\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"98.88\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge15\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.83,-116.81C123.91,-113.42 153.19,-104.93 166.88,-84 174.18,-72.84 173.52,-65.56 166.88,-54 159.11,-40.46 143.85,-31.67 130.67,-26.28\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"124.02,-23.77 131.68,-23.29 127.3,-25 130.57,-26.24 130.57,-26.24 130.57,-26.24 127.3,-25 129.46,-29.19 124.02,-23.77 124.02,-23.77\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"171.88\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"193.88\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge17\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M71.34,-110.91C57.23,-103.21 38.01,-91.67 33.88,-84 27.56,-72.26 26.78,-65.28 33.88,-54 44.43,-37.24 65.47,-28.33 82.27,-23.7\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"89.16,-21.97 83.14,-26.73 85.77,-22.82 82.37,-23.68 82.37,-23.68 82.37,-23.68 85.77,-22.82 81.61,-20.62 89.16,-21.97 89.16,-21.97\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"33.88\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"37.88\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"53.88\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"69.88\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge16\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.66,-124.49C114.2,-125.26 122.88,-123.76 122.88,-120 122.88,-117.24 118.2,-115.7 111.93,-115.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"104.66,-115.51 111.6,-112.23 108.16,-115.44 111.66,-115.38 111.66,-115.38 111.66,-115.38 108.16,-115.44 111.72,-118.53 104.66,-115.51 104.66,-115.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"122.88\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge18\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.1,-125.98C134.3,-132 186.88,-130.01 186.88,-120 186.88,-110.73 141.81,-108.34 111.17,-112.81\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"104.1,-114.02 110.47,-109.73 107.55,-113.43 111,-112.84 111,-112.84 111,-112.84 107.55,-113.43 111.54,-115.94 104.1,-114.02 104.1,-114.02\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"186.88\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"200.88\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"216.88\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"(spot.formula(\"a\"), spot.formula(\"b\"), spot.formula(\"c\"))\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"def product2(left, right):\n",
|
|
" bdict = left.get_dict()\n",
|
|
" if right.get_dict() != bdict:\n",
|
|
" raise RuntimeError(\"automata should share their dictionary\")\n",
|
|
" \n",
|
|
" result = spot.make_twa_graph(bdict)\n",
|
|
" # Copy the atomic propositions of the two input automata\n",
|
|
" result.copy_ap_of(left)\n",
|
|
" result.copy_ap_of(right)\n",
|
|
" \n",
|
|
" sdict = {}\n",
|
|
" todo = []\n",
|
|
" def dst(ls, rs):\n",
|
|
" pair = (ls, rs)\n",
|
|
" p = sdict.get(pair)\n",
|
|
" if p is None:\n",
|
|
" p = result.new_state()\n",
|
|
" sdict[pair] = p\n",
|
|
" todo.append((ls, rs, p))\n",
|
|
" return p\n",
|
|
" \n",
|
|
" result.set_init_state(dst(left.get_init_state_number(), \n",
|
|
" right.get_init_state_number()))\n",
|
|
"\n",
|
|
" # The acceptance sets of the right automaton will be shifted by this amount\n",
|
|
" shift = left.num_sets()\n",
|
|
" result.set_acceptance(shift + right.num_sets(),\n",
|
|
" left.get_acceptance() & (right.get_acceptance() << shift))\n",
|
|
" \n",
|
|
" while todo:\n",
|
|
" lsrc, rsrc, osrc = todo.pop()\n",
|
|
" for lt in left.out(lsrc):\n",
|
|
" for rt in right.out(rsrc):\n",
|
|
" cond = lt.cond & rt.cond\n",
|
|
" if cond != buddy.bddfalse:\n",
|
|
" # membership of this transitions to the new acceptance sets\n",
|
|
" acc = lt.acc | (rt.acc << shift)\n",
|
|
" result.new_edge(osrc, dst(lt.dst, rt.dst), cond, acc)\n",
|
|
" return result\n",
|
|
"\n",
|
|
"p2 = product2(a1, a2)\n",
|
|
"show_prod(a1, a2, p2)\n",
|
|
"print(p2.ap())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Third attempt: a more usable product\n",
|
|
"\n",
|
|
"We could stop with the previous function: the result is a correct product from a theoretical point of view. However our function is still inferior to `spot.product()` in a couple of points:\n",
|
|
"- states are not presented as pairs\n",
|
|
"- the properties of the resulting automaton are not set\n",
|
|
"\n",
|
|
"The former point could be addressed by calling `set_state_names()` and passing an array of strings: if a state number is smaller than the size of that array, then the string at that position will be displayed instead of the state number in the dot output. However we can do even better by using `set_product_states()` and passing an array of pairs of states. Besides the output routines, some algorithms actually retrieve this vector of pair of states to work on the product.\n",
|
|
"\n",
|
|
"Regarding the latter point, consider for instance the deterministic nature of these automata. In Spot an automaton is deterministic if it is both existential (no universal branching) and universal (no non-deterministic branching). In our case we will restrict the algorithm to existential input (by asserting `is_existential()` on both operands), so we can consider that the `prop_universal()` property is an indication of determinism:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"maybe\n",
|
|
"yes\n",
|
|
"maybe\n",
|
|
"maybe\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(a1.prop_universal())\n",
|
|
"print(a2.prop_universal())\n",
|
|
"print(prod.prop_universal())\n",
|
|
"print(p1.prop_universal())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Because `a1` and `a2` are deterministic, their product is necessarily deterministic. This is a property that the `spot.product()` algorithm will preserve, but that our version does not *yet* preserve. We can fix that by adding\n",
|
|
"\n",
|
|
" if left.prop_universal() and right.prop_universal():\n",
|
|
" result.prop_universal(True)\n",
|
|
" \n",
|
|
"at the end of our function. Note that this is **not** the same as\n",
|
|
"\n",
|
|
" result.prop_universal(left.prop_universal() and right.prop_universal())\n",
|
|
"\n",
|
|
"because the results the `prop_*()` family of functions take and return instances of `spot.trival` values. These `spot.trival`, can, as their name implies, take one amongst three values representing `yes`, `no`, and `maybe`. `yes` and `no` should be used when we actually know that the automaton is deterministic or not (not deterministic meaning that there actually exists some non deterministic state in the automaton), and `maybe` when we do not know. \n",
|
|
"\n",
|
|
"The one-liner above is wrong for two reasons:\n",
|
|
"\n",
|
|
" - if `left` and `right` are non-deterministic, their product could be deterministic, so calling `prop_universal(False)` would be wrong. \n",
|
|
"\n",
|
|
" - the use of the `and` operator on `trival` is misleading in non-Boolean context. The `&` operator would be the correct operator to use if you want to work in threed-valued logic. Compare: "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" no & no = no no and no = no \n",
|
|
" no & maybe = no no and maybe = no \n",
|
|
" no & yes = no no and yes = no \n",
|
|
"maybe & no = no maybe and no = maybe\n",
|
|
"maybe & maybe = maybe maybe and maybe = maybe\n",
|
|
"maybe & yes = maybe maybe and yes = maybe\n",
|
|
" yes & no = no yes and no = no \n",
|
|
" yes & maybe = maybe yes and maybe = maybe\n",
|
|
" yes & yes = yes yes and yes = yes \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"yes = spot.trival(True)\n",
|
|
"no = spot.trival(False)\n",
|
|
"maybe = spot.trival_maybe()\n",
|
|
"for u in (no, maybe, yes):\n",
|
|
" for v in (no, maybe, yes):\n",
|
|
" print(f\"{u!s:>5} & {v!s:<5} = {u&v!s:<5} {u!s:>5} and {v!s:<5} = {u and v !s:<5}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The reason `maybe and no` is equal to `maybe` is that Python evaluate it like `no if maybe else maybe`, but when a trival is evaluated in a Boolean context (as in `if maybe`) the result is True only if the trival is equal to yes.\n",
|
|
"\n",
|
|
"So our\n",
|
|
"\n",
|
|
" if left.prop_universal() and right.prop_universal():\n",
|
|
" result.prop_universal(True)\n",
|
|
"\n",
|
|
"is OK because the `if` body will only be entered of both input automata are known to be deterministic."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"However the question is in fact more general than just determinism: the product of two weak automata is weak, the product of two stutter-invariant automata is stutter-invariant, etc. So when writing an algorithm one should consider which of the [property bits](https://spot.lrde.epita.fr/hoa.html#property-bits) are naturally preserved by the algorithm, and set the relevant bits: this can save time later if the resulting automaton is used as input for another algorithm."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div style='vertical-align:text-top;display:inline-block;'><?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=\"148pt\" height=\"205pt\"\n",
|
|
" viewBox=\"0.00 0.00 148.00 205.00\" 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 201)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-201 144,-201 144,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"49.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"70.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"86.5\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"48.5\" y=\"-168.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-105\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"18\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-159.85C18,-158.21 18,-143.85 18,-130.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-123.06 21.15,-130.06 18,-126.56 18,-130.06 18,-130.06 18,-130.06 18,-126.56 14.85,-130.06 18,-123.06 18,-123.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.04,-111.38C44.86,-112.68 54,-110.55 54,-105 54,-100.83 48.86,-98.6 42.14,-98.29\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.04,-98.62 41.88,-95.15 38.53,-98.46 42.03,-98.29 42.03,-98.29 42.03,-98.29 38.53,-98.46 42.18,-101.44 35.04,-98.62 35.04,-98.62\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-101.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1 -->\n",
|
|
"<g id=\"node3\" class=\"node\">\n",
|
|
"<title>1</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"18\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"13.5\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M18,-86.8C18,-74.36 18,-57.36 18,-43.5\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"18,-36.18 21.15,-43.18 18,-39.68 18,-43.18 18,-43.18 18,-43.18 18,-39.68 14.85,-43.18 18,-36.18 18,-36.18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"18\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.78,-21.78C45.31,-22.42 54,-21.16 54,-18 54,-15.68 49.32,-14.39 43.05,-14.12\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.78,-14.22 42.73,-10.97 39.28,-14.17 42.78,-14.12 42.78,-14.12 42.78,-14.12 39.28,-14.17 42.83,-17.27 35.78,-14.22 35.78,-14.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"54\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M35.43,-23.65C58.35,-27.92 90,-26.04 90,-18 90,-10.75 64.23,-8.5 42.36,-11.27\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"35.43,-12.35 41.86,-8.16 38.89,-11.81 42.35,-11.27 42.35,-11.27 42.35,-11.27 38.89,-11.81 42.83,-14.39 35.43,-12.35 35.43,-12.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"90\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"98\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"205pt\" height=\"220pt\"\n",
|
|
" viewBox=\"0.00 0.00 205.04 220.00\" 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 216)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-216 201.04,-216 201.04,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"53.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"74.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"90.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"124.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"140.02\" y=\"-197.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"56.02\" y=\"-183.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 2]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"67.04\" cy=\"-120\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-174.85C67.04,-173.21 67.04,-158.85 67.04,-145.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-138.06 70.19,-145.06 67.04,-141.56 67.04,-145.06 67.04,-145.06 67.04,-145.06 67.04,-141.56 63.89,-145.06 67.04,-138.06 67.04,-138.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-123.24C94.36,-123.79 103.04,-122.71 103.04,-120 103.04,-118.01 98.36,-116.9 92.09,-116.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-116.76 91.78,-113.52 88.32,-116.72 91.82,-116.67 91.82,-116.67 91.82,-116.67 88.32,-116.72 91.86,-119.82 84.82,-116.76 84.82,-116.76\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.04\" y=\"-108.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.47,-124.84C107.39,-128.51 139.04,-126.89 139.04,-120 139.04,-113.81 113.49,-111.88 91.68,-114.2\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.47,-115.16 91,-111.12 87.94,-114.7 91.41,-114.24 91.41,-114.24 91.41,-114.24 87.94,-114.7 91.82,-117.36 84.47,-115.16 84.47,-115.16\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"151.04\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"139.04\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"155.04\" y=\"-109.8\" 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=\"67.04\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"67.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M49.64,-114.49C34.86,-109.64 14.58,-100.33 5.04,-84 -1.68,-72.49 -1.68,-65.51 5.04,-54 13.16,-40.09 29.08,-31.28 42.75,-25.97\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"49.64,-23.51 44.11,-28.83 46.34,-24.68 43.05,-25.86 43.05,-25.86 43.05,-25.86 46.34,-24.68 41.99,-22.9 49.64,-23.51 49.64,-23.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"5.04\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.04,-36.22C67.04,-52.21 67.04,-76.21 67.04,-94.25\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"67.04,-101.58 63.89,-94.58 67.04,-98.08 67.04,-94.58 67.04,-94.58 67.04,-94.58 67.04,-98.08 70.19,-94.58 67.04,-101.58 67.04,-101.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"67.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"77.04\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M81.8,-28.42C90.03,-34.58 99.5,-43.44 104.04,-54 109.31,-66.25 109.31,-71.75 104.04,-84 100.49,-92.25 93.93,-99.46 87.31,-105.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"81.8,-109.58 85.29,-102.74 84.53,-107.39 87.26,-105.2 87.26,-105.2 87.26,-105.2 84.53,-107.39 89.24,-107.66 81.8,-109.58 81.8,-109.58\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"107.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"123.04\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M84.82,-22.49C94.36,-23.26 103.04,-21.76 103.04,-18 103.04,-15.24 98.36,-13.7 92.09,-13.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.82,-13.51 91.77,-10.23 88.32,-13.44 91.82,-13.38 91.82,-13.38 91.82,-13.38 88.32,-13.44 91.88,-16.53 84.82,-13.51 84.82,-13.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"103.04\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M83.93,-24.49C107.99,-29.88 143.04,-27.72 143.04,-18 143.04,-9.19 114.26,-6.59 90.95,-10.19\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"83.93,-11.51 90.23,-7.12 87.37,-10.86 90.81,-10.22 90.81,-10.22 90.81,-10.22 87.37,-10.86 91.39,-13.31 83.93,-11.51 83.93,-11.51\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.04\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"153.04\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div><div style='vertical-align:text-top;display:inline-block;'><?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=\"284pt\" height=\"360pt\"\n",
|
|
" viewBox=\"0.00 0.00 283.66 360.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
|
"<g id=\"graph0\" class=\"graph\" transform=\"scale(0.8474576271186441 0.8474576271186441) rotate(0) translate(4 420)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-420 330.09,-420 330.09,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"113.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"129.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"163.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"179.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"213.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"229.54\" y=\"-401.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"120.54\" y=\"-387.8\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 3]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"153.09\" cy=\"-324\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"143.09\" y=\"-320.3\" font-family=\"Lato\" font-size=\"14.00\">0,0</text>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M153.09,-378.85C153.09,-377.21 153.09,-362.85 153.09,-349.37\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"153.09,-342.06 156.24,-349.06 153.09,-345.56 153.09,-349.06 153.09,-349.06 153.09,-349.06 153.09,-345.56 149.94,-349.06 153.09,-342.06 153.09,-342.06\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M176.49,-327.35C186.23,-327.58 194.49,-326.46 194.49,-324 194.49,-322.19 190.03,-321.11 183.81,-320.76\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"176.49,-320.65 183.54,-317.6 179.99,-320.7 183.49,-320.75 183.49,-320.75 183.49,-320.75 179.99,-320.7 183.45,-323.9 176.49,-320.65 176.49,-320.65\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"194.49\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"204.49\" y=\"-312.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M175.47,-329.32C199.75,-332.35 230.49,-330.57 230.49,-324 230.49,-318.04 205.24,-316.03 182.44,-317.96\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"175.47,-318.68 182.1,-314.83 178.95,-318.32 182.43,-317.96 182.43,-317.96 182.43,-317.96 178.95,-318.32 182.76,-321.09 175.47,-318.68 175.47,-318.68\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"242.49\" y=\"-327.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"230.49\" y=\"-313.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"246.49\" y=\"-313.8\" 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=\"92.09\" cy=\"-222\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"82.09\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">0,1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M129.95,-321.23C108.34,-318.21 77.23,-310.05 62.09,-288 54.54,-277.01 57.46,-270.51 62.09,-258 64.28,-252.07 67.98,-246.46 72.05,-241.54\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"76.93,-236.11 74.59,-243.42 74.59,-238.72 72.25,-241.32 72.25,-241.32 72.25,-241.32 74.59,-238.72 69.91,-239.22 76.93,-236.11 76.93,-236.11\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"62.09\" y=\"-269.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2 -->\n",
|
|
"<g id=\"node4\" class=\"node\">\n",
|
|
"<title>2</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"107.09\" cy=\"-18\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"97.09\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\">1,0</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->2 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>0->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M170.97,-312.31C180.78,-305.96 192.79,-297.33 202.09,-288 265.84,-223.99 317.77,-185.83 284.09,-102 261.13,-44.87 181.84,-27.03 137.57,-21.48\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"130.52,-20.67 137.84,-18.34 134,-21.07 137.47,-21.47 137.47,-21.47 137.47,-21.47 134,-21.07 137.11,-24.6 130.52,-20.67 130.52,-20.67\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"294.09\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"294.09\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"310.09\" y=\"-160.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M99.21,-239.27C105.37,-252.73 114.88,-272.15 125.09,-288 128.29,-292.97 132.05,-298.07 135.77,-302.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"140.4,-308.52 133.55,-305.05 138.2,-305.79 136,-303.07 136,-303.07 136,-303.07 138.2,-305.79 138.45,-301.09 140.4,-308.52 140.4,-308.52\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"125.09\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"135.09\" y=\"-261.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M114.34,-227.77C130.4,-232.5 150.97,-241.52 161.09,-258 168.72,-270.43 166.7,-286.72 162.78,-299.88\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"160.45,-306.83 159.69,-299.19 161.56,-303.51 162.67,-300.19 162.67,-300.19 162.67,-300.19 161.56,-303.51 165.66,-301.19 160.45,-306.83 160.45,-306.83\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"166.09\" y=\"-276.8\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"166.09\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"182.09\" y=\"-262.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M115.08,-226.63C124.99,-227.01 133.49,-225.47 133.49,-222 133.49,-219.4 128.71,-217.88 122.14,-217.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"115.08,-217.37 122.11,-214.29 118.58,-217.41 122.08,-217.44 122.08,-217.44 122.08,-217.44 118.58,-217.41 122.04,-220.59 115.08,-217.37 115.08,-217.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"133.49\" y=\"-218.3\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge9\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M113.96,-229.18C139.55,-233.67 173.49,-231.28 173.49,-222 173.49,-213.56 145.38,-210.82 121.03,-213.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"113.96,-214.82 120.43,-210.69 117.43,-214.31 120.89,-213.8 120.89,-213.8 120.89,-213.8 117.43,-214.31 121.35,-216.92 113.96,-214.82 113.96,-214.82\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"173.49\" y=\"-225.8\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"183.49\" y=\"-210.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->2 -->\n",
|
|
"<g id=\"edge10\" class=\"edge\">\n",
|
|
"<title>1->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M73.76,-210.29C52.4,-196.63 18.23,-170.78 4.09,-138 -2.25,-123.31 0.41,-117.57 4.09,-102 9.57,-78.79 10.83,-70.47 28.09,-54 42.05,-40.68 61.92,-31.91 78.24,-26.48\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.99,-24.35 79.26,-29.46 81.66,-25.4 78.32,-26.45 78.32,-26.45 78.32,-26.45 81.66,-25.4 77.37,-23.45 84.99,-24.35 84.99,-24.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"4.09\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"16.09\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"32.09\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3 -->\n",
|
|
"<g id=\"node5\" class=\"node\">\n",
|
|
"<title>3</title>\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"92.09\" cy=\"-120\" rx=\"23.3\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"82.09\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">1,1</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->3 -->\n",
|
|
"<g id=\"edge11\" class=\"edge\">\n",
|
|
"<title>1->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M92.09,-203.58C92.09,-187.52 92.09,-163.52 92.09,-145.52\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"92.09,-138.22 95.24,-145.22 92.09,-141.72 92.09,-145.22 92.09,-145.22 92.09,-145.22 92.09,-141.72 88.94,-145.22 92.09,-138.22 92.09,-138.22\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92.09\" y=\"-174.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"114.09\" y=\"-159.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge12\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M130.08,-22.63C139.99,-23.01 148.49,-21.47 148.49,-18 148.49,-15.4 143.71,-13.88 137.14,-13.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"130.08,-13.37 137.11,-10.29 133.58,-13.41 137.08,-13.44 137.08,-13.44 137.08,-13.44 133.58,-13.41 137.04,-16.59 130.08,-13.37 130.08,-13.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"148.49\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"170.49\" y=\"-6.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge14\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M128.87,-24.65C160.17,-29.84 208.49,-27.62 208.49,-18 208.49,-9.09 167.07,-6.53 136.09,-10.32\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"128.87,-11.35 135.35,-7.24 132.33,-10.85 135.8,-10.36 135.8,-10.36 135.8,-10.36 132.33,-10.85 136.24,-13.48 128.87,-11.35 128.87,-11.35\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"216.49\" y=\"-21.8\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"208.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"224.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"240.49\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->3 -->\n",
|
|
"<g id=\"edge13\" class=\"edge\">\n",
|
|
"<title>2->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M104.53,-36.05C102.11,-52.17 98.46,-76.52 95.74,-94.68\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"94.63,-102.04 92.56,-94.65 95.15,-98.58 95.67,-95.11 95.67,-95.11 95.67,-95.11 95.15,-98.58 98.79,-95.58 94.63,-102.04 94.63,-102.04\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"101.09\" y=\"-65.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge15\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M114.99,-115.41C133.1,-111.23 157.24,-102.4 169.09,-84 176.31,-72.79 175.81,-65.51 169.09,-54 161.78,-41.48 148.15,-33.09 135.53,-27.67\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"128.67,-24.95 136.34,-24.6 131.93,-26.24 135.18,-27.53 135.18,-27.53 135.18,-27.53 131.93,-26.24 134.02,-30.46 128.67,-24.95 128.67,-24.95\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"174.09\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"196.09\" y=\"-57.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge17\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M72.84,-109.33C58.63,-101.75 41.09,-91.29 37.09,-84 30.67,-72.31 30.08,-65.34 37.09,-54 46.01,-39.57 62.88,-30.89 77.83,-25.78\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"84.52,-23.68 78.79,-28.78 81.18,-24.73 77.84,-25.78 77.84,-25.78 77.84,-25.78 81.18,-24.73 76.9,-22.77 84.52,-23.68 84.52,-23.68\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"37.09\" y=\"-72.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"41.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"57.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"73.09\" y=\"-58.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge16\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M115.08,-124.63C124.99,-125.01 133.49,-123.47 133.49,-120 133.49,-117.4 128.71,-115.88 122.14,-115.44\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"115.08,-115.37 122.11,-112.29 118.58,-115.41 122.08,-115.44 122.08,-115.44 122.08,-115.44 118.58,-115.41 122.04,-118.59 115.08,-115.37 115.08,-115.37\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"133.49\" y=\"-116.3\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge18\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M113.92,-126.57C146.28,-131.86 197.49,-129.67 197.49,-120 197.49,-111.01 153.23,-108.49 121,-112.42\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"113.92,-113.43 120.41,-109.33 117.38,-112.94 120.85,-112.45 120.85,-112.45 120.85,-112.45 117.38,-112.94 121.29,-115.56 113.92,-113.43 113.92,-113.43\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"197.49\" y=\"-123.8\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"211.49\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"227.49\" y=\"-109.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"maybe\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"def product3(left, right):\n",
|
|
" # the twa_graph.is_existential() method returns a Boolean, not a spot.trival\n",
|
|
" if not (left.is_existential() and right.is_existential()):\n",
|
|
" raise RuntimeError(\"alternating automata are not supported\")\n",
|
|
" bdict = left.get_dict()\n",
|
|
" if right.get_dict() != bdict:\n",
|
|
" raise RuntimeError(\"automata should share their dictionary\")\n",
|
|
" \n",
|
|
" result = spot.make_twa_graph(bdict)\n",
|
|
" result.copy_ap_of(left)\n",
|
|
" result.copy_ap_of(right)\n",
|
|
" \n",
|
|
" pairs = [] # our array of state pairs\n",
|
|
" sdict = {}\n",
|
|
" todo = []\n",
|
|
" def dst(ls, rs):\n",
|
|
" pair = (ls, rs)\n",
|
|
" p = sdict.get(pair)\n",
|
|
" if p is None:\n",
|
|
" p = result.new_state()\n",
|
|
" sdict[pair] = p\n",
|
|
" todo.append((ls, rs, p))\n",
|
|
" pairs.append((ls, rs)) # name each state\n",
|
|
" return p\n",
|
|
" \n",
|
|
" result.set_init_state(dst(left.get_init_state_number(), \n",
|
|
" right.get_init_state_number()))\n",
|
|
"\n",
|
|
" shift = left.num_sets()\n",
|
|
" result.set_acceptance(shift + right.num_sets(),\n",
|
|
" left.get_acceptance() & (right.get_acceptance() << shift))\n",
|
|
" \n",
|
|
" while todo:\n",
|
|
" lsrc, rsrc, osrc = todo.pop()\n",
|
|
" for lt in left.out(lsrc):\n",
|
|
" for rt in right.out(rsrc):\n",
|
|
" cond = lt.cond & rt.cond\n",
|
|
" if cond != buddy.bddfalse:\n",
|
|
" acc = lt.acc | (rt.acc << shift)\n",
|
|
" result.new_edge(osrc, dst(lt.dst, rt.dst), cond, acc)\n",
|
|
"\n",
|
|
" # Remember the origin of our states\n",
|
|
" result.set_product_states(pairs)\n",
|
|
" \n",
|
|
" # Loop over all the properties we want to preserve if they hold in both automata\n",
|
|
" for p in ('prop_universal', 'prop_complete', 'prop_weak', 'prop_inherently_weak', \n",
|
|
" 'prop_terminal', 'prop_stutter_invariant', 'prop_state_acc'):\n",
|
|
" if getattr(left, p)() and getattr(right, p)():\n",
|
|
" getattr(result, p)(True)\n",
|
|
" return result\n",
|
|
"\n",
|
|
"p3 = product3(a1, a2)\n",
|
|
"show_prod(a1, a2, p3)\n",
|
|
"print(p3.prop_universal())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"For development, it is useful to know that we can force the automaton printer to show the real state numbers (not the pairs) by passing option `1`, and that we can retrieve the associated pairs ourselves. Note that the pairs also appear as tooltips when we mouse over the states."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<?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=\"494pt\" height=\"255pt\"\n",
|
|
" viewBox=\"0.00 0.00 494.00 255.11\" 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 251.11)\">\n",
|
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-251.11 490,-251.11 490,4 -4,4\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"172.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"193.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"209.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"243.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"259.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\">)&Inf(</text>\n",
|
|
"<text text-anchor=\"start\" x=\"293.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"<text text-anchor=\"start\" x=\"309.5\" y=\"-232.91\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
|
"<text text-anchor=\"start\" x=\"200.5\" y=\"-218.91\" font-family=\"Lato\" font-size=\"14.00\">[gen. Büchi 3]</text>\n",
|
|
"<!-- I -->\n",
|
|
"<!-- 0 -->\n",
|
|
"<g id=\"node2\" class=\"node\">\n",
|
|
"<title>0</title>\n",
|
|
"<g id=\"a_node2\"><a xlink:title=\"0,0\">\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"56\" cy=\"-62.11\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"56\" y=\"-58.41\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
|
"</a>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"<!-- I->0 -->\n",
|
|
"<g id=\"edge1\" class=\"edge\">\n",
|
|
"<title>I->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-62.11C2.79,-62.11 17.15,-62.11 30.63,-62.11\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"37.94,-62.11 30.94,-65.26 34.44,-62.11 30.94,-62.11 30.94,-62.11 30.94,-62.11 34.44,-62.11 30.94,-58.96 37.94,-62.11 37.94,-62.11\"/>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge2\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M52.76,-79.89C52.21,-89.43 53.29,-98.11 56,-98.11 57.99,-98.11 59.1,-93.43 59.33,-87.16\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"59.24,-79.89 62.48,-86.85 59.28,-83.39 59.33,-86.89 59.33,-86.89 59.33,-86.89 59.28,-83.39 56.18,-86.93 59.24,-79.89 59.24,-79.89\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"38\" y=\"-116.91\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"48\" y=\"-101.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 0->0 -->\n",
|
|
"<g id=\"edge3\" class=\"edge\">\n",
|
|
"<title>0->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M50.99,-79.69C47.55,-100.83 49.21,-128.11 56,-128.11 62.04,-128.11 64.03,-106.47 61.96,-86.8\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"61.01,-79.69 65.06,-86.21 61.47,-83.16 61.93,-86.63 61.93,-86.63 61.93,-86.63 61.47,-83.16 58.81,-87.04 61.01,-79.69 61.01,-79.69\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"52\" y=\"-145.91\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"40\" y=\"-131.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"56\" y=\"-131.91\" 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",
|
|
"<g id=\"a_node3\"><a xlink:title=\"0,1\">\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"168\" cy=\"-88.11\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"168\" y=\"-84.41\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
|
"</a>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"<!-- 0->1 -->\n",
|
|
"<g id=\"edge4\" class=\"edge\">\n",
|
|
"<title>0->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M62.32,-79.23C67.52,-92.74 76.9,-110.66 92,-119.11 107.51,-127.79 115.38,-125.41 132,-119.11 138.94,-116.48 145.4,-111.77 150.82,-106.8\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"155.88,-101.81 153.1,-108.97 153.39,-104.27 150.89,-106.73 150.89,-106.73 150.89,-106.73 153.39,-104.27 148.68,-104.48 155.88,-101.81 155.88,-101.81\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"92\" y=\"-127.91\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2 -->\n",
|
|
"<g id=\"node4\" class=\"node\">\n",
|
|
"<title>2</title>\n",
|
|
"<g id=\"a_node4\"><a xlink:title=\"1,0\">\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"456\" cy=\"-90.11\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"456\" y=\"-86.41\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
|
|
"</a>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"<!-- 0->2 -->\n",
|
|
"<g id=\"edge5\" class=\"edge\">\n",
|
|
"<title>0->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M67.26,-47.82C73.48,-40.42 82.11,-32.12 92,-28.11 108.47,-21.43 114.22,-28.08 132,-28.11 260,-28.33 309.35,35.23 420,-29.11 433.75,-37.11 442.57,-52.77 447.92,-66.21\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"450.4,-72.99 445.04,-67.51 449.2,-69.71 447.99,-66.42 447.99,-66.42 447.99,-66.42 449.2,-69.71 450.95,-65.34 450.4,-72.99 450.4,-72.99\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"218\" y=\"-38.91\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"218\" y=\"-24.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"234\" y=\"-24.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge6\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M150.14,-84.13C131.58,-79.74 101.61,-72.66 80.69,-67.71\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"73.71,-66.06 81.24,-64.61 77.11,-66.87 80.52,-67.67 80.52,-67.67 80.52,-67.67 77.11,-66.87 79.79,-70.74 73.71,-66.06 73.71,-66.06\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"94\" y=\"-97.91\" font-family=\"Lato\" font-size=\"14.00\">!b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"104\" y=\"-82.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->0 -->\n",
|
|
"<g id=\"edge7\" class=\"edge\">\n",
|
|
"<title>1->0</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M160.3,-71.33C154.65,-59.68 145.35,-45.06 132,-38.11 116.23,-29.9 108.98,-32.85 92,-38.11 86.36,-39.86 80.82,-42.87 75.87,-46.17\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"69.95,-50.45 73.78,-43.79 72.79,-48.4 75.63,-46.35 75.63,-46.35 75.63,-46.35 72.79,-48.4 77.47,-48.9 69.95,-50.45 69.95,-50.45\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"96\" y=\"-55.91\" font-family=\"Lato\" font-size=\"14.00\">b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"96\" y=\"-41.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"112\" y=\"-41.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge8\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M163,-105.52C162.07,-115.2 163.73,-124.11 168,-124.11 171.13,-124.11 172.86,-119.31 173.19,-112.92\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"173,-105.52 176.33,-112.44 173.09,-109.02 173.18,-112.52 173.18,-112.52 173.18,-112.52 173.09,-109.02 170.03,-112.6 173,-105.52 173,-105.52\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"148\" y=\"-127.91\" font-family=\"Lato\" font-size=\"14.00\">!b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->1 -->\n",
|
|
"<g id=\"edge9\" class=\"edge\">\n",
|
|
"<title>1->1</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M160.04,-104.42C154.9,-122.07 157.55,-142.11 168,-142.11 177.06,-142.11 180.26,-127.04 177.59,-111.53\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"175.96,-104.42 180.6,-110.54 176.74,-107.83 177.53,-111.24 177.53,-111.24 177.53,-111.24 176.74,-107.83 174.46,-111.95 175.96,-104.42 175.96,-104.42\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"150\" y=\"-160.91\" font-family=\"Lato\" font-size=\"14.00\">b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"160\" y=\"-145.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 1->2 -->\n",
|
|
"<g id=\"edge10\" class=\"edge\">\n",
|
|
"<title>1->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M180.54,-101.45C199.33,-122.01 238.81,-160.62 282,-175.11 341.99,-195.24 370.87,-179.98 420,-140.11 429.45,-132.44 437.46,-121.59 443.43,-111.96\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"447.05,-105.85 446.19,-113.48 445.27,-108.86 443.48,-111.87 443.48,-111.87 443.48,-111.87 445.27,-108.86 440.77,-110.27 447.05,-105.85 447.05,-105.85\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"282\" y=\"-200.91\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"294\" y=\"-186.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"310\" y=\"-186.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3 -->\n",
|
|
"<g id=\"node5\" class=\"node\">\n",
|
|
"<title>3</title>\n",
|
|
"<g id=\"a_node5\"><a xlink:title=\"1,1\">\n",
|
|
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"310\" cy=\"-69.11\" rx=\"18\" ry=\"18\"/>\n",
|
|
"<text text-anchor=\"middle\" x=\"310\" y=\"-65.41\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
|
|
"</a>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"<!-- 1->3 -->\n",
|
|
"<g id=\"edge11\" class=\"edge\">\n",
|
|
"<title>1->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M185.89,-85.82C210.59,-82.47 256.7,-76.21 284.94,-72.38\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"292.05,-71.41 285.54,-75.47 288.58,-71.88 285.12,-72.35 285.12,-72.35 285.12,-72.35 288.58,-71.88 284.69,-69.23 292.05,-71.41 292.05,-71.41\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"204\" y=\"-100.91\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"226\" y=\"-85.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge12\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M449.98,-107.15C448.75,-116.97 450.75,-126.11 456,-126.11 459.93,-126.11 462.05,-120.97 462.34,-114.26\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"462.02,-107.15 465.48,-114 462.18,-110.65 462.33,-114.14 462.33,-114.14 462.33,-114.14 462.18,-110.65 459.19,-114.28 462.02,-107.15 462.02,-107.15\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"426\" y=\"-144.91\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"448\" y=\"-129.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->2 -->\n",
|
|
"<g id=\"edge14\" class=\"edge\">\n",
|
|
"<title>2->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M447.06,-106.06C439.87,-127.4 442.85,-156.11 456,-156.11 467.76,-156.11 471.39,-133.14 466.87,-113.01\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"464.94,-106.06 469.85,-111.96 465.88,-109.43 466.81,-112.8 466.81,-112.8 466.81,-112.8 465.88,-109.43 463.78,-113.65 464.94,-106.06 464.94,-106.06\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"440\" y=\"-173.91\" font-family=\"Lato\" font-size=\"14.00\">a & b</text>\n",
|
|
"<text text-anchor=\"start\" x=\"432\" y=\"-159.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"448\" y=\"-159.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"464\" y=\"-159.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 2->3 -->\n",
|
|
"<g id=\"edge13\" class=\"edge\">\n",
|
|
"<title>2->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M437.94,-87.62C412.4,-83.9 364.14,-76.86 335.04,-72.62\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"328.08,-71.6 335.47,-69.5 331.55,-72.11 335.01,-72.61 335.01,-72.61 335.01,-72.61 331.55,-72.11 334.56,-75.73 328.08,-71.6 328.08,-71.6\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"356\" y=\"-87.91\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge15\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M324.61,-57.83C333.07,-51.57 344.5,-44.4 356,-41.11 383.35,-33.3 394.71,-28.1 420,-41.11 430.83,-46.68 439.05,-57.33 444.79,-67.28\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"448.21,-73.66 442.13,-68.98 446.56,-70.57 444.9,-67.49 444.9,-67.49 444.9,-67.49 446.56,-70.57 447.68,-66 448.21,-73.66 448.21,-73.66\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"358\" y=\"-59.91\" font-family=\"Lato\" font-size=\"14.00\">a & !b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"380\" y=\"-44.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->2 -->\n",
|
|
"<g id=\"edge17\" class=\"edge\">\n",
|
|
"<title>3->2</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M323.07,-81.73C331.46,-89.55 343.37,-98.88 356,-103.11 382.97,-112.15 392,-108.14 420,-103.11 424.17,-102.36 428.49,-101.15 432.61,-99.76\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"439.31,-97.3 433.82,-102.67 436.02,-98.5 432.74,-99.71 432.74,-99.71 432.74,-99.71 436.02,-98.5 431.65,-96.76 439.31,-97.3 439.31,-97.3\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"360\" y=\"-125.91\" font-family=\"Lato\" font-size=\"14.00\">a & b & c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"364\" y=\"-111.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"380\" y=\"-111.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
|
|
"<text text-anchor=\"start\" x=\"396\" y=\"-111.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge16\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M303.27,-86.15C301.89,-95.97 304.14,-105.11 310,-105.11 314.4,-105.11 316.76,-99.97 317.09,-93.26\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"316.73,-86.15 320.23,-92.98 316.91,-89.64 317.08,-93.14 317.08,-93.14 317.08,-93.14 316.91,-89.64 313.93,-93.3 316.73,-86.15 316.73,-86.15\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"278\" y=\"-108.91\" font-family=\"Lato\" font-size=\"14.00\">a & !b & !c</text>\n",
|
|
"</g>\n",
|
|
"<!-- 3->3 -->\n",
|
|
"<g id=\"edge18\" class=\"edge\">\n",
|
|
"<title>3->3</title>\n",
|
|
"<path fill=\"none\" stroke=\"black\" d=\"M299.77,-84.04C292.04,-102.01 295.45,-123.11 310,-123.11 322.73,-123.11 326.93,-106.96 322.6,-90.88\"/>\n",
|
|
"<polygon fill=\"black\" stroke=\"black\" points=\"320.23,-84.04 325.5,-89.62 321.38,-87.35 322.53,-90.65 322.53,-90.65 322.53,-90.65 321.38,-87.35 319.55,-91.69 320.23,-84.04 320.23,-84.04\"/>\n",
|
|
"<text text-anchor=\"start\" x=\"280\" y=\"-140.91\" font-family=\"Lato\" font-size=\"14.00\">a & b & !c</text>\n",
|
|
"<text text-anchor=\"start\" x=\"294\" y=\"-126.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
"<text text-anchor=\"start\" x=\"310\" y=\"-126.91\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
|
|
"</g>\n",
|
|
"</g>\n",
|
|
"</svg>\n"
|
|
],
|
|
"text/plain": [
|
|
"<spot.jupyter.SVG object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0: (0, 0)\n",
|
|
"1: (0, 1)\n",
|
|
"2: (1, 0)\n",
|
|
"3: (1, 1)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"display(p3.show('.1'))\n",
|
|
"pairs = p3.get_product_states()\n",
|
|
"for s in range(p3.num_states()):\n",
|
|
" print(f\"{s}: {pairs[s]}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Timings\n",
|
|
"\n",
|
|
"As an indication of how slow it is to implement such an algorithm using the Python bindings of Spot, consider the following comparison:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"107 µs ± 2.91 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"%timeit product3(a1, a2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2.23 µs ± 47.3 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"%timeit spot.product(a1, a2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Depending on the machine where this notebook has been run, using the C++ version of the product can be 1 to 2 orders of magnitude faster. This is due to all the type conversions (converting Python types to C++ types) that occurs everytime a function/method of Spot is called from Python. When calling high-level C++ functions (such as `spot.product()`) from Python, the overhead is negligible because most of the time is spent on the C++ side, actually executing the function. However when calling low-level functions (such as `new_edge()`, `new_state()`, `out()`) most of the time is spent converting the arguments from Python to C++ and the results from C++ to Python.\n",
|
|
"\n",
|
|
"Despite that speed difference, Python can be useful to prototype an algorithm before implementing it in C++."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# The case of weak automata\n",
|
|
"\n",
|
|
"Finally, note that `spot.product()` actually does a bit more: it has some specializations for when one of the argument of the product is marked as weak (as indicated by `prop_weak()`). In this case, the resulting acceptance condition can be simplified a bit."
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.8"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|