{ "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.4.3+" }, "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This first chunk just makes sure the version of DiVinE installed accepts the `--LTSmin` option. If that is not the case, this notebook should be skipped by the test suite: `sys.exit(77)` does that." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "# Make sure we have divine and that it is patched to accept the --LTSmin option.\n", "import shutil\n", "if shutil.which(\"divine\") == None:\n", " sys.exit(77)\n", "import subprocess\n", "out = subprocess.check_output(['divine', 'compile', '--help'], stderr=subprocess.STDOUT)\n", "if b'LTSmin' not in out:\n", " sys.exit(77)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The real test case starts here." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import spot\n", "import spot.ltsmin\n", "# This is notebook also tests the limitation of the number of states in the GraphViz output\n", "spot.setup(max_states=10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Write an example DiVinE model. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "!rm -f test1.dve" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%%file test1.dve\n", "int a = 0, b = 0;\n", "\n", "process P {\n", " state x;\n", " init x;\n", "\n", " trans\n", " x -> x { guard a < 3 && b < 3; effect a = a + 1; },\n", " x -> x { guard a < 3 && b < 3; effect b = b + 1; };\n", "}\n", "\n", "process Q {\n", " state wait, work;\n", " init wait;\n", " trans\n", " wait -> work { guard b > 1; },\n", " work -> wait { guard a > 1; };\n", "}\n", "\n", "system async;" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Writing test1.dve\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compile the model using the `ltlmin` interface and load it. This should work with DiVinE models if `divine --LTSmin` works, and with Promela models if `spins` is installed.\n", "\n", "Printing an ltsmin model shows some information about the variables it contains and their types." ] }, { "cell_type": "code", "collapsed": false, "input": [ "m = spot.ltsmin.load('test1.dve')\n", "m" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "ltsmin model with the following variables:\n", " a: int\n", " b: int\n", " P: ['x']\n", " Q: ['wait', 'work']" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "sorted(m.info().items())" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "[('state_size', 4),\n", " ('types', [('int', []), ('P', ['x']), ('Q', ['wait', 'work'])]),\n", " ('variables', [('a', 0), ('b', 0), ('P', 1), ('Q', 2)])]" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "k = m.kripke([\"a<1\", \"b>2\"])\n", "k" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "svg": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "\n", "\n", "0\n", "\n", "a=0, b=0, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "1\n", "\n", "a=1, b=0, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "0->1\n", "\n", "\n", "\n", "\n", "2\n", "\n", "a=0, b=1, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "0->2\n", "\n", "\n", "\n", "\n", "3\n", "\n", "a=2, b=0, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "1->3\n", "\n", "\n", "\n", "\n", "4\n", "\n", "a=1, b=1, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "1->4\n", "\n", "\n", "\n", "\n", "2->4\n", "\n", "\n", "\n", "\n", "5\n", "\n", "a=0, b=2, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "6\n", "\n", "a=3, b=0, Q=0\n", "!"a<1" & !"b>2" & dead\n", "\n", "\n", "3->6\n", "\n", "\n", "\n", "\n", "7\n", "\n", "a=2, b=1, Q=0\n", "...\n", "\n", "\n", "3->7\n", "\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "\n", "\n", "8\n", "\n", "a=1, b=2, Q=0\n", "...\n", "\n", "\n", "4->8\n", "\n", "\n", "\n", "\n", "5->8\n", "\n", "\n", "\n", "\n", "u5\n", "\n", "...\n", "\n", "\n", "5->u5\n", "\n", "\n", "\n", "\n", "9\n", "\n", "a=0, b=3, Q=0\n", "...\n", "\n", "\n", "5->9\n", "\n", "\n", "\n", "\n", "6->6\n", "\n", "\n", "\n", "\n", "u7\n", "\n", "...\n", "\n", "\n", "7->u7\n", "\n", "\n", "\n", "\n", "u8\n", "\n", "...\n", "\n", "\n", "8->u8\n", "\n", "\n", "\n", "\n", "u9\n", "\n", "...\n", "\n", "\n", "9->u9\n", "\n", "\n", "\n", "\n", "\n" ], "text": [ " *' at 0x7f426c309690> >" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "k.show('.<15')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "svg": [ "\n", "\n", "G\n", "\n", "\n", "\n", "0\n", "\n", "a=0, b=0, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "1\n", "\n", "a=1, b=0, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "0->1\n", "\n", "\n", "\n", "\n", "2\n", "\n", "a=0, b=1, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "0->2\n", "\n", "\n", "\n", "\n", "3\n", "\n", "a=2, b=0, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "1->3\n", "\n", "\n", "\n", "\n", "4\n", "\n", "a=1, b=1, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "1->4\n", "\n", "\n", "\n", "\n", "2->4\n", "\n", "\n", "\n", "\n", "5\n", "\n", "a=0, b=2, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "6\n", "\n", "a=3, b=0, Q=0\n", "!"a<1" & !"b>2" & dead\n", "\n", "\n", "3->6\n", "\n", "\n", "\n", "\n", "7\n", "\n", "a=2, b=1, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "3->7\n", "\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "\n", "\n", "8\n", "\n", "a=1, b=2, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "4->8\n", "\n", "\n", "\n", "\n", "5->8\n", "\n", "\n", "\n", "\n", "9\n", "\n", "a=0, b=3, Q=0\n", "...\n", "\n", "\n", "5->9\n", "\n", "\n", "\n", "\n", "10\n", "\n", "a=0, b=2, Q=1\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "5->10\n", "\n", "\n", "\n", "\n", "6->6\n", "\n", "\n", "\n", "\n", "11\n", "\n", "a=3, b=1, Q=0\n", "!"a<1" & !"b>2" & dead\n", "\n", "\n", "7->11\n", "\n", "\n", "\n", "\n", "12\n", "\n", "a=2, b=2, Q=0\n", "...\n", "\n", "\n", "7->12\n", "\n", "\n", "\n", "\n", "8->12\n", "\n", "\n", "\n", "\n", "13\n", "\n", "a=1, b=3, Q=0\n", "...\n", "\n", "\n", "8->13\n", "\n", "\n", "\n", "\n", "14\n", "\n", "a=1, b=2, Q=1\n", "...\n", "\n", "\n", "8->14\n", "\n", "\n", "\n", "\n", "u9\n", "\n", "...\n", "\n", "\n", "9->u9\n", "\n", "\n", "\n", "\n", "10->14\n", "\n", "\n", "\n", "\n", "u10\n", "\n", "...\n", "\n", "\n", "10->u10\n", "\n", "\n", "\n", "\n", "11->11\n", "\n", "\n", "\n", "\n", "u12\n", "\n", "...\n", "\n", "\n", "12->u12\n", "\n", "\n", "\n", "\n", "u13\n", "\n", "...\n", "\n", "\n", "13->u13\n", "\n", "\n", "\n", "\n", "u14\n", "\n", "...\n", "\n", "\n", "14->u14\n", "\n", "\n", "\n", "\n", "" ], "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "k.show('.<0') # unlimited output" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "svg": [ "\n", "\n", "G\n", "\n", "\n", "\n", "0\n", "\n", "a=0, b=0, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "1\n", "\n", "a=1, b=0, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "0->1\n", "\n", "\n", "\n", "\n", "2\n", "\n", "a=0, b=1, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "0->2\n", "\n", "\n", "\n", "\n", "3\n", "\n", "a=2, b=0, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "1->3\n", "\n", "\n", "\n", "\n", "4\n", "\n", "a=1, b=1, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "1->4\n", "\n", "\n", "\n", "\n", "2->4\n", "\n", "\n", "\n", "\n", "5\n", "\n", "a=0, b=2, Q=0\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "6\n", "\n", "a=3, b=0, Q=0\n", "!"a<1" & !"b>2" & dead\n", "\n", "\n", "3->6\n", "\n", "\n", "\n", "\n", "7\n", "\n", "a=2, b=1, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "3->7\n", "\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "\n", "\n", "8\n", "\n", "a=1, b=2, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "4->8\n", "\n", "\n", "\n", "\n", "5->8\n", "\n", "\n", "\n", "\n", "9\n", "\n", "a=0, b=3, Q=0\n", ""a<1" & "b>2" & !dead\n", "\n", "\n", "5->9\n", "\n", "\n", "\n", "\n", "10\n", "\n", "a=0, b=2, Q=1\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "5->10\n", "\n", "\n", "\n", "\n", "6->6\n", "\n", "\n", "\n", "\n", "11\n", "\n", "a=3, b=1, Q=0\n", "!"a<1" & !"b>2" & dead\n", "\n", "\n", "7->11\n", "\n", "\n", "\n", "\n", "12\n", "\n", "a=2, b=2, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "7->12\n", "\n", "\n", "\n", "\n", "8->12\n", "\n", "\n", "\n", "\n", "13\n", "\n", "a=1, b=3, Q=0\n", "!"a<1" & "b>2" & !dead\n", "\n", "\n", "8->13\n", "\n", "\n", "\n", "\n", "14\n", "\n", "a=1, b=2, Q=1\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "8->14\n", "\n", "\n", "\n", "\n", "15\n", "\n", "a=0, b=3, Q=1\n", ""a<1" & "b>2" & dead\n", "\n", "\n", "9->15\n", "\n", "\n", "\n", "\n", "10->14\n", "\n", "\n", "\n", "\n", "10->15\n", "\n", "\n", "\n", "\n", "11->11\n", "\n", "\n", "\n", "\n", "16\n", "\n", "a=3, b=2, Q=0\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "12->16\n", "\n", "\n", "\n", "\n", "17\n", "\n", "a=2, b=3, Q=0\n", "!"a<1" & "b>2" & !dead\n", "\n", "\n", "12->17\n", "\n", "\n", "\n", "\n", "18\n", "\n", "a=2, b=2, Q=1\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "12->18\n", "\n", "\n", "\n", "\n", "19\n", "\n", "a=1, b=3, Q=1\n", "!"a<1" & "b>2" & dead\n", "\n", "\n", "13->19\n", "\n", "\n", "\n", "\n", "14->18\n", "\n", "\n", "\n", "\n", "14->19\n", "\n", "\n", "\n", "\n", "15->15\n", "\n", "\n", "\n", "\n", "20\n", "\n", "a=3, b=2, Q=1\n", "!"a<1" & !"b>2" & !dead\n", "\n", "\n", "16->20\n", "\n", "\n", "\n", "\n", "21\n", "\n", "a=2, b=3, Q=1\n", "!"a<1" & "b>2" & !dead\n", "\n", "\n", "17->21\n", "\n", "\n", "\n", "\n", "18->12\n", "\n", "\n", "\n", "\n", "18->20\n", "\n", "\n", "\n", "\n", "18->21\n", "\n", "\n", "\n", "\n", "19->19\n", "\n", "\n", "\n", "\n", "20->16\n", "\n", "\n", "\n", "\n", "21->17\n", "\n", "\n", "\n", "\n", "" ], "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "a = spot.translate('\"a<1\" U \"b>2\"'); a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "svg": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "I->1\n", "\n", "\n", "\n", "\n", "1->1\n", "\n", "\n", ""a<1" & !"b>2"\n", "\n", "\n", "0\n", "\n", "\n", "0\n", "\n", "\n", "1->0\n", "\n", "\n", ""b>2"\n", "\n", "\n", "0->0\n", "\n", "\n", "1\n", "\n", "\n", "\n" ], "text": [ " *' at 0x7f426c05f960> >" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "spot.otf_product(k, a)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "svg": [ "\n", "\n", "\n", "\n", "\n", "\n", "G\n", "\n", "\n", "\n", "0\n", "\n", "a=0, b=0, Q=0 * 1\n", "\n", "\n", "I->0\n", "\n", "\n", "\n", "\n", "1\n", "\n", "a=1, b=0, Q=0 * 1\n", "\n", "\n", "0->1\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "2\n", "\n", "a=0, b=1, Q=0 * 1\n", "\n", "\n", "0->2\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "3\n", "\n", "a=1, b=1, Q=0 * 1\n", "\n", "\n", "2->3\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "4\n", "\n", "a=0, b=2, Q=0 * 1\n", "\n", "\n", "2->4\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "5\n", "\n", "a=1, b=2, Q=0 * 1\n", "\n", "\n", "4->5\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "6\n", "\n", "a=0, b=3, Q=0 * 1\n", "\n", "\n", "4->6\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "7\n", "\n", "a=0, b=2, Q=1 * 1\n", "\n", "\n", "4->7\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "8\n", "\n", "a=0, b=3, Q=1 * 0\n", "\n", "\n", "6->8\n", "\n", "\n", ""a<1" & "b>2" & !dead\n", "\n", "\n", "u7\n", "\n", "...\n", "\n", "\n", "7->u7\n", "\n", "\n", "\n", "\n", "9\n", "\n", "a=1, b=2, Q=1 * 1\n", "\n", "\n", "7->9\n", "\n", "\n", ""a<1" & !"b>2" & !dead\n", "\n", "\n", "8->8\n", "\n", "\n", ""a<1" & "b>2" & dead\n", "\u24ff\n", "\n", "\n", "\n" ], "text": [ " *' at 0x7f426c309600> >" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "!rm -f test1.dve" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 } ], "metadata": {} } ] }