{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from IPython.display import display\n", "import spot\n", "spot.setup()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Converting automata to strings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `to_str()` to output a string representing the automaton in different formats." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HOA: v1\n", "States: 2\n", "Start: 1\n", "AP: 2 \"a\" \"b\"\n", "acc-name: Buchi\n", "Acceptance: 1 Inf(0)\n", "properties: trans-labels explicit-labels state-acc deterministic\n", "properties: stutter-invariant terminal\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0\n", "State: 1\n", "[1] 0\n", "[0&!1] 1\n", "--END--\n", "never {\n", "T0_init:\n", " if\n", " :: (b) -> goto accept_all\n", " :: ((a) && (!(b))) -> goto T0_init\n", " fi;\n", "accept_all:\n", " skip\n", "}\n", "\n", "digraph G {\n", " rankdir=LR\n", " label=<
[Büchi]>\n", " labelloc=\"t\"\n", " node [shape=\"circle\"]\n", " node [style=\"filled\", fillcolor=\"#ffffaa\"]\n", " fontname=\"Lato\"\n", " node [fontname=\"Lato\"]\n", " edge [fontname=\"Lato\"]\n", " size=\"10.2,5\" edge[arrowhead=vee, arrowsize=.7]\n", " I [label=\"\", style=invis, width=0]\n", " I -> 1\n", " 0 [label=<0>, peripheries=2]\n", " 0 -> 0 [label=<1>]\n", " 1 [label=<1>]\n", " 1 -> 0 [label=]\n", " 1 -> 1 [label=]\n", "}\n", "\n", "2 1\n", "0 1 -1\n", "1 \"b\"\n", "0 & \"a\" ! \"b\"\n", "-1\n", "1 0 0 -1\n", "1 t\n", "-1\n", "\n" ] } ], "source": [ "a = spot.translate('a U b')\n", "for fmt in ('hoa', 'spin', 'dot', 'lbtt'):\n", " print(a.to_str(fmt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Saving automata to files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `save()` to save the automaton into a file." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f40579030> >" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.save('example.aut').save('example.aut', format='lbtt', append=True)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HOA: v1\r\n", "States: 2\r\n", "Start: 1\r\n", "AP: 2 \"a\" \"b\"\r\n", "acc-name: Buchi\r\n", "Acceptance: 1 Inf(0)\r\n", "properties: trans-labels explicit-labels state-acc deterministic\r\n", "properties: stutter-invariant terminal\r\n", "--BODY--\r\n", "State: 0 {0}\r\n", "[t] 0\r\n", "State: 1\r\n", "[1] 0\r\n", "[0&!1] 1\r\n", "--END--\r\n", "2 1\r\n", "0 1 -1\r\n", "1 \"b\"\r\n", "0 & \"a\" ! \"b\"\r\n", "-1\r\n", "1 0 0 -1\r\n", "1 t\r\n", "-1\r\n" ] } ], "source": [ "!cat example.aut" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reading automata from files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `spot.automata()` to read multiple automata from a file, and `spot.automaton()` to read only one." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f40528ab0> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "1\n", "\n", "\n", "1\n", "\n", "\n", "0->1\n", "\n", "\n", "b\n", "\n", "\n", "1->1\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f40528360> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for a in spot.automata('example.aut'):\n", " display(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `--ABORT--` feature of the HOA format allows discarding the automaton being read and starting over." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting example.aut\n" ] } ], "source": [ "%%file example.aut\n", "HOA: v1\n", "States: 2\n", "Start: 1\n", "AP: 2 \"a\" \"b\"\n", "acc-name: Buchi\n", "Acceptance: 1 Inf(0)\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0\n", "--ABORT-- /* the previous automaton should be ignored */\n", "HOA: v1\n", "States: 2\n", "Start: 1\n", "AP: 2 \"a\" \"b\"\n", "Acceptance: 1 Inf(0)\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0\n", "State: 1\n", "[1] 0\n", "[0&!1] 1\n", "--END--" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f40528b10> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for a in spot.automata('example.aut'):\n", " display(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reading automata from strings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of passing a filename, you can also pass the contents of a file. `spot.automata()` and `spot.automaton()` look for the absence of newline to decide if this is a filename or a string containing some actual automaton text." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f40542fc0> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "Inf(\n", "\n", ")&Inf(\n", "\n", ")\n", "[gen. Büchi 2]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f405426f0> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for a in spot.automata(\"\"\"\n", "HOA: v1\n", "States: 2\n", "Start: 1\n", "name: \"Hello world\"\n", "AP: 2 \"a\" \"b\"\n", "Acceptance: 1 Inf(0)\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0\n", "State: 1\n", "[1] 0\n", "[0&!1] 1\n", "--END--\n", "HOA: v1\n", "States: 1\n", "Start: 0\n", "name: \"Hello world 2\"\n", "AP: 2 \"a\" \"b\"\n", "Acceptance: 2 Inf(0)&Inf(1)\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0 {1}\n", "[0&!1] 0\n", "--END--\n", "\"\"\"):\n", " display(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reading automata output from processes\n", "\n", "If an argument of `spot.automata` ends with `|`, then it is interpreted as a shell command that outputs one automaton or more." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "1\n", "\n", "\n", "1\n", "\n", "\n", "0->1\n", "\n", "\n", "b\n", "\n", "\n", "1->1\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f404d3390> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "1\n", "\n", "\n", "1\n", "\n", "\n", "0->1\n", "\n", "\n", "b\n", "\n", "\n", "1->1\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f405427e0> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a\n", "\n", "\n", "0->0\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f40dc6240> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "0->1\n", "\n", "\n", "a\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f405426f0> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for a in spot.automata('ltl2tgba -s \"a U b\"; ltl2tgba --lbtt \"b\"|', 'ltl2tgba -H \"GFa\" \"a & GFb\"|'):\n", " display(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A single automaton can be read using `spot.automaton()`, with the same convention." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "[Büchi]\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "1\n", "\n", "\n", "1\n", "\n", "\n", "0->1\n", "\n", "\n", "b\n", "\n", "\n", "1->1\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7f1f405338d0> >" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spot.automaton('ltl2tgba -s6 \"a U b\"|')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "!rm example.aut" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.4+" } }, "nbformat": 4, "nbformat_minor": 2 }