diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..171f3a383a373b5378a5caa36ea20686a5204e33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Jupyter notebook checkpoints +.ipynb_checkpoints/ + +# nbconvert HTML/slides output +*.html + +# nbconvert LaTeX output +*.aux +*.dvi +*.log +*.out +*.pdf +*.svg +*.tex diff --git a/.ipynb_checkpoints/Apples_and_Oranges-checkpoint.ipynb b/.ipynb_checkpoints/Apples_and_Oranges-checkpoint.ipynb deleted file mode 100644 index 8ad2482bf9efc21a96774bda785f17e26d7585cc..0000000000000000000000000000000000000000 --- a/.ipynb_checkpoints/Apples_and_Oranges-checkpoint.ipynb +++ /dev/null @@ -1,293 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Apples and Oranges\n", - "\n", - "Use `:help` to get an overview for the jupyter notebook commands.\n", - "\n", - "This puzzle is [apparently an Interview question at Apple](https://bgr.com/2015/11/20/apple-interview-questions/). Quoting from\n", - "[1](https://bgr.com/2015/11/20/apple-interview-questions/) we have the\n", - "following information:\n", - "\n", - "* (1) There are three boxes, one contains only apples, one contains only oranges, and one contains both apples and oranges.\n", - "* (2) The boxes have been incorrectly labeled such that no label identifies the actual contents of the box it labels.\n", - "* (3) Opening just one box, and without looking in the box, you take out one piece of fruit.\n", - "* (4) By looking at the fruit, how can you immediately label all of the boxes correctly?\n", - "\n", - "Here is one encoding of this puzzle in B:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: ApplesOranges" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE ApplesOranges\n", - "SETS\n", - " Fruit={apple,orange}; // possible content for the boxes\n", - " Label={A,O,Both} // labels for the boxes\n", - "CONSTANTS a,o,b, // a,o,b are the three boxes\n", - " Take, // which box should we open (the label of that box)\n", - " DecisionFunction // given the fruit we pick from Take: what are the contents of the boxes labeled A,O,Both\n", - "PROPERTIES\n", - " a = {apple} & o={orange} & b={apple,orange} // (1)\n", - " &\n", - " Take : Label //3\n", - " &\n", - " DecisionFunction : Fruit --> (Label >->> {a,o,b}) & //4\n", - " !label. ( // the decision function has to work for all allowed labelings\n", - " ( label : {a,o,b} >->> Label &\n", - " label(a) /= A & label(o) /= O & label(b) /= Both // (2)\n", - " )\n", - " =>\n", - " !f.(f: label~(Take)\n", - " => DecisionFunction(f)=label~ // the function should tell us what is behind label A,O,Both\n", - " )\n", - " )\n", - "END" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We have abstracted the box of apples `a` by the set containing `apple`.\n", - "Ditto for `o` and `b`, which are abstracted by `{orange}` and\n", - "`{apple,orange}` respectively.\n", - "\n", - "NOTE: You need a recent version of ProB 1.5.1-beta3 or newer to load the above model on your own computer with its one-line comments. If you have an older version of ProB, simply use the normal comments `/* ... */`.\n", - "\n", - "`:goto Number` jumps to the state with the given number. \n", - "\n", - "With the `:trace` command, you will get the information of your current trace.\n", - "\n", - "There is an autocompletion tool, which allows you to see the possible commands, simply use TAB after you type in your `:`. \n", - "\n", - "This model gives you just one solution, after setting up the constants with `:constants`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Changed to state with index -1" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":goto -1" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state\n", - "* 0: `SETUP_CONSTANTS()` **(current)**" - ], - "text/plain": [ - "-1: Root state\n", - "0: SETUP_CONSTANTS() (current)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\mathit{Both}$" - ], - "text/plain": [ - "Both" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Take" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we can see, the only solution is to open the box labelled with\n", - "\"Both\". We can inspect the decision function by using the jupyter notebook code block, like follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\{(\\mathit{A}\\mapsto\\{\\mathit{orange}\\}),(\\mathit{O}\\mapsto\\{\\mathit{apple},\\mathit{orange}\\}),(\\mathit{Both}\\mapsto\\{\\mathit{apple}\\})\\}$" - ], - "text/plain": [ - "{(A↦{orange}),(O↦{apple,orange}),(Both↦{apple})}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "DecisionFunction(apple)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\{(\\mathit{A}\\mapsto\\{\\mathit{apple},\\mathit{orange}\\}),(\\mathit{O}\\mapsto\\{\\mathit{apple}\\}),(\\mathit{Both}\\mapsto\\{\\mathit{orange}\\})\\}$" - ], - "text/plain": [ - "{(A↦{apple,orange}),(O↦{apple}),(Both↦{orange})}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "DecisionFunction(orange)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In other words, when we pick an apple out of the box labelled with\n", - "\"Both\", then it contains only apples and the box labelled \"O\"ranges\n", - "contains both apples and oranges. The box labelled \"A\"pples contains\n", - "just oranges. Similarly, if we pick up an orange out of the box labelled\n", - "with \"Both\", then it contains only oranges and the box labelled with\n", - "\"A\"pples contains contains both apples and oranges. The box labelled\n", - "\"O\"ranges contains just apples.\n", - "\n", - "NOTE: You can use `:table Expression` to get values or expressions in a tabular form." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "|prj1|prj2|\n", - "|---|---|\n", - "|$\\mathit{apple}$|$\\{(\\mathit{A}\\mapsto\\{\\mathit{orange}\\}),(\\mathit{O}\\mapsto\\{\\mathit{apple},\\mathit{orange}\\}),(\\mathit{Both}\\mapsto\\{\\mathit{apple}\\})\\}$|\n", - "|$\\mathit{orange}$|$\\{(\\mathit{A}\\mapsto\\{\\mathit{apple},\\mathit{orange}\\}),(\\mathit{O}\\mapsto\\{\\mathit{apple}\\}),(\\mathit{Both}\\mapsto\\{\\mathit{orange}\\})\\}$|\n" - ], - "text/plain": [ - "prj1\tprj2\n", - "apple\t{(A|->{orange}),(O|->{apple,orange}),(Both|->{apple})}\n", - "orange\t{(A|->{apple,orange}),(O|->{apple}),(Both|->{orange})}\n" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":table DecisionFunction" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ProB 2", - "language": "prob", - "name": "prob2" - }, - "language_info": { - "codemirror_mode": "prob2_jupyter_repl", - "file_extension": ".prob", - "mimetype": "text/x-prob2-jupyter-repl", - "name": "prob" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/Argumentation_Theory-checkpoint.ipynb b/.ipynb_checkpoints/Argumentation_Theory-checkpoint.ipynb deleted file mode 100644 index a803fa1c39a0e9968615bbfd34d661965cc86199..0000000000000000000000000000000000000000 --- a/.ipynb_checkpoints/Argumentation_Theory-checkpoint.ipynb +++ /dev/null @@ -1,999 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Argumentation Theory\n", - "\n", - "Use `:help` to get an overview for the jupyter notebook commands. If you need more insight on how to use this tool, consider reading *ProB Jupyter Notebook Overview*.\n", - "\n", - "In this notebook we try to model some concepts of argumentation theory in B. The examples try to show that classical (monotonic) logic with set theory can be used to model some aspects of argumentation theory quite naturally, and that ProB can solve and visualise some problems in argumentation theory. Alternative solutions are encoding arguments as normal logic programs (with non-monotonic negation) and using answer set solvers for problem solving.\n", - "\n", - "The following model was inspired by a talk given by Claudia Schulz.\n", - "\n", - "The model below represents the labelling of the arguments as a total\n", - "function from arguments to its status, which can either be in (the\n", - "argument is accepted), out (the argument is rejected), or undec (the\n", - "argument is undecided). The relation between the arguments is given in\n", - "the binary attacks relation.\n", - "\n", - "In case you are new to B, you probably need to know the following\n", - "operators to understand the specification below:\n", - "\n", - "* `x : S` specifies that x is an element of S\n", - "* `a|->b` represents the pair (a,b); note that a relation and function in B is a set of pairs.\n", - "* `x|->y : R` hence specifies that x is mapped to y in relation R\n", - "* `!x.(P => Q)` denotes universal quantification over variable x\n", - "* `#x.(P & Q)` denotes existential quantification over variable x\n", - "* `A <--> B` denotes the set of relations from A to B\n", - "* `A --> B` denotes the set of total functions from A to B\n", - "* block comments are of the form `/* ... */` and line comments start with `//` " - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: ArgumentationTotFun" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE ArgumentationTotFun\n", - "SETS\n", - " ARGUMENTS={A,B,C,D,E};\n", - " STATUS = {in,out,undec}\n", - "CONSTANTS attacks, label\n", - "PROPERTIES\n", - " attacks : ARGUMENTS <-> ARGUMENTS /* which argument attacks which other argument */\n", - " &\n", - " label: ARGUMENTS --> {in,out,undec} & /* the labeling function */\n", - "\n", - " // if an argument y is in any attacker must be out:\n", - " !(x,y).(x|->y:attacks => (label(y)=in => label(x)=out)) &\n", - " // if an argument x is in anything it attacks must be out:\n", - " !(x,y).(x|->y:attacks => (label(x)=in => label(y)=out)) &\n", - " //if an argument y is out it must be attacked by a valid argument:\n", - " !(y).(y:ARGUMENTS => (label(y)=out => #x.(x|->y:attacks & label(x)=in))) &\n", - " // if an argument y is undecided it must be attacked by an undecided argument:\n", - " !(y).(y:ARGUMENTS => (label(y)=undec => #x.(x|->y:attacks & label(x)=undec)))\n", - " &\n", - " // here we model one particular argumentation graph\n", - " // A = the sun will shine to day, B = we are in the UK, C = it is summer, D = there are only 10 days of sunshine per year, E = the BBC has forecast sun\n", - " attacks = {B|->A, C|->B, D|->C, E |-> B, E|->D}\n", - "END" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we will load the model and setup its constants.\n", - "\n", - "`:goto Number` jumps to the state with the given number. \n", - "\n", - "With the `:trace` command, you will get the information of your current trace.\n", - "\n", - "There is an autocompletion tool, which allows you to see the possible commands, simply use TAB after you type in your `:`. \n", - "\n", - "This model gives you just one solution, after setting up the constants with `:constants`." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Changed to state with index -1" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":goto -1" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state\n", - "* 0: `SETUP_CONSTANTS()` **(current)**" - ], - "text/plain": [ - "-1: Root state\n", - "0: SETUP_CONSTANTS() (current)" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we initialise the model with `:init`" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you want to inspect the solution, you can type in the following:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "|prj1|prj2|\n", - "|---|---|\n", - "|$\\mathit{B}$|$\\mathit{A}$|\n", - "|$\\mathit{C}$|$\\mathit{B}$|\n", - "|$\\mathit{D}$|$\\mathit{C}$|\n", - "|$\\mathit{E}$|$\\mathit{B}$|\n", - "|$\\mathit{E}$|$\\mathit{D}$|\n" - ], - "text/plain": [ - "prj1\tprj2\n", - "B\tA\n", - "C\tB\n", - "D\tC\n", - "E\tB\n", - "E\tD\n" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":table attacks" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "|prj1|prj2|\n", - "|---|---|\n", - "|$\\mathit{A}$|$\\mathit{in}$|\n", - "|$\\mathit{B}$|$\\mathit{out}$|\n", - "|$\\mathit{C}$|$\\mathit{in}$|\n", - "|$\\mathit{D}$|$\\mathit{out}$|\n", - "|$\\mathit{E}$|$\\mathit{in}$|\n" - ], - "text/plain": [ - "prj1\tprj2\n", - "A\tin\n", - "B\tout\n", - "C\tin\n", - "D\tout\n", - "E\tin\n" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":table label" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you have installed *graphviz*, you can use the following command to set the path to your dot executable. And then the `:dot command` to make a graph visualisation of your current state.\n", - "\n", - "TIP: To get a list of possible commands for `:dot`, you can use TAB after typing in `:dot `.\n", - "\n", - "Now you can try and experiment with various attack graphs by editing the machine. E.g., with\n", - "\n", - "`attacks = {B|->A, C|->B, D|->C, E |-> B, E|->D, D|->E}`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "scrolled": true - }, - "source": [ - "In case dot is installed in a non-standard location you can use the command\n", - "```:pref DOT=/usr/bin/dot``` to specify the path to dot." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", - "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", - " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", - "<!-- Generated by graphviz version 2.28.0 (20110509.1545)\n", - " -->\n", - "<!-- Title: state Pages: 1 -->\n", - "<svg width=\"294pt\" height=\"568pt\"\n", - " viewBox=\"0.00 0.00 294.21 568.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", - "<g id=\"graph1\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 564)\">\n", - "<title>state</title>\n", - "<polygon fill=\"white\" stroke=\"white\" points=\"-4,5 -4,-564 291.21,-564 291.21,5 -4,5\"/>\n", - "<g id=\"graph2\" class=\"cluster\"><title>cluster_ARGUMENTS</title>\n", - "<polygon fill=\"lightgrey\" stroke=\"lightgrey\" points=\"8,-118 8,-552 143,-552 143,-118 8,-118\"/>\n", - "<text text-anchor=\"middle\" x=\"75.5\" y=\"-537.2\" font-family=\"Times,serif\" font-size=\"12.00\">ARGUMENTS</text>\n", - "</g>\n", - "<g id=\"graph3\" class=\"cluster\"><title>cluster_STATUS</title>\n", - "<polygon fill=\"lightgrey\" stroke=\"lightgrey\" points=\"72,-8 72,-82 214,-82 214,-8 72,-8\"/>\n", - "<text text-anchor=\"middle\" x=\"143\" y=\"-67.2\" font-family=\"Times,serif\" font-size=\"12.00\">STATUS</text>\n", - "</g>\n", - "<!-- E -->\n", - "<g id=\"node1\" class=\"node\"><title>E</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"123,-522 69,-522 69,-486 123,-486 123,-522\"/>\n", - "<text text-anchor=\"middle\" x=\"96\" y=\"-499.8\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", - "</g>\n", - "<!-- in -->\n", - "<g id=\"node3\" class=\"node\"><title>in</title>\n", - "<polygon fill=\"#bdef6b\" stroke=\"#bdef6b\" points=\"206,-52 152,-52 152,-16 206,-16 206,-52\"/>\n", - "<text text-anchor=\"middle\" x=\"179\" y=\"-29.8\" font-family=\"Times,serif\" font-size=\"14.00\">in</text>\n", - "</g>\n", - "<!-- E->in -->\n", - "<g id=\"edge2\" class=\"edge\"><title>E->in</title>\n", - "<path fill=\"none\" stroke=\"firebrick\" d=\"M123.283,-500.608C169.685,-494.881 259,-475.942 259,-415 259,-415 259,-415 259,-143 259,-108.977 233.048,-78.6753 210.706,-58.8927\"/>\n", - "<polygon fill=\"firebrick\" stroke=\"firebrick\" points=\"212.889,-56.1546 203.003,-52.3451 208.356,-61.4883 212.889,-56.1546\"/>\n", - "<text text-anchor=\"middle\" x=\"272.605\" y=\"-274.8\" font-family=\"Times,serif\" font-size=\"14.00\">label</text>\n", - "</g>\n", - "<!-- D -->\n", - "<g id=\"node4\" class=\"node\"><title>D</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"123,-432 69,-432 69,-396 123,-396 123,-432\"/>\n", - "<text text-anchor=\"middle\" x=\"96\" y=\"-409.8\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", - "</g>\n", - "<!-- E->D -->\n", - "<g id=\"edge12\" class=\"edge\"><title>E->D</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M96,-485.614C96,-473.24 96,-456.369 96,-442.22\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"99.5001,-442.05 96,-432.05 92.5001,-442.05 99.5001,-442.05\"/>\n", - "<text text-anchor=\"middle\" x=\"115.435\" y=\"-454.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- B -->\n", - "<g id=\"node9\" class=\"node\"><title>B</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"86,-252 32,-252 32,-216 86,-216 86,-252\"/>\n", - "<text text-anchor=\"middle\" x=\"59\" y=\"-229.8\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", - "</g>\n", - "<!-- E->B -->\n", - "<g id=\"edge14\" class=\"edge\"><title>E->B</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M85.2215,-485.909C76.948,-471.949 65.963,-451.421 60,-432 42.0609,-373.574 48.6791,-300.724 54.3115,-262.057\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"57.7822,-262.515 55.8528,-252.098 50.8646,-261.445 57.7822,-262.515\"/>\n", - "<text text-anchor=\"middle\" x=\"69.4348\" y=\"-364.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- out -->\n", - "<g id=\"node6\" class=\"node\"><title>out</title>\n", - "<polygon fill=\"#bdef6b\" stroke=\"#bdef6b\" points=\"134,-52 80,-52 80,-16 134,-16 134,-52\"/>\n", - "<text text-anchor=\"middle\" x=\"107\" y=\"-29.8\" font-family=\"Times,serif\" font-size=\"14.00\">out</text>\n", - "</g>\n", - "<!-- D->out -->\n", - "<g id=\"edge4\" class=\"edge\"><title>D->out</title>\n", - "<path fill=\"none\" stroke=\"firebrick\" d=\"M123.253,-404.231C155.247,-392.025 204,-366.6 204,-325 204,-325 204,-325 204,-143 204,-112.385 184.207,-108.744 160,-90 153.398,-84.8877 149.501,-87.2409 143,-82 135.638,-76.0651 128.918,-68.3259 123.33,-60.8456\"/>\n", - "<polygon fill=\"firebrick\" stroke=\"firebrick\" points=\"125.937,-58.4689 117.318,-52.3071 120.213,-62.4987 125.937,-58.4689\"/>\n", - "<text text-anchor=\"middle\" x=\"217.605\" y=\"-229.8\" font-family=\"Times,serif\" font-size=\"14.00\">label</text>\n", - "</g>\n", - "<!-- C -->\n", - "<g id=\"node7\" class=\"node\"><title>C</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"123,-342 69,-342 69,-306 123,-306 123,-342\"/>\n", - "<text text-anchor=\"middle\" x=\"96\" y=\"-319.8\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", - "</g>\n", - "<!-- D->C -->\n", - "<g id=\"edge16\" class=\"edge\"><title>D->C</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M96,-395.614C96,-383.24 96,-366.369 96,-352.22\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"99.5001,-352.05 96,-342.05 92.5001,-352.05 99.5001,-352.05\"/>\n", - "<text text-anchor=\"middle\" x=\"115.435\" y=\"-364.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- C->in -->\n", - "<g id=\"edge6\" class=\"edge\"><title>C->in</title>\n", - "<path fill=\"none\" stroke=\"firebrick\" d=\"M111.644,-305.828C115.868,-300.44 120.074,-294.256 123,-288 158.98,-211.066 172.348,-110.006 176.887,-62.2477\"/>\n", - "<polygon fill=\"firebrick\" stroke=\"firebrick\" points=\"180.39,-62.3657 177.794,-52.094 173.418,-61.7431 180.39,-62.3657\"/>\n", - "<text text-anchor=\"middle\" x=\"171.605\" y=\"-184.8\" font-family=\"Times,serif\" font-size=\"14.00\">label</text>\n", - "</g>\n", - "<!-- C->B -->\n", - "<g id=\"edge18\" class=\"edge\"><title>C->B</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M88.69,-305.614C83.3854,-292.998 76.1147,-275.705 70.0961,-261.391\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"73.2713,-259.912 66.1689,-252.05 66.8185,-262.625 73.2713,-259.912\"/>\n", - "<text text-anchor=\"middle\" x=\"100.435\" y=\"-274.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- B->out -->\n", - "<g id=\"edge8\" class=\"edge\"><title>B->out</title>\n", - "<path fill=\"none\" stroke=\"firebrick\" d=\"M79.4216,-215.857C84.3525,-210.645 89.046,-204.547 92,-198 111.952,-153.782 111.965,-96.0589 109.759,-62.5017\"/>\n", - "<polygon fill=\"firebrick\" stroke=\"firebrick\" points=\"113.215,-61.8013 108.951,-52.1024 106.236,-62.3434 113.215,-61.8013\"/>\n", - "<text text-anchor=\"middle\" x=\"123.605\" y=\"-139.8\" font-family=\"Times,serif\" font-size=\"14.00\">label</text>\n", - "</g>\n", - "<!-- A -->\n", - "<g id=\"node11\" class=\"node\"><title>A</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"70,-162 16,-162 16,-126 70,-126 70,-162\"/>\n", - "<text text-anchor=\"middle\" x=\"43\" y=\"-139.8\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", - "</g>\n", - "<!-- B->A -->\n", - "<g id=\"edge20\" class=\"edge\"><title>B->A</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M55.8389,-215.614C53.5892,-203.24 50.5216,-186.369 47.949,-172.22\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"51.3326,-171.263 46.1001,-162.05 44.4455,-172.515 51.3326,-171.263\"/>\n", - "<text text-anchor=\"middle\" x=\"72.4348\" y=\"-184.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- A->in -->\n", - "<g id=\"edge10\" class=\"edge\"><title>A->in</title>\n", - "<path fill=\"none\" stroke=\"firebrick\" d=\"M70.2551,-126.395C99.7972,-108.393 142.802,-82.1785 143,-82 149.921,-75.7756 156.451,-68.0732 161.999,-60.7175\"/>\n", - "<polygon fill=\"firebrick\" stroke=\"firebrick\" points=\"165.021,-62.5106 168.028,-52.3512 159.342,-58.4185 165.021,-62.5106\"/>\n", - "<text text-anchor=\"middle\" x=\"142.605\" y=\"-94.8\" font-family=\"Times,serif\" font-size=\"14.00\">label</text>\n", - "</g>\n", - "</g>\n", - "</svg>" - ], - "text/plain": [ - "<Dot visualization: state_as_graph []>" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":dot state_as_graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## A more elegant encoding\n", - "\n", - "The following is a slightly more elegant encoding, where we represent\n", - "the labelling as a partition of the arguments. This enables to use the\n", - "relational image operator to express some constraints more compactly.\n", - "This model is particularly well suited if you wish to use our Kodok Backend which translates the\n", - "constraints to SAT. However, even the standard ProB solver can solve\n", - "this instance in 10 ms (Kodkod requires 70 ms), so this would only be\n", - "worthwhile for larger problem instances.\n", - "\n", - "In case you are new to B, you probably need to know the following\n", - "additional operators to understand the specification below (we als have\n", - "a <<summary-of-b-syntax,summary page about the B syntax>>):\n", - "\n", - "* `r~` is the inverse of a function or relation r\n", - "* `r[S]` is the relational image of a relation r for a set of domain values S" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: ArgumentationAsSets" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE ArgumentationAsSets\n", - "SETS\n", - " ARGUMENTS={A,B,C,D,E}\n", - "CONSTANTS attacks, in,out,undec\n", - "PROPERTIES\n", - " attacks : ARGUMENTS <-> ARGUMENTS /* which argument attacks which other argument */\n", - " &\n", - " // we partition the arguments into three sets\n", - " ARGUMENTS = in \\/ out \\/ undec &\n", - " in /\\ out = {} & in /\\ undec = {} & out /\\ undec = {} &\n", - "\n", - " // if an argument is in, any attacker must be out:\n", - " attacks~[in] <: out &\n", - " // if an argument is in, anything it attacks must be out:\n", - " attacks[in] <: out &\n", - " //if an argument y is out, it must be attacked by a valid argument:\n", - " !y.(y:out => #x.(x|->y:attacks & x:in)) &\n", - " // if an argument y is undecided, it must be attacked by an undecided argument:\n", - " !y.(y:undec => #x.(x|->y:attacks & x:undec))\n", - "\n", - " &\n", - " // here we model one particular argumentation graph\n", - " // A = the sun will shine to day, B = we are in the UK, C = it is summer, D = there are only 10 days of sunshine per year, E = the BBC has forecast sun\n", - " attacks = {B|->A, C|->B, D|->C, E |-> B, E|->D}\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "|prj1|prj2|\n", - "|---|---|\n", - "|$\\mathit{B}$|$\\mathit{A}$|\n", - "|$\\mathit{C}$|$\\mathit{B}$|\n", - "|$\\mathit{D}$|$\\mathit{C}$|\n", - "|$\\mathit{E}$|$\\mathit{B}$|\n", - "|$\\mathit{E}$|$\\mathit{D}$|\n" - ], - "text/plain": [ - "prj1\tprj2\n", - "B\tA\n", - "C\tB\n", - "D\tC\n", - "E\tB\n", - "E\tD\n" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":table attacks" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", - "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", - " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", - "<!-- Generated by graphviz version 2.28.0 (20110509.1545)\n", - " -->\n", - "<!-- Title: state Pages: 1 -->\n", - "<svg width=\"306pt\" height=\"532pt\"\n", - " viewBox=\"0.00 0.00 306.43 532.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", - "<g id=\"graph1\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 528)\">\n", - "<title>state</title>\n", - "<polygon fill=\"white\" stroke=\"white\" points=\"-4,5 -4,-528 303.429,-528 303.429,5 -4,5\"/>\n", - "<g id=\"graph2\" class=\"cluster\"><title>cluster_ARGUMENTS</title>\n", - "<polygon fill=\"lightgrey\" stroke=\"lightgrey\" points=\"8,-82 8,-516 143,-516 143,-82 8,-82\"/>\n", - "<text text-anchor=\"middle\" x=\"75.5\" y=\"-501.2\" font-family=\"Times,serif\" font-size=\"12.00\">ARGUMENTS</text>\n", - "</g>\n", - "<!-- ROOT-NODE -->\n", - "<g id=\"node1\" class=\"node\"><title>ROOT-NODE</title>\n", - "<polygon fill=\"lightblue\" stroke=\"lightblue\" points=\"152,-36 56.6349,-18 152,-3.55271e-15 247.365,-18 152,-36\"/>\n", - "<text text-anchor=\"middle\" x=\"152\" y=\"-13.8\" font-family=\"Times,serif\" font-size=\"14.00\">ROOT-NODE</text>\n", - "</g>\n", - "<!-- ROOT-NODE->ROOT-NODE -->\n", - "<g id=\"edge2\" class=\"edge\"><title>ROOT-NODE->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"firebrick\" d=\"M206.063,-25.8265C236.666,-27.3549 265,-24.7461 265,-18 265,-12.0181 242.722,-9.28922 216.338,-9.81333\"/>\n", - "<polygon fill=\"firebrick\" stroke=\"firebrick\" points=\"215.934,-6.32524 206.063,-10.1735 216.18,-13.3209 215.934,-6.32524\"/>\n", - "<text text-anchor=\"middle\" x=\"281.715\" y=\"-13.8\" font-family=\"Times,serif\" font-size=\"14.00\">undec</text>\n", - "</g>\n", - "<!-- D -->\n", - "<g id=\"node3\" class=\"node\"><title>D</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"123,-396 69,-396 69,-360 123,-360 123,-396\"/>\n", - "<text text-anchor=\"middle\" x=\"96\" y=\"-373.8\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", - "</g>\n", - "<!-- D->ROOT-NODE -->\n", - "<g id=\"edge4\" class=\"edge\"><title>D->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M121.19,-359.963C149.034,-340.19 190,-307.89 190,-289 190,-289 190,-289 190,-107 190,-83.8321 178.762,-59.8373 168.508,-42.7666\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"171.295,-40.6246 162.991,-34.0446 165.379,-44.3668 171.295,-40.6246\"/>\n", - "<text text-anchor=\"middle\" x=\"198.945\" y=\"-193.8\" font-family=\"Times,serif\" font-size=\"14.00\">out</text>\n", - "</g>\n", - "<!-- C -->\n", - "<g id=\"node9\" class=\"node\"><title>C</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"123,-306 69,-306 69,-270 123,-270 123,-306\"/>\n", - "<text text-anchor=\"middle\" x=\"96\" y=\"-283.8\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", - "</g>\n", - "<!-- D->C -->\n", - "<g id=\"edge18\" class=\"edge\"><title>D->C</title>\n", - "<path fill=\"none\" stroke=\"black\" d=\"M96,-359.614C96,-347.24 96,-330.369 96,-316.22\"/>\n", - "<polygon fill=\"black\" stroke=\"black\" points=\"99.5001,-316.05 96,-306.05 92.5001,-316.05 99.5001,-316.05\"/>\n", - "<text text-anchor=\"middle\" x=\"115.435\" y=\"-328.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- B -->\n", - "<g id=\"node5\" class=\"node\"><title>B</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"93,-216 39,-216 39,-180 93,-180 93,-216\"/>\n", - "<text text-anchor=\"middle\" x=\"66\" y=\"-193.8\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", - "</g>\n", - "<!-- B->ROOT-NODE -->\n", - "<g id=\"edge6\" class=\"edge\"><title>B->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"sienna\" d=\"M73.9137,-179.781C84.3213,-157.229 103.265,-116.501 120.109,-82 126.286,-69.3487 133.339,-55.3696 139.239,-43.8002\"/>\n", - "<polygon fill=\"sienna\" stroke=\"sienna\" points=\"142.44,-45.2273 143.879,-34.7306 136.208,-42.039 142.44,-45.2273\"/>\n", - "<text text-anchor=\"middle\" x=\"129.945\" y=\"-103.8\" font-family=\"Times,serif\" font-size=\"14.00\">out</text>\n", - "</g>\n", - "<!-- A -->\n", - "<g id=\"node11\" class=\"node\"><title>A</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"70,-126 16,-126 16,-90 70,-90 70,-126\"/>\n", - "<text text-anchor=\"middle\" x=\"43\" y=\"-103.8\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", - "</g>\n", - "<!-- B->A -->\n", - "<g id=\"edge22\" class=\"edge\"><title>B->A</title>\n", - "<path fill=\"none\" stroke=\"black\" d=\"M38.7713,-183.572C30.6181,-178.086 22.6507,-170.905 18.1304,-162 13.6914,-153.255 16.1311,-143.574 20.895,-134.904\"/>\n", - "<polygon fill=\"black\" stroke=\"black\" points=\"23.9668,-136.601 26.51,-126.316 18.108,-132.771 23.9668,-136.601\"/>\n", - "<text text-anchor=\"middle\" x=\"38.4348\" y=\"-148.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- E -->\n", - "<g id=\"node7\" class=\"node\"><title>E</title>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"123,-486 69,-486 69,-450 123,-450 123,-486\"/>\n", - "<text text-anchor=\"middle\" x=\"96\" y=\"-463.8\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", - "</g>\n", - "<!-- E->ROOT-NODE -->\n", - "<g id=\"edge8\" class=\"edge\"><title>E->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#473c8b\" d=\"M123.326,-462.499C164.068,-454.052 236,-431.68 236,-379 236,-379 236,-379 236,-107 236,-76.2859 208.894,-52.07 185.478,-36.8807\"/>\n", - "<polygon fill=\"#473c8b\" stroke=\"#473c8b\" points=\"187.099,-33.7685 176.748,-31.5064 183.429,-39.7294 187.099,-33.7685\"/>\n", - "<text text-anchor=\"middle\" x=\"241.445\" y=\"-238.8\" font-family=\"Times,serif\" font-size=\"14.00\">in</text>\n", - "</g>\n", - "<!-- E->D -->\n", - "<g id=\"edge14\" class=\"edge\"><title>E->D</title>\n", - "<path fill=\"none\" stroke=\"black\" d=\"M78.0466,-449.992C73.6173,-444.698 69.4737,-438.523 67.1304,-432 64.4259,-424.471 64.4259,-421.529 67.1304,-414 68.3387,-410.636 70.0256,-407.366 71.9835,-404.26\"/>\n", - "<polygon fill=\"black\" stroke=\"black\" points=\"74.9463,-406.139 78.0466,-396.008 69.3052,-401.994 74.9463,-406.139\"/>\n", - "<text text-anchor=\"middle\" x=\"87.4348\" y=\"-418.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- E->B -->\n", - "<g id=\"edge16\" class=\"edge\"><title>E->B</title>\n", - "<path fill=\"none\" stroke=\"black\" d=\"M74.991,-449.938C69.9108,-444.726 65.0673,-438.608 62,-432 24.927,-352.13 40.7417,-320.893 55,-234 55.4393,-231.323 56.0369,-228.568 56.728,-225.834\"/>\n", - "<polygon fill=\"black\" stroke=\"black\" points=\"60.095,-226.79 59.5248,-216.211 53.3731,-224.837 60.095,-226.79\"/>\n", - "<text text-anchor=\"middle\" x=\"59.4348\" y=\"-328.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- C->ROOT-NODE -->\n", - "<g id=\"edge10\" class=\"edge\"><title>C->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#473c8b\" d=\"M101.255,-269.771C110.014,-240.488 127.658,-179.019 138,-126 143.278,-98.9435 147.113,-67.6411 149.421,-45.9119\"/>\n", - "<polygon fill=\"#473c8b\" stroke=\"#473c8b\" points=\"152.921,-46.0899 150.46,-35.785 145.958,-45.3757 152.921,-46.0899\"/>\n", - "<text text-anchor=\"middle\" x=\"140.445\" y=\"-148.8\" font-family=\"Times,serif\" font-size=\"14.00\">in</text>\n", - "</g>\n", - "<!-- C->B -->\n", - "<g id=\"edge20\" class=\"edge\"><title>C->B</title>\n", - "<path fill=\"none\" stroke=\"black\" d=\"M73.655,-269.85C68.5813,-264.716 63.8814,-258.659 61.1304,-252 57.8195,-243.986 57.5904,-234.725 58.6285,-226.209\"/>\n", - "<polygon fill=\"black\" stroke=\"black\" points=\"62.081,-226.785 60.4014,-216.324 55.191,-225.549 62.081,-226.785\"/>\n", - "<text text-anchor=\"middle\" x=\"81.4348\" y=\"-238.8\" font-family=\"Times,serif\" font-size=\"14.00\">attacks</text>\n", - "</g>\n", - "<!-- A->ROOT-NODE -->\n", - "<g id=\"edge12\" class=\"edge\"><title>A->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#473c8b\" d=\"M52.5196,-89.5497C59.3302,-78.3 69.3507,-63.9648 81.1094,-54 90.1802,-46.313 101.229,-39.8208 111.879,-34.5948\"/>\n", - "<polygon fill=\"#473c8b\" stroke=\"#473c8b\" points=\"113.476,-37.7124 121.076,-30.3302 110.531,-31.362 113.476,-37.7124\"/>\n", - "<text text-anchor=\"middle\" x=\"87.4453\" y=\"-58.8\" font-family=\"Times,serif\" font-size=\"14.00\">in</text>\n", - "</g>\n", - "</g>\n", - "</svg>" - ], - "text/plain": [ - "<Dot visualization: state_as_graph []>" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":dot state_as_graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Influencing the Graphical Rendering\n", - "\n", - "One can influence the graphical representation of the current state in\n", - "various ways. The user can directly define nodes and edges of the graph\n", - "to be rendered. One way to do this is by adding the following lines\n", - "after the MACHINE section:\n", - "\n", - "~~~~\n", - "DEFINITIONS\n", - " CUSTOM_GRAPH_NODES == (in * {\"green\"}) \\/ (out * {\"red\"}) \\/ (undec * {\"orange\"});\n", - " CUSTOM_GRAPH_EDGES == attacks\n", - "~~~~\n", - "\n", - "These lines do not influence the meaning of the model; they are just\n", - "used by ProB. Indeed, one can then use the \"Current State as Custom\n", - "Graph\" command in the \"States\" submenu of the \"Visualise\" menu to\n", - "obtain the following rendering of the very first example above:" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: ArgumentationAsSets" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE ArgumentationAsSets\n", - "DEFINITIONS\n", - " CUSTOM_GRAPH_NODES == (in * {\"green\"}) \\/ (out * {\"red\"}) \\/ (undec * {\"orange\"});\n", - " CUSTOM_GRAPH_EDGES == attacks\n", - "SETS\n", - " ARGUMENTS={A,B,C,D,E}\n", - "CONSTANTS attacks, in,out,undec\n", - "PROPERTIES\n", - " attacks : ARGUMENTS <-> ARGUMENTS /* which argument attacks which other argument */\n", - " &\n", - " // we partition the arguments into three sets\n", - " ARGUMENTS = in \\/ out \\/ undec &\n", - " in /\\ out = {} & in /\\ undec = {} & out /\\ undec = {} &\n", - "\n", - " // if an argument is in, any attacker must be out:\n", - " attacks~[in] <: out &\n", - " // if an argument is in, anything it attacks must be out:\n", - " attacks[in] <: out &\n", - " //if an argument y is out, it must be attacked by a valid argument:\n", - " !y.(y:out => #x.(x|->y:attacks & x:in)) &\n", - " // if an argument y is undecided, it must be attacked by an undecided argument:\n", - " !y.(y:undec => #x.(x|->y:attacks & x:undec))\n", - "\n", - " &\n", - " // here we model one particular argumentation graph\n", - " // A = the sun will shine to day, B = we are in the UK, C = it is summer, D = there are only 10 days of sunshine per year, E = the BBC has forecast sun\n", - " attacks = {B|->A, C|->B, D|->C, E |-> B, E|->D}\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "|prj1|prj2|\n", - "|---|---|\n", - "|$\\mathit{B}$|$\\mathit{A}$|\n", - "|$\\mathit{C}$|$\\mathit{B}$|\n", - "|$\\mathit{D}$|$\\mathit{C}$|\n", - "|$\\mathit{E}$|$\\mathit{B}$|\n", - "|$\\mathit{E}$|$\\mathit{D}$|\n" - ], - "text/plain": [ - "prj1\tprj2\n", - "B\tA\n", - "C\tB\n", - "D\tC\n", - "E\tB\n", - "E\tD\n" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":table attacks" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", - "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", - " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", - "<!-- Generated by graphviz version 2.28.0 (20110509.1545)\n", - " -->\n", - "<!-- Title: prob_graph Pages: 1 -->\n", - "<svg width=\"540pt\" height=\"717pt\"\n", - " viewBox=\"0.00 0.00 540.00 717.37\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", - "<g id=\"graph1\" class=\"graph\" transform=\"scale(0.985401 0.985401) rotate(0) translate(4 724)\">\n", - "<title>prob_graph</title>\n", - "<polygon fill=\"white\" stroke=\"white\" points=\"-4,5 -4,-724 545,-724 545,5 -4,5\"/>\n", - "<!-- 0 -->\n", - "<g id=\"node1\" class=\"node\"><title>0</title>\n", - "<polygon fill=\"green\" stroke=\"green\" points=\"195.034,-52 141.034,-52 141.034,-16 195.034,-16 195.034,-52\"/>\n", - "<text text-anchor=\"middle\" x=\"168.034\" y=\"-30.4\" font-family=\"Times,serif\" font-size=\"12.00\">A</text>\n", - "</g>\n", - "<!-- 1 -->\n", - "<g id=\"node2\" class=\"node\"><title>1</title>\n", - "<polygon fill=\"red\" stroke=\"red\" points=\"195.034,-215 141.034,-215 141.034,-179 195.034,-179 195.034,-215\"/>\n", - "<text text-anchor=\"middle\" x=\"168.034\" y=\"-193.4\" font-family=\"Times,serif\" font-size=\"12.00\">B</text>\n", - "</g>\n", - "<!-- 1->0 -->\n", - "<g id=\"edge2\" class=\"edge\"><title>1->0</title>\n", - "<path fill=\"none\" stroke=\"blue\" d=\"M168.034,-178.77C168.034,-150.929 168.034,-95.8132 168.034,-62.4976\"/>\n", - "<polygon fill=\"blue\" stroke=\"blue\" points=\"171.535,-62.1059 168.034,-52.1059 164.535,-62.106 171.535,-62.1059\"/>\n", - "<text text-anchor=\"middle\" x=\"184.693\" y=\"-112.4\" font-family=\"Times,serif\" font-size=\"12.00\">attacks</text>\n", - "</g>\n", - "<!-- 2 -->\n", - "<g id=\"node3\" class=\"node\"><title>2</title>\n", - "<polygon fill=\"green\" stroke=\"green\" points=\"399.034,-378 345.034,-378 345.034,-342 399.034,-342 399.034,-378\"/>\n", - "<text text-anchor=\"middle\" x=\"372.034\" y=\"-356.4\" font-family=\"Times,serif\" font-size=\"12.00\">C</text>\n", - "</g>\n", - "<!-- 2->1 -->\n", - "<g id=\"edge4\" class=\"edge\"><title>2->1</title>\n", - "<path fill=\"none\" stroke=\"blue\" d=\"M350.203,-341.77C313.469,-312.779 239.262,-254.214 197.791,-221.484\"/>\n", - "<polygon fill=\"blue\" stroke=\"blue\" points=\"199.727,-218.554 189.709,-215.106 195.391,-224.049 199.727,-218.554\"/>\n", - "<text text-anchor=\"middle\" x=\"292.693\" y=\"-275.4\" font-family=\"Times,serif\" font-size=\"12.00\">attacks</text>\n", - "</g>\n", - "<!-- 3 -->\n", - "<g id=\"node4\" class=\"node\"><title>3</title>\n", - "<polygon fill=\"red\" stroke=\"red\" points=\"399.034,-541 345.034,-541 345.034,-505 399.034,-505 399.034,-541\"/>\n", - "<text text-anchor=\"middle\" x=\"372.034\" y=\"-519.4\" font-family=\"Times,serif\" font-size=\"12.00\">D</text>\n", - "</g>\n", - "<!-- 3->2 -->\n", - "<g id=\"edge6\" class=\"edge\"><title>3->2</title>\n", - "<path fill=\"none\" stroke=\"blue\" d=\"M372.034,-504.77C372.034,-476.929 372.034,-421.813 372.034,-388.498\"/>\n", - "<polygon fill=\"blue\" stroke=\"blue\" points=\"375.535,-388.106 372.034,-378.106 368.535,-388.106 375.535,-388.106\"/>\n", - "<text text-anchor=\"middle\" x=\"388.693\" y=\"-437.4\" font-family=\"Times,serif\" font-size=\"12.00\">attacks</text>\n", - "</g>\n", - "<!-- 4 -->\n", - "<g id=\"node5\" class=\"node\"><title>4</title>\n", - "<polygon fill=\"green\" stroke=\"green\" points=\"195.034,-704 141.034,-704 141.034,-668 195.034,-668 195.034,-704\"/>\n", - "<text text-anchor=\"middle\" x=\"168.034\" y=\"-682.4\" font-family=\"Times,serif\" font-size=\"12.00\">E</text>\n", - "</g>\n", - "<!-- 4->1 -->\n", - "<g id=\"edge8\" class=\"edge\"><title>4->1</title>\n", - "<path fill=\"none\" stroke=\"blue\" d=\"M168.034,-667.953C168.034,-595.713 168.034,-314.467 168.034,-225.288\"/>\n", - "<polygon fill=\"blue\" stroke=\"blue\" points=\"171.535,-225.161 168.034,-215.161 164.535,-225.161 171.535,-225.161\"/>\n", - "<text text-anchor=\"middle\" x=\"184.693\" y=\"-437.4\" font-family=\"Times,serif\" font-size=\"12.00\">attacks</text>\n", - "</g>\n", - "<!-- 4->3 -->\n", - "<g id=\"edge10\" class=\"edge\"><title>4->3</title>\n", - "<path fill=\"none\" stroke=\"blue\" d=\"M189.866,-667.77C226.6,-638.779 300.807,-580.214 342.278,-547.484\"/>\n", - "<polygon fill=\"blue\" stroke=\"blue\" points=\"344.678,-550.049 350.36,-541.106 340.342,-544.554 344.678,-550.049\"/>\n", - "<text text-anchor=\"middle\" x=\"292.693\" y=\"-600.4\" font-family=\"Times,serif\" font-size=\"12.00\">attacks</text>\n", - "</g>\n", - "</g>\n", - "</svg>" - ], - "text/plain": [ - "<Dot visualization: custom_graph []>" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":dot custom_graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## An Event-B Version of the Model\n", - "\n", - "Instead of using ProB Tcl/Tk you can also encode this model in Rodin,\n", - "the Eclipse-based platform for Event-B.\n", - "\n", - "Here we have split the model into two contexts. The first one encodes\n", - "the general rules for labelling (we use Camille syntax):\n", - "\n", - "~~~~\n", - "context ArgumentsAsSets\n", - "sets ARGUMENTS\n", - "constants attacks in out undec\n", - "axioms\n", - " @axm1 attacks ∈ ARGUMENTS ↔ ARGUMENTS // which argument attacks which other argument\n", - " @axm2 partition(ARGUMENTS,in,out,undec) // we partition the arguments into three sets\n", - " @axm3 attacks∼[in] ⊆ out // if an argument is in, any attacker must be out\n", - " @axm4 attacks[in] ⊆ out // if an argument is in, anything it attacks must be out\n", - " @axm5 ∀y·(y∈out ⇒ ∃x·(x↦y∈attacks ∧ x∈in)) //if an argument y is out, it must be attacked by a valid argument\n", - " @axm6 ∀y·(y∈undec ⇒ ∃x·(x↦y∈attacks ∧ x∈undec)) // if an argument y is undecided, it must be attacked by an undecided argument\n", - "end\n", - "~~~~\n", - "\n", - "A second context then extends the above one, and encodes our particular\n", - "problem instance:\n", - "\n", - "~~~~\n", - "context Arguments_Example extends ArgumentsAsSets\n", - "constants A B C D E\n", - "axioms\n", - " @part partition(ARGUMENTS,{A},{B},{C},{D},{E})\n", - " @example attacks = {B↦A, C↦B, D↦C, E ↦ B, E↦D}\n", - " /* A = the sun will shine to day, B = we are in the UK\n", - " C = it is summer, D = there are only 10 days of sunshine per year, E = the BBC has forecast sun */\n", - "end\n", - "~~~~\n", - "\n", - "If you load this model with ProB for Rodin, you can see the solution in the State view:\n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ProB 2", - "language": "prob", - "name": "prob2" - }, - "language_info": { - "codemirror_mode": "prob2_jupyter_repl", - "file_extension": ".prob", - "mimetype": "text/x-prob2-jupyter-repl", - "name": "prob" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/Bridges_Puzzle-checkpoint.ipynb b/.ipynb_checkpoints/Bridges_Puzzle-checkpoint.ipynb deleted file mode 100644 index 4c917ef35a1aefb80321e7b17c55ced28713137b..0000000000000000000000000000000000000000 --- a/.ipynb_checkpoints/Bridges_Puzzle-checkpoint.ipynb +++ /dev/null @@ -1,484 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Bridges Puzzle (Hashiwokakero)\n", - "\n", - "Use `:help` to get an overview for the jupyter notebook commands. If you need more insight on how to use this tool, consider reading *ProB Jupyter Notebook Overview*.\n", - "\n", - "The [Hashiwokakero](https://en.wikipedia.org/wiki/Hashiwokakero) Puzzle is a logical puzzle where one has to build bridges between islands. The puzzle is also known under the name Ai-Ki-Ai. The puzzles can also be [played online](http://www.puzzle-bridges.com).\n", - "\n", - "The requirements for this puzzle are as follows:\n", - "\n", - "* the goal is to build bridges between islands so as to generate a connected graph\n", - "* every island has a number on it, indicating exactly how many bridges should be linked with the island\n", - "* there is an upper bound (MAXBRIDGES) on the number of bridges that can be built-between two islands\n", - "* bridges cannot cross each other\n", - "\n", - "A B model for this puzzle can be found below. The constants and sets of the model are as follows:\n", - "\n", - "* N are the nodes (islands); we have added a constant ignore where one can stipulate which islands should be ignored in this puzzle\n", - "* nl (number of links) stipulates for each island how many bridges it should be linked with\n", - "* xc, yc are the x- and y-coordinates for every island\n", - "\n", - "A simple puzzle with four islands would be defined as follows, assuming\n", - "the basic set N is defined as `N = {a,b,c,d,e,f,g,h,i,j,k,l,m,n}`:\n", - "\n", - "~~~~\n", - " xc(a)=0 & xc(b)=1 & xc(c)=0 & xc(d) = 1 &\n", - " yc(a)=0 & yc(b)=0 & yc(c)=1 & yc(d) = 1 &\n", - " nl = {a|->2, b|->2, c|->2, d|->2} &\n", - " ignore = {e,f,g,h,i,j,k,l,m,n}\n", - "~~~~\n", - "\n", - "Below we will use a more complicated puzzle to illustrate the B model.\n", - "\n", - "The model then contains the following derived constants:\n", - "\n", - "* plx,ply: the possible links between islands on the x- and y-axis respectively\n", - "* pl: the possible links both on the x- and y-axis combined\n", - "* cs: the conflict set of links which overlap, i.e., one cannot build bridges on both links (a,b) when the pair (a,b) is in cs\n", - "* connected: the set of links on which at least one bridge was built\n", - "\n", - "The model also sets up the goal constant `sol` which maps every link in `pl` to a number indicating how many bridges are built on it. The model also stipulates that the graph set up by connected generates a fully connected graph." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: Bridges" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load DOT=/usr/bin/dot\n", - "MACHINE Bridges\n", - "DEFINITIONS\n", - " MAXBRIDGES==2;\n", - " LINKS == 1..(MAXBRIDGES*4);\n", - " COORD == 0..10;\n", - " p1 == prj1(nodes,nodes);\n", - " p2 == prj2(nodes,nodes);\n", - " p1i == prj1(nodes,INTEGER)\n", - "SETS\n", - " N = {a,b,c,d,e,f,g,h,i,j,k,l,m,n}\n", - "CONSTANTS nodes, ignore, nl, xc,yc, plx,ply,pl, cs, sol, connected\n", - "PROPERTIES\n", - " nodes = N \\ ignore &\n", - " // target number of links per node:\n", - " nl : nodes --> LINKS & /* number of links */\n", - "\n", - "// coordinates of nodes\n", - " xc: nodes --> COORD & yc: nodes --> COORD &\n", - "\n", - "// possible links:\n", - " pl : nodes <-> nodes &\n", - " plx : nodes <-> nodes &\n", - " ply : nodes <-> nodes &\n", - "\n", - " plx = {n1,n2 | xc(n1)=xc(n2) & n1 /= n2 & yc(n2)>yc(n1) &\n", - " !n3.(xc(n3)=xc(n1) => yc(n3) /: yc(n1)+1..yc(n2)-1) } &\n", - " ply = {n1,n2 | yc(n1)=yc(n2) & n1 /= n2 & xc(n2)>xc(n1) &\n", - " !n3.(yc(n3)=yc(n1) => xc(n3) /: xc(n1)+1..xc(n2)-1)} &\n", - " pl = plx \\/ ply &\n", - " \n", - "// compute conflict set (assumes xc,yc coordinates ordered in plx,ply)\n", - "cs = {pl1,pl2 | pl1:plx & pl2:ply &\n", - " xc(p1(pl1)): xc(p1(pl2))+1..xc(p2(pl2))-1 &\n", - " yc(p1(pl2)): yc(p1(pl1))+1..yc(p2(pl1))-1} &\n", - "\n", - "sol : pl --> 0..MAXBRIDGES &\n", - "!nn.(nn:nodes => SIGMA(l).(l:pl &\n", - " (p1(l)=nn or p2(l)=nn)|sol(l))=nl(nn)) &\n", - "\n", - "!(pl1,pl2).( (pl1,pl2):cs => sol(pl1)=0 or sol(pl2)=0) & // no conflicts\n", - "\n", - "// check graph connected\n", - " connected = {pl|sol(pl)>0} &\n", - " closure1(connected \\/ connected~)[{a}] = {nn|nn:nodes & nl(nn)>0} &\n", - " \n", - "// encoding of puzzle\n", - "// A puzzle from bridges.png\n", - " xc(a)=1 & yc(a)=1 & nl(a)=4 &\n", - " xc(b)=1 & yc(b)=4 & nl(b)=6 &\n", - " xc(c)=1 & yc(c)=6 & nl(c)=3 &\n", - "\n", - " xc(d)=2 & yc(d)=2 & nl(d)=1 &\n", - " xc(e)=2 & yc(e)=5 & nl(e)=2 &\n", - "\n", - " xc(f)=3 & yc(f)=2 & nl(f)=4 &\n", - " xc(g)=3 & yc(g)=4 & nl(g)=6 &\n", - " xc(h)=3 & yc(h)=5 & nl(h)=4 &\n", - "\n", - " xc(i)=4 & yc(i)=3 & nl(i)=3 &\n", - " xc(j)=4 & yc(j)=6 & nl(j)=3 &\n", - "\n", - " xc(k)=5 & yc(k)=2 & nl(k)=1 &\n", - "\n", - " xc(l)=6 & yc(l)=1 & nl(l)=4 &\n", - " xc(m)=6 & yc(m)=3 & nl(m)=5 &\n", - " xc(n)=6 & yc(n)=5 & nl(n)=2 &\n", - " ignore = {}\n", - "\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After setting the constants and initialising the machine with the above commands, one can see that the solution for this puzzle, which is saved in `sol`, is the following:\n", - "\n", - "(Simply type in `sol` to get the value for it.)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\{(\\mathit{a}\\mapsto \\mathit{b}\\mapsto 2),(\\mathit{a}\\mapsto \\mathit{l}\\mapsto 2),(\\mathit{b}\\mapsto \\mathit{c}\\mapsto 2),(\\mathit{b}\\mapsto \\mathit{g}\\mapsto 2),(\\mathit{c}\\mapsto \\mathit{j}\\mapsto 1),(\\mathit{d}\\mapsto \\mathit{e}\\mapsto 0),(\\mathit{d}\\mapsto \\mathit{f}\\mapsto 1),(\\mathit{e}\\mapsto \\mathit{h}\\mapsto 2),(\\mathit{f}\\mapsto \\mathit{g}\\mapsto 2),(\\mathit{f}\\mapsto \\mathit{k}\\mapsto 1),(\\mathit{g}\\mapsto \\mathit{h}\\mapsto 2),(\\mathit{h}\\mapsto \\mathit{n}\\mapsto 0),(\\mathit{i}\\mapsto \\mathit{j}\\mapsto 2),(\\mathit{i}\\mapsto \\mathit{m}\\mapsto 1),(\\mathit{l}\\mapsto \\mathit{m}\\mapsto 2),(\\mathit{m}\\mapsto \\mathit{n}\\mapsto 2)\\}$" - ], - "text/plain": [ - "{(a↦b↦2),(a↦l↦2),(b↦c↦2),(b↦g↦2),(c↦j↦1),(d↦e↦0),(d↦f↦1),(e↦h↦2),(f↦g↦2),(f↦k↦1),(g↦h↦2),(h↦n↦0),(i↦j↦2),(i↦m↦1),(l↦m↦2),(m↦n↦2)}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sol" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Adding Graphical Visualisation\n", - "\n", - "To show the solution graphically, we can add the following to the\n", - "`DEFINITIONS` clause in the model:\n", - "\n", - "~~~~\n", - " CUSTOM_GRAPH_NODES == {n,w,w2|(n|->w):nl & w=w2}; // %n1.(n1:nodes|nl(n1));\n", - " CUSTOM_GRAPH_EDGES == {n1,w,n2|n1:nl & n2:nl & (p1i(n1),p1i(n2),w):sol}\n", - "~~~~" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: Bridges" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE Bridges\n", - "DEFINITIONS\n", - " MAXBRIDGES==2;\n", - " LINKS == 1..(MAXBRIDGES*4);\n", - " COORD == 0..10;\n", - " p1 == prj1(nodes,nodes);\n", - " p2 == prj2(nodes,nodes);\n", - " p1i == prj1(nodes,INTEGER);\n", - " CUSTOM_GRAPH_NODES == {n,w,w2|(n|->w):nl & w=w2}; // %n1.(n1:nodes|nl(n1));\n", - " CUSTOM_GRAPH_EDGES == {n1,w,n2|n1:nl & n2:nl & (p1i(n1),p1i(n2),w):sol}\n", - "SETS\n", - " N = {a,b,c,d,e,f,g,h,i,j,k,l,m,n}\n", - "CONSTANTS nodes, ignore, nl, xc,yc, plx,ply,pl, cs, sol, connected\n", - "PROPERTIES\n", - " nodes = N \\ ignore &\n", - " // target number of links per node:\n", - " nl : nodes --> LINKS & /* number of links */\n", - "\n", - "// coordinates of nodes\n", - " xc: nodes --> COORD & yc: nodes --> COORD &\n", - "\n", - "// possible links:\n", - " pl : nodes <-> nodes &\n", - " plx : nodes <-> nodes &\n", - " ply : nodes <-> nodes &\n", - "\n", - " plx = {n1,n2 | xc(n1)=xc(n2) & n1 /= n2 & yc(n2)>yc(n1) &\n", - " !n3.(xc(n3)=xc(n1) => yc(n3) /: yc(n1)+1..yc(n2)-1) } &\n", - " ply = {n1,n2 | yc(n1)=yc(n2) & n1 /= n2 & xc(n2)>xc(n1) &\n", - " !n3.(yc(n3)=yc(n1) => xc(n3) /: xc(n1)+1..xc(n2)-1)} &\n", - " pl = plx \\/ ply &\n", - " \n", - "// compute conflict set (assumes xc,yc coordinates ordered in plx,ply)\n", - "cs = {pl1,pl2 | pl1:plx & pl2:ply &\n", - " xc(p1(pl1)): xc(p1(pl2))+1..xc(p2(pl2))-1 &\n", - " yc(p1(pl2)): yc(p1(pl1))+1..yc(p2(pl1))-1} &\n", - "\n", - "sol : pl --> 0..MAXBRIDGES &\n", - "!nn.(nn:nodes => SIGMA(l).(l:pl &\n", - " (p1(l)=nn or p2(l)=nn)|sol(l))=nl(nn)) &\n", - "\n", - "!(pl1,pl2).( (pl1,pl2):cs => sol(pl1)=0 or sol(pl2)=0) & // no conflicts\n", - "\n", - "// check graph connected\n", - " connected = {pl|sol(pl)>0} &\n", - " closure1(connected \\/ connected~)[{a}] = {nn|nn:nodes & nl(nn)>0} &\n", - " \n", - "// encoding of puzzle\n", - "// A puzzle from bridges.png\n", - " xc(a)=1 & yc(a)=1 & nl(a)=4 &\n", - " xc(b)=1 & yc(b)=4 & nl(b)=6 &\n", - " xc(c)=1 & yc(c)=6 & nl(c)=3 &\n", - "\n", - " xc(d)=2 & yc(d)=2 & nl(d)=1 &\n", - " xc(e)=2 & yc(e)=5 & nl(e)=2 &\n", - "\n", - " xc(f)=3 & yc(f)=2 & nl(f)=4 &\n", - " xc(g)=3 & yc(g)=4 & nl(g)=6 &\n", - " xc(h)=3 & yc(h)=5 & nl(h)=4 &\n", - "\n", - " xc(i)=4 & yc(i)=3 & nl(i)=3 &\n", - " xc(j)=4 & yc(j)=6 & nl(j)=3 &\n", - "\n", - " xc(k)=5 & yc(k)=2 & nl(k)=1 &\n", - "\n", - " xc(l)=6 & yc(l)=1 & nl(l)=4 &\n", - " xc(m)=6 & yc(m)=3 & nl(m)=5 &\n", - " xc(n)=6 & yc(n)=5 & nl(n)=2 &\n", - " ignore = {}\n", - "\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One can then initialise the model, as above and the execute the command `:dot custom_graph`. This leads to the following picture:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "ename": "ProBError", - "evalue": "Prolog said no.\nProB returned error messages:\nError: Could not execute command \"/usr/bin/dot\" due to exception: 'Could not access file:'('/usr/bin/dot')", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mProlog said no.\u001b[0m", - "\u001b[1m\u001b[31mError: Could not execute command \"/usr/bin/dot\" due to exception: 'Could not access file:'('/usr/bin/dot')\u001b[0m" - ] - } - ], - "source": [ - ":dot custom_graph" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "ename": "IndexOutOfBoundsException", - "evalue": "Index: 0, Size: 0", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31mjava.lang.IndexOutOfBoundsException: Index: 0, Size: 0\u001b[0m" - ] - } - ], - "source": [ - ":dot " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ProB CLI: 1.9.1-nightly (e1c6b13036a30115e0fea4fc880887b737b82ce4)\n", - "ProB 2: 3.2.12-SNAPSHOT (e73f14155d2b248b99097801ddddfab206c4cf2b)" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":version" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "ename": "ProBError", - "evalue": "Prolog said no.\nProB returned error messages:\nError: Could not execute command \"/usr/bin/dot\" due to exception: 'Could not access file:'('/usr/bin/dot')", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mProlog said no.\u001b[0m", - "\u001b[1m\u001b[31mError: Could not execute command \"/usr/bin/dot\" due to exception: 'Could not access file:'('/usr/bin/dot')\u001b[0m" - ] - } - ], - "source": [ - ":dot custom_graph" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DOT = /usr/bin/dot\n" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":pref DOT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ProB 2", - "language": "prob", - "name": "prob2" - }, - "language_info": { - "codemirror_mode": "prob2_jupyter_repl", - "file_extension": ".prob", - "mimetype": "text/x-prob2-jupyter-repl", - "name": "prob" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/Cheryls_Birthday-checkpoint.ipynb b/.ipynb_checkpoints/Cheryls_Birthday-checkpoint.ipynb deleted file mode 100644 index 060f25fa66e878ca6fab0fe7c1de86a19aa91951..0000000000000000000000000000000000000000 --- a/.ipynb_checkpoints/Cheryls_Birthday-checkpoint.ipynb +++ /dev/null @@ -1,404 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Cheryl's Birthday\n", - "\n", - "This Puzzle is a variation of another Puzzle (Sum and Product) and has\n", - "been described\n", - "in a New York Times article(http://www.nytimes.com/2015/04/15/science/a-math-problem-from-singapore-goes-viral-when-is-cheryls-birthday.html).\n", - "\n", - "Here is a first solution in B, where the text of the puzzle has been\n", - "integrated as comments. There are almost certainly more elegant\n", - "encodings of the problem in B.\n", - "\n", - "In case you are new to B, you probably need to know the following\n", - "operators to understand the specification below (we als have a\n", - "<<summary-of-b-syntax,summary page about the B syntax>>):\n", - "\n", - "* `x : S` specifies that x is an element of S\n", - "* `dom(r)` is the domain of a function or relation r\n", - "* `r~` is the inverse of a function or relation r\n", - "* `r[S]` is the relational image of a relation r for a set of domain values S\n", - "* `card(S)` is the cardinality of a set S\n", - "* `a|->b` represents the pair (a,b); note that a relation and function in B is a set of pairs.\n", - "* `!x.(P => Q)` denotes universal quantification over variable x\n", - "\n", - "In case you are new to using the jupyter notebook, simply type in `:help` to get an overview over the full range of options you have with the ProB core." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: CherylsBirthday" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE CherylsBirthday\n", - "/* A simplified version of the SumProduct Puzzle taken from\n", - " http://www.nytimes.com/2015/04/15/science/a-math-problem-from-singapore-goes-viral-when-is-cheryls-birthday.html\n", - "*/\n", - "DEFINITIONS\n", - " DontKnowFromDay(PossDates,KDay) == card(PossDates~[{KDay}]) > 1;\n", - " KnowFromDay(PossDates,KDay) == card(PossDates~[{KDay}]) = 1\n", - "CONSTANTS Month, Day, PD, PD2\n", - "PROPERTIES\n", - " /* Albert and Bernard just met Cheryl. “When’s your birthday?” Albert asked Cheryl.*/\n", - " Month:STRING & Day:1..31 &\n", - "\n", - " /* Cheryl thought a second and said, “I’m not going to tell you, but I’ll give you some clues.” She wrote down a list of 10 dates: */\n", - " PD = {(\"aug\"|->14),(\"aug\"|->15),(\"aug\"|->17),\n", - " (\"july\"|->14),(\"july\"|->16),(\"june\"|->17),(\"june\"|->18),\n", - " (\"may\"|->15),(\"may\"|->16),(\"may\"|->19)}\n", - " &\n", - " /*\n", - "Then Cheryl whispered in Albert’s ear the month — and only the month — of her birthday.\n", - "To Bernard, she whispered the day, and only the day.\n", - "*/\n", - " Month : dom(PD) &\n", - " Day : ran(PD) &\n", - " Month|->Day : PD &\n", - "\n", - " /* Albert: I don’t know when your birthday is, */\n", - " card(PD[{Month}]) > 1 &\n", - " /* but I know Bernard doesn’t know, either. */\n", - " !x.(x:PD[{Month}] => DontKnowFromDay(PD,x) ) &\n", - "\n", - " /* Bernard: I didn’t know originally, */\n", - " DontKnowFromDay(PD,Day) &\n", - " /* but now I do. */\n", - " PD2 = {m,d| (m|->d):PD & !x.(x:PD[{m}] => DontKnowFromDay(PD,x) ) } &\n", - " KnowFromDay(PD2,Day) &\n", - "\n", - " /* Albert: Well, now I know, too! */\n", - " card({d|Month|->d : PD2 & KnowFromDay(PD2,d)})=1\n", - "\n", - "ASSERTIONS /* single solution found by ProB */\n", - " Month = \"july\";\n", - " Day = 16\n", - "END" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After loading this B machine, you will see that there is only a single solution (solving time 20-30 ms) : `Month = \"july\"` and `Day = 16`.\n", - "\n", - "With jupyter notebook, you have to type in `:constants` to set up the models constants. \n", - "After doing that, you can use `:init` to initialise your machine." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can check for the solution simply by typing in `Month` and `Day`. You will see, there is only one solution for this problem." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\text{\"july\"}$" - ], - "text/plain": [ - "\"july\"" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Month" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$16$" - ], - "text/plain": [ - "16" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Day" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using an enumerated set\n", - "\n", - "It is possible to use an enumerated set for the Months. One simply has to add:\n", - "\n", - "~~~~\n", - "SETS MONTHS = {may, june, july, aug, sep}\n", - "~~~~\n", - "\n", - "change the definition of the possible dates:\n", - "\n", - "~~~~\n", - "PD = {(aug|->14), (aug|->15), (aug|->17),\n", - " (july|->14),(july|->16),(june|->17),\n", - " (june|->18),\n", - " (may|->15),(may|->16),(may|->19)}\n", - "~~~~\n", - "\n", - "and change the type of Month to `MONTHS`. This possible solution makes the constraint solving via ProB marginally faster." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: CherylsBirthday" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE CherylsBirthday\n", - "/* A simplified version of the SumProduct Puzzle taken from\n", - " http://www.nytimes.com/2015/04/15/science/a-math-problem-from-singapore-goes-viral-when-is-cheryls-birthday.html\n", - "*/\n", - "DEFINITIONS\n", - " DontKnowFromDay(PossDates,KDay) == card(PossDates~[{KDay}]) > 1;\n", - " KnowFromDay(PossDates,KDay) == card(PossDates~[{KDay}]) = 1\n", - "SETS \n", - " MONTHS = {may, june, july, aug, sep}\n", - "CONSTANTS Month, Day, PD, PD2\n", - "PROPERTIES\n", - " /* Albert and Bernard just met Cheryl. “When’s your birthday?” Albert asked Cheryl.*/\n", - " Month:MONTHS & Day:1..31 &\n", - "\n", - " /* Cheryl thought a second and said, “I’m not going to tell you, but I’ll give you some clues.” She wrote down a list of 10 dates: */\n", - " PD = {(aug|->14), (aug|->15), (aug|->17),\n", - " (july|->14),(july|->16),(june|->17),\n", - " (june|->18),\n", - " (may|->15),(may|->16),(may|->19)}\n", - " &\n", - " /*\n", - "Then Cheryl whispered in Albert’s ear the month — and only the month — of her birthday.\n", - "To Bernard, she whispered the day, and only the day.\n", - "*/\n", - " Month : dom(PD) &\n", - " Day : ran(PD) &\n", - " Month|->Day : PD &\n", - "\n", - " /* Albert: I don’t know when your birthday is, */\n", - " card(PD[{Month}]) > 1 &\n", - " /* but I know Bernard doesn’t know, either. */\n", - " !x.(x:PD[{Month}] => DontKnowFromDay(PD,x) ) &\n", - "\n", - " /* Bernard: I didn’t know originally, */\n", - " DontKnowFromDay(PD,Day) &\n", - " /* but now I do. */\n", - " PD2 = {m,d| (m|->d):PD & !x.(x:PD[{m}] => DontKnowFromDay(PD,x) ) } &\n", - " KnowFromDay(PD2,Day) &\n", - "\n", - " /* Albert: Well, now I know, too! */\n", - " card({d|Month|->d : PD2 & KnowFromDay(PD2,d)})=1\n", - "\n", - "ASSERTIONS /* single solution found by ProB */\n", - " Month = july;\n", - " Day = 16\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One will get one possible solution with this code as well. By typing in `Month` and `Day` again, it is possible to check this." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\mathit{july}$" - ], - "text/plain": [ - "july" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Month" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$16$" - ], - "text/plain": [ - "16" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Day" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ProB 2", - "language": "prob", - "name": "prob2" - }, - "language_info": { - "codemirror_mode": "prob2_jupyter_repl", - "file_extension": ".prob", - "mimetype": "text/x-prob2-jupyter-repl", - "name": "prob" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/N_Queens-checkpoint.ipynb b/.ipynb_checkpoints/N_Queens-checkpoint.ipynb deleted file mode 100644 index 99041d2233fa2a447d2001c435eb5a7de2ec7ada..0000000000000000000000000000000000000000 --- a/.ipynb_checkpoints/N_Queens-checkpoint.ipynb +++ /dev/null @@ -1,1893 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# N-Queens\n", - "\n", - "The N-Queens is a famous constraint solving benchmark puzzle. It is a generalisation of the original [eight queens puzzle](https://en.wikipedia.org/wiki/Eight_queens_puzzle), where the goal is to place eight queens on a 8*8 chessboard so that no two queens attach each other.\n", - "\n", - "Here is one way to encode the N-Queens puzzle in B.\n", - "\n", - "If you are new to using jupyter notebook with the ProB kernel, just try typing in `:help`. This will give you an overview for your options on interacting with the machine." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: NQueens" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE NQueens\n", - "CONSTANTS n,queens\n", - "PROPERTIES\n", - " n = 40 &\n", - " queens : 1..n >-> 1..n /* for each column the row in which the queen is in */\n", - " &\n", - " !(q1,q2).(q1:1..n & q2:2..n & q2>q1\n", - " => queens(q1)+q2-q1 /= queens(q2) & queens(q1)-q2+q1 /= queens(q2))\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One can use graphical visualisation features to display the solution, by declaring the ANIMATION_FUNCTION. With the `:show` command from the jupyter kernel you can see the results of the N-Queens problem for yourself.\n", - "\n", - "Please note, that the image paths given in the DEFINITIONS have to be relative to the jupyter notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: NQueens40" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MACHINE NQueens40\n", - "CONSTANTS n,queens\n", - "PROPERTIES\n", - " n = 40 &\n", - " queens : 1..n >-> 1..n /* for each column the row in which the queen is in */\n", - " &\n", - " !(q1,q2).(q1:1..n & q2:2..n & q2>q1\n", - " => queens(q1)+q2-q1 /= queens(q2) & queens(q1)-q2+q1 /= queens(q2))\n", - "DEFINITIONS\n", - " ANIMATION_FUNCTION_DEFAULT == ( {r,c,i|r:1..n & c:1..n & i=(r+c) mod 2 } );\n", - " ANIMATION_FUNCTION == ( {r,c,i|c:1..n & r=queens(c) & i=2+((r+c) mod 2) } );\n", - " ANIMATION_IMG0 == \"images/sm_empty_box.gif\";\n", - " ANIMATION_IMG1 == \"images/sm_gray_box.gif\";\n", - " ANIMATION_IMG2 == \"images/sm_queen_white.gif\";\n", - " ANIMATION_IMG3 == \"images/sm_queen_black.gif\";\n", - " SET_PREF_CLPFD == TRUE;\n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/sm_queen_black.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/sm_queen_white.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/sm_gray_box.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/sm_empty_box.gif\"/></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ProB 2", - "language": "prob", - "name": "prob2" - }, - "language_info": { - "codemirror_mode": "prob2_jupyter_repl", - "file_extension": ".prob", - "mimetype": "text/x-prob2-jupyter-repl", - "name": "prob" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/ProB_Jupyter_Notebook_Overview-checkpoint.ipynb b/.ipynb_checkpoints/ProB_Jupyter_Notebook_Overview-checkpoint.ipynb deleted file mode 100644 index bb1e4eacf5d5cbcb4041718cd78a82d7be076b78..0000000000000000000000000000000000000000 --- a/.ipynb_checkpoints/ProB_Jupyter_Notebook_Overview-checkpoint.ipynb +++ /dev/null @@ -1,2475 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ProB2 Jupyter Notebook Overview\n", - "\n", - "In this jupyter notebook we want to give you an overview over the functionalities of the ProB2 Jupyter Notebook.\n", - "For this purpose, we will take a look at the simple machine `Lift.mch` taken from the [ProB Public Examples](https://www3.hhu.de/stups/downloads/prob/source/)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The Help Command\n", - "\n", - "If you want to find out more about the commands and how to use them, type in `:help [COMMAND]`. The ProB2 Jupyter Notebook has an autocompletion function which also helps you to find what you need. Simply press `TAB` after the space after `:help`." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":help [COMMAND]\n", - "```\n", - "\n", - "Display help for a specific command, or general help about the REPL." - ], - "text/plain": [ - ":help [COMMAND]\n", - "Display help for a specific command, or general help about the REPL." - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Loading a Machine\n", - "\n", - "To start of with the ProB Jupyter Kernel, we have to load a machine. This can be done by typing `::load` in a Code cell before the machine code and pressing `Shift+Enter`." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - "::load [PREF=VALUE ...]\n", - "MACHINE\n", - "...\n", - "END\n", - "```\n", - "\n", - "Load the machine source code given in the cell body.\n", - "\n", - "There must be a newline between the `::load` command name and the machine code.\n", - "\n", - "Any number of preference assignments may be included after `::load` (only on the first line). Preferences can also be changed on a loaded machine using the `:pref` command, however certain preferences do not take full effect when set using `:pref` and must be set when the machine is loaded." - ], - "text/plain": [ - "::load [PREF=VALUE ...]\n", - "MACHINE\n", - "...\n", - "END\n", - "Load the machine source code given in the cell body.\n", - "\n", - "There must be a newline between the `::load` command name and the machine code.\n", - "\n", - "Any number of preference assignments may be included after `::load` (only on the first line). Preferences can also be changed on a loaded machine using the `:pref` command, however certain preferences do not take full effect when set using `:pref` and must be set when the machine is loaded." - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help ::load" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: Lift" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load DOT=/usr/bin/dot\n", - "MODEL Lift\n", - "DEFINITIONS SET_PREF_SHOW_EVENTB_ANY_VALUES==TRUE;\n", - " ASSERT_LTL == \"G( [push_call_button(groundf)] => F {cur_floor=groundf & door_open=TRUE})\";\n", - " Rconv == (topf-r+groundf);\n", - "CONSTANTS groundf,topf\n", - "PROPERTIES\n", - " topf : INTEGER & groundf : INTEGER & (groundf = -1) & (topf = 2) & (groundf < topf)\n", - "VARIABLES call_buttons,cur_floor,direction_up,door_open\n", - "INVARIANT\n", - " cur_floor : (groundf .. topf) & \n", - " door_open : BOOL & \n", - " call_buttons : POW(groundf .. topf) &\n", - " direction_up : BOOL &\n", - " (door_open = TRUE => cur_floor : call_buttons)\n", - "INITIALISATION cur_floor := (groundf) || door_open := FALSE || call_buttons := ({}) || direction_up := TRUE\n", - "OPERATIONS\n", - " move_up = SELECT door_open = FALSE & cur_floor < topf & direction_up = TRUE &\n", - " # c.((c : INTEGER) & ((c : INTEGER) & (c > cur_floor) & (c : call_buttons))) &\n", - " (cur_floor /: call_buttons) THEN\n", - " cur_floor := ((cur_floor)+(1))\n", - " END ;\n", - " move_down = SELECT door_open = FALSE & cur_floor > groundf & (direction_up = FALSE) &\n", - " # cu.((cu : INTEGER) & ((cu : INTEGER) & (cu < cur_floor) & (cu : call_buttons))) &\n", - " (cur_floor /: call_buttons) THEN\n", - " cur_floor := ((cur_floor)-(1))\n", - " END ;\n", - " reverse_lift_up = SELECT direction_up = FALSE & door_open = FALSE &\n", - " # c.((c : INTEGER) & ((c : INTEGER) & (c > cur_floor) & (c : call_buttons))) & \n", - " ! l.((l : INTEGER) => (((l : INTEGER) & (l <= cur_floor) & (l >= groundf)) => (l /: call_buttons))) THEN\n", - " direction_up := TRUE\n", - " END ;\n", - " reverse_lift_down = SELECT direction_up = TRUE & door_open = FALSE & \n", - " # cd.(cd : INTEGER & ((cd : INTEGER) & (cd < cur_floor) & (cd : call_buttons))) & \n", - " ! u.(u : INTEGER => (((u : INTEGER) & (u >= cur_floor) & (u <= topf)) => (u /: call_buttons))) THEN\n", - " direction_up := FALSE\n", - " END ;\n", - " open_door = SELECT door_open = FALSE & (cur_floor : call_buttons) THEN\n", - " door_open := TRUE\n", - " END ;\n", - " close_door = SELECT door_open = TRUE THEN\n", - " door_open := FALSE || call_buttons := ((call_buttons)\\({cur_floor}))\n", - " END ;\n", - " push_call_button(floor) = SELECT (floor : (groundf .. topf)) & (floor /: call_buttons) THEN \n", - " call_buttons := ((call_buttons)\\/({floor}))\n", - " END \n", - "END" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Initialising a Machine\n", - "\n", - "Now we will set up constants and initialise the machine, to be able to interact with it. You can set up constants with the commant `:constants` and initialise with the command `:init`. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":constants [PREDICATE]\n", - "```\n", - "\n", - "Set up the current machine's constants.\n", - "\n", - "This is a shorthand for `:exec SETUP_CONSTANTS [PREDICATE]`." - ], - "text/plain": [ - ":constants [PREDICATE]\n", - "Set up the current machine's constants.\n", - "\n", - "This is a shorthand for `:exec SETUP_CONSTANTS [PREDICATE]`." - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :constants" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":init [PREDICATE]\n", - "```\n", - "\n", - "Initialise the current machine with the specified predicate\n", - "\n", - "This is a shorthand for `:exec INITIALISATION [PREDICATE]`." - ], - "text/plain": [ - ":init [PREDICATE]\n", - "Initialise the current machine with the specified predicate\n", - "\n", - "This is a shorthand for `:exec INITIALISATION [PREDICATE]`." - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :init" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Trace and State\n", - "\n", - "After loading and initialising the machine, we can explore the state, visualise the machine and state and more. We will start by finding out in which trace we are currently in, to ensure, that we initialised the machine. This can be done with the command `:trace`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":trace\n", - "```\n", - "\n", - "Display all states and transitions in the current trace.\n", - "\n", - "Each state has an index, which can be passed to the `:goto` command to go to that state.\n", - "\n", - "The first state (index -1) is always the root state. All other states are reached from the root state by following (previously executed) transitions." - ], - "text/plain": [ - ":trace\n", - "Display all states and transitions in the current trace.\n", - "\n", - "Each state has an index, which can be passed to the `:goto` command to go to that state.\n", - "\n", - "The first state (index -1) is always the root state. All other states are reached from the root state by following (previously executed) transitions." - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :trace" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state\n", - "* 0: `SETUP_CONSTANTS()`\n", - "* 1: `INITIALISATION()` **(current)**" - ], - "text/plain": [ - "-1: Root state\n", - "0: SETUP_CONSTANTS()\n", - "1: INITIALISATION() (current)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Switching to a different trace is possible by typing in `:goto INDEX`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":goto INDEX\n", - "```\n", - "\n", - "Go to the state with the specified index in the current trace.\n", - "\n", - "Use the `:trace` command to view the current trace and the indices of its states. Index -1 refers to the root state and is always available.\n", - "\n", - "Going backwards in the current trace does *not* discard any parts of the trace, so it is possible to go forward again afterwards. However, executing an operation in a state *will* discard any parts of the trace after that state (and replace them with the destination state of the executed transition)." - ], - "text/plain": [ - ":goto INDEX\n", - "Go to the state with the specified index in the current trace.\n", - "\n", - "Use the `:trace` command to view the current trace and the indices of its states. Index -1 refers to the root state and is always available.\n", - "\n", - "Going backwards in the current trace does *not* discard any parts of the trace, so it is possible to go forward again afterwards. However, executing an operation in a state *will* discard any parts of the trace after that state (and replace them with the destination state of the executed transition)." - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :goto" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Changed to state with index -1" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":goto -1" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state **(current)**\n", - "* 0: `SETUP_CONSTANTS()`\n", - "* 1: `INITIALISATION()`" - ], - "text/plain": [ - "-1: Root state (current)\n", - "0: SETUP_CONSTANTS()\n", - "1: INITIALISATION()" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we set the current state to -1, we are at out root state again. We did not set up constants or initialise the machine, yet. From here, we have two possibilities to go back to the initialised state. Either by setting up constants and initialising again, or by simply typing `:goto 1`." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Changed to state with index 1" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":goto 1" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state\n", - "* 0: `SETUP_CONSTANTS()`\n", - "* 1: `INITIALISATION()` **(current)**" - ], - "text/plain": [ - "-1: Root state\n", - "0: SETUP_CONSTANTS()\n", - "1: INITIALISATION() (current)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another feature of ProB is, that you can find a state, for which a predicate is true. In the following we will try to use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":find PREDICATE\n", - "```\n", - "\n", - "Try to find a state for which the given predicate is true (in addition to the machine's invariant).\n", - "\n", - "If such a state is found, it is made the current state, otherwise an error is displayed.\n", - "\n", - "Note that this command does not necessarily find a valid *trace* to the found state. Instead, in some cases a single \"fake\" transition is added to the trace, which goes directly to the found state and does not use the machine's operations to reach it." - ], - "text/plain": [ - ":find PREDICATE\n", - "Try to find a state for which the given predicate is true (in addition to the machine's invariant).\n", - "\n", - "If such a state is found, it is made the current state, otherwise an error is displayed.\n", - "\n", - "Note that this command does not necessarily find a valid *trace* to the found state. Instead, in some cases a single \"fake\" transition is added to the trace, which goes directly to the found state and does not use the machine's operations to reach it." - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :find" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Found a matching state and made it current state" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":find cur_floor=0" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state\n", - "* 0: `find_valid_state` **(current)**" - ], - "text/plain": [ - "-1: Root state\n", - "0: find_valid_state (current)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the command leaves us with the root state and the current state, with a valid trace. That means, we lose our previous trace. \n", - "\n", - "For the next example we will have to recreate that trace again, with the following three commands:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Changed to state with index -1" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":goto -1" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Interacting with the Machine\n", - "\n", - "If you want to interact with the machine, meaning, that you want to know, which values the variables and constants have, you can simply type in the identifiers of those. e.g. type in `cur_floor` to find out on which floor we are currently at." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$-1$" - ], - "text/plain": [ - "−1" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cur_floor" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you want to get an overview over the whole machine state and which operations are currently possible, you can use `:browse`." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":browse\n", - "```\n", - "\n", - "Show information about the current state.\n", - "\n", - "The output shows the names of all sets, constants, and variables defined by the current machine, as well as a list of transitions that are available in the current state." - ], - "text/plain": [ - ":browse\n", - "Show information about the current state.\n", - "\n", - "The output shows the names of all sets, constants, and variables defined by the current machine, as well as a list of transitions that are available in the current state." - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :browse" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine: Lift\n", - "Sets: (none)\n", - "Constants: groundf, topf\n", - "Variables: call_buttons, cur_floor, direction_up, door_open\n", - "Operations: \n", - "push_call_button(-1)\n", - "push_call_button(0)\n", - "push_call_button(1)\n", - "push_call_button(2)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":browse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To use operations, you have to use another command, that is slightly different. Type in the name of any operation, that is currently possible and put `:exec` before:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":exec OPERATION [PREDICATE]\n", - "```\n", - "\n", - "Execute an operation.\n", - "\n", - "A transition for the given operation is found and executed. If the optional predicate is specified, a transition is found for which the predicate is $\\mathit{TRUE}$. The predicate can be used to restrict what values the operation's parameters or the variables in the next state may have." - ], - "text/plain": [ - ":exec OPERATION [PREDICATE]\n", - "Execute an operation.\n", - "\n", - "A transition for the given operation is found and executed. If the optional predicate is specified, a transition is found for which the predicate is $\\mathit{TRUE}$. The predicate can be used to restrict what values the operation's parameters or the variables in the next state may have." - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :exec" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: push_call_button(-1)" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec push_call_button floor=-1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we check our trace again and browse our actions, we can see, that the call button of the floor -1 is now pushed." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "* -1: Root state\n", - "* 0: `SETUP_CONSTANTS()`\n", - "* 1: `INITIALISATION()`\n", - "* 2: `push_call_button(-1)` **(current)**" - ], - "text/plain": [ - "-1: Root state\n", - "0: SETUP_CONSTANTS()\n", - "1: INITIALISATION()\n", - "2: push_call_button(-1) (current)" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":trace" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine: Lift\n", - "Sets: (none)\n", - "Constants: groundf, topf\n", - "Variables: call_buttons, cur_floor, direction_up, door_open\n", - "Operations: \n", - "open_door()\n", - "push_call_button(0)\n", - "push_call_button(1)\n", - "push_call_button(2)" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":browse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course, we could also type in `call_buttons` to find out, which call buttons are currently pushed." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\{-1\\}$" - ], - "text/plain": [ - "{−1}" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "call_buttons" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `:let` command lets you store the value of an expression under a different name. It is evaluated once on the current state. You can use the `:unlet` command if you are not using the local variable anymore." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":let NAME EXPR\n", - "```\n", - "\n", - "Evaluate an expression and store it in a local variable.\n", - "\n", - "The expression is evaluated only once, in the current state, and its value is stored. Once set, variables are available in all states and are not affected by machine loads. A variable created by `:let` shadows any identifier from the machine with the same name.\n", - "\n", - "**Note:** The values of local variables are currently stored in text form. Values must have a syntactically valid text representation, and large values may cause performance issues." - ], - "text/plain": [ - ":let NAME EXPR\n", - "Evaluate an expression and store it in a local variable.\n", - "\n", - "The expression is evaluated only once, in the current state, and its value is stored. Once set, variables are available in all states and are not affected by machine loads. A variable created by `:let` shadows any identifier from the machine with the same name.\n", - "\n", - "**Note:** The values of local variables are currently stored in text form. Values must have a syntactically valid text representation, and large values may cause performance issues." - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :let" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\mathit{FALSE}$" - ], - "text/plain": [ - "FALSE" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":let first_floor_called 1:call_buttons" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: push_call_button(1)" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec push_call_button floor=1" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\mathit{FALSE}$" - ], - "text/plain": [ - "FALSE" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "first_floor_called" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":unlet NAME\n", - "```\n", - "\n", - "Remove a local variable." - ], - "text/plain": [ - ":unlet NAME\n", - "Remove a local variable." - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :unlet" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - ":unlet first_floor_called" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "ename": "CommandExecutionException", - "evalue": ":eval: Computation not completed: Unknown identifier \"first_floor_called\"", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m:eval: Computation not completed: Unknown identifier \"first_floor_called\"\u001b[0m" - ] - } - ], - "source": [ - "first_floor_called" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Additionally, you can use the `:table` command to display an expression as a table." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":table EXPRESSION\n", - "```\n", - "\n", - "Display an expression as a table.\n", - "\n", - "Although any expression is accepted, this command is most useful for sets of tuples." - ], - "text/plain": [ - ":table EXPRESSION\n", - "Display an expression as a table.\n", - "\n", - "Although any expression is accepted, this command is most useful for sets of tuples." - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :table" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "|cur_floor|\n", - "|---|\n", - "|$-1$|\n" - ], - "text/plain": [ - "cur_floor\n", - "-1\n" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":table cur_floor" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you are not sure which type an formula has, you can use `:type` to find out." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":type FORMULA\n", - "```\n", - "\n", - "Display the type of a formula.\n", - "\n", - "The returned types are *not* standard B types. They are human-readable, but cannot be used in code." - ], - "text/plain": [ - ":type FORMULA\n", - "Display the type of a formula.\n", - "\n", - "The returned types are *not* standard B types. They are human-readable, but cannot be used in code." - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :type" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "INTEGER" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":type cur_floor" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "POW(INTEGER)" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":type call_buttons" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Evaluations\n", - "\n", - "If you just want to make sure, that a predicate is true, use the `:assert` command instead." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":assert PREDICATE\n", - "```\n", - "\n", - "Ensure that the predicate is true, and show an error otherwise.\n", - "\n", - "This command is intended for verifying that a predicate is always true at a certain point in a notebook. Unlike normal evaluation (`:eval`), this command treats a $\\mathit{FALSE}$ result as an error. If the result is $\\mathit{TRUE}$, solutions for free variables (if any) are not displayed.\n", - "\n", - "Only predicates and $\\mathit{BOOL}$ expressions are accepted. Expressions of other types cause an error." - ], - "text/plain": [ - ":assert PREDICATE\n", - "Ensure that the predicate is true, and show an error otherwise.\n", - "\n", - "This command is intended for verifying that a predicate is always true at a certain point in a notebook. Unlike normal evaluation (`:eval`), this command treats a $\\mathit{FALSE}$ result as an error. If the result is $\\mathit{TRUE}$, solutions for free variables (if any) are not displayed.\n", - "\n", - "Only predicates and $\\mathit{BOOL}$ expressions are accepted. Expressions of other types cause an error." - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :assert" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "ename": "CommandExecutionException", - "evalue": ":assert: Assertion is not true: FALSE", - "output_type": "error", - "traceback": [ - "\u001b[1m\u001b[31m:assert: Assertion is not true: FALSE\u001b[0m" - ] - } - ], - "source": [ - ":assert cur_floor=0" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "$\\mathit{TRUE}$" - ], - "text/plain": [ - "TRUE" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":assert cur_floor=-1" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine: Lift\n", - "Sets: (none)\n", - "Constants: groundf, topf\n", - "Variables: call_buttons, cur_floor, direction_up, door_open\n", - "Operations: \n", - "open_door()\n", - "push_call_button(0)\n", - "push_call_button(2)" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":browse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another notable feature is the following command, with which you can pretty print predicates. Use `:prettyprint` to access it. \n", - "\n", - "You also have the option to solve predicates with different solvers. For this you can use the command `:solve`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - ":help :prettyprint" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\mathit{cur\\_floor} = - 1$" - ], - "text/plain": [ - "cur_floor = - 1" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":prettyprint cur_floor=-1" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":solve SOLVER PREDICATE\n", - "```\n", - "\n", - "Solve a predicate with the specified solver.\n", - "\n", - "The following solvers are currently available:\n", - "\n", - "* `cvc4`\n", - "* `kodkod`\n", - "* `prob`\n", - "* `smt_supported_interpreter`\n", - "* `z3`\n" - ], - "text/plain": [ - ":solve SOLVER PREDICATE\n", - "Solve a predicate with the specified solver.\n", - "\n", - "The following solvers are currently available:\n", - "\n", - "* `cvc4`\n", - "* `kodkod`\n", - "* `prob`\n", - "* `smt_supported_interpreter`\n", - "* `z3`\n" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :solve" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Modifying the Preferences\n", - "\n", - "We have seen before, that you can set preferences when loading the machine with the `::load` command. You can modify or change the values of preferences by using the `:pref` command." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":pref [NAME ...]\n", - ":pref NAME=VALUE [NAME=VALUE ...]\n", - "```\n", - "\n", - "View or change the value of one or more preferences.\n", - "\n", - "In the first form, the values of all given preferences are displayed (or all preferences, if none are given). In the second form, the given preference assignments are performed. The two forms cannot be mixed; it is not possible to view and change preferences in a single command.\n", - "\n", - "Certain preference changes do not take full effect when performed on a loaded machine. Such preferences must be assigned when the machine is loaded using the `::load` or `:load` command." - ], - "text/plain": [ - ":pref [NAME ...]\n", - ":pref NAME=VALUE [NAME=VALUE ...]\n", - "View or change the value of one or more preferences.\n", - "\n", - "In the first form, the values of all given preferences are displayed (or all preferences, if none are given). In the second form, the given preference assignments are performed. The two forms cannot be mixed; it is not possible to view and change preferences in a single command.\n", - "\n", - "Certain preference changes do not take full effect when performed on a loaded machine. Such preferences must be assigned when the machine is loaded using the `::load` or `:load` command." - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :pref" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Additional Features\n", - "\n", - "In addition to the previous commands, you have the possibility to use the `:stats` command to show statistics about the state space. Moreover, you can use the `:time` command to measure the execution time of commands with their arguments. This can be helpful for measuring the solving time for specific machines." - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":stats\n", - "```\n", - "\n", - "Show statistics about the state space." - ], - "text/plain": [ - ":stats\n", - "Show statistics about the state space." - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :stats" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**Explored States:** 4/15 \n", - "**Transitions:** 14" - ], - "text/plain": [ - "Explored States: 4/15\n", - "Transitions: 14" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":stats" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":time COMMAND [ARGS ...]\n", - "```\n", - "\n", - "Execute the given command and measure how long it takes to execute.\n", - "\n", - "The time is measured using Java's [`System.nanoTime()`](https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--) method. The measured time is displayed with the full number of decimal places, but no guarantees are made about the actual resolution of the time measurement.\n", - "\n", - "As with any measurement of execution time, there will likely be small differences between two measurements of the same command. The time is measured by the kernel rather than ProB, so it will include some overhead due to processing of the command by the kernel and communication with ProB." - ], - "text/plain": [ - ":time COMMAND [ARGS ...]\n", - "Execute the given command and measure how long it takes to execute.\n", - "\n", - "The time is measured using Java's [`System.nanoTime()`](https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--) method. The measured time is displayed with the full number of decimal places, but no guarantees are made about the actual resolution of the time measurement.\n", - "\n", - "As with any measurement of execution time, there will likely be small differences between two measurements of the same command. The time is measured by the kernel rather than ProB, so it will include some overhead due to processing of the command by the kernel and communication with ProB." - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :time" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "Execution time: 0.044099194 seconds" - ], - "text/plain": [ - "Execution time: 0.044099194 seconds" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Explored States:** 4/15 \n", - "**Transitions:** 14" - ], - "text/plain": [ - "Explored States: 4/15\n", - "Transitions: 14" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":time :stats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To find out your current ProB CLI and ProB2 version, you can use `:version`." - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":version\n", - "```\n", - "\n", - "Display version info about the ProB CLI and ProB 2." - ], - "text/plain": [ - ":version\n", - "Display version info about the ProB CLI and ProB 2." - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :version" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ProB CLI: 1.9.0-nightly (ab12dcd41e1150b19e8c00897fe53f96f76cbd0d)\n", - "ProB 2: 3.2.12-SNAPSHOT (06e75efe84ffdadf56df45e34acb44ec8e4603dd)" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":version" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualisations\n", - "\n", - "There are two possible ways of visualising the machine in jupyter notebook. One can be accessed via the `:dot` command. This command allows you to visualise a variety of different things, e.g. the state as graph. You can use autocomplete by clicking `TAB` after the command, as well." - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":dot COMMAND [FORMULA]\n", - "```\n", - "\n", - "Execute and show a dot visualisation.\n", - "\n", - "The following dot visualisation commands are available:\n", - "\n", - "* `machine_hierarchy` - Machine Hierarchy: Shows the machine hierarchy of a classical B model\n", - "* `event_hierarchy` - Event Hierarchy: Shows the event hierarchy of an Event-B model (**Not available for this machine/state**: only available for Event-B models)\n", - "* `state_space` - State Space: Show state space\n", - "* `state_space_sfdp` - State Space (Fast): Show state space (fast)\n", - "* `current_state` - Current State in State Space: Show current state and successors in state space\n", - "* `signature_merge` - Signature Merge: Show signature-merged reduced state space\n", - "* `dfa_merge` - DFA Merge: Show state space as deterministic automaton (DFA)\n", - "* `transition_diagram` - State Space Expression Projection...: Project state space onto expression values and show transition diagram\n", - "* `enable_graph` - Enable Graph: Show enabling graph of events\n", - "* `state_as_graph` - Current State as Graph: Show values in current state as a graph\n", - "* `custom_graph` - Customized Current State as Graph: Show values in current state as a graph using CUSTOM_GRAPH_EDGES (**Not available for this machine/state**: only available when CUSTOM_GRAPH_NODES and CUSTOM_GRAPH_EDGES are defined in the DEFINITIONS of a B machine)\n", - "* `expr_as_graph` - (Relational) Expression as Graph...: Show (relational) expression value as a graph\n", - "* `formula_tree` - Custom Predicate/Expression Formula Tree...: Show predicate/expressions and sub-formulas as a tree\n", - "* `invariant` - Invariant Formula Tree: Show invariant as a formula tree\n", - "* `properties` - Properties Formula Tree: Show properties as a formula tree\n", - "* `assertions` - Assertions Formula Tree: Show assertions as a formula tree\n", - "* `deadlock` - Deadlock Formula Tree: Show deadlocking status as a formula tree\n", - "* `goal` - Goal Formula Tree: Show GOAL as a formula tree (**Not available for this machine/state**: only available for initialised B,Z or Event-B models with a GOAL DEFINITION)\n", - "* `dependence_graph` - Dependence Graph: Show dependence graph of events\n", - "* `variable_modification_graph` - Variable Read/Write Graph: Show variable modification by operations and reading in guards\n", - "* `definitions` - Definitions Graph: Show dependence graph of DEFINITIONS\n", - "* `predicate_dependency` - Predicate Dependency Graph...: Show dependence graph of conjuncts of a predicate\n", - "* `last_error` - Last Error Formula Tree: Show last error source as a formula tree (**Not available for this machine/state**: only available when error occured)\n" - ], - "text/plain": [ - ":dot COMMAND [FORMULA]\n", - "Execute and show a dot visualisation.\n", - "\n", - "The following dot visualisation commands are available:\n", - "\n", - "* `machine_hierarchy` - Machine Hierarchy: Shows the machine hierarchy of a classical B model\n", - "* `event_hierarchy` - Event Hierarchy: Shows the event hierarchy of an Event-B model (**Not available for this machine/state**: only available for Event-B models)\n", - "* `state_space` - State Space: Show state space\n", - "* `state_space_sfdp` - State Space (Fast): Show state space (fast)\n", - "* `current_state` - Current State in State Space: Show current state and successors in state space\n", - "* `signature_merge` - Signature Merge: Show signature-merged reduced state space\n", - "* `dfa_merge` - DFA Merge: Show state space as deterministic automaton (DFA)\n", - "* `transition_diagram` - State Space Expression Projection...: Project state space onto expression values and show transition diagram\n", - "* `enable_graph` - Enable Graph: Show enabling graph of events\n", - "* `state_as_graph` - Current State as Graph: Show values in current state as a graph\n", - "* `custom_graph` - Customized Current State as Graph: Show values in current state as a graph using CUSTOM_GRAPH_EDGES (**Not available for this machine/state**: only available when CUSTOM_GRAPH_NODES and CUSTOM_GRAPH_EDGES are defined in the DEFINITIONS of a B machine)\n", - "* `expr_as_graph` - (Relational) Expression as Graph...: Show (relational) expression value as a graph\n", - "* `formula_tree` - Custom Predicate/Expression Formula Tree...: Show predicate/expressions and sub-formulas as a tree\n", - "* `invariant` - Invariant Formula Tree: Show invariant as a formula tree\n", - "* `properties` - Properties Formula Tree: Show properties as a formula tree\n", - "* `assertions` - Assertions Formula Tree: Show assertions as a formula tree\n", - "* `deadlock` - Deadlock Formula Tree: Show deadlocking status as a formula tree\n", - "* `goal` - Goal Formula Tree: Show GOAL as a formula tree (**Not available for this machine/state**: only available for initialised B,Z or Event-B models with a GOAL DEFINITION)\n", - "* `dependence_graph` - Dependence Graph: Show dependence graph of events\n", - "* `variable_modification_graph` - Variable Read/Write Graph: Show variable modification by operations and reading in guards\n", - "* `definitions` - Definitions Graph: Show dependence graph of DEFINITIONS\n", - "* `predicate_dependency` - Predicate Dependency Graph...: Show dependence graph of conjuncts of a predicate\n", - "* `last_error` - Last Error Formula Tree: Show last error source as a formula tree (**Not available for this machine/state**: only available when error occured)\n" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :dot" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", - "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", - " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", - "<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n", - " -->\n", - "<!-- Title: state Pages: 1 -->\n", - "<svg width=\"574pt\" height=\"131pt\"\n", - " viewBox=\"0.00 0.00 573.70 131.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 1) rotate(0) translate(4 127)\">\n", - "<title>state</title>\n", - "<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-127 569.6967,-127 569.6967,4 -4,4\"/>\n", - "<!-- FALSE -->\n", - "<g id=\"node1\" class=\"node\">\n", - "<title>FALSE</title>\n", - "<ellipse fill=\"#a52a2a\" stroke=\"#a52a2a\" cx=\"37.6967\" cy=\"-105\" rx=\"37.8943\" ry=\"18\"/>\n", - "<text text-anchor=\"middle\" x=\"37.6967\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">FALSE</text>\n", - "</g>\n", - "<!-- ROOT-NODE -->\n", - "<g id=\"node2\" class=\"node\">\n", - "<title>ROOT-NODE</title>\n", - "<polygon fill=\"#add8e6\" stroke=\"#add8e6\" points=\"292.6967,-36 205.5564,-18 292.6967,0 379.8369,-18 292.6967,-36\"/>\n", - "<text text-anchor=\"middle\" x=\"292.6967\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">ROOT-NODE</text>\n", - "</g>\n", - "<!-- FALSE->ROOT-NODE -->\n", - "<g id=\"edge1\" class=\"edge\">\n", - "<title>FALSE->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#b22222\" d=\"M45.4313,-87.0482C51.2604,-75.7333 60.3678,-61.829 72.6967,-54 96.4841,-38.8946 164.3902,-29.3258 218.5285,-23.8823\"/>\n", - "<polygon fill=\"#b22222\" stroke=\"#b22222\" points=\"219.1954,-27.334 228.8089,-22.8808 218.5167,-20.367 219.1954,-27.334\"/>\n", - "<text text-anchor=\"middle\" x=\"101.6967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">door_open</text>\n", - "</g>\n", - "<!-- TRUE -->\n", - "<g id=\"node3\" class=\"node\">\n", - "<title>TRUE</title>\n", - "<ellipse fill=\"#698b22\" stroke=\"#698b22\" cx=\"126.6967\" cy=\"-105\" rx=\"33.5952\" ry=\"18\"/>\n", - "<text text-anchor=\"middle\" x=\"126.6967\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">TRUE</text>\n", - "</g>\n", - "<!-- TRUE->ROOT-NODE -->\n", - "<g id=\"edge2\" class=\"edge\">\n", - "<title>TRUE->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#a0522d\" d=\"M128.4128,-86.5614C130.3881,-75.6337 134.6244,-62.3348 143.6967,-54 156.5391,-42.2015 195.2856,-33.048 230.0463,-26.9236\"/>\n", - "<polygon fill=\"#a0522d\" stroke=\"#a0522d\" points=\"230.9228,-30.3249 240.195,-25.1989 229.7499,-23.4239 230.9228,-30.3249\"/>\n", - "<text text-anchor=\"middle\" x=\"178.1967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">direction_up</text>\n", - "</g>\n", - "<!-- -1 -->\n", - "<g id=\"node4\" class=\"node\">\n", - "<title>-1</title>\n", - "<polygon fill=\"#cdba96\" stroke=\"#cdba96\" points=\"319.6967,-123 265.6967,-123 265.6967,-87 319.6967,-87 319.6967,-123\"/>\n", - "<text text-anchor=\"middle\" x=\"292.6967\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">-1</text>\n", - "</g>\n", - "<!-- -1->ROOT-NODE -->\n", - "<g id=\"edge3\" class=\"edge\">\n", - "<title>-1->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#473c8b\" d=\"M265.574,-99.2206C249.2281,-94.1898 229.6958,-85.08 219.6967,-69 209.7592,-53.0192 225.7758,-40.7054 245.3118,-32.1844\"/>\n", - "<polygon fill=\"#473c8b\" stroke=\"#473c8b\" points=\"246.7714,-35.3705 254.7693,-28.4218 244.1838,-28.8664 246.7714,-35.3705\"/>\n", - "<text text-anchor=\"middle\" x=\"245.1967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cur_floor</text>\n", - "</g>\n", - "<!-- -1->ROOT-NODE -->\n", - "<g id=\"edge5\" class=\"edge\">\n", - "<title>-1->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#000000\" d=\"M292.6967,-86.9735C292.6967,-75.1918 292.6967,-59.5607 292.6967,-46.1581\"/>\n", - "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"296.1968,-46.0033 292.6967,-36.0034 289.1968,-46.0034 296.1968,-46.0033\"/>\n", - "<text text-anchor=\"middle\" x=\"326.1967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">call_buttons</text>\n", - "</g>\n", - "<!-- -1->ROOT-NODE -->\n", - "<g id=\"edge7\" class=\"edge\">\n", - "<title>-1->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#bdef6b\" d=\"M319.7358,-98.1105C334.6112,-92.7883 351.8084,-83.7625 360.6967,-69 369.8361,-53.8203 355.4433,-41.6607 337.5823,-33.0275\"/>\n", - "<polygon fill=\"#bdef6b\" stroke=\"#bdef6b\" points=\"338.5958,-29.6502 328.0322,-28.837 335.7831,-36.0602 338.5958,-29.6502\"/>\n", - "<text text-anchor=\"middle\" x=\"384.1967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">groundf</text>\n", - "</g>\n", - "<!-- 1 -->\n", - "<g id=\"node5\" class=\"node\">\n", - "<title>1</title>\n", - "<polygon fill=\"#cdba96\" stroke=\"#cdba96\" points=\"475.6967,-123 421.6967,-123 421.6967,-87 475.6967,-87 475.6967,-123\"/>\n", - "<text text-anchor=\"middle\" x=\"448.6967\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">1</text>\n", - "</g>\n", - "<!-- 1->ROOT-NODE -->\n", - "<g id=\"edge4\" class=\"edge\">\n", - "<title>1->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#000000\" d=\"M438.6092,-86.6124C431.7628,-75.7039 421.7712,-62.4073 409.6967,-54 392.4638,-42.0011 371.1042,-33.9017 351.3706,-28.479\"/>\n", - "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"352.0918,-25.0507 341.5356,-25.9538 350.351,-31.8308 352.0918,-25.0507\"/>\n", - "<text text-anchor=\"middle\" x=\"458.1967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">call_buttons</text>\n", - "</g>\n", - "<!-- 2 -->\n", - "<g id=\"node6\" class=\"node\">\n", - "<title>2</title>\n", - "<polygon fill=\"#cdba96\" stroke=\"#cdba96\" points=\"565.6967,-123 511.6967,-123 511.6967,-87 565.6967,-87 565.6967,-123\"/>\n", - "<text text-anchor=\"middle\" x=\"538.6967\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">2</text>\n", - "</g>\n", - "<!-- 2->ROOT-NODE -->\n", - "<g id=\"edge6\" class=\"edge\">\n", - "<title>2->ROOT-NODE</title>\n", - "<path fill=\"none\" stroke=\"#efdf84\" d=\"M528.0369,-86.8227C520.4593,-75.5637 509.2422,-61.808 495.6967,-54 473.2129,-41.0397 411.0663,-31.2111 361.4046,-25.1247\"/>\n", - "<polygon fill=\"#efdf84\" stroke=\"#efdf84\" points=\"361.6802,-21.6328 351.3353,-23.9202 360.8488,-28.5832 361.6802,-21.6328\"/>\n", - "<text text-anchor=\"middle\" x=\"524.6967\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">topf</text>\n", - "</g>\n", - "</g>\n", - "</svg>" - ], - "text/plain": [ - "<Dot visualization: state_as_graph []>" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":dot state_as_graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another option is to use the `ANIMATION_FUNCTION` with the command `:show`. Note, however, that to use this you have to write an `ANIMATION_FUNCTION` for your B model.\n", - "\n", - "The following B model contains such an `ANIMATION_FUNCTION` for the visualisation of Lift4. You can use what you have learned before to explore the visualisation." - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Loaded machine: Lift0" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "::load\n", - "MODEL Lift0\n", - "DEFINITIONS SET_PREF_SHOW_EVENTB_ANY_VALUES==TRUE;\n", - " ASSERT_LTL == \"G( [push_call_button(groundf)] => F {cur_floor=groundf & door_open=TRUE})\";\n", - " Rconv == (topf-r+groundf);\n", - " ANIMATION_FUNCTION == ( {r,c,i|r:groundf..topf & ((c=2 & i=0) or (c=1 & i=2))} <+ \n", - " ({r,c,i|r:groundf..topf & Rconv:call_buttons & c=2 & i=1} \\/\n", - " {r,c,i|r:groundf..topf & Rconv=cur_floor & c=1 &\n", - " ((door_open=TRUE & i=3) or (door_open=FALSE & i=4))}\n", - " ) \\/ {r,c,i| r=topf+1 & c=1 & \n", - " ((direction_up=TRUE & i=5) or (direction_up=FALSE & i=6)) } );\n", - " ANIMATION_IMG0 == \"images/CallButtonOff.gif\";\n", - " ANIMATION_IMG1 == \"images/CallButtonOn.gif\";\n", - " ANIMATION_IMG2 == \"images/LiftEmpty.gif\";\n", - " ANIMATION_IMG3 == \"images/LiftOpen.gif\";\n", - " ANIMATION_IMG4 == \"images/LiftClosed.gif\";\n", - " ANIMATION_IMG5 == \"images/up_arrow.gif\";\n", - " ANIMATION_IMG6 == \"images/down_arrow.gif\";\n", - " ANIMATION_RIGHT_CLICK(J,r) ==\n", - " IF J=2 THEN\n", - " push_call_button(topf-r+groundf)\n", - " ELSIF J=1 THEN\n", - " CHOICE open_door OR close_door OR move_up OR move_down OR\n", - " reverse_lift_up OR reverse_lift_down\n", - " END\n", - " END;\n", - "CONSTANTS groundf,topf\n", - "PROPERTIES\n", - " topf : INTEGER & groundf : INTEGER & (groundf = -1) & (topf = 2) & (groundf < topf)\n", - "VARIABLES call_buttons,cur_floor,direction_up,door_open\n", - "INVARIANT\n", - " cur_floor : (groundf .. topf) & \n", - " door_open : BOOL & \n", - " call_buttons : POW(groundf .. topf) &\n", - " direction_up : BOOL &\n", - " (door_open = TRUE => cur_floor : call_buttons)\n", - "INITIALISATION cur_floor := (groundf) || door_open := FALSE || call_buttons := ({}) || direction_up := TRUE\n", - "OPERATIONS\n", - " move_up = SELECT door_open = FALSE & cur_floor < topf & direction_up = TRUE &\n", - " # c.((c : INTEGER) & ((c : INTEGER) & (c > cur_floor) & (c : call_buttons))) &\n", - " (cur_floor /: call_buttons) THEN\n", - " cur_floor := ((cur_floor)+(1))\n", - " END ;\n", - " move_down = SELECT door_open = FALSE & cur_floor > groundf & (direction_up = FALSE) &\n", - " # cu.((cu : INTEGER) & ((cu : INTEGER) & (cu < cur_floor) & (cu : call_buttons))) &\n", - " (cur_floor /: call_buttons) THEN\n", - " cur_floor := ((cur_floor)-(1))\n", - " END ;\n", - " reverse_lift_up = SELECT direction_up = FALSE & door_open = FALSE &\n", - " # c.((c : INTEGER) & ((c : INTEGER) & (c > cur_floor) & (c : call_buttons))) & \n", - " ! l.((l : INTEGER) => (((l : INTEGER) & (l <= cur_floor) & (l >= groundf)) => (l /: call_buttons))) THEN\n", - " direction_up := TRUE\n", - " END ;\n", - " reverse_lift_down = SELECT direction_up = TRUE & door_open = FALSE & \n", - " # cd.(cd : INTEGER & ((cd : INTEGER) & (cd < cur_floor) & (cd : call_buttons))) & \n", - " ! u.(u : INTEGER => (((u : INTEGER) & (u >= cur_floor) & (u <= topf)) => (u /: call_buttons))) THEN\n", - " direction_up := FALSE\n", - " END ;\n", - " open_door = SELECT door_open = FALSE & (cur_floor : call_buttons) THEN\n", - " door_open := TRUE\n", - " END ;\n", - " close_door = SELECT door_open = TRUE THEN\n", - " door_open := FALSE || call_buttons := ((call_buttons)\\({cur_floor}))\n", - " END ;\n", - " push_call_button(floor) = SELECT (floor : (groundf .. topf)) & (floor /: call_buttons) THEN \n", - " call_buttons := ((call_buttons)\\/({floor}))\n", - " END \n", - "END" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```\n", - ":show\n", - "```\n", - "\n", - "Show the machine's animation function visualisation for the current state.\n", - "\n", - "The visualisation is static, any defined right-click options cannot be viewed or used." - ], - "text/plain": [ - ":show\n", - "Show the machine's animation function visualisation for the current state.\n", - "\n", - "The visualisation is static, any defined right-click options cannot be viewed or used." - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":help :show" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine constants set up using operation 0: $setup_constants()" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":constants" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine initialised using operation 1: $initialise_machine()" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":init" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"4\" src=\"images/LiftClosed.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"5\" src=\"images/up_arrow.gif\"/></td>\n", - "<td style=\"padding:0px\"></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine: Lift0\n", - "Sets: (none)\n", - "Constants: groundf, topf\n", - "Variables: call_buttons, cur_floor, direction_up, door_open\n", - "Operations: \n", - "push_call_button(-1)\n", - "push_call_button(0)\n", - "push_call_button(1)\n", - "push_call_button(2)" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":browse" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: push_call_button(-1)" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec push_call_button floor=-1" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"4\" src=\"images/LiftClosed.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/CallButtonOn.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"5\" src=\"images/up_arrow.gif\"/></td>\n", - "<td style=\"padding:0px\"></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: open_door()" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec open_door" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"3\" src=\"images/LiftOpen.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/CallButtonOn.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"5\" src=\"images/up_arrow.gif\"/></td>\n", - "<td style=\"padding:0px\"></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: close_door()" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec close_door" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"4\" src=\"images/LiftClosed.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"5\" src=\"images/up_arrow.gif\"/></td>\n", - "<td style=\"padding:0px\"></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Machine: Lift0\n", - "Sets: (none)\n", - "Constants: groundf, topf\n", - "Variables: call_buttons, cur_floor, direction_up, door_open\n", - "Operations: \n", - "push_call_button(-1)\n", - "push_call_button(0)\n", - "push_call_button(1)\n", - "push_call_button(2)" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":browse" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: push_call_button(1)" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec push_call_button floor=1" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/CallButtonOn.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"4\" src=\"images/LiftClosed.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"5\" src=\"images/up_arrow.gif\"/></td>\n", - "<td style=\"padding:0px\"></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Executed operation: move_up()" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":exec move_up" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<table style=\"font-family:monospace\"><tbody>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"1\" src=\"images/CallButtonOn.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"4\" src=\"images/LiftClosed.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"2\" src=\"images/LiftEmpty.gif\"/></td>\n", - "<td style=\"padding:0px\"><img alt=\"0\" src=\"images/CallButtonOff.gif\"/></td>\n", - "</tr>\n", - "<tr>\n", - "<td style=\"padding:0px\"><img alt=\"5\" src=\"images/up_arrow.gif\"/></td>\n", - "<td style=\"padding:0px\"></td>\n", - "</tr>\n", - "</tbody></table>" - ], - "text/plain": [ - "<Animation function visualisation>" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - ":show" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This concludes the overview over the ProB jupyter notebook kernel." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "ProB 2", - "language": "prob", - "name": "prob2" - }, - "language_info": { - "codemirror_mode": "prob2_jupyter_repl", - "file_extension": ".prob", - "mimetype": "text/x-prob2-jupyter-repl", - "name": "prob" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebook.tex b/notebook.tex deleted file mode 100644 index 1d6bfea4767d8c9c3ebccda6eab0e57350883ff7..0000000000000000000000000000000000000000 --- a/notebook.tex +++ /dev/null @@ -1,1604 +0,0 @@ - -% Default to the notebook output style - - - - -% Inherit from the specified cell style. - - - - - -\documentclass[11pt]{article} - - - - \usepackage[T1]{fontenc} - % Nicer default font (+ math font) than Computer Modern for most use cases - \usepackage{mathpazo} - - % Basic figure setup, for now with no caption control since it's done - % automatically by Pandoc (which extracts  syntax from Markdown). - \usepackage{graphicx} - % We will generate all images so they have a width \maxwidth. This means - % that they will get their normal width if they fit onto the page, but - % are scaled down if they would overflow the margins. - \makeatletter - \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth - \else\Gin@nat@width\fi} - \makeatother - \let\Oldincludegraphics\includegraphics - % Set max figure width to be 80% of text width, for now hardcoded. - \renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=.8\maxwidth]{#1}} - % Ensure that by default, figures have no caption (until we provide a - % proper Figure object with a Caption API and a way to capture that - % in the conversion process - todo). - \usepackage{caption} - \DeclareCaptionLabelFormat{nolabel}{} - \captionsetup{labelformat=nolabel} - - \usepackage{adjustbox} % Used to constrain images to a maximum size - \usepackage{xcolor} % Allow colors to be defined - \usepackage{enumerate} % Needed for markdown enumerations to work - \usepackage{geometry} % Used to adjust the document margins - \usepackage{amsmath} % Equations - \usepackage{amssymb} % Equations - \usepackage{textcomp} % defines textquotesingle - % Hack from http://tex.stackexchange.com/a/47451/13684: - \AtBeginDocument{% - \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code - } - \usepackage{upquote} % Upright quotes for verbatim code - \usepackage{eurosym} % defines \euro - \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support - \usepackage[utf8x]{inputenc} % Allow utf-8 characters in the tex document - \usepackage{fancyvrb} % verbatim replacement that allows latex - \usepackage{grffile} % extends the file name processing of package graphics - % to support a larger range - % The hyperref package gives us a pdf with properly built - % internal navigation ('pdf bookmarks' for the table of contents, - % internal cross-reference links, web links for URLs, etc.) - \usepackage{hyperref} - \usepackage{longtable} % longtable support required by pandoc >1.10 - \usepackage{booktabs} % table support for pandoc > 1.12.2 - \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) - \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) - % normalem makes italics be italics, not underlines - - - - - % Colors for the hyperref package - \definecolor{urlcolor}{rgb}{0,.145,.698} - \definecolor{linkcolor}{rgb}{.71,0.21,0.01} - \definecolor{citecolor}{rgb}{.12,.54,.11} - - % ANSI colors - \definecolor{ansi-black}{HTML}{3E424D} - \definecolor{ansi-black-intense}{HTML}{282C36} - \definecolor{ansi-red}{HTML}{E75C58} - \definecolor{ansi-red-intense}{HTML}{B22B31} - \definecolor{ansi-green}{HTML}{00A250} - \definecolor{ansi-green-intense}{HTML}{007427} - \definecolor{ansi-yellow}{HTML}{DDB62B} - \definecolor{ansi-yellow-intense}{HTML}{B27D12} - \definecolor{ansi-blue}{HTML}{208FFB} - \definecolor{ansi-blue-intense}{HTML}{0065CA} - \definecolor{ansi-magenta}{HTML}{D160C4} - \definecolor{ansi-magenta-intense}{HTML}{A03196} - \definecolor{ansi-cyan}{HTML}{60C6C8} - \definecolor{ansi-cyan-intense}{HTML}{258F8F} - \definecolor{ansi-white}{HTML}{C5C1B4} - \definecolor{ansi-white-intense}{HTML}{A1A6B2} - - % commands and environments needed by pandoc snippets - % extracted from the output of `pandoc -s` - \providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} - % Add ',fontsize=\small' for more characters per line - \newenvironment{Shaded}{}{} - \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} - \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} - \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} - \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} - \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} - \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} - \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} - \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} - \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} - \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} - \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} - \newcommand{\RegionMarkerTok}[1]{{#1}} - \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} - \newcommand{\NormalTok}[1]{{#1}} - - % Additional commands for more recent versions of Pandoc - \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} - \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} - \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} - \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} - \newcommand{\ImportTok}[1]{{#1}} - \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} - \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} - \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} - \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} - \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} - \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} - \newcommand{\BuiltInTok}[1]{{#1}} - \newcommand{\ExtensionTok}[1]{{#1}} - \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} - \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} - \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} - \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} - - - % Define a nice break command that doesn't care if a line doesn't already - % exist. - \def\br{\hspace*{\fill} \\* } - % Math Jax compatability definitions - \def\gt{>} - \def\lt{<} - % Document parameters - \title{ProB\_Jupyter\_Notebook\_Overview} - - - - - % Pygments definitions - -\makeatletter -\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% - \let\PY@ul=\relax \let\PY@tc=\relax% - \let\PY@bc=\relax \let\PY@ff=\relax} -\def\PY@tok#1{\csname PY@tok@#1\endcsname} -\def\PY@toks#1+{\ifx\relax#1\empty\else% - \PY@tok{#1}\expandafter\PY@toks\fi} -\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% - \PY@it{\PY@bf{\PY@ff{#1}}}}}}} -\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} - -\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} -\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} -\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} -\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} -\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} -\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} -\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} -\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} -\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} -\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} -\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} -\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} -\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} -\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} -\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} -\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} -\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} -\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} -\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} -\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} -\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} -\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} -\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} -\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} -\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} -\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} -\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} -\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} -\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} -\expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} -\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} -\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} -\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} -\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} -\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} -\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} -\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} -\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} -\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} -\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} -\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} -\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} - -\def\PYZbs{\char`\\} -\def\PYZus{\char`\_} -\def\PYZob{\char`\{} -\def\PYZcb{\char`\}} -\def\PYZca{\char`\^} -\def\PYZam{\char`\&} -\def\PYZlt{\char`\<} -\def\PYZgt{\char`\>} -\def\PYZsh{\char`\#} -\def\PYZpc{\char`\%} -\def\PYZdl{\char`\$} -\def\PYZhy{\char`\-} -\def\PYZsq{\char`\'} -\def\PYZdq{\char`\"} -\def\PYZti{\char`\~} -% for compatibility with earlier versions -\def\PYZat{@} -\def\PYZlb{[} -\def\PYZrb{]} -\makeatother - - - % Exact colors from NB - \definecolor{incolor}{rgb}{0.0, 0.0, 0.5} - \definecolor{outcolor}{rgb}{0.545, 0.0, 0.0} - - - - - % Prevent overflowing lines due to hard-to-break entities - \sloppy - % Setup hyperref package - \hypersetup{ - breaklinks=true, % so long urls are correctly broken across lines - colorlinks=true, - urlcolor=urlcolor, - linkcolor=linkcolor, - citecolor=citecolor, - } - % Slightly bigger margins than the latex defaults - - \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} - - - - \begin{document} - - - \maketitle - - - - - \section{ProB2 Jupyter Notebook -Overview}\label{prob2-jupyter-notebook-overview} - -In this jupyter notebook we want to give you an overview over the -functionalities of the ProB2 Jupyter Notebook. For this purpose, we will -take a look at the simple machine \texttt{Lift.mch} taken from the -\href{https://www3.hhu.de/stups/downloads/prob/source/}{ProB Public -Examples}. - - \subsection{The Help Command}\label{the-help-command} - -If you want to find out more about the commands and how to use them, -type in \texttt{:help\ {[}COMMAND{]}}. The ProB2 Jupyter Notebook has an -autocompletion function which also helps you to find what you need. -Simply press \texttt{TAB} after the space after \texttt{:help}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}1}]:} :help :help -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}1}]:} - - \begin{verbatim} -:help [COMMAND] -\end{verbatim} - -Display help for a specific command, or general help about the REPL. - - - - \subsection{Loading a Machine}\label{loading-a-machine} - -To start of with the ProB Jupyter Kernel, we have to load a machine. -This can be done by typing \texttt{::load} in a Code cell before the -machine code and pressing \texttt{Shift+Enter}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}2}]:} :help ::load -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}2}]:} - - \begin{verbatim} -::load [PREF=VALUE ...] -MACHINE -... -END -\end{verbatim} - -Load the machine source code given in the cell body. - -There must be a newline between the \texttt{::load} command name and the -machine code. - -Any number of preference assignments may be included after -\texttt{::load} (only on the first line). Preferences can also be -changed on a loaded machine using the \texttt{:pref} command, however -certain preferences do not take full effect when set using -\texttt{:pref} and must be set when the machine is loaded. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}3}]:} ::load DOT=/usr/bin/dot - MODEL Lift - DEFINITIONS SET\PYZus{}PREF\PYZus{}SHOW\PYZus{}EVENTB\PYZus{}ANY\PYZus{}VALUES==TRUE; - ASSERT\PYZus{}LTL == \PYZdq{}G( [push\PYZus{}call\PYZus{}button(groundf)] =\PYZgt{} F \PYZob{}cur\PYZus{}floor=groundf \PYZam{} door\PYZus{}open=TRUE\PYZcb{})\PYZdq{}; - Rconv == (topf\PYZhy{}r+groundf); - CONSTANTS groundf,topf - PROPERTIES - topf : INTEGER \PYZam{} groundf : INTEGER \PYZam{} (groundf = \PYZhy{}1) \PYZam{} (topf = 2) \PYZam{} (groundf \PYZlt{} topf) - VARIABLES call\PYZus{}buttons,cur\PYZus{}floor,direction\PYZus{}up,door\PYZus{}open - INVARIANT - cur\PYZus{}floor : (groundf .. topf) \PYZam{} - door\PYZus{}open : BOOL \PYZam{} - call\PYZus{}buttons : POW(groundf .. topf) \PYZam{} - direction\PYZus{}up : BOOL \PYZam{} - (door\PYZus{}open = TRUE =\PYZgt{} cur\PYZus{}floor : call\PYZus{}buttons) - INITIALISATION cur\PYZus{}floor := (groundf) || door\PYZus{}open := FALSE || call\PYZus{}buttons := (\PYZob{}\PYZcb{}) || direction\PYZus{}up := TRUE - OPERATIONS - move\PYZus{}up = SELECT door\PYZus{}open = FALSE \PYZam{} cur\PYZus{}floor \PYZlt{} topf \PYZam{} direction\PYZus{}up = TRUE \PYZam{} - \PYZsh{} c.((c : INTEGER) \PYZam{} ((c : INTEGER) \PYZam{} (c \PYZgt{} cur\PYZus{}floor) \PYZam{} (c : call\PYZus{}buttons))) \PYZam{} - (cur\PYZus{}floor /: call\PYZus{}buttons) THEN - cur\PYZus{}floor := ((cur\PYZus{}floor)+(1)) - END ; - move\PYZus{}down = SELECT door\PYZus{}open = FALSE \PYZam{} cur\PYZus{}floor \PYZgt{} groundf \PYZam{} (direction\PYZus{}up = FALSE) \PYZam{} - \PYZsh{} cu.((cu : INTEGER) \PYZam{} ((cu : INTEGER) \PYZam{} (cu \PYZlt{} cur\PYZus{}floor) \PYZam{} (cu : call\PYZus{}buttons))) \PYZam{} - (cur\PYZus{}floor /: call\PYZus{}buttons) THEN - cur\PYZus{}floor := ((cur\PYZus{}floor)\PYZhy{}(1)) - END ; - reverse\PYZus{}lift\PYZus{}up = SELECT direction\PYZus{}up = FALSE \PYZam{} door\PYZus{}open = FALSE \PYZam{} - \PYZsh{} c.((c : INTEGER) \PYZam{} ((c : INTEGER) \PYZam{} (c \PYZgt{} cur\PYZus{}floor) \PYZam{} (c : call\PYZus{}buttons))) \PYZam{} - ! l.((l : INTEGER) =\PYZgt{} (((l : INTEGER) \PYZam{} (l \PYZlt{}= cur\PYZus{}floor) \PYZam{} (l \PYZgt{}= groundf)) =\PYZgt{} (l /: call\PYZus{}buttons))) THEN - direction\PYZus{}up := TRUE - END ; - reverse\PYZus{}lift\PYZus{}down = SELECT direction\PYZus{}up = TRUE \PYZam{} door\PYZus{}open = FALSE \PYZam{} - \PYZsh{} cd.(cd : INTEGER \PYZam{} ((cd : INTEGER) \PYZam{} (cd \PYZlt{} cur\PYZus{}floor) \PYZam{} (cd : call\PYZus{}buttons))) \PYZam{} - ! u.(u : INTEGER =\PYZgt{} (((u : INTEGER) \PYZam{} (u \PYZgt{}= cur\PYZus{}floor) \PYZam{} (u \PYZlt{}= topf)) =\PYZgt{} (u /: call\PYZus{}buttons))) THEN - direction\PYZus{}up := FALSE - END ; - open\PYZus{}door = SELECT door\PYZus{}open = FALSE \PYZam{} (cur\PYZus{}floor : call\PYZus{}buttons) THEN - door\PYZus{}open := TRUE - END ; - close\PYZus{}door = SELECT door\PYZus{}open = TRUE THEN - door\PYZus{}open := FALSE || call\PYZus{}buttons := ((call\PYZus{}buttons)\PYZbs{}(\PYZob{}cur\PYZus{}floor\PYZcb{})) - END ; - push\PYZus{}call\PYZus{}button(floor) = SELECT (floor : (groundf .. topf)) \PYZam{} (floor /: call\PYZus{}buttons) THEN - call\PYZus{}buttons := ((call\PYZus{}buttons)\PYZbs{}/(\PYZob{}floor\PYZcb{})) - END - END -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}3}]:} Loaded machine: Lift -\end{Verbatim} - - \subsection{Initialising a Machine}\label{initialising-a-machine} - -Now we will set up constants and initialise the machine, to be able to -interact with it. You can set up constants with the commant -\texttt{:constants} and initialise with the command \texttt{:init}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}4}]:} :help :constants -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}4}]:} - - \begin{verbatim} -:constants [PREDICATE] -\end{verbatim} - -Set up the current machine's constants. - -This is a shorthand for -\texttt{:exec\ SETUP\_CONSTANTS\ {[}PREDICATE{]}}. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}5}]:} :constants -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}5}]:} Machine constants set up using operation 0: \$setup\_constants() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}6}]:} :help :init -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}6}]:} - - \begin{verbatim} -:init [PREDICATE] -\end{verbatim} - -Initialise the current machine with the specified predicate - -This is a shorthand for \texttt{:exec\ INITIALISATION\ {[}PREDICATE{]}}. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}7}]:} :init -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}7}]:} Machine initialised using operation 1: \$initialise\_machine() -\end{Verbatim} - - \subsection{Trace and State}\label{trace-and-state} - -After loading and initialising the machine, we can explore the state, -visualise the machine and state and more. We will start by finding out -in which trace we are currently in, to ensure, that we initialised the -machine. This can be done with the command \texttt{:trace}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}8}]:} :help :trace -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}8}]:} - - \begin{verbatim} -:trace -\end{verbatim} - -Display all states and transitions in the current trace. - -Each state has an index, which can be passed to the \texttt{:goto} -command to go to that state. - -The first state (index -1) is always the root state. All other states -are reached from the root state by following (previously executed) -transitions. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}9}]:} :trace -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}9}]:} - - \begin{itemize} -\tightlist -\item - -1: Root state -\item - 0: \texttt{SETUP\_CONSTANTS()} -\item - 1: \texttt{INITIALISATION()} \textbf{(current)} -\end{itemize} - - - - Switching to a different trace is possible by typing in -\texttt{:goto\ INDEX}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}10}]:} :help :goto -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}10}]:} - - \begin{verbatim} -:goto INDEX -\end{verbatim} - -Go to the state with the specified index in the current trace. - -Use the \texttt{:trace} command to view the current trace and the -indices of its states. Index -1 refers to the root state and is always -available. - -Going backwards in the current trace does \emph{not} discard any parts -of the trace, so it is possible to go forward again afterwards. However, -executing an operation in a state \emph{will} discard any parts of the -trace after that state (and replace them with the destination state of -the executed transition). - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}11}]:} :goto \PYZhy{}1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}11}]:} Changed to state with index -1 -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}12}]:} :trace -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}12}]:} - - \begin{itemize} -\tightlist -\item - -1: Root state \textbf{(current)} -\item - 0: \texttt{SETUP\_CONSTANTS()} -\item - 1: \texttt{INITIALISATION()} -\end{itemize} - - - - Now that we set the current state to -1, we are at out root state again. -We did not set up constants or initialise the machine, yet. From here, -we have two possibilities to go back to the initialised state. Either by -setting up constants and initialising again, or by simply typing -\texttt{:goto\ 1}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}13}]:} :goto 1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}13}]:} Changed to state with index 1 -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}14}]:} :trace -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}14}]:} - - \begin{itemize} -\tightlist -\item - -1: Root state -\item - 0: \texttt{SETUP\_CONSTANTS()} -\item - 1: \texttt{INITIALISATION()} \textbf{(current)} -\end{itemize} - - - - Another feature of ProB is, that you can find a state, for which a -predicate is true. In the following we will try to use it: - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}16}]:} :help :find -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}16}]:} - - \begin{verbatim} -:find PREDICATE -\end{verbatim} - -Try to find a state for which the given predicate is true (in addition -to the machine's invariant). - -If such a state is found, it is made the current state, otherwise an -error is displayed. - -Note that this command does not necessarily find a valid \emph{trace} to -the found state. Instead, in some cases a single ``fake'' transition is -added to the trace, which goes directly to the found state and does not -use the machine's operations to reach it. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}17}]:} :find cur\PYZus{}floor=0 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}17}]:} Found a matching state and made it current state -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}18}]:} :trace -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}18}]:} - - \begin{itemize} -\tightlist -\item - -1: Root state -\item - 0: \texttt{find\_valid\_state} \textbf{(current)} -\end{itemize} - - - - Note that the command leaves us with the root state and the current -state, with a valid trace. That means, we lose our previous trace. - -For the next example we will have to recreate that trace again, with the -following three commands: - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}19}]:} :goto \PYZhy{}1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}19}]:} Changed to state with index -1 -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}20}]:} :constants -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}20}]:} Machine constants set up using operation 0: \$setup\_constants() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}21}]:} :init -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}21}]:} Machine initialised using operation 1: \$initialise\_machine() -\end{Verbatim} - - \subsection{Interacting with the -Machine}\label{interacting-with-the-machine} - -If you want to interact with the machine, meaning, that you want to -know, which values the variables and constants have, you can simply type -in the identifiers of those. e.g. type in \texttt{cur\_floor} to find -out on which floor we are currently at. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}22}]:} cur\PYZus{}floor -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}22}]:} - - \(-1\) - - - - If you want to get an overview over the whole machine state and which -operations are currently possible, you can use \texttt{:browse}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}23}]:} :help :browse -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}23}]:} - - \begin{verbatim} -:browse -\end{verbatim} - -Show information about the current state. - -The output shows the names of all sets, constants, and variables defined -by the current machine, as well as a list of transitions that are -available in the current state. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}24}]:} :browse -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}24}]:} Machine: Lift - Sets: (none) - Constants: groundf, topf - Variables: call\_buttons, cur\_floor, direction\_up, door\_open - Operations: - push\_call\_button(-1) - push\_call\_button(0) - push\_call\_button(1) - push\_call\_button(2) -\end{Verbatim} - - To use operations, you have to use another command, that is slightly -different. Type in the name of any operation, that is currently possible -and put \texttt{:exec} before: - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}25}]:} :help :exec -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}25}]:} - - \begin{verbatim} -:exec OPERATION [PREDICATE] -\end{verbatim} - -Execute an operation. - -A transition for the given operation is found and executed. If the -optional predicate is specified, a transition is found for which the -predicate is \(\mathit{TRUE}\). The predicate can be used to restrict -what values the operation's parameters or the variables in the next -state may have. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}26}]:} :exec push\PYZus{}call\PYZus{}button floor=\PYZhy{}1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}26}]:} Executed operation: push\_call\_button(-1) -\end{Verbatim} - - If we check our trace again and browse our actions, we can see, that the -call button of the floor -1 is now pushed. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}27}]:} :trace -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}27}]:} - - \begin{itemize} -\tightlist -\item - -1: Root state -\item - 0: \texttt{SETUP\_CONSTANTS()} -\item - 1: \texttt{INITIALISATION()} -\item - 2: \texttt{push\_call\_button(-1)} \textbf{(current)} -\end{itemize} - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}28}]:} :browse -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}28}]:} Machine: Lift - Sets: (none) - Constants: groundf, topf - Variables: call\_buttons, cur\_floor, direction\_up, door\_open - Operations: - open\_door() - push\_call\_button(0) - push\_call\_button(1) - push\_call\_button(2) -\end{Verbatim} - - Of course, we could also type in \texttt{call\_buttons} to find out, -which call buttons are currently pushed. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}29}]:} call\PYZus{}buttons -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}29}]:} - - \(\{-1\}\) - - - - The \texttt{:let} command lets you store the value of an expression -under a different name. It is evaluated once on the current state. You -can use the \texttt{:unlet} command if you are not using the local -variable anymore. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}30}]:} :help :let -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}30}]:} - - \begin{verbatim} -:let NAME EXPR -\end{verbatim} - -Evaluate an expression and store it in a local variable. - -The expression is evaluated only once, in the current state, and its -value is stored. Once set, variables are available in all states and are -not affected by machine loads. A variable created by \texttt{:let} -shadows any identifier from the machine with the same name. - -\textbf{Note:} The values of local variables are currently stored in -text form. Values must have a syntactically valid text representation, -and large values may cause performance issues. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}31}]:} :let first\PYZus{}floor\PYZus{}called 1:call\PYZus{}buttons -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}31}]:} - - \(\mathit{FALSE}\) - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}32}]:} :exec push\PYZus{}call\PYZus{}button floor=1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}32}]:} Executed operation: push\_call\_button(1) -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}33}]:} first\PYZus{}floor\PYZus{}called -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}33}]:} - - \(\mathit{FALSE}\) - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}34}]:} :help :unlet -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}34}]:} - - \begin{verbatim} -:unlet NAME -\end{verbatim} - -Remove a local variable. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}35}]:} :unlet first\PYZus{}floor\PYZus{}called -\end{Verbatim} - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}36}]:} first\PYZus{}floor\PYZus{}called -\end{Verbatim} - - - \begin{Verbatim}[commandchars=\\\{\}] - - :eval: Computation not completed: Unknown identifier "first\_floor\_called" - - \end{Verbatim} - - Additionally, you can use the \texttt{:table} command to display an -expression as a table. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}37}]:} :help :table -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}37}]:} - - \begin{verbatim} -:table EXPRESSION -\end{verbatim} - -Display an expression as a table. - -Although any expression is accepted, this command is most useful for -sets of tuples. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}38}]:} :table cur\PYZus{}floor -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}38}]:} - - \begin{longtable}[]{@{}l@{}} -\toprule -cur\_floor\tabularnewline -\midrule -\endhead -\(-1\)\tabularnewline -\bottomrule -\end{longtable} - - - - If you are not sure which type an formula has, you can use -\texttt{:type} to find out. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}39}]:} :help :type -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}39}]:} - - \begin{verbatim} -:type FORMULA -\end{verbatim} - -Display the type of a formula. - -The returned types are \emph{not} standard B types. They are -human-readable, but cannot be used in code. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}40}]:} :type cur\PYZus{}floor -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}40}]:} INTEGER -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}41}]:} :type call\PYZus{}buttons -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}41}]:} POW(INTEGER) -\end{Verbatim} - - \subsection{Evaluations}\label{evaluations} - -If you just want to make sure, that a predicate is true, use the -\texttt{:assert} command instead. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}42}]:} :help :assert -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}42}]:} - - \begin{verbatim} -:assert PREDICATE -\end{verbatim} - -Ensure that the predicate is true, and show an error otherwise. - -This command is intended for verifying that a predicate is always true -at a certain point in a notebook. Unlike normal evaluation -(\texttt{:eval}), this command treats a \(\mathit{FALSE}\) result as an -error. If the result is \(\mathit{TRUE}\), solutions for free variables -(if any) are not displayed. - -Only predicates and \(\mathit{BOOL}\) expressions are accepted. -Expressions of other types cause an error. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}43}]:} :assert cur\PYZus{}floor=0 -\end{Verbatim} - - - \begin{Verbatim}[commandchars=\\\{\}] - - :assert: Assertion is not true: FALSE - - \end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}44}]:} :assert cur\PYZus{}floor=\PYZhy{}1 -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}44}]:} - - \(\mathit{TRUE}\) - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}45}]:} :browse -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}45}]:} Machine: Lift - Sets: (none) - Constants: groundf, topf - Variables: call\_buttons, cur\_floor, direction\_up, door\_open - Operations: - open\_door() - push\_call\_button(0) - push\_call\_button(2) -\end{Verbatim} - - Another notable feature is the following command, with which you can -pretty print predicates. Use \texttt{:prettyprint} to access it. - -You also have the option to solve predicates with different solvers. For -this you can use the command \texttt{:solve}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor} }]:} :help :prettyprint -\end{Verbatim} - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}47}]:} :prettyprint cur\PYZus{}floor=\PYZhy{}1 -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}47}]:} - - $\mathit{cur\_floor} = - 1$ - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}48}]:} :help :solve -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}48}]:} - - \begin{verbatim} -:solve SOLVER PREDICATE -\end{verbatim} - -Solve a predicate with the specified solver. - -The following solvers are currently available: - -\begin{itemize} -\tightlist -\item - \texttt{cvc4} -\item - \texttt{kodkod} -\item - \texttt{prob} -\item - \texttt{smt\_supported\_interpreter} -\item - \texttt{z3} -\end{itemize} - - - - \subsection{Modifying the Preferences}\label{modifying-the-preferences} - -We have seen before, that you can set preferences when loading the -machine with the \texttt{::load} command. You can modify or change the -values of preferences by using the \texttt{:pref} command. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}49}]:} :help :pref -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}49}]:} - - \begin{verbatim} -:pref [NAME ...] -:pref NAME=VALUE [NAME=VALUE ...] -\end{verbatim} - -View or change the value of one or more preferences. - -In the first form, the values of all given preferences are displayed (or -all preferences, if none are given). In the second form, the given -preference assignments are performed. The two forms cannot be mixed; it -is not possible to view and change preferences in a single command. - -Certain preference changes do not take full effect when performed on a -loaded machine. Such preferences must be assigned when the machine is -loaded using the \texttt{::load} or \texttt{:load} command. - - - - \subsection{Additional Features}\label{additional-features} - -In addition to the previous commands, you have the possibility to use -the \texttt{:stats} command to show statistics about the state space. -Moreover, you can use the \texttt{:time} command to measure the -execution time of commands with their arguments. This can be helpful for -measuring the solving time for specific machines. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}50}]:} :help :stats -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}50}]:} - - \begin{verbatim} -:stats -\end{verbatim} - -Show statistics about the state space. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}51}]:} :stats -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}51}]:} - - \textbf{Explored States:} 4/15\\ -\textbf{Transitions:} 14 - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}52}]:} :help :time -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}52}]:} - - \begin{verbatim} -:time COMMAND [ARGS ...] -\end{verbatim} - -Execute the given command and measure how long it takes to execute. - -The time is measured using Java's -\href{https://docs.oracle.com/javase/8/docs/api/java/lang/System.html\#nanoTime--}{\texttt{System.nanoTime()}} -method. The measured time is displayed with the full number of decimal -places, but no guarantees are made about the actual resolution of the -time measurement. - -As with any measurement of execution time, there will likely be small -differences between two measurements of the same command. The time is -measured by the kernel rather than ProB, so it will include some -overhead due to processing of the command by the kernel and -communication with ProB. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}53}]:} :time :stats -\end{Verbatim} - - - Execution time: 0.044099194 seconds - - \texttt{\color{outcolor}Out[{\color{outcolor}53}]:} - - \textbf{Explored States:} 4/15\\ -\textbf{Transitions:} 14 - - - - To find out your current ProB CLI and ProB2 version, you can use -\texttt{:version}. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}54}]:} :help :version -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}54}]:} - - \begin{verbatim} -:version -\end{verbatim} - -Display version info about the ProB CLI and ProB 2. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}55}]:} :version -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}55}]:} ProB CLI: 1.9.0-nightly (ab12dcd41e1150b19e8c00897fe53f96f76cbd0d) - ProB 2: 3.2.12-SNAPSHOT (06e75efe84ffdadf56df45e34acb44ec8e4603dd) -\end{Verbatim} - - \subsection{Visualisations}\label{visualisations} - -There are two possible ways of visualising the machine in jupyter -notebook. One can be accessed via the \texttt{:dot} command. This -command allows you to visualise a variety of different things, e.g. the -state as graph. You can use autocomplete by clicking \texttt{TAB} after -the command, as well. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}56}]:} :help :dot -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}56}]:} - - \begin{verbatim} -:dot COMMAND [FORMULA] -\end{verbatim} - -Execute and show a dot visualisation. - -The following dot visualisation commands are available: - -\begin{itemize} -\tightlist -\item - \texttt{machine\_hierarchy} - Machine Hierarchy: Shows the machine - hierarchy of a classical B model -\item - \texttt{event\_hierarchy} - Event Hierarchy: Shows the event hierarchy - of an Event-B model (\textbf{Not available for this machine/state}: - only available for Event-B models) -\item - \texttt{state\_space} - State Space: Show state space -\item - \texttt{state\_space\_sfdp} - State Space (Fast): Show state space - (fast) -\item - \texttt{current\_state} - Current State in State Space: Show current - state and successors in state space -\item - \texttt{signature\_merge} - Signature Merge: Show signature-merged - reduced state space -\item - \texttt{dfa\_merge} - DFA Merge: Show state space as deterministic - automaton (DFA) -\item - \texttt{transition\_diagram} - State Space Expression - Projection\ldots{}: Project state space onto expression values and - show transition diagram -\item - \texttt{enable\_graph} - Enable Graph: Show enabling graph of events -\item - \texttt{state\_as\_graph} - Current State as Graph: Show values in - current state as a graph -\item - \texttt{custom\_graph} - Customized Current State as Graph: Show - values in current state as a graph using CUSTOM\_GRAPH\_EDGES - (\textbf{Not available for this machine/state}: only available when - CUSTOM\_GRAPH\_NODES and CUSTOM\_GRAPH\_EDGES are defined in the - DEFINITIONS of a B machine) -\item - \texttt{expr\_as\_graph} - (Relational) Expression as Graph\ldots{}: - Show (relational) expression value as a graph -\item - \texttt{formula\_tree} - Custom Predicate/Expression Formula - Tree\ldots{}: Show predicate/expressions and sub-formulas as a tree -\item - \texttt{invariant} - Invariant Formula Tree: Show invariant as a - formula tree -\item - \texttt{properties} - Properties Formula Tree: Show properties as a - formula tree -\item - \texttt{assertions} - Assertions Formula Tree: Show assertions as a - formula tree -\item - \texttt{deadlock} - Deadlock Formula Tree: Show deadlocking status as - a formula tree -\item - \texttt{goal} - Goal Formula Tree: Show GOAL as a formula tree - (\textbf{Not available for this machine/state}: only available for - initialised B,Z or Event-B models with a GOAL DEFINITION) -\item - \texttt{dependence\_graph} - Dependence Graph: Show dependence graph - of events -\item - \texttt{variable\_modification\_graph} - Variable Read/Write Graph: - Show variable modification by operations and reading in guards -\item - \texttt{definitions} - Definitions Graph: Show dependence graph of - DEFINITIONS -\item - \texttt{predicate\_dependency} - Predicate Dependency Graph\ldots{}: - Show dependence graph of conjuncts of a predicate -\item - \texttt{last\_error} - Last Error Formula Tree: Show last error source - as a formula tree (\textbf{Not available for this machine/state}: only - available when error occured) -\end{itemize} - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}57}]:} :dot state\PYZus{}as\PYZus{}graph -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}57}]:} - - \begin{center} - \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_78_0.pdf} - \end{center} - { \hspace*{\fill} \\} - - - Another option is to use the \texttt{ANIMATION\_FUNCTION} with the -command \texttt{:show}. Note, however, that to use this you have to -write an \texttt{ANIMATION\_FUNCTION} for your B model. - -The following B model contains such an \texttt{ANIMATION\_FUNCTION} for -the visualisation of Lift4. You can use what you have learned before to -explore the visualisation. - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}58}]:} ::load - MODEL Lift0 - DEFINITIONS SET\PYZus{}PREF\PYZus{}SHOW\PYZus{}EVENTB\PYZus{}ANY\PYZus{}VALUES==TRUE; - ASSERT\PYZus{}LTL == \PYZdq{}G( [push\PYZus{}call\PYZus{}button(groundf)] =\PYZgt{} F \PYZob{}cur\PYZus{}floor=groundf \PYZam{} door\PYZus{}open=TRUE\PYZcb{})\PYZdq{}; - Rconv == (topf\PYZhy{}r+groundf); - ANIMATION\PYZus{}FUNCTION == ( \PYZob{}r,c,i|r:groundf..topf \PYZam{} ((c=2 \PYZam{} i=0) or (c=1 \PYZam{} i=2))\PYZcb{} \PYZlt{}+ - (\PYZob{}r,c,i|r:groundf..topf \PYZam{} Rconv:call\PYZus{}buttons \PYZam{} c=2 \PYZam{} i=1\PYZcb{} \PYZbs{}/ - \PYZob{}r,c,i|r:groundf..topf \PYZam{} Rconv=cur\PYZus{}floor \PYZam{} c=1 \PYZam{} - ((door\PYZus{}open=TRUE \PYZam{} i=3) or (door\PYZus{}open=FALSE \PYZam{} i=4))\PYZcb{} - ) \PYZbs{}/ \PYZob{}r,c,i| r=topf+1 \PYZam{} c=1 \PYZam{} - ((direction\PYZus{}up=TRUE \PYZam{} i=5) or (direction\PYZus{}up=FALSE \PYZam{} i=6)) \PYZcb{} ); - ANIMATION\PYZus{}IMG0 == \PYZdq{}images/CallButtonOff.gif\PYZdq{}; - ANIMATION\PYZus{}IMG1 == \PYZdq{}images/CallButtonOn.gif\PYZdq{}; - ANIMATION\PYZus{}IMG2 == \PYZdq{}images/LiftEmpty.gif\PYZdq{}; - ANIMATION\PYZus{}IMG3 == \PYZdq{}images/LiftOpen.gif\PYZdq{}; - ANIMATION\PYZus{}IMG4 == \PYZdq{}images/LiftClosed.gif\PYZdq{}; - ANIMATION\PYZus{}IMG5 == \PYZdq{}images/up\PYZus{}arrow.gif\PYZdq{}; - ANIMATION\PYZus{}IMG6 == \PYZdq{}images/down\PYZus{}arrow.gif\PYZdq{}; - ANIMATION\PYZus{}RIGHT\PYZus{}CLICK(J,r) == - IF J=2 THEN - push\PYZus{}call\PYZus{}button(topf\PYZhy{}r+groundf) - ELSIF J=1 THEN - CHOICE open\PYZus{}door OR close\PYZus{}door OR move\PYZus{}up OR move\PYZus{}down OR - reverse\PYZus{}lift\PYZus{}up OR reverse\PYZus{}lift\PYZus{}down - END - END; - CONSTANTS groundf,topf - PROPERTIES - topf : INTEGER \PYZam{} groundf : INTEGER \PYZam{} (groundf = \PYZhy{}1) \PYZam{} (topf = 2) \PYZam{} (groundf \PYZlt{} topf) - VARIABLES call\PYZus{}buttons,cur\PYZus{}floor,direction\PYZus{}up,door\PYZus{}open - INVARIANT - cur\PYZus{}floor : (groundf .. topf) \PYZam{} - door\PYZus{}open : BOOL \PYZam{} - call\PYZus{}buttons : POW(groundf .. topf) \PYZam{} - direction\PYZus{}up : BOOL \PYZam{} - (door\PYZus{}open = TRUE =\PYZgt{} cur\PYZus{}floor : call\PYZus{}buttons) - INITIALISATION cur\PYZus{}floor := (groundf) || door\PYZus{}open := FALSE || call\PYZus{}buttons := (\PYZob{}\PYZcb{}) || direction\PYZus{}up := TRUE - OPERATIONS - move\PYZus{}up = SELECT door\PYZus{}open = FALSE \PYZam{} cur\PYZus{}floor \PYZlt{} topf \PYZam{} direction\PYZus{}up = TRUE \PYZam{} - \PYZsh{} c.((c : INTEGER) \PYZam{} ((c : INTEGER) \PYZam{} (c \PYZgt{} cur\PYZus{}floor) \PYZam{} (c : call\PYZus{}buttons))) \PYZam{} - (cur\PYZus{}floor /: call\PYZus{}buttons) THEN - cur\PYZus{}floor := ((cur\PYZus{}floor)+(1)) - END ; - move\PYZus{}down = SELECT door\PYZus{}open = FALSE \PYZam{} cur\PYZus{}floor \PYZgt{} groundf \PYZam{} (direction\PYZus{}up = FALSE) \PYZam{} - \PYZsh{} cu.((cu : INTEGER) \PYZam{} ((cu : INTEGER) \PYZam{} (cu \PYZlt{} cur\PYZus{}floor) \PYZam{} (cu : call\PYZus{}buttons))) \PYZam{} - (cur\PYZus{}floor /: call\PYZus{}buttons) THEN - cur\PYZus{}floor := ((cur\PYZus{}floor)\PYZhy{}(1)) - END ; - reverse\PYZus{}lift\PYZus{}up = SELECT direction\PYZus{}up = FALSE \PYZam{} door\PYZus{}open = FALSE \PYZam{} - \PYZsh{} c.((c : INTEGER) \PYZam{} ((c : INTEGER) \PYZam{} (c \PYZgt{} cur\PYZus{}floor) \PYZam{} (c : call\PYZus{}buttons))) \PYZam{} - ! l.((l : INTEGER) =\PYZgt{} (((l : INTEGER) \PYZam{} (l \PYZlt{}= cur\PYZus{}floor) \PYZam{} (l \PYZgt{}= groundf)) =\PYZgt{} (l /: call\PYZus{}buttons))) THEN - direction\PYZus{}up := TRUE - END ; - reverse\PYZus{}lift\PYZus{}down = SELECT direction\PYZus{}up = TRUE \PYZam{} door\PYZus{}open = FALSE \PYZam{} - \PYZsh{} cd.(cd : INTEGER \PYZam{} ((cd : INTEGER) \PYZam{} (cd \PYZlt{} cur\PYZus{}floor) \PYZam{} (cd : call\PYZus{}buttons))) \PYZam{} - ! u.(u : INTEGER =\PYZgt{} (((u : INTEGER) \PYZam{} (u \PYZgt{}= cur\PYZus{}floor) \PYZam{} (u \PYZlt{}= topf)) =\PYZgt{} (u /: call\PYZus{}buttons))) THEN - direction\PYZus{}up := FALSE - END ; - open\PYZus{}door = SELECT door\PYZus{}open = FALSE \PYZam{} (cur\PYZus{}floor : call\PYZus{}buttons) THEN - door\PYZus{}open := TRUE - END ; - close\PYZus{}door = SELECT door\PYZus{}open = TRUE THEN - door\PYZus{}open := FALSE || call\PYZus{}buttons := ((call\PYZus{}buttons)\PYZbs{}(\PYZob{}cur\PYZus{}floor\PYZcb{})) - END ; - push\PYZus{}call\PYZus{}button(floor) = SELECT (floor : (groundf .. topf)) \PYZam{} (floor /: call\PYZus{}buttons) THEN - call\PYZus{}buttons := ((call\PYZus{}buttons)\PYZbs{}/(\PYZob{}floor\PYZcb{})) - END - END -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}58}]:} Loaded machine: Lift0 -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}59}]:} :help :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}59}]:} - - \begin{verbatim} -:show -\end{verbatim} - -Show the machine's animation function visualisation for the current -state. - -The visualisation is static, any defined right-click options cannot be -viewed or used. - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}60}]:} :constants -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}60}]:} Machine constants set up using operation 0: \$setup\_constants() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}61}]:} :init -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}61}]:} Machine initialised using operation 1: \$initialise\_machine() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}62}]:} :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}62}]:} - - - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}63}]:} :browse -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}63}]:} Machine: Lift0 - Sets: (none) - Constants: groundf, topf - Variables: call\_buttons, cur\_floor, direction\_up, door\_open - Operations: - push\_call\_button(-1) - push\_call\_button(0) - push\_call\_button(1) - push\_call\_button(2) -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}64}]:} :exec push\PYZus{}call\PYZus{}button floor=\PYZhy{}1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}64}]:} Executed operation: push\_call\_button(-1) -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}65}]:} :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}65}]:} - - - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}66}]:} :exec open\PYZus{}door -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}66}]:} Executed operation: open\_door() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}67}]:} :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}67}]:} - - - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}68}]:} :exec close\PYZus{}door -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}68}]:} Executed operation: close\_door() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}69}]:} :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}69}]:} - - - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}70}]:} :browse -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}70}]:} Machine: Lift0 - Sets: (none) - Constants: groundf, topf - Variables: call\_buttons, cur\_floor, direction\_up, door\_open - Operations: - push\_call\_button(-1) - push\_call\_button(0) - push\_call\_button(1) - push\_call\_button(2) -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}71}]:} :exec push\PYZus{}call\PYZus{}button floor=1 -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}71}]:} Executed operation: push\_call\_button(1) -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}72}]:} :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}72}]:} - - - - - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}73}]:} :exec move\PYZus{}up -\end{Verbatim} - - -\begin{Verbatim}[commandchars=\\\{\}] -{\color{outcolor}Out[{\color{outcolor}73}]:} Executed operation: move\_up() -\end{Verbatim} - - \begin{Verbatim}[commandchars=\\\{\}] -{\color{incolor}In [{\color{incolor}74}]:} :show -\end{Verbatim} - -\texttt{\color{outcolor}Out[{\color{outcolor}74}]:} - - - - - - This concludes the overview over the ProB jupyter notebook kernel. - - - % Add a bibliography block to the postdoc - - - - \end{document} diff --git a/output_78_0.pdf b/output_78_0.pdf deleted file mode 100644 index a5e13864b677bcb2305fe087f868b9daffb808d2..0000000000000000000000000000000000000000 Binary files a/output_78_0.pdf and /dev/null differ diff --git a/output_78_0.svg b/output_78_0.svg deleted file mode 100644 index 5c02d17cc9e92c479d29ac7fc93b9898df82fc86..0000000000000000000000000000000000000000 --- a/output_78_0.svg +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Generated by graphviz version 2.40.1 (20161225.0304) - --> -<!-- Title: state Pages: 1 --> -<svg width="574pt" height="131pt" - viewBox="0.00 0.00 573.70 131.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> -<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 127)"> -<title>state</title> -<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-127 569.6967,-127 569.6967,4 -4,4"/> -<!-- FALSE --> -<g id="node1" class="node"> -<title>FALSE</title> -<ellipse fill="#a52a2a" stroke="#a52a2a" cx="37.6967" cy="-105" rx="37.8943" ry="18"/> -<text text-anchor="middle" x="37.6967" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">FALSE</text> -</g> -<!-- ROOT-NODE --> -<g id="node2" class="node"> -<title>ROOT-NODE</title> -<polygon fill="#add8e6" stroke="#add8e6" points="292.6967,-36 205.5564,-18 292.6967,0 379.8369,-18 292.6967,-36"/> -<text text-anchor="middle" x="292.6967" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">ROOT-NODE</text> -</g> -<!-- FALSE->ROOT-NODE --> -<g id="edge1" class="edge"> -<title>FALSE->ROOT-NODE</title> -<path fill="none" stroke="#b22222" d="M45.4313,-87.0482C51.2604,-75.7333 60.3678,-61.829 72.6967,-54 96.4841,-38.8946 164.3902,-29.3258 218.5285,-23.8823"/> -<polygon fill="#b22222" stroke="#b22222" points="219.1954,-27.334 228.8089,-22.8808 218.5167,-20.367 219.1954,-27.334"/> -<text text-anchor="middle" x="101.6967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">door_open</text> -</g> -<!-- TRUE --> -<g id="node3" class="node"> -<title>TRUE</title> -<ellipse fill="#698b22" stroke="#698b22" cx="126.6967" cy="-105" rx="33.5952" ry="18"/> -<text text-anchor="middle" x="126.6967" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">TRUE</text> -</g> -<!-- TRUE->ROOT-NODE --> -<g id="edge2" class="edge"> -<title>TRUE->ROOT-NODE</title> -<path fill="none" stroke="#a0522d" d="M128.4128,-86.5614C130.3881,-75.6337 134.6244,-62.3348 143.6967,-54 156.5391,-42.2015 195.2856,-33.048 230.0463,-26.9236"/> -<polygon fill="#a0522d" stroke="#a0522d" points="230.9228,-30.3249 240.195,-25.1989 229.7499,-23.4239 230.9228,-30.3249"/> -<text text-anchor="middle" x="178.1967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">direction_up</text> -</g> -<!-- -1 --> -<g id="node4" class="node"> -<title>-1</title> -<polygon fill="#cdba96" stroke="#cdba96" points="319.6967,-123 265.6967,-123 265.6967,-87 319.6967,-87 319.6967,-123"/> -<text text-anchor="middle" x="292.6967" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">-1</text> -</g> -<!-- -1->ROOT-NODE --> -<g id="edge3" class="edge"> -<title>-1->ROOT-NODE</title> -<path fill="none" stroke="#473c8b" d="M265.574,-99.2206C249.2281,-94.1898 229.6958,-85.08 219.6967,-69 209.7592,-53.0192 225.7758,-40.7054 245.3118,-32.1844"/> -<polygon fill="#473c8b" stroke="#473c8b" points="246.7714,-35.3705 254.7693,-28.4218 244.1838,-28.8664 246.7714,-35.3705"/> -<text text-anchor="middle" x="245.1967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">cur_floor</text> -</g> -<!-- -1->ROOT-NODE --> -<g id="edge5" class="edge"> -<title>-1->ROOT-NODE</title> -<path fill="none" stroke="#000000" d="M292.6967,-86.9735C292.6967,-75.1918 292.6967,-59.5607 292.6967,-46.1581"/> -<polygon fill="#000000" stroke="#000000" points="296.1968,-46.0033 292.6967,-36.0034 289.1968,-46.0034 296.1968,-46.0033"/> -<text text-anchor="middle" x="326.1967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">call_buttons</text> -</g> -<!-- -1->ROOT-NODE --> -<g id="edge7" class="edge"> -<title>-1->ROOT-NODE</title> -<path fill="none" stroke="#bdef6b" d="M319.7358,-98.1105C334.6112,-92.7883 351.8084,-83.7625 360.6967,-69 369.8361,-53.8203 355.4433,-41.6607 337.5823,-33.0275"/> -<polygon fill="#bdef6b" stroke="#bdef6b" points="338.5958,-29.6502 328.0322,-28.837 335.7831,-36.0602 338.5958,-29.6502"/> -<text text-anchor="middle" x="384.1967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">groundf</text> -</g> -<!-- 1 --> -<g id="node5" class="node"> -<title>1</title> -<polygon fill="#cdba96" stroke="#cdba96" points="475.6967,-123 421.6967,-123 421.6967,-87 475.6967,-87 475.6967,-123"/> -<text text-anchor="middle" x="448.6967" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">1</text> -</g> -<!-- 1->ROOT-NODE --> -<g id="edge4" class="edge"> -<title>1->ROOT-NODE</title> -<path fill="none" stroke="#000000" d="M438.6092,-86.6124C431.7628,-75.7039 421.7712,-62.4073 409.6967,-54 392.4638,-42.0011 371.1042,-33.9017 351.3706,-28.479"/> -<polygon fill="#000000" stroke="#000000" points="352.0918,-25.0507 341.5356,-25.9538 350.351,-31.8308 352.0918,-25.0507"/> -<text text-anchor="middle" x="458.1967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">call_buttons</text> -</g> -<!-- 2 --> -<g id="node6" class="node"> -<title>2</title> -<polygon fill="#cdba96" stroke="#cdba96" points="565.6967,-123 511.6967,-123 511.6967,-87 565.6967,-87 565.6967,-123"/> -<text text-anchor="middle" x="538.6967" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">2</text> -</g> -<!-- 2->ROOT-NODE --> -<g id="edge6" class="edge"> -<title>2->ROOT-NODE</title> -<path fill="none" stroke="#efdf84" d="M528.0369,-86.8227C520.4593,-75.5637 509.2422,-61.808 495.6967,-54 473.2129,-41.0397 411.0663,-31.2111 361.4046,-25.1247"/> -<polygon fill="#efdf84" stroke="#efdf84" points="361.6802,-21.6328 351.3353,-23.9202 360.8488,-28.5832 361.6802,-21.6328"/> -<text text-anchor="middle" x="524.6967" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">topf</text> -</g> -</g> -</svg> \ No newline at end of file diff --git a/output_79_0.pdf b/output_79_0.pdf deleted file mode 100644 index 39e31061bab60c77b0fe2abdd3f5cdb06f981d1d..0000000000000000000000000000000000000000 Binary files a/output_79_0.pdf and /dev/null differ diff --git a/output_79_0.svg b/output_79_0.svg deleted file mode 100644 index 9a855026297f11985d2e98e21ffae57be42265fa..0000000000000000000000000000000000000000 --- a/output_79_0.svg +++ /dev/null @@ -1,99 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Generated by graphviz version 2.40.1 (20161225.0304) - --> -<!-- Title: state Pages: 1 --> -<svg width="536pt" height="131pt" - viewBox="0.00 0.00 536.49 131.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> -<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 127)"> -<title>state</title> -<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-127 532.4937,-127 532.4937,4 -4,4"/> -<!-- TRUE --> -<g id="node1" class="node"> -<title>TRUE</title> -<ellipse fill="#698b22" stroke="#698b22" cx="33.797" cy="-105" rx="33.5952" ry="18"/> -<text text-anchor="middle" x="33.797" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">TRUE</text> -</g> -<!-- ROOT-NODE --> -<g id="node2" class="node"> -<title>ROOT-NODE</title> -<polygon fill="#add8e6" stroke="#add8e6" points="260.797,-36 173.6568,-18 260.797,0 347.9373,-18 260.797,-36"/> -<text text-anchor="middle" x="260.797" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">ROOT-NODE</text> -</g> -<!-- TRUE->ROOT-NODE --> -<g id="edge1" class="edge"> -<title>TRUE->ROOT-NODE</title> -<path fill="none" stroke="#b22222" d="M35.2345,-86.8422C37.0949,-75.738 41.3079,-62.1465 50.797,-54 70.531,-37.0582 131.9518,-27.8663 183.3061,-23.0221"/> -<polygon fill="#b22222" stroke="#b22222" points="183.7819,-26.4935 193.4275,-22.1103 183.1537,-19.5218 183.7819,-26.4935"/> -<text text-anchor="middle" x="85.297" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">direction_up</text> -</g> -<!-- ROOT-NODE->ROOT-NODE --> -<g id="edge5" class="edge"> -<title>ROOT-NODE->ROOT-NODE</title> -<path fill="none" stroke="#000000" d="M311.7306,-25.4982C340.0441,-26.8978 366.1169,-24.3984 366.1169,-18 366.1169,-12.3764 345.9763,-9.7647 321.8755,-10.1649"/> -<polygon fill="#000000" stroke="#000000" points="321.6089,-6.6717 311.7306,-10.5018 321.8413,-13.6679 321.6089,-6.6717"/> -<text text-anchor="middle" x="405.6169" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">inside_buttons</text> -</g> -<!-- 1 --> -<g id="node3" class="node"> -<title>1</title> -<polygon fill="#cdba96" stroke="#cdba96" points="197.797,-123 143.797,-123 143.797,-87 197.797,-87 197.797,-123"/> -<text text-anchor="middle" x="170.797" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">1</text> -</g> -<!-- 1->ROOT-NODE --> -<g id="edge2" class="edge"> -<title>1->ROOT-NODE</title> -<path fill="none" stroke="#a0522d" d="M143.5311,-89.5409C129.5789,-79.6256 117.333,-66.3421 126.797,-54 135.9895,-42.0119 168.3405,-33.1292 198.9506,-27.1866"/> -<polygon fill="#a0522d" stroke="#a0522d" points="199.6023,-30.6255 208.7962,-25.3603 198.3255,-23.7429 199.6023,-30.6255"/> -<text text-anchor="middle" x="160.297" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">call_buttons</text> -</g> -<!-- 1->ROOT-NODE --> -<g id="edge7" class="edge"> -<title>1->ROOT-NODE</title> -<path fill="none" stroke="#bdef6b" d="M189.4451,-86.9735C203.4754,-73.4109 222.7826,-54.7473 237.7754,-40.2542"/> -<polygon fill="#bdef6b" stroke="#bdef6b" points="240.4143,-42.5713 245.1716,-33.1046 235.5491,-37.5383 240.4143,-42.5713"/> -<text text-anchor="middle" x="232.797" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">topf</text> -</g> -<!-- -1 --> -<g id="node4" class="node"> -<title>-1</title> -<polygon fill="#cdba96" stroke="#cdba96" points="377.797,-123 323.797,-123 323.797,-87 377.797,-87 377.797,-123"/> -<text text-anchor="middle" x="350.797" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">-1</text> -</g> -<!-- -1->ROOT-NODE --> -<g id="edge3" class="edge"> -<title>-1->ROOT-NODE</title> -<path fill="none" stroke="#a0522d" d="M323.6897,-101.9537C302.9755,-98.0547 275.6924,-89.18 261.797,-69 257.1356,-62.2303 255.7227,-53.6658 255.8156,-45.4976"/> -<polygon fill="#a0522d" stroke="#a0522d" points="259.3045,-45.774 256.6073,-35.5283 252.3265,-45.2198 259.3045,-45.774"/> -<text text-anchor="middle" x="295.297" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">call_buttons</text> -</g> -<!-- -1->ROOT-NODE --> -<g id="edge6" class="edge"> -<title>-1->ROOT-NODE</title> -<path fill="none" stroke="#efdf84" d="M346.2352,-86.7909C342.8415,-76.2176 337.3012,-63.2099 328.797,-54 321.3804,-45.9678 311.7557,-39.3919 302.0929,-34.1621"/> -<polygon fill="#efdf84" stroke="#efdf84" points="303.397,-30.901 292.8877,-29.5568 300.2649,-37.1612 303.397,-30.901"/> -<text text-anchor="middle" x="364.297" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">cur_floor</text> -</g> -<!-- -1->ROOT-NODE --> -<g id="edge8" class="edge"> -<title>-1->ROOT-NODE</title> -<path fill="none" stroke="#5863ee" d="M377.829,-89.2398C391.3652,-79.32 403.0879,-66.1401 393.797,-54 384.7192,-42.1383 352.8479,-33.2825 322.5817,-27.3226"/> -<polygon fill="#5863ee" stroke="#5863ee" points="322.8887,-23.8191 312.4143,-25.4123 321.596,-30.6987 322.8887,-23.8191"/> -<text text-anchor="middle" x="418.297" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">groundf</text> -</g> -<!-- FALSE --> -<g id="node5" class="node"> -<title>FALSE</title> -<ellipse fill="#a52a2a" stroke="#a52a2a" cx="490.797" cy="-105" rx="37.8943" ry="18"/> -<text text-anchor="middle" x="490.797" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">FALSE</text> -</g> -<!-- FALSE->ROOT-NODE --> -<g id="edge4" class="edge"> -<title>FALSE->ROOT-NODE</title> -<path fill="none" stroke="#473c8b" d="M479.2874,-87.6545C470.8217,-76.3008 458.2969,-62.1147 443.797,-54 423.6778,-42.7404 369.3139,-32.8677 325.0301,-26.3232"/> -<polygon fill="#473c8b" stroke="#473c8b" points="325.2844,-22.8236 314.8862,-24.8553 324.2818,-29.7514 325.2844,-22.8236"/> -<text text-anchor="middle" x="491.797" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">door_open</text> -</g> -</g> -</svg> \ No newline at end of file