{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import spot\n", "spot.setup()\n", "from IPython.display import display" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook shows you different ways in which states or transitions can be highlighted in Spot. \n", "\n", "It should be noted that highlighting works using some special [named properties](https://spot.lrde.epita.fr/concepts.html#named-properties): basically, two maps that are attached to the automaton, and associated state or edge numbers to color numbers. This named properties are fragile: they will be lost if the automaton is transformed into a new automaton, and they can become meaningless of the automaton is modified in place (e.g., if the transitions or states are reordered).\n", "\n", "Nonetheless, highlighting is OK to use right before displaying or printing the automaton. The `dot` and `hoa` printer both know how to represent highlighted states and transitions.\n", "\n", "# Manual highlighting" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "a = spot.translate('a U b U c')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `#` option of `print_dot()` can be used to display the internal number of each transition " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "#6\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "#4\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "#5\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "#1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "#2\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "#3\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.show('.#')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using these numbers you can selectively highlight some transitions. The second argument is a color number (from a list of predefined colors)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4156190> >" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.highlight_edges([2, 4, 5], 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that these `highlight_` functions work for edges and states, and come with both singular (changing the color of single state or edge) and plural versions.\n", "\n", "They modify the automaton in place." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4155f80> >" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.highlight_edge(6, 2).highlight_states((0, 1), 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plural version can take a list or tuple of state numbers (as above) or of Booleans (as below). In the latter case the indices of the True values give the states to highlight." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4156190> >" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.highlight_states([False, True, True], 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Saving to HOA 1.1\n", "\n", "When saving to HOA format, the highlighting is only output if version 1.1 of the format is selected, because the headers `spot.highlight.edges` and `spot.highlight.states` contain dots, which are disallowed in version 1. Compare these two outputs:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HOA: v1\n", "States: 3\n", "Start: 2\n", "AP: 3 \"a\" \"b\" \"c\"\n", "acc-name: Buchi\n", "Acceptance: 1 Inf(0)\n", "properties: trans-labels explicit-labels state-acc deterministic\n", "properties: stutter-invariant terminal very-weak\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0\n", "State: 1\n", "[2] 0\n", "[1&!2] 1\n", "State: 2\n", "[2] 0\n", "[!0&1&!2] 1\n", "[0&!2] 2\n", "--END--\n", "\n", "HOA: v1.1\n", "States: 3\n", "Start: 2\n", "AP: 3 \"a\" \"b\" \"c\"\n", "acc-name: Buchi\n", "Acceptance: 1 Inf(0)\n", "properties: trans-labels explicit-labels state-acc !complete\n", "properties: deterministic stutter-invariant terminal very-weak\n", "spot.highlight.states: 0 0 1 5 2 5\n", "spot.highlight.edges: 2 1 4 1 5 1 6 2\n", "--BODY--\n", "State: 0 {0}\n", "[t] 0\n", "State: 1\n", "[2] 0\n", "[1&!2] 1\n", "State: 2\n", "[2] 0\n", "[!0&1&!2] 1\n", "[0&!2] 2\n", "--END--\n" ] } ], "source": [ "print(a.to_str('HOA', '1'))\n", "print()\n", "print(a.to_str('HOA', '1.1'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Querying highlights\n", "\n", "Use `get_highlight_state(s)` or `get_highlight_edge(e)` to retrieve the highlighting color of some state/edge. If no highlighting is present for this state/edge, `None` is returned." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "state 0: 0\n", "state 1: 5\n", "state 2: 5\n", "edge 1: None\n", "edge 2: 1\n", "edge 3: None\n", "edge 4: 1\n", "edge 5: 1\n", "edge 6: 2\n" ] } ], "source": [ "for i in range(0, a.num_states()):\n", " print(\"state {}: {}\".format(i, a.get_highlight_state(i)))\n", "for i in range(1, a.num_edges() + 1):\n", " print(\"edge {}: {}\".format(i, a.get_highlight_edge(i)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Removing highlights" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `None` as the color to remove some specific highlights." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4157900> >" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.highlight_state(0, None).highlight_edges([4, 2], None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or use `remove_highlight_states()` or `remove_highlight_edges()` to remove all highlights." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "I->2\n", "\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !c\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "c\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4157780> >" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.remove_highlight_states().remove_highlight_edges()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Highlighting a run\n", "\n", "One use of this highlighting is to highlight a run in an automaton.\n", "\n", "The following few command generate an automaton, then an accepting run on this automaton, and highlight that accepting run on the automaton. Note that a run knows the automaton from which it was generated, so calling `highlight()` will directly decorate that automaton." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "I->4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "I->4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f41574b0> >" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = spot.translate('X (F(Ga <-> b) & GF!b)'); b" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Prefix:\n", " 4\n", " | 1\n", " 0\n", " | !a & !b\n", "Cycle:\n", " 1\n", " | !b\t{0}\n", "\n" ] } ], "source": [ "r = b.accepting_run(); print(r)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "r.highlight(5) # the parameter is a color number" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The call of `highlight(5)` on the accepting run `r` modified the original automaton `b`:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "I->4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "I->4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f41574b0> >" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Highlighting an accepting run in an automaton with arbitrary acceptance\n", "\n", "This is not as easy as finding accepting runs in (generalized) Büchi automata, so let's have a few example for testing." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "(Inf(\n", "\n", ") | (Fin(\n", "\n", ") & Inf(\n", "\n", ")) | Fin(\n", "\n", ")) & Fin(\n", "\n", ")\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "9\n", "\n", "9\n", "\n", "\n", "\n", "0->9\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "5\n", "\n", "5\n", "\n", "\n", "\n", "0->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "9->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "9->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "8\n", "\n", "8\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "5->0\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "6\n", "\n", "6\n", "\n", "\n", "\n", "5->6\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "1->9\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "1->8\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "8->9\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "7\n", "\n", "7\n", "\n", "\n", "\n", "8->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->8\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "2->6\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "2->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "6->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "6->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "6->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "7->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "7->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "(Inf(\n", "\n", ") | (Fin(\n", "\n", ") & Inf(\n", "\n", ")) | Fin(\n", "\n", ")) & Fin(\n", "\n", ")\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "9\n", "\n", "9\n", "\n", "\n", "\n", "0->9\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "5\n", "\n", "5\n", "\n", "\n", "\n", "0->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "9->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "9->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "8\n", "\n", "8\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "5->0\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "6\n", "\n", "6\n", "\n", "\n", "\n", "5->6\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "1->9\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "1->8\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "8->9\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "7\n", "\n", "7\n", "\n", "\n", "\n", "8->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->8\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "2->6\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "2->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "6->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "6->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "6->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "7->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "7->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f41745d0> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Fin(\n", "\n", ") & ((Fin(\n", "\n", ") & (Inf(\n", "\n", ") | Inf(\n", "\n", "))) | (Fin(\n", "\n", ")|Fin(\n", "\n", ")))\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "8\n", "\n", "8\n", "\n", "\n", "\n", "0->8\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "6\n", "\n", "6\n", "\n", "\n", "\n", "0->6\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "8->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "\n", "7\n", "\n", "7\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "9\n", "\n", "9\n", "\n", "\n", "\n", "1->9\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "\n", "9->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "9->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "5\n", "\n", "5\n", "\n", "\n", "\n", "9->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "4->9\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "7->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "7->5\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "5->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Fin(\n", "\n", ") & ((Fin(\n", "\n", ") & (Inf(\n", "\n", ") | Inf(\n", "\n", "))) | (Fin(\n", "\n", ")|Fin(\n", "\n", ")))\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "8\n", "\n", "8\n", "\n", "\n", "\n", "0->8\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "6\n", "\n", "6\n", "\n", "\n", "\n", "0->6\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "8->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "\n", "\n", "7\n", "\n", "7\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "9\n", "\n", "9\n", "\n", "\n", "\n", "1->9\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "\n", "9->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "9->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "5\n", "\n", "5\n", "\n", "\n", "\n", "9->5\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n", "4->9\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "7->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "7->5\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "5->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4156100> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "i G F a G F b\n", "\n", "(Fin(\n", "\n", ") & Inf(\n", "\n", ")) | (Fin(\n", "\n", ") & Inf(\n", "\n", "))\n", "[Rabin 2]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "i G F a G F b\n", "\n", "(Fin(\n", "\n", ") & Inf(\n", "\n", ")) | (Fin(\n", "\n", ") & Inf(\n", "\n", "))\n", "[Rabin 2]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4157480> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def show_accrun(string):\n", " aut = spot.automaton(string)\n", " run = aut.accepting_run()\n", " run.highlight(5)\n", " display(aut)\n", "\n", "show_accrun(\"\"\"\n", "HOA: v1 States: 10 Start: 0 AP: 2 \"a\" \"b\" Acceptance: 5 (Inf(1) | (Fin(0)\n", "& Inf(4)) | Fin(2)) & Fin(3) properties: trans-labels explicit-labels\n", "trans-acc --BODY-- State: 0 [0&1] 9 {3} [!0&!1] 0 {3} [0&!1] 5 {0 1} State:\n", "1 [0&!1] 9 {4} [0&1] 8 {3} State: 2 [!0&!1] 8 {0} [!0&1] 6 {2 4} [0&1]\n", "2 {3} [!0&1] 7 State: 3 [0&!1] 2 {0 4} [!0&!1] 3 {1 3} [!0&1] 4 {0} State: 4\n", "[0&!1] 5 {2} [0&1] 0 [!0&1] 1 {0} State: 5 [!0&!1] 0 {3} [!0&!1] 6 {3} State: 6\n", "[0&1] 3 {2} [!0&1] 1 [0&1] 2 {0 1 3 4} State: 7 [0&1] 1 [!0&1] 7 {0 2}\n", "State: 8 [!0&1] 7 [!0&!1] 9 {0} State: 9 [0&1] 8 {3} [0&!1] 5 [0&!1]\n", "1 --END--\n", "\"\"\")\n", "show_accrun(\"\"\"\n", "HOA: v1 States: 10 Start: 0 AP: 2 \"a\" \"b\" Acceptance: 6 Fin(5) &\n", "((Fin(1) & (Inf(3) | Inf(4))) | Fin(0) | Fin(2)) properties: trans-labels\n", "explicit-labels trans-acc --BODY-- State: 0 [0&1] 8 {0} [0&!1] 6 {2}\n", "State: 1 [!0&1] 9 {0 4 5} State: 2 [!0&1] 1 State: 3 [0&!1] 3 {2}\n", "[0&1] 4 {3 5} State: 4 [0&1] 7 {5} [0&!1] 9 {2} [!0&1] 0 {0 2} State:\n", "5 [!0&1] 1 [!0&1] 3 {2 3} State: 6 [0&!1] 8 {1 2 5} [!0&1] 7 {3} State:\n", "7 [0&1] 2 {0} [!0&1] 5 State: 8 [0&!1] 3 {4 5} State: 9 [!0&1] 3 {1 2}\n", "[0&1] 1 {4} [0&!1] 5 {2} --END--\"\"\")\n", "show_accrun(\"\"\"\n", "HOA: v1 States: 4 properties: implicit-labels trans-labels no-univ-branch\n", "deterministic complete tool: \"ltl2dstar\" \"0.5.4\" name: \"i G F a G F b\"\n", "comment: \"Union{Safra[NBA=2],Safra[NBA=2]}\" acc-name: Rabin 2 Acceptance:\n", "4 (Fin(0)&Inf(1))|(Fin(2)&Inf(3)) Start: 0 AP: 2 \"a\" \"b\" --BODY-- State:\n", "0 {0} 1 0 3 2 State: 1 {1} 1 0 3 2 State: 2 {0 3} 1 0 3 2 State: 3 {1 3}\n", "1 0 3 2 --END--\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Highlighting from a product\n", "\n", "Pretty often, accepting runs are found in a product but we want to display them on one of the original automata. This can be done by projecting the runs on those automata before displaying them." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4174d80> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4174210> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "left = spot.translate('a U b')\n", "right = spot.translate('GFa')\n", "display(left, right)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "1,0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "0,0\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "1,0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "0,0\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4174f30> >" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prod = spot.product(left, right); prod" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Prefix:\n", " 1,0\n", " | !a & b\n", "Cycle:\n", " 0,0\n", " | a\t{0}\n", "\n" ] } ], "source": [ "run = prod.accepting_run(); print(run)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "run.highlight(5)\n", "# Note that by default project() needs to know on which side you project, but it cannot \n", "# guess it. The left-side is assumed unless you pass True as a second argument.\n", "run.project(left).highlight(5)\n", "run.project(right, True).highlight(5)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "1,0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "0,0\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "1,0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1\n", "\n", "0,0\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4174f30> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4174d80> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "!a\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4174210> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(prod, left, right)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The projection also works for products generated on-the-fly, but the on-the-fly product itself cannot be highlighted (it does not store states or transitions). " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Prefix:\n", " 0 * 3\n", " | a & !b\n", " 1 * 2\n", " | a\t{0}\n", " 1 * 1\n", " | a\t{0}\n", " 1 * 0\n", " | a & b\t{0}\n", "Cycle:\n", " 1 * 4\n", " | a\t{0}\n", "\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0 * 3\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1 * 2\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2 * 2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "3\n", "\n", "1 * 1\n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "a\n", "\n", "\n", "\n", "4\n", "\n", "2 * 1\n", "\n", "\n", "\n", "2->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "5\n", "\n", "1 * 0\n", "\n", "\n", "\n", "3->5\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n", "4->5\n", "\n", "\n", "a\n", "\n", "\n", "\n", "6\n", "\n", "2 * 0\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "1\n", "\n", "\n", "\n", "7\n", "\n", "1 * 4\n", "\n", "\n", "\n", "5->7\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "8\n", "\n", "2 * 4\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "b\n", "\n", "\n", "\n", "7->7\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n", "8->7\n", "\n", "\n", "a\n", "\n", "\n", "\n", "8->8\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0 * 3\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1 * 2\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2 * 2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "3\n", "\n", "1 * 1\n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "a\n", "\n", "\n", "\n", "4\n", "\n", "2 * 1\n", "\n", "\n", "\n", "2->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "5\n", "\n", "1 * 0\n", "\n", "\n", "\n", "3->5\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n", "4->5\n", "\n", "\n", "a\n", "\n", "\n", "\n", "6\n", "\n", "2 * 0\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "1\n", "\n", "\n", "\n", "7\n", "\n", "1 * 4\n", "\n", "\n", "\n", "5->7\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "8\n", "\n", "2 * 4\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "b\n", "\n", "\n", "\n", "7->7\n", "\n", "\n", "a\n", "\n", "\n", "\n", "\n", "8->7\n", "\n", "\n", "a\n", "\n", "\n", "\n", "8->8\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4176160> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "a\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4175320> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "t\n", "[all]\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "I->3\n", "\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "0->4\n", "\n", "\n", "b\n", "\n", "\n", "\n", "4->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "t\n", "[all]\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "I->3\n", "\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "0->4\n", "\n", "\n", "b\n", "\n", "\n", "\n", "4->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "1->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4176130> >" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "left2 = spot.translate('!b & FG a')\n", "right2 = spot.translate('XXXb')\n", "prod2 = spot.otf_product(left2, right2) # Note \"otf_product()\"\n", "run2 = prod2.accepting_run()\n", "run2.project(left2).highlight(5)\n", "run2.project(right2, True).highlight(5)\n", "print(run2)\n", "display(prod2, left2, right2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Highlighting nondeterminism\n", "\n", "Sometimes its is hard to locate non-deterministic states inside a large automaton. Here are two functions that can help for that." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "I->4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "I->4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "3->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4175950> >" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = spot.translate('X (F(Ga <-> b) & GF!b)')\n", "spot.highlight_nondet_states(b, 5)\n", "spot.highlight_nondet_edges(b, 4)\n", "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Disappearing highlights\n", "\n", "As explained at the top of this notebook, named properties (such as highlights) are fragile, and you should not really on them being preserved across algorithms. In-place algorithm are probably the worst, because they might modify the automaton and ignore the attached named properties. \n", "\n", "`randomize()` is one such in-place algorithm: it reorder states or transitions of the automaton. By doing so it renumber the states and edges, and that process would completely invalidate the highlights information. Fortunately `randomize()` know about highlights: it will preserve highlighted states, but it will drop all highlighted edges." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "I->3\n", "\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "4->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "4->4\n", "\n", "\n", "a | b\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "I->3\n", "\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "4->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "4->4\n", "\n", "\n", "a | b\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4175950> >" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spot.randomize(b); b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Highlighting with partial output\n", "\n", "For simplicity, rendering of partial automata is actually implemented by copying the original automaton and marking some states as \"incomplete\". This also allows the same display code to work with automata generated on-the-fly. However since there is a copy, propagating the highlighting information requires extra work. Let's make sure it has been done:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "I->3\n", "\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "4->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "4->4\n", "\n", "\n", "a | b\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "I->3\n", "\n", "\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "3->4\n", "\n", "\n", "1\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "0->0\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "b\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->0\n", "\n", "\n", "a & b\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "4->2\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "4->4\n", "\n", "\n", "a | b\n", "\n", "\n", "\n" ], "text/plain": [ " *' at 0x7fa7f4175950> >" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "3\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "4\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "u1\n", "\n", "\n", "...\n", "\n", "\n", "\n", "\n", "\n", "1->u1\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "2\n", "\n", "1\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "3\n", "\n", "2\n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "a & !b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "a & b\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "\n", "\n", "0\n", "\n", "3\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "4\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "1\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", "a | b\n", "\n", "\n", "\n", "u1\n", "\n", "\n", "...\n", "\n", "\n", "\n", "\n", "\n", "1->u1\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "spot.highlight_nondet_edges(b, 4) # let's get those highlighted edges back\n", "display(b, b.show('.<4'), b.show('.<2'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Highlighting languages\n", "\n", "For deterministic automata, the function `spot.highlight_languages()` can be used to highlight states that recognize the same language. This can be a great help in reading automata. States with a colored border share their language, and states with a black border all have a language different from all other states." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Inf(\n", "\n", ")\n", "[Büchi]\n", "\n", "cluster_0\n", "\n", "\n", "\n", "cluster_1\n", "\n", "\n", "\n", "cluster_2\n", "\n", "\n", "\n", "cluster_3\n", "\n", "\n", "\n", "cluster_4\n", "\n", "\n", "\n", "\n", "\n", "0\n", "\n", "0\n", "\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "0->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2\n", "\n", "2\n", "\n", "\n", "\n", "0->2\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "3\n", "\n", "3\n", "\n", "\n", "\n", "0->3\n", "\n", "\n", "a\n", "\n", "\n", "\n", "4\n", "\n", "4\n", "\n", "\n", "\n", "6\n", "\n", "6\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "!c\n", "\n", "\n", "\n", "7\n", "\n", "7\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "c\n", "\n", "\n", "\n", "6->4\n", "\n", "\n", "!b\n", "\n", "\n", "\n", "\n", "6->6\n", "\n", "\n", "b & !c\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "b & c\n", "\n", "\n", "\n", "7->4\n", "\n", "\n", "b\n", "\n", "\n", "\n", "\n", "7->6\n", "\n", "\n", "!b & !c\n", "\n", "\n", "\n", "7->7\n", "\n", "\n", "!b & c\n", "\n", "\n", "\n", "1->4\n", "\n", "\n", "a\n", "\n", "\n", "\n", "2->4\n", "\n", "\n", "a\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "2->2\n", "\n", "\n", "!a & b & !c\n", "\n", "\n", "\n", "5\n", "\n", "5\n", "\n", "\n", "\n", "2->5\n", "\n", "\n", "!a & b & c\n", "\n", "\n", "\n", "5->4\n", "\n", "\n", "a\n", "\n", "\n", "\n", "5->1\n", "\n", "\n", "!a & !b\n", "\n", "\n", "\n", "5->2\n", "\n", "\n", "!a & b\n", "\n", "\n", "\n", "\n", "3->3\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aut = spot.translate('(b W Xa) & GF(c <-> Xb) | a', 'generic', 'det')\n", "spot.highlight_languages(aut)\n", "aut.show('.bas')" ] } ], "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.7" } }, "nbformat": 4, "nbformat_minor": 2 }