<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <title>liamoc.net</title>
        <link>http://liamoc.net</link>
        <description><![CDATA[Musings of Liam O'Connor, lambda scientist]]></description>
        <atom:link href="http://liamoc.net/rss.xml" rel="self"
                   type="application/rss+xml" />
        <lastBuildDate>Sat, 08 Jul 2017 00:00:00 UT</lastBuildDate>
        <item>
    <title>What is abstraction anyway?</title>
    <link>http://liamoc.net/posts/2017-07-08-abstraction.html</link>
    <description><![CDATA[<p>Abstraction is one of the most ubiquitous concepts in Computer Science, and yet it is also one of the most poorly taught<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a>. Programmers (and even computer scientists) often confuse <em>semantic</em> notions of abstraction and refinement in terms of <em>models</em> with the <em>syntactic</em> notions of abstraction that exist within a particular programming language. In this post, I’ll give an overview of these two different notions of abstraction, and how they might be related.</p>
<p>Let’s be clear: abstraction is not about indirection, nor is it the process of giving things names, nor is it even the packaging of code into reusable modules. Informally, abstraction is the merely the <em>elimination of detail</em>.</p>
<h2 id="semantic-abstraction">Semantic Abstraction</h2>
<p>When we discuss the semantics of a particular program, we are really discussing what is called the semantic <em>model</em> of a program. A model is a mathematical object that captures the interesting aspects of what the program <em>means</em>. While there are a variety of models for various domains, languages, and objectives, a common choice for a semantic model of an imperative program is some kind of <em>state transformer</em>, which describes the <em>transitions</em> possible from a given initial state to some final state(s).</p>
<p>To eliminate detail on a model such as this requires a way to be imprecise about some aspects of a program — usually, this takes the form of non-determinism. Non-determinism can be hard for beginners to grasp, but it typically has to be employed when modelling real programs. For example, suppose we had a greeting program that differed depending on the physical location of the computer<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a>:</p>
<p><img width=354 alt=" \begin{array}{l} \textsf{\textbf{if}}\ \mathit{currentLocation}() = \text{Korea}\ \textsf{\textbf{then}} \\ \quad \textsf{\textbf{say}}\ \text{``안녕 하세요&39;&39;} \\ \textsf{\textbf{else}} \\ \quad \textsf{\textbf{say}}\ \text{``Hello!&39;&39;}\\ \textsf{\textbf{fi}}  \end{array} " height=135 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-60px;"/></p>
<p>If we wanted to mathematically model the behaviour of this program, it would be frightfully inconvenient to include the geography of Earth and the computer’s physical location in our model. That’s where non-determinism comes in. If we <em>abstract</em> away from the geographical details, and instead regard the program as choosing between the two options based on some <em>unspecified criteria</em>, then we can get away with modelling less, at the cost of some detail:</p>
<p><img width=206 alt=" \begin{array}{l} \textsf{\textbf{if}}\ \mathit{???}\ \textsf{\textbf{then}} \\ \quad \textsf{\textbf{say}}\ \text{``안녕 하세요&39;&39;} \\ \textsf{\textbf{else}} \\ \quad \textsf{\textbf{say}}\ \text{``Hello!&39;&39;}\\ \textsf{\textbf{fi}}  \end{array} " height=135 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-60px;"/></p>
<p>Such underspecified conditionals are usually called <em>non-deterministic choice</em>, where <img width=221 alt="\textsf{\textbf{if}}\ \mathit{???}\ \textsf{\textbf{then}}\ P\ \textsf{\textbf{else}}\ Q\ \textsf{\textbf{fi}}" height=21 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-6px;"/> is written simply as <img width=61 alt="P + Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAAAgCAQAAAA1BtdpAAAB+klEQVR4nNWYbYGEIBCGqUAFK1DBClawghWoYAUqWGErWMEKHssg6gEzA+ut3suvXQEfYJgPhXiuGl43KXSi9aL9W7pInRjFS6yhvSwFuoQ3+Bw6T7btw0f79BtqHcFsSVrXOksBBBonkB5dhX86j79wD+4D9R7xrM6+GzYTRYcVHiU9umEDyCrzAuw+8UT5XUcJYvD3mmEg11zaaAZaCkXTngDZkBS4oIedVAMO782Zo/TmMuYn0LeAN96KKa6F6pCalg9TDg5vHZAeitq8FLgm9+OscvCJcaJL9vI6xeCNH9KxMcrBF8aJTklnGfQbXHnPjlyLSOXgHFNkg0sXfNdi7HJwyQLXHPC9LRa6NJyUgrcs8JEDDslVywjz0mcVxza4ixa33Gw8cMJUTJHj2wI1r+Xd3YqGnyN41kWkI2deTcGO51MGwtU5EWlHKXhK5V7FkC4AzGnKd7gHvCeNZaTO5B5wKomCIDhjUwC4wrqQqskONzec3lPjHDNKxckaKNWAi1Aoxuijw8av7o3gMqCbg61D6TjRNjC5UvWz0rgOHMr1xcPPrlyHZbDSuytK4lrwbfQQvjcQBfLV+gx8n4OOpherKcjd8zJUyHmqtm88V2zCl6XcVSX89zPV+ZpgOFzSr1p9vdTpe+bL/vo3piNtzDTOq+uj0fwA+pZwBc9h/9UAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>.</p>
<p>While we tend to view our physical machines as deterministic automata, the state upon which each decision is deterministically made includes a number of external things which are tedious to model mathematically. We can also use non-determinism to ignore details that we don’t care about for our particular domain — a common example is memory allocation, where it is very convenient (for some programs) to think of memory as infinite, and allocation as an operation that can potentially fail, without specifying exactly when and how this failure can occur. This is normally modelled as a non-deterministic choice between successful allocation and a failure state.</p>
<p>In a total, deterministic setting, we might model semantics of a program as a total function — given an initial state, there will be exactly one final state determined entirely by the initial state. But, with non-determinism, each use of the choice operator potentially doubles the number of final states<a href="#fn3" class="footnote-ref" id="fnref3"><sup>3</sup></a>. So, with non-determinism in our language, the semantics of a program are given as a binary <em>relation</em> on states: a mapping from initial states to <em>every possible</em> final state. For our purposes, we will define a <em>state</em> as just a mapping from variable names to their values. We shall call the set of all states <img width=17 alt="\Sigma" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAXCAQAAAC/3ZebAAAApElEQVR4nJ2UYRGAIAyFV4EKVKDCKlDBClSgghWoYAUqWMEKChPu1Jt6j71/jk+f4wHRvTwtijbai1ZSK0nzTVGH5ta2elsvUyx8vPOtuH2LMSwKlDGoWwwYdlrcsHF0iwmDukWPYTzyXySxMRgS8b1yeCpM2dqMWquxdRgy4dbcaO5Aa0nCw6LrIGx7piQkfB72quWJ2F9EGRC3G0e7jbqmc+kBbK58YsyCR6gAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>.</p>
<h2 id="a-toy-language">A Toy Language</h2>
<p>Before we go any further, let’s define a little language that we can use for our programs. For simplicity, we will assume that all our variables contain integers. First I’ll introduce the syntax, and then I’ll discuss the semantics of each form separately.</p>
<p><img width=589 alt=" \begin{array}{lclrrr} \mathcal{P} &amp; ::= &amp; x := e &amp; \text{where}&amp; e \in \mathcal{E} &amp; \text{(assignment)} \\             &amp; |   &amp; P + Q &amp;\text{where}&amp; P, Q \in \mathcal{P} &amp;\text{(nondeterministic choice)} \\             &amp; |   &amp; P;Q &amp;\text{where}&amp; P, Q \in \mathcal{P} &amp; \text{(sequential composition)} \\             &amp; |   &amp; g &amp;\text{where}&amp; g \in \mathcal{B} &amp; \text{(guard)} \\             &amp; |   &amp; P^\star &amp;\text{where}&amp; P \in \mathcal{P} &amp; \text{(Kleene star)} \end{array} " height=141 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3QAAADTCAQAAABjaJn7AAA3ZklEQVR4nO2dibmzKhCGbcEWbMEWbMEWbCEt2IItpAVbsAVbSAvnhE0YGMQFF8y8ee49fxYFYZiPnSwjCIIgrqHO/rLP1ZF4DCVPzSLeDauYNyMIYiXltwxWV0eC2ImQuaPzsfiGkB8cxl14xZC6ImuyNuuz8Xuz4fv3/X1X/0wS/ioqx//Isd6C6lvuRPljedJR+UuW8pRSVXwdP3P+v2In7b42cvUtWMP3Jq/vv4bvrdjf9lvMWCK2P5OIv4hwqCR096DlIlfyf+c8b7qLY0Rs5XNK7rWPLL3l1/Zbz3esWv7edtsWNLB7I9lyWb8kqXsqDa/QPK+opEht1c0rni9EirAyNZ4QTiVbdM8abGKW33u+K3ipaNbftLWcXA/e51xBqV75bEjo7sDA+080LQldouRbnfEGWN/bs2RuXuhEJWJYe8vCaQj2ltN70cyhx0NCdwfsXPhs76QhLuWs9txT6WeFblOb7uW012yhEx0o1Hn5ZEjoYlJ/S5Sa4iNeoxx3m8fOhReNjyfKOeNzz2WYFbpN43StU/cgofs9SOhi8eJOjg2lm6/XovIzUi48gnPmWz6XmqffnNBtmHvpjgNgQveUrssaWXNSXCjiNZ/ez15x+vNzvv5KvUrrfeG8V6iCWfK2CIsNliblNEfTbKGwdTwNv4p9VvF/1eC6htfQ/ngtLK3RhHX5I+ZJbh8xaakd8Aj8HZesBH1kWeiRVn479QN0vK8t9E3By3GP3kt83vFvcqOEwvJaSAu3rbbkY3+9lBv1q84Ip5IlAxP03Iiv2SsB74p5GxZTcd2A+CnFhs5Ltg4jPEa3t/iJPtccfXcWtUx6OIe0/D7//MDmUbGtvvH5fFO2lfIRY25rZXSX/XEjNN+3znuFMJsefFtb967Bt2wJiqA1rhiQe7fgquMX0MZibf7k3198FnVRzt3hrCkMxHH0no41uwRhg0bwFfpGly1YqspJTkW11LzOLK+wbJoToXrjig78ij3ZC9zfXsWXW/EdgecXr8LjbaCHcuOl+Hg+X4EtdCyZ9hRfHfkX8u4sWr5OcJyySpBzZ2a7dJOjYttw16nqKi1i9lsoeQ1JGBerpZV8faR63xjfw1aKNmLW0faW5mtSy7uwawr5i0Y+iQpj4L9o5f3NJxP1PrFGc58YnMX6/GkjTPLO+V062qghaXzOuTckSjl67Vda47pKCknomwbd7iGXSw5Et7mSVGZZY2aW1w+38XZaMW36eb2RhKjom7/qjLuPTslQMtfx0vDivxidu3483kZ4KBH/fqY3ZX66yiKg0HXZ/jpmmZm1DviOUa14bY8DI5dZrO4TroPbsY0TV7FiynSLIvvjuDc4VNtYBa/K3I4Vu+bUWWafS5nLwC8G5w4jf6Z66rysnWIw7q+JncD6/KmyOKMytVF/3lmQiYvQlUDIyyozI3jfgxLWGXLm/0aHZ9qeECL1yQuNT29ZWGPJrr6z7TtsTzBaleLWCk+0Ls3GRMjbLJGxLqbQsZr7J0pXSg10Gb4rpoIdfu0v+oWsxzC6Ra0LM7ax4uq6+94x1+3AoVrbpLH9NmzjtQtP4xSW0ipuf2hxEkXOTONXEg58ff50EZ6q4eH2fF8iIlXskuEHzo+wnTsUOvwb/X5uWQq2TEXYc2F9YldB3Z6d3hEl+BS57NcxeVt3DnmbJUIXYeaIcIQ9b+08bymirnE0l3Wi1U7GNrxbIVb3aAmMWPXRKz6IILmdLTCGfeYWXngNLu3upyns9rElf/ZXCEUbOYVuXWKO5RYOfym68HTLp59Kjv8bgW2tdmnGZMP9zCd0boUPihQUugq5xp7wGPI2S4Vupx8RD1w9uMiJxvZ1Y0Vmxhe879yep7gXPVRb8WqLbqGUaE3Iba3AT3ytVih0djsRG1j+S0Do1udP6aTfljBHGpl7AGEXXMoZi4MlER9ZMWwsW/J/I9gqdK6EYUJXOb+C94Iy1jpl3S3zIW9zotA9u+sE748+D9E+yvm0+48ctI2L7sHuuPky8xOdF02GzQiLI3R2MUlV6Nbnj/9JxStUqdq8fx9xO+ZccG7NYIS/VIL251Qb/d8w7NK7tOuShO7hQof1Ep+JXo22bCHxerQZDPyvbsdh5rxM6OYNzy909596YrM+fyouU3MTk+bv85LSSqSP3wWr5QViDiP+yzbTK+0+C7+xS68YGVfVsxqtRB0rdPP6cROhGx9f5NSk2Ktq0P0JAiCeL58EnRWRInMHsvWvSegU6/OHpfOezuf3/mJL3ASfCxYzlwejVPmddSW7Nd0FLdg3duktpRiyAahOhmqTjtDh89cjCN35Ra5f/Iqxb0TNx0LM1R1nx1UYQ9xROTeeaoH423qPCVbI9MagVWDSUCwQyDuyJX+GXbaJTfYh0sTngt3DsOAvsfXLn8A3AqxFZ74GRCqOEjp7MRPGOqHDU3OT0JXGKIR7msHRFFm7+LW/DZbLBeJLMuSouL48tbWYtNxUusyclNLzp8bCDZlel7ktYDakDjcRc1NTFEk4PrVnNeQ5bMmfZtcpz+5KIkVLm4IlB8tLd1zXlQhX6MzvtYD4v9HhmWVKDFeIrbbeHj90lNCJVXOwCZFbZT6G0DXrq9ANqB80jkOLQf4Vl8Lz7lz01NwBOBd/fOLHVi1Ch46tjnp8YpGJvQW0kbCanW/8NWR6om0GRwbg6Wm40InqhFlxyhNou2zLn3FHBbH2VrvGQ8ojcSR4XvZoCbK3+dKVJSh0+Dc6PFtIQp7kKKFTlTZzql8diO+c0Pn8xYadUVqQMP0BkzTUljQF8u5cXsaTVtJ5V3xhvC/RjoltL8NWLqzmA83xlxjYC8V9iyzDpifMV2/mXGdu94nPUZubOev5n3dmS/6Uq1uBJvjmaJuOmCQuBt/9p7XKo9q8WOV5DyqFhTwFY/4bAS4T83s0HSd0ap9NtZmz2BLMFL6l3ob5DF/LbVhf2oTDF0X6dcjqMjX5ukXenUnBJ4tr3pnuxfZ1Ox0T23IK+U/W6/rowi+MRT9vC4qLwt4uFvsE/pK1E4dMbzJkTyiGZllMW8qOWS83Pbr/JgTb8qfhG6Rve7pcpqme5yl2FI2x1TdxLr7WxmcqP2o/Wr1oAJYv9e9yut/8N7Dkldmf89JVVLu8Vs4n7p3/0OvsZUcq/Hp6riHrweKGpd5GTafx70e0ySe3k/uK724Zd2nRvTLYHZVPM5j8zuSo2NaZ3lN8OKRzyj4VC1+rtVzoxLbFuuBU06dzQsfC7cC395c5xrb8KWVNc1tnt5oNrKoEI3VaJolvokQByk/HP1HnfYi+tAa1urlv3JKXgzV35ku0qo4XOnGEj/5cV7bXV6tHVOY2z7kU5xod54KKb9YUnndnYnc+5XxH/3mOiy07F+q60cptNBsnBYkJOnefhgLZlj/69D3ztbSfhJXEmu92mZZdECb+9kYr19C5KC8jSlix6BsMsYrOLKHFVEU9EzVxb6sdNzN+JsLZBQRB7AUecBteME48iysdMWxDKcoZ8U2PJz0LQRBEksBt1c/FJwLPEQe4ToAgCIK4BHgm5JnoY8hM3IO20uWDtlkJgiCIU7lum+7XNIlDL6TybQSWIl125T7FBEEQxER7WQfbC51z+QyZs+eSEwRBEBdy3ZSUgm8Appcy+DYCS43cOGmTIAiCuAE0DT4mJHMEQRA3xLdqjlhPEWVbf4IgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCAKQZ/VFxxQSxG/RXnZSGkFsp+SnQSSuEtVPHr2QeKY9lOtzpTowDi0/sOX6Z0yfcqPHKr7X5ReGfy4xY/lKX+rOELqcb7Bqv5rTzaXOuq+rMc+Jai/MPHacx5jUGU/H5OP1uVJ8n0HlxvD9+/6+q6O4RM2LH9pyD1fRfJ9RpHiK2x7XPObrTyYo+A78n935ujX8JcTLmdixvO6Mv0icJXTj5Mb6KTP/+MHscR2Kj4rHYPzGpOKvejo1qj0pBjb61KqUhC5uPl6fKxV/ivYrRBV/Gva3/T7NJ2ocystOvcZop1xb407Lb0rdQRiVhaylXVnafM+7NfwlbMsZjPixHNPueD+r6zKXLrKcPqmlmzyjSdygxlNzd8ac9hVS13CHmpLQMWLm4/W50n7D0qnfG3mRfwt1vDiMvCpwFyreEl97wlh1kxPeXhtP7a5ki26plfqed2v4y8LckjMY8WNZ3Kqytprzxuh6p4aRSxe5vJ6Qb4pr482iUtZ7rquppCZ0cfKRcX2utFba9+B9Hk2eau5gy/APT6VPVOhEFXEL1apOcf/zbg1/KWtzBid+LLvDBP4ErhQ61ZP8t7jeXG1ojJezTnNth0ZsniB06/PxDrlSOOH3VohiCH4/92rPKda60187s/u6540jdPFJuk13rdBlKx3aFqET4fpqcrnsKLvKET1D6Nbm4zG5wqa19NMoInuNM+2ol3N/W+iqleKNc6/xOc1adzr8mNBd97x3Fbqkx+nOE7r2EqErgn3VIl5XzShKT+hi5GP8XHlxaeytGaGvGZlquRCaHCN0d5pvabLOnR451/COXPm89xW6hOdeXit0RbZubtB6oROhvmZ+Ua500ji5nDcoXqX1vnDeK1TIJW+N9N+aP+ZYy2kWldlGYeuCGn4V+6zi/6rBdc00L/IdzdXGyMe4uZJL17DuCd3nwIRuf7HGOi5hzhV8cUPvfYJ2yv3eahkyW+qm2YHCAnpPmulQxPeYOy3kfFP23DqkXI6nsqqJa8EM3D5LPirWc7nI5fMWyPOr78yY+8pDOV25Li0LHmv1K/1k+nlbHmLoed3wFWzG8EemQb/AFnNjWQ2c36lyZrtdbIslnvvwF/fsnVjAtULXBmv2kPVC1y9wl58I2VdN3WXC8OD71nmvECH34NvauncNvtUC0RpXDMi9W3DVJ1I+x8jHmLnCpsJsmerB1lWFx+j2d2ljkm7mHMwlV3rGDOa+ORNU21sp00vlNXRhYg6p2aXbIEJXgHvoTqrKioEdT599mgto9FPU4Pkr2RbXMcvBr2070fdcl5Ytcrfcel7Vgpt7Xjd8LH3D1l17wlZhtLvsYkssfbkPiTEj9BKuFDqVtLZj97Ne6D5OqC49akrrKHn9SRRVVgcrp1VmI69v6e97UP/SZsVMWxgibEXUmXJNLMXEL8T1ennpkInVaGaBUe9Y7oo1YnFm/sXIx5i50kZboGILHXMle1OsQp2ezrlPJpbIt1NtGoYopsSLOn0lf6Pto5f1c/Ffx+/jzoDNJ8fXgZBg6hZTWAzxGyHzpRFOL1/agv32qbdEGPh/3RSmfv5eWm47rdF8S2faTi0Ws4O5nVok69KyydztGfpMt11eRtmZe143fJ2+b3nvKmi5tYwvlM8MvNtjF+tj6c99SLJTkq4TulIa3po683qhc+s1LjGETgAHa+11YlVmjwqp+OnfdJZR505Rtyf5/slfMJOvp87L2knbMdIzxsjHeLkS036h0HVZjE4a0f2Jy6Wq+CiEvZitPyEbpoxXTlqr9oeO+ZjBytLLsBBBgey/MVhhidjAVoLr4kL2qWInrmxBd5n9/LqVUoC72U6+QqwnnJYMmE4wJUfr+fwu3Q7/lcGqhUjduWqfEBUdkxdIs5h2sTSWodxXdCR0IbSDzPn8uD8na8KsFbp8kUttowkdHKy1DbZHntd2E3ZhdFebldYT/Tm/YHSOg31FMtH9+RgzV7qIxU4LXcHbFTHGIuZS3Z15ancnYin7ttIu5OLUKkcoFrXVCVUgYX0yu/3jPknIPpXQYW3u3omXO3aLtYj9QjeXlgxX6GA1dIvQ5Y5IhGgCJSamXSyLZTj3zbsmOR3lbKHTL9bVsjbktUKnitk8uktlLyUwpj9ZQ1V8EEFyQ3a7V+z4w2ugmPo/xdzDFvbnY8xciSNHAlER6fmYX6z9NtuA0PXOJ/YYq90abCwLcaUA5nTlsRAsrMr5Re95Z346Z59z3XjuHVvHGa8Rurm01DHT94I7pdhbfi0VunBHpQ2+QGcu5O12sSyW4dzH75oQZwud2AR4yS7xcJ6ieL14bN2X727LXGq8rktzsLbiblN3GJZoXcg1MLfWib2g0Nm1O2w4fUlKLGFtPrrEy5UyqvUKd1JF3cMkJHTtzCd2HV0Bc9x1PfATkV9udQCG1SO2AgUSd3wh+6w8oePP747/rhG6ubTUsYUdhmIcDsvzpULnS18/7Pf2EMZ8zPfbxXwsw7mP3zUhzhM6X/b4aDyJj738E9XF9/PuWGTz8qkUc+g+7C5Tc6fe0/O4M5niCJ1doI8UurX5iBErV/zP+Sed2BrRsiejxGCP0Plq/tAFLRM697nOFDo8Va8WOiV1ylagF1kndGvsBpeQuZjvt4v5WJLQRSTUYLcpVrTo/It6l0xSF5kaZ/tebQgD/6vbcfgy0CVCNz8K5Re6Y6YBr81HjFi5UvG7YBYRtgwXEro5/EI3Z5/3Fjq1Vk05drMi+ntCtwQSuiAxHOT6WZei/TE3VcI3hrEV4cLZhAvRPcGceiE/x3/9e0IXK1dYKsdpiTPGaNUdzTOFrprul7rQKRqn8oU/rxs+CV0SPF3oVAeov5usswx8L2qkR9UP9XvMuENCNwZTDZO0IrJ4m8TIx3i5MkTcpfSIIrxH6LCp9fiilTmhE91zbuc+FtacJzAdv75/yD7vLHTwLqLM6DYd/rxu+PhhU3OE0uwIu5iP5fLjwkjoglwjdKHtgcVCybmh4bUI19ZNZiUkrvHEISR0mMNnG/zATcRcAxZrqez1RzFyOkY+xsuVZteZ0SVYW3bEhrUs932n2oUcGn6QkT3nLiR07vIDRmktL8CmvLPBAx0O7vhD9nl3ofPPs1wqdCViq/lsWQul2RF2MR/LcO6bYdM6ulncVTPrWS90ejo83jp4I4KwjyITM7l0TMV53Hg6h4RO1DPhbM0BmD0udMJ04f4Ycepiy/Kx4GLvJ16ujJvlqQEp23hjs4d1jt7+RFRXTJl0qwAhoVM5ZsZB7ZJhh+WuasMcv2lJIfu8u9CZWy8MC54XC//tpOXLERWTUqaZ2Z9hLj06xi7mYxnKfTMmJHSzuMVtPVuETq36x9yYWFYd272J1gosMr5lliGhU/U/vVlubd3L1yWhNlRSxUnP/9zHsnwMH7MTK1fKQDh+4KqtPmq7XiGEAB9HDDu0Rjpj5dIKxCGFha6RFqTyzNwSzP6VTnfhOnVI3ZRasFY/b593FzrdqVtbJcn3vG74ap9Rda1YnD1nv50ldQ0QqWPsYj6WodxXDJtL28X8gtDlGbaHfy1rcPFPfu4sJ9JmduuKYU/pxT6Bv2TtRLFnZWXcV79gTUtvqDRmYp+/Icoi6GX5qGLsJ16uNHx75vXPZq7xekVu12uwioidc5Xzif3LIdMn7b3AvWH+4xah7jJmenfU0RuW2I8VhqTbIW7+++zTtmd7ybP5/PZCkRa53n3idnFawnv14F46VUx7xZ8XfyK9RXMv8ynU6umNsHUIx9jFsljO575552MmuR3MmULHNm/dN6ttm9Axp9pOmaxN6x1xxp5JCYqG73CL5UKXGbE3a+bzQieO3TC/jbX18ZJ8bJ1ncImXK6WsadYbjuoR7jlW6uBh2Dmz3KExGTf3qR+AHbn577OIF7AgKCN4WPa6MtM52x4Dt8/7C10HYv62ngt7Xt8TVSCEJW0eLM2OsYulsZzPfXE9jENCnCd0MRzJVqFTV78ytUe6b4LAfWkytvx8fTer2Ac+Xh4vz8dlhSJWruiz98xXeCxx6/4uS5nrvFuOyMV9CAsqwDuXaiasZsYCt9rndbTT3y3P6/v9mlwqdpfNLXYxF8u53E94hO5MoYvBPqHT92Cv+535/CyaVbW/OLnibht3h+oMrFUTRKokbMlpCV0RpbPxbXRfEEcxt4IM47m58kqyB4EgIHCWcmKkJXRxyGVH2TEjdIRg7VnEz80VMUbr34+VIFLAdxhrEvyi0KmptkfNsyPUSrh1PDdXmoc+F/E7dFncjTVOpuD7Mv4e6jD7l/H0NGoXj2FTG+a5udJnR+y7QhDnYM8kJ5KhnCbTDnyC+fjATrMr2Tb/7qm5UhgnExJEWuSrByKIG5F/nfGbr99qqVvpNjw1V0jqiDQhmSMIYjFFYuvMCIJBdksQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBHEIeVY/ZH94gkiROuXjLIkf4ZP6SZFPOI+OhPoZXJ+P1elxEDKXeglcRvF9zl88Emwf+SqrPCqNq9Sl7gyhy7MWeTU7w62zjp969jcd69LewFUup816eSRNKm7uqfnIzmRUucEOB3p/39WnuORfOuWrkMfqLk/Xlp9h8TsphJGvSoH1abyciscj2fNEzhI685Sx3nBs3aZMqfj9xu99K/6qpTmwwyRSqTP2UxqkUoyfmI8Vf4o2e33/JQ6Lrb7vOnkwydFx+PCUexrMMlza1daeXgmJTzWVB0isNF5Dl3In+1ldl7l0kbpGUEs3+Vldf2/QrK+522AuOA2pa7hDTa0YPysfW9Bt2Bt5kX/bdUfHoeMi/zxY7rlUsrWx3ErSLCFxKWTpsjsNY6XxOsZ0K2bnjdH1TubkMhPfq+4j3CN2PlIp6zPr7nct6RXj5+Rja6V9D97nBxfr3Pv8qYM74Yy3lde74PRKSFwK3t9hEzeNlyLKbBoNCYsrhU4Mxa9LunLWBR7bdD+CtGLLeEo+Fk74vRXi69Cumqe251qvE95GeiXkeGKn8XKSbdNdK3TZxn57X50ll91e6WRFesX4vvnIprX00yjiHxcS/+D5y7m/LXTVofXXZ47PkdCdwXVCl+w43XlCh2fOOgdZyNGbUCjpZEV6xfie+fjiwtFbM0JfMzLVOi2qM4XuqfMtC1lFiccz02kP8dN4OcnOvbxW6ArpIDXzq0bEPV4zoZQrXW4scjlvULxK633hvFeouJa8NdJnDepYy2kGmtlGYWtmGn4V+6zi/4KD1s00L/Idred+WT4uuUesfBRTsNeOTbjPgQndUVUmX8dlLmd8spBbbhMmuB0oCjkhX6VEKy1DXFnJb/2fzIcCrc0OS1DJuP8ZJUFfXSGhsbDUNW5MGMtLcz3da/z+y7aGdnqq3hoZZTHr+LOIGHXWk+XyuTsrfuq6fnrCnr/w2ObTMpoP8qT1VFIHPh2rkteoMHSM16fxXNhLchWSaOfltULXWjX7PDBraMmaEmEGZw/yq2nAqijB963zXiHi2oNv7RlWNfhWC0RrXDEg927BVbGWJS/JxxAx85FNhflsqGOyenF4jO6oIt1n2AhlPjkxbUkanx2IK9/gu0HKv3oed6q+b/L+EmuDlgWtGY9/i4Zmh4Wl9zKhs58fXlWADm2VPnas+2lalfnsnTc/9Kf2/V17rJ2cNZ+0tb5TcddeY3saz4e9JFchbysVEuFKoVNNcO3YfatGFEua7P3sHY6inBa3jrxGVE6rzEZeH9Pf96B+pszqzbva3rKYmNTyLuyaQv5CXN9MYQyZWI3mmr2oX4o1YlvkwGVJPoaImY9ttOnUttAx53VUJw3+bD3PJZG7L8ux+u1ALytmLqyd2i4f43nc7QnwDQuWWNsnE8v626n1qVKpn+7Zy5d6xgYNzRzvLeQ7u52/ROjU87+BQOj0FdVn0U6pZKx1KetlS3CQ46ZmSXxPz9o6VS91nZIbM0Vgl3cpU7WVafGWsc2M2Io+F7WcoJLXqTRvQahr0ng+7CW5CrlufHAX1wldKTPFrNmolf2+GP3dVugEY2bW0+11YlXmdlfZwt5ZJpZLM83ALwbnDiMvJvXUeVk7aTtGSpUl+RgiXj7GtF8odF12ZL/AH3p3mI6jIXTzdvAybECAz1sNfRK2NlVZUzSOOM05Qjv8l3X3MXP7BZYI3Qs4byUXquIlXDvsYrUttnLSS6Wg/lVhhWL+ykwBVfnUfJyS3xoW0IL4Nc4T9045WJPG82HrEOZzNbO+S44rhC7n8+NsMxLgq0Yyed0SB9leKHRtBmuK0Hx65Hltx2IbqrvarLTS4A91mmJ2lFkne2VxuhyW5eMcMfPRHsXagxY61pb5HChzdh4q3IqRero5O1AdbrBF/d4gdGFrc2fL2m54jRO2wa4NC516fl+7HrPPtxWSalXZ18Held4pQ/hos2gRqTZdhZbQz3Qv+6ntnoU9QhcKW4cwn6t2CMlNRzlb6PTr8zW+dSGrWtc83YVCVwKD+ZNtHcUHMTk3rtBQscn88Boopv5PqwVpt4R75WNMORIVkZ53YR2736YvL+AIdWl0S83ZQYXagNsyCAtd2NpcVx9T6LB0CQud3VEJaVHHbKdO5UkbdwEKJnQ2cD+X3hFM/RvGy4q/OYlIXb9V6EJh+54rJHTJzYM9W+jEJsDbdolf5iCv7LrM5B6JjIoXE91hWKImF3I9f54XFDq7vlp5r9vPnfKxjGq9onBXJ9RWfUL3klWH3onFnB3grQqf695nba4DjCF0pZwtOCDXht2q2xVnYrfdzPvqcuOTWPdZlwidkFH1S7v9ZIYoxkJVZyezPnfW9R6hC4XtC4GEbjM+g1uDKHbzzlU4yKsOlOgmw+q4qTCTFB0iTYbNs4sjdLZJHil0d8pH/3OK17rpN3aX0XH4W9cvEHstXmGhs2OehtDl1qzG7ULn+w2+wYHd5xFX6ODd/5yrdIji/kUGz++AYrdH6MJh4yGQ0G3GZ3BrWDLlXBjLVfux6QIz8L+6HYebzhLXMz8K5Re6Y1q1d8rHit+lmnmtsYM7CJ1ay6ScnqoazdlBXKGbt7a4QqeWF4gZi1u7LtMXOgabD6kXKcTquiShk6QldKI1MTfxAR+vOBPhwtmECzHJhDn1IvNtw/qbQhcrH1kqx2u7j6dVkJaMlzagOpCm0JVWVQOGJiYlDc5IGeRXhE6glnSYE9TmhW4+jUnoJGkJXSPrO/5Or85wDtegRnpUbVy/x1xIyPWMwVTDi8txcn+vfBwiLune/1xL8Qkd/NSczj5nB/ZkBkG9QejC1rZO6Ow2MgzNPYJnm9Dhxz3BUPDJKHCGazyhE58qy2Sp6psQUslft843MFS/0M2ncShsXwgkdJuJ4SBDm/0WyKqRs2l5YegmQxES13hiHXI9mMMvM3sTMdckhYG7Wxbt51752Ow6T7k00tE9zeBIcJm381I71jk7EE7aTi2snWN/Ys89DFtbTKFzZWOb0JWIteSTtePHQdlzMfcJnS2jcOefDs3tYZIgWyztuOwRulDYvhD8QldEKP8XcLbQhSYH1Bm+451CTW7H6/pvxL2fTZGJeXPaGMR53Hg6h5yRMCtYJxuAEeJCJ4q36bjzSAa6LB8LLvZ+4uXjuFmeGpCyjTc2R4DnmujK0wyTY523A3fijtoRcV7o7K3Ywta2TuiGoNC5Ya0XOtUVbsbiZUifqPSZ1SG3IrVP6OAi98ZKRax/xdzQobVyr14ldPNpHArbF4Jf6GhnlABL9jdUW/nOoeYnuU5JLJK+/ijLj2VcakMmjLAzEnUyvb1ubd3L120zSqlTtTk9/3MfS/IxC7TYGLHysQyE4wfuSNGf2hOA71MjUkTNtaxB3s7ZgeoKVrlibvxr8gFOGatshKwt7BJ1C8qt+8MYwS3r9FO4CytC1lbK51XxEEvI1XM1UoyU1KmdKc1w9gkdK1nq7i8rLozOKg012ISslWmey7jbfSZumi9P41DYvhDmhS7BcxTvJXShvS4ZeuNVc0f+WtZ+77Bi3zatNrNbVww9s06Ju/sJ/CVrJ4pOh8q4r37BIqg3mh2zXm6uFGMR9DKhUzH2Ey8fG74n4fpnM1cTvU7uCXBdJuPPyLHBSUGfHTBa50osn97S5atdGk2LC4ViW1vlfKJQFT29ptS27R788pPpfWI/xt185QFDb1ys9oI0U1fFdMj0eYW+pRs9GrK9kKUFdx6mkD/GXUz67M/6jc691ghbfftC01yzPI2Xhh3KVfNutKnzDD3fWDQ0nrJkmXCetZNBjVMheV+2ds7GPmtM1LrsFspyocuM52VP7DNS2/wKsEbJPbhkG8vysXWewSVePpbc1XTfK9cf1SMceqzUWQo+HUVsKazz+m2VTdwOBC9jcvrAR6igFYpQ9W8+vJRttza/S2ynELSY4E64ACF1mbmibJ3QiWOq9G/tNn4DzhcYQGl0S9FaoWN/zZTFdok0UxXmLLuHeYLJaN0dz6OlaRwOe1mumqmV3FSUM4VuqSOZm+9jUn2zWJmXvcTyiTQZW2u0vmNW7LweL4+XC0LYOTFi5aM+e898hccSt+7vspc/xM61g2u9ZWDODsR34mkwoROf699k3ntttTYzjGXMPet6mtm7xQ1L3FFbeRVMswL9hZo2U60qqWvS2B/2WhIdoTtT6JYyLBQ6gappXeGqiDnW7XIeJx/h8bZrF4yfy9FdQD6hI2KSrOPfSKIdl3cUurWG83Ya6sQdaFfmyq/lY3lwBY2E7gx+S+iKRb0kt+RuQtdka+f05LLb6y4jdITAHCZfwu/lIzy9MDYkdGfwW0L3Xu2db8PdhE6c8buOUk6YTbKm8VDESrh1/Fo+4pOUYtBm+uz5/odayecCz/q+6ryU82hSHiQq+L6Md4HNwlrrHhn1NANJP0uiGfIQmJvFTyie49fysd1QHVjCuvmKxDbc2ZrPZm0fDTFDsbF9WU7Tewdemx1/qAvsnmxrqfxaPh4zuN/I+YXtAfMMCQVM4+s3qjiWZKehPI2cH3QhOhF+pfPrifxaPpIDIe4PWSlBELugNhdxd8hGCYIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgopNn9aP3hycIgrgP9UEnVhzJJ/1zIu92Hh1BnE/++L3niXsgZC41j1ulL3UkdFfRTsc2UvpfB+vRaOVJW+q4lV84M4G4gvL25b2ZjuyFmziL8+oTLhkkdFehD8ek9L+GKnt/qxqdzImKS17HRe/pp+AR18Bsq7s6ErO0k1eyTyvoEuxyNSChu4qGu1USumvIeXtadFi24BTuXOYKdWYScel4FereVLxXAz9LfLy9TM9AQnctJHRXUHyL8vCVNAEUOkafgEsi0iJPqPrUo0LX8CfIkd8nAAndtZDQXcHwFTpdYF2ha5xPCGIfKbTnFLjQJd2mI6G7FhK6/dR8nG2cRheYQ5kbNmcz33rjvSt0VdrjEcQNuf/4nMYndAmP05HQXQsJ3T5e3IH005xJ8XrNdrAwYRus926LLhWnRKTA/edbmviELuG5l+cLXclnt1VymXqeap+vRf59Iv0qrfeF816hzL/krZL+62Kx9CinOZpmW6X4Xtnwq9hnFf8XnC3YyKnCf9n79tsCrLeLXBbItU9mCxs2Rve5fXoRKTHfcSnKbsfLcW6UaeE1el6RE7ifCIrv1apPY7BGAsN+ouCLnXpe/hg+oUu48/Jcoat5Qo1yrUbP5/ekUsuZpzI6ztiTwfet814hBqh78K09tb0G3/592yuC1rhiQO7dgqvunNJb7CLnI21bapeN5XRsoes23pcgfPS8solR8j4J3emu/216FdXV7n7CKMA9hNjZY9A+P5F/42VeOUp/hAvd2wo5Gc4Uuha420pmzn3d7xpKXiP6k+665e+H6X1jfC/abQplXm/e5faWkmRST+bHDPqd6blbenHnwH/RggKg3rH0rfgv7uq+t9lFu6PVVYH2oil0Nc8fas0RccFWpjFybu0f2eUufEHHbZtVxUyvIXA/YbSgxHTSoyjm/EQ+VbI7HoNukkxc6Nzej0Q4T+jETDbT1cLseQKjZWDQYKrM7b6wjaqzUimXMpeBXwzOHUbunOupU6KWxgvjhhvvtWyzi5h220onoIq8qKgQRDx09RTSgUreC/1d67Si7E9Y5dCs9gkvAjv/cT/xMj4VFOjOKIpk5yOfJXQ5sgjxeULXgvaYXfPqM7d/25Yxe3pK45h+aZnaH1o4OqcF93KKyx3YahddxGcRk1NEUS/4HE6Rb88YPSauxy6zmk8GuzTt94yw0NlUSAnC/EQuRQ1W62rPgnF9nwSrgWcJnXBeBfLZk4SuBE+petwVH0SQ3LoTTJMeKSLwGrsbw/dpdcu62Fa7+ERcets6FZBSzuUkiBj4y55d/nvE7tYLHTabG/MTlcd7+Mfokp0nfpbQDU7LRTm0BGsHM+i6UMXdp+4wLDNsDQpukBV4h72g0NntxMp73d3YZhdlVKttkWLdpFqgiRtyltCx+ZXdNIrn+hXbT7RIK0/FgoRuE1jNIdmBzRm66Tm77E8OMIuuiCbD5l3FETrbKNMRum124X8+8Vo37aZFy8Bc9w1BrMEvdPG6Lltn5qXrV2x79vWdkNDtCMVXn3gW2qQH/le343DjWSJ04U4KXOju76a32kXF66HVzGvN+FqPhjZX2AliDX6hE2Ppquu+RltYYaFTywsGXrVmdyOhszhT6PBkfhrCVNlsSdElx0xQmR7+618XuvV2wVI33kE6H3SF05BEChIp4Be6UvZAtLzTUYiVTVjoxOIhUyBJ6CzOFLpf6LpURlJNXRD6PSZYIaEbg2mEGXCxQCDvwHa7GKLtz4CP94llHbSejojBfIvOfA2ILYaEzl7GxFgmdGJxwSuzIaHbSCGzEXYoPVPohBF2mTkppffunhgSOuxstDKzNxHDz46yR6qq2xnodrtowPkDe+jQIt1Qe46IiK/aJAY4xAZcb89MYlfoRvAJVl6WCR0+dFDOjE8XqfrssyajjEhCP1PoCi4x5riPWoyMpXNI6ArZtWECO9VwoRO1PLNLLr9lam+3i9GzpdI6GrBZkiIH59URxF58QwlL+g3c5eGwH8SdpYx1SeIxcOdnqr1SaGeUTajtbVTylVOj/Xl8LEPsEbFShIROten0Zs61dS+fUY5S6lQx0vM/78R2uyg9beTl5N9QMTmreMcoyRwRD9++RGI5gTmNykV0MKox6UKWbG25lfQv6r3aPRN2Sc5ViMcpXHNLMIw2S+dUPcB5O6Oo7UrZ3o9iq6z3Q4WuswyldVpXDLiR8x/6CfzlR+5Zp7YMaq3fw+6Nwknx4YZjTnvsouHTSLY9UytTdeCdRuZL7Q9KEPHA1scxSqsMw0qt+ZsPt05R/vXWzAK1LTP7hdg7U28OXQX8RJvp8qd2xByt+4ef4/act9dlYWTPm4eZbDM4gH32lOh+tPvflwsdXCOja1/zBiyO7jC/vZ/MMfbYRcmv7b613XXPVlgpp4v666apRKQNPh0ld9a+qRdsjcFybEqXQpchVflT4hcSOnWmoyoDrNXXO/dXQM+WEOce01OCNU7vLNFm8CU0fI3M+o2vxL7o9zbOPXbRGIVcv5613w6RPswq7a5DsYrOLNPFVKm1MUt/Na2X0zTIZ8uBV4t3Lgk3Ta48YXzI7jhqRFzNeruAx9quXTBOEMeDdfr9ZdhYWImK4h1ItuPySqErkCY6QZBdEE8Ebvgu8AnaPYWuSLmv5MwxOog40oZq3r8O2QXxG4xOTwXrpHR3QnGP5roHSQ81nTnr0qyjlOihNcSvQXZB/ArupDR17KneAMK/EdjVNEiLNCEKvi/j8fSgQ0rMliN3RpBdEL8DPJiZ8ULnXN5P5ug0j4XUci6RWq2B7elG/B5kF8Qv4U7nKKY1naIc+DYCu5aEp6GcTf6tvbz5ksY21QFN4gDILohfIkXJSDHOBEEQxGXga9TuTHoxJgiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAjiWvKsTveMIYIgCIPaOQiH2A87YaS+OhL7OO+EcYK4OxVV+pJGyBz5s9hU6UvdGUKX892v7VczE+4v7JXNTqEa+RlUv1ww19tGfNjhwyo3hu/f9/ddfcpxxERMSqs0lfzwJ/OladFvxKe/XiYxKp4qCR+jdZbQjdPZub08YlO8OtSh/ELngz5s8ZcL1XrbiEvFQ2yz1/dfAz/rvPq+6+R5yiR2KfHhNqOpnJO7NT36zTPKZMnPdoxNl3an8Fldl7l0Z7pOUEuX9nG6iwpgkk+l4Q419UIVgzW2EZcWdHT1Rl7k33Ydk16SulTo+PncJgXvHRBlrLXOVGOlT1iY+c0zymR10DGpo1WRSIrzxuh6q07FnIlwZ28kTgk3kleReqGKw3LbiElrpX0P3udpF+wfI+fW0iDfVI5tCT7e8bzUy+RRQtfwlEm06nel0InBY514rOOqy17f1x//f2f1qz+R1AtVHMK2EZ/CkdHeyotX2p01P4XbnlPgQveembaSepnsDxK6pNt01wpdZvWIV7LjQI3RPH8OXOqFKg5LbCNMzatGo2FB40zPwMsptLbQVSnXYH8Me3xOgwndnMylXyaHw4Qu4XG684SuXejMSvnZ80WOkXqhisNS2/Dz4q6ut2ZvvmZkqnXaACR0qWLPtzRxhW5e5lIvk6In5BihS3ju5bVCV2T2bCjxu87T335f8m8q6ldpvS+c9wpVqErZUdugjrWc5oOZbZTie2XDr2KfVfxfcK1LM81hfN+64rDUNnBynjrtyid0w8SELtH664/h77h0hS4kc7jQ4SVQgZezks/gVcMvW0q4n1zODBbTaToZRi7H0dg0KtfXiFA+8he9FU7F+9PEfM2Cxxub9Zxs5+W1QtfKTNEU34xgEseyMaW6NJzK3FvvW+e9Qgyhw8nO9sLMGnzLxi8FrXHFgNy7BVfdeSHtMtvAYdNWPhtqmczSwmN0SRbqn6PP/NOWoNCFZQ4TOl8JFPjKmS7VxcYS7iOf5Ep7HP2s8KX9gR0KtG59p5dxd9sHv7OjWosHc6XQFTJBzWzvpkzuklo2Xk5LTUdeKyqnFWEjr8Xp70WtTqEM6s272t6yqJjU8i7smkL+QlzfTGEM/BetYfLZ9I7lrlgjtkUOzmGZbfiujbUIwRY6Vnu9a4oRJtChQ0yhM0vP/N1MO/CXQIa/nOktIT4bS7iPnt9D/OZllHrhZcR8UrUUvgFXqZRQ0vsyvhVXqtnO+MJ5fJAhAa4TulIaQWf9Cv93GoyZWbNsrAJYZW4Hi13rEpNxtHvNZSHIwC8G5w4jd/b11HlZO2k7zjiDq1lmGxgx7RcKXXrd57/LnDRooXvLshLqJYAOfr4EhsvZ/hKOx1CHOWawleWbdfmy7js64bQgtm+kldyQ0IXQzizn8+PcxnP6tKC2plpw5nv7eW0jt4tZ4xTi0jK1P7SYd5ndgnt5zP8ObLeNLuIzaaFj9eoPyVwi2CUCooTuLVtBn2CFb00JDJez/SUcjyGsQC8ROhu3ddYiscXCTrCf42yh06/P10juO2q0DWGiqiPtT7ZLFB9EkNxOF1gMsIn38Jo/1KzdT30LZ+/AdtuIKUeiItLzMb+1U1uI65i3bPGtHpt7oRVDkzUlMFzO9pdwF9E5qSzU3vJrqdC56dZaccMI/+KWnC10YsPe5+4Sr+uLFXebuiOjzLA5fK7ZwE/+PC8odHbbBxuU/ru90K23jTKq9Yq5m1WK9dWfZonQ2ZNE5mbTLi+BS8rZ/hLu8pJP1KPWGhK6Us7QHjxCN1/+SOgCvG/saOPRTUbWZWKHPTVq12TYzLA4QmcXitSEbqtt+J9TObc1omVPRiHSYInQmTMtCzk5xMf9hU5JnbJyOEvTL3Q52JDD9QhLppqQ0AXAd794GrrQDfyvbsf1qPEuKQbz3RB+obvr1BOXrbbBnrMBKxTt15olKiR0abJE6GC+iiEGX/fl8hK4pJztL+E4Yq2bkitTtn1Cp5YX9HIba1/X5TwkdAF+Q+jUDDA2l0oM6rLaYyE/x39NQrfVNlgqxzsOknUzp7R2kxAsETobMYkE76RLQ+gUjVyIA5cRqDtWU0hidudghExCdwi/InRqpEfVsvR7zJxDxWAMphpW1IrdxedcttvGEHHe7m/Y5/PYInSZ3DIOY3kJXFLO9pdw/J52LHSbzhQ6/Uv3+CESukP4FaFruZl1mTkppecjdJhLDhWDzqqtMcrM3kTMrVOOmTtCVd3WQLfbRrNrB53SSEf3NAMiFf4y/xQKn9CJ7ktsD5I1JTBczvaXcDyG/nmWuNC5HZpbhK5I1YufLXTPn9FWZGI+lDYHcXY2ns6hYiAMC84RG7LQZBS1Osd03PmNTXSPbYyb5akBKds47oZIhbkORH97T6x6dQVlTQkMl7P9JdxFdELC32NCZ8bFnWvqm3U5B+2MEgTfUuaJiD5zaHi+Cc2hYqBqfHqr19q6l6+Qj7IIqoKs53/ejz22UXraymHgZOo+sFCWuC9zu/7MdWzae4oI1pXAUDnbX8Jd/kBrtLZ8QDfZdWM8H9wgUEk0rF4uE7okywkJXXyEoWnn2zq1Pgbc5vUP/QT+8iPXvqip0vYya1hki+lktlHuuTfcdvXiPtto+PbM659NuEC1Y+B9dwIlQuDzDN3J//5v++k+a0ogw1/O9pdwH39GiENmV6PL6V6wVH2mz9WuvB8jJnZa4TE47lDXgzlT6Ni2w78wq80+HaswHKpmeTEQGxdr466mT+eEjoXbgW/vKnP7baPkxb371m3XH9UjnMudU4cIgbfa4gmdrwQKfOVsfwn38ce3vNdXvK0revROBQij458MU0yWCZ3/m5tzntCRI9lHw1e/rB9FEkeQ3ts4Y9iGPhPMfIVaaUX25H16fgeW10cvp5kvgfvL2fIS3k5/W89TN547+a9YQrIjdGcKHUEcDTzedu2CcSJdku1SS4qEU5mEjiCI1IHbqRNHUCzqI7kpJHQEQaQPPAuSiM87S3TGJYOEjiCI9MGnfBGxaNJuMxd8X0aCIIi0gcceE3EJH1hLEARBHE7CkyVuDqUsQRDETSCHfASUqgRBEDdizzoxAsebpv9HyZ57bss1oQAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-66px;"/></p>
<p>Here we use <img width=19 alt="\mathcal{B}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAYCAQAAACsVz43AAABCElEQVR4nI2TARWEIAyGV4EKVrACFaxAhatABSpchVWgghWo4P1D7g5lgOM9n5v79ssYRH0z5AZfu9BGnhIdeJ7L0TrHLL1pp0AM8IAnRUIus+N9oMZIOH/TZ/T/JWS/s4UFtSOSSEHFOCurFoGan9eirokU2xDmym9RCz9pqKTGISqqoYceA1/2mtAPxdytCXdUDqh7trZq0hXdoMi6omYnGstoSAv9k4n6orEoLdANpYCZcAW99nPN48id/BvqbzFX5voB2iYlpWBjrA4dP0ETLl9rcY6u6u+avNfJ+Qa1tptruure1ppJjVcJXk2wiIY+6MvYxTyz9ZJRGJznUqb1unZAL601H048jvobFJwnAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and <img width=16 alt="\mathcal{E}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAZCAQAAACBIibWAAAA1UlEQVR4nJVUAQ3EIAysBSxgYRawgIVZmIVawMIsYGEWsDALrLuR/4WwAkeysLRH22uB6BsLOVlDcLRTpoOifDMFMro7w3nB3oAUNHcvDufrTIcoCg4xcxVPJdzmd6mn/O8zhE1iqEWnitAF91SpYVD2OkdhKTWIwJ2G/eHFPZcVe84ryo6izlDp4TUWA7gVSuOZW+Q8oc8GwvD5hDugjlmNOEt4tG8pxO1h8SBww5K+xDhw2+oYT2+aMIWy/bSy5TlQtGMkcDcwYpdGOmNljjymydamC9RSXT0QQJJVAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> to denote simple boolean propositions and arithmetic expressions respectively. These expressions may mention our program variables, so we will assume the existence of a simple semantics for them. For the arithmetic expressions, they are interpreted as a function that, given a state, will produce a resultant integer:</p>
<p><img width=167 alt=" \llbracket \cdot \rrbracket^\mathcal{E} : \mathcal{E} \rightarrow \Sigma \rightarrow \mathbb{Z} " height=26 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPsAAAAnCAQAAABjh/Z5AAAEGElEQVR4nO1b65mkIBAkBVIwBVMgBVMwBVMgBVIwBVMwBVOYFDxoFB0FbVwe3jcUP272xnVqKLqpblxCYoIRLkdHqqifUvAiNGQivRReST/Lnwp+AJWUujc/zWTIyKUgGVSE18vrVr4WWdkUJIKSfUUlhS94MSqZjL+HXbD69jpW9vP/BwzSMYdY1f8y63UU3uO7q/npGk4+jt8OgxrsYkEAKNn1VM6oKd2uPsuuvfwkM4Htvb+ASbM4k1HeeYaFRwPfH4/mlPXU+ACvKTmbc64+jt7+i+Fkb0Dw1ti6cOAgub4vBelz2cUe5HWN0Iv9Hp2ccw6L7gPBpodahvrV5KqnQsmupIlj4xr4Ult8M5jiPBCLwG9pRnG5EEcp7n7mqZytDl4xN9MwstcRI3A8fBbPKDuVU5wnru0Qli2Pmwgf3TzDyG63eGEwH5h9vtpCqcGWeH+HtRzkMvwWvTbdk+703g7xZA+VCI+T3MlPymfp1mwzZmSwYTxtrKudrq6rqjCyt5Zm7BQo/qfIsfXxNKFrou8i8fFh1B+Ca4vw/jojhrJ0w2EihPd0usAjO3f/5akT/SeasXsaMMrM6YYZu2MXroDjULOLpXAQiEkZIEfcJWwKpi5es5c/qLd1oo/lMJ4wUhAm4053uShsu4ZCHw2XkldzdJ8sKdSmQq7kGHt69aCpvCb6OM3oJ4z25Rq/dx5hZfdB7eGJG1MxxzjQFVee1wEWdX9/wmgyZg4xp/lk143O++TdQmQNcopjGTsKj4f4Yn4gDRb+jLaNYcA4oZyyYyB2jdl4qOUm0nuJyCPXF36MtnKt+epoOuGWnVsNV1rZedSY2qMGQ4oVsk7w/X0YreWa8vIo8+uSvXLsvCll1xyeePhqORPzHxOiAlG1xei5GGMy2iKcY52PO9o1zeNHppS9AwbPYp15jxGyGya61Mbjv+3EYkRNuVZbeFFiPb9wy15ZH7lIKbs+5kwDYc6t7tAm2uCwjLZyzXb00vjKbkdK2YdksuN7ijVJ04/HMtrKNfvRy2BP+2+WXdfqti/Pg7ZrG7Qr122a2HWFD6P16GVrzO6h1LUWgjllp5LolV1piOtse3po9ezA98B7mEa98+4jq1r+L1TXDsuoNWZOWKK6Bn9mvVM+2enyMNCV8CNccYwuETTRtmjb2N267jAdRCyjrVyzHb108GiVoyGWT/a1J391H7oI35lpqJaHKcPV8qiuFtlK2vhP02EZcajr1ZhMDtKDQz7ksBysqr472hX4cuwxwbMk8+HJsb8De+zBDAv3CMMMywjXCbAGSM69Xf3tDO7MuoJ9U3Xlw59xsyRdQB8kYPRmJ18QDUX2n0SR/SdRZP9JFNl/EkX2nwQjuJYD9rqC/wTHU157ZUxP172t2i24xD8hYfetIe+GqgAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>For boolean propositions, the semantics are simply the set of states where the proposition holds:</p>
<p><img width=132 alt=" \llbracket \cdot \rrbracket^\mathcal{B} : \mathcal{B} \rightarrow 2^\Sigma  " height=26 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMYAAAAnCAQAAAD+iv/xAAADuElEQVR4nO1ba7msIBSlAhWoYAUqWMEKVqACFaxgBStYYSrM3YCOyEM3ikf8rosfZ0YdUNZ+LDYeQq5ETdpL+38eGOGBdikokCBJR75kJAI+DdAkqa4dtHhQmItvoMkrB21JP7H9hU8GFdDyAbv4vyH15P/hLAjwAjp9XshQIesL5/5vUJgbe04uBltNuT0wh29vBqkgPqCMksHUrVsT6TB+nZry7vfNJkNAoKLkRaND1W7+5DqZCJ1mzN9wnqf6nLCuFta53rL/hYwWHPSaWEkjJlMuVOYY9i5SZMyJFyO3lqtjbjerqQ/8rbOTQaFPMbm9ac0jFBuF2fjumdAVZIhp+Bp8JGcC5xAMR6C5107PNS1SE6NovxP8F7rjQVnuJ/HcZFRwxp6Ybt8eUFChcJx6Msp9OWPE412Bi2ubX5oIEsLBaHazZ24yuKOp18n9KBg8yiKe12Qo9No77gDX99LpgNlPdPTetCs9hZjd3GS0TppiWcgYVnblk9F4R/4GJhMs4oVNXiKcqwacwM9NRu/00iD73ULtLJp8MtRTfE6OcgTunRnjU/dii4oBa455yWgcC6C6PnUWwpGFYc/IV+35oPWZuZN285gMZAtVOgyMkYuMCo5LaHZdsgGLyKFy3MkP5YycNbARrQBFICjx1bFwmdD/1e+n58mgWmDaTXkElog+mPQWNE56dsmQCbaMgUCLAVW/6BwzWJMxz4ZbvxhC6i//OiMVfLrhrRTHV1TZZNT60fIuLZkjz9PQ7j5NFPeTUU1k4NO8+FnbLCVF5lW4PFFTG70Ejsb9ZBjrTlmymYRuvIHBr2VE3R+HkqzHBHkdywcYlEBGKoSnnUyROueegeqxS6aXTj57MGxukSEC9lYKGe7oTWKo24fapxyTejRLwBOV6jgZLBjLSyHDn6TtDRzm6T1sG5GTe5qKbc8wt7/uvAQyehIqfexViENvaGw3s12K840MVGyTwQJbTSWQ8Qkm1yHzPanVC1agGipOS+znJfAqeKc04MVnkLKQNFQs89EkqsMfnkeGjFTF8optvBhwqSCYPb0wSiCDJmzPNta+ht3DJ3j8KPDVKZ8KclzX3U+GqWthCn109X7WAq4rYfmoUF6G623OFXbab4+veO4nY65Nbfc376P5JTe84sGiR5fjYzXZx5KB8QwWfORRvyKU/2UgfJkwRsaDyyEMAkNJb+TyjCEvceD7yXgx4SWjILxkFISXjILwklEQXjIKAic4jYy97sUpuFX8sOKn3nXvP8FkwT+54bpzTrcVPgAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>As mentioned in the previous section, the semantics of a given program will be a binary <em>relation</em> on states:</p>
<p><img width=140 alt=" \llbracket \cdot \rrbracket : \mathcal{P} \rightarrow 2^{\Sigma \times \Sigma} " height=26 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAAAnCAQAAADQz95jAAADaUlEQVR4nO2b4bmrIAyGWcEVWMEVXKEruIIrsIIr3BVYwRVcoSt4SWifFogQfaTgvXz+6KnSiLyGhOgRoum8pBiIraylpi91QomN2OaClpoCzTiUsipLTZ46sZih1VVZagrUi6cZXBVtMxL7OvE4YQklDUt3o04ABnnt/geNOFH1kRZLEFvAb0IcaUuoAYOVwjBmP+n8osNj6qs14w44qOE2MzTEkyVyvPMw+d/5llAAyWLZWOnfp/VVkKS5n5TxzBW7q8Uf8+1hLqtmddjb2FzyjWUfEceSKA1pMFBgGpjMXxBG4VOZC7JzdRlQEm8ZbXoRm4bmZMh/o4kh4lkqCkkZGJ9z6q8edMafwK9+j2l2Vi3PHVCDOZLum8UTR8SyVA6S8s6one92Gvj10k4jGIXevL5A+TmZzcp4lQFpfr9GjjMtlYIE3f/j7NFeDyYcsF/KP+O7JuDe6eAfE8teypPYlkpBmgI/8SENxADl1RKMwUyUahbv5tpTOiZxLRWDpIKJIBekvbgSaiN81983EzEECqX+OdLZHdeSKAtpc/ZQkK6Y7lZ2T7egT7ZXn310UXQLRiO9TuJaQuWCpLEute8H0gBIx6QrEgcVDd1uSx3ECBeSHcYlqL4s3konXXHgWkLlgTS8OsELsFY+JMiuuBNVTJLM0Lh6nvJnaiS781eTB1L/gnTkEZYLCUL2VdVBSKfPxbaRSBwKKNd09zhcgv1AkmYifF5YwIU1FzOP8rSgHxWvKJav3b2l8Z6FWRmWk9cOTI8R8Kg3qcNTdibFICki+OeFpOgU9AL1xpvWQ9PvVAuiGCRJxpW8kLiDKDGgn9lWpo9WhCjuSXYg3IuqA5Ig37OJb/ZhNe8MVSGKQ5LEI8B8kCDlzlcEgvU9d9BtDa8aRDUlDuFq/zrNB4pDk5fR6fIvi5SE1H8NRVgVv06PAxOpj2gU8YcNP1EuSPBuTDxEj85afrxw8eqLX73zEb0z3MLKA6l7lVNimJSTluhs9+vIjnU2XRiDdKP4q795a3fpNtZ7pgMx46g0u6yzl7b/o5A4nmR96Yk1Bp2x9MIvr+5BKq5cMQle1EoPvP2/gry1saHy18MYqicFb9pVg3QDNUg3UIN0AzVIN1CDdAMNwl8V0IPPbdeURf5zF3rV0gXtbr/6qFt/AdySr35Mmy8EAAAAAElFTkSuQmCC" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>For an assignment statement, the final state is the same as the initial state, save that the updated variable is replaced with the result of evaluating the expression with respect to the initial state:</p>
<p><img width=621 alt=" \llbracket x := e \rrbracket = \left\{ (\sigma_i, \sigma_f)\ |\  \sigma_f = \sigma_i\left[x \mapsto \llbracket e \rrbracket^\mathcal{E}(\sigma_i)\right] \land \sigma_i \in \Sigma \land \sigma_f \in \Sigma \right\} " height=28 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-9px;"/></p>
<p>For non-deterministic choice, seeing as <img width=33 alt="\llbracket P \rrbracket" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAiCAQAAABc1/miAAAA+0lEQVR4nO3W0RGDIAwA0KzACq7ACqzgCs7CCq7gCl3BFVzBFWyQqJDiFWs4+wH56JUjeZQaFSAcDbxYdJA7dF6ugQV6sBjbp8km1LreBhXsGeGLLkHxLTmO7oQ/KlwkJpxxMa5HMNI3t2MlQXjGI3qfaQma8R8UIQD37grGrEeGcoT7Jf64wsMSJoAIE838TNhniIaIGBUlLF3IxYgGL1g315YiNHVKz9aJEAr33e/dzcdt4ogZy6fuUrcJf/sz7KYhRAzJvhAl0t1diecI/ZkkTXx/Xfh3YsIk/jIgSpz3sxiROypRiZiII7ksObJzDYvcbnBPdJ5LbfoGJ9JMbVpklQAAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-7px;"/> contains all the possible state transitions of <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, and <img width=38 alt="\llbracket Q \rrbracket" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAiCAQAAABPALlWAAABiElEQVR4nL2XARWEIAxAV4EKVrCCFaxgBStQwQpWsMJVoIIVvMHgDpGhD6fbu3fvHbDPNjY4gFgaWBIdoFbaa7Y62GACjRq+u6LZpjCm3HodWdQckiBbAdajkQ/OCPpBYzz8b7ES2YHBMeP8t9pjwAis0a8HkIM3vpceVu9tDnoLScDcIWi9p7MssmWNWtEeetzoDSTljDsmygd3kkM2Plu8kJ+rHJIMjgVky4S2GrkwmYplzR6vaiSZK8uSLaFq5PY2Ul1Caklkdwk5vY98JJelyyogeylkvgBS41bT1l6NnJl2tl+7oafHjVQih9PQTkwcqpF82yZp3LjJjNy4ScL1lM/n7Fp6K4uE33vnCJ0cML+ZW0j1g85RTnv365L18DaSHoqrxxr3NqUNpLUoiAyzRlxugH9iiSP/c887kigytIdj8T+IVD64pUwKI+17Z2Xr8SGkLRF6143RMdpnVxxpPTUQ/g4t+DFJoC8g95qdlojCvjO7KtVRiC/b6hI9K4HSRlJbPvRfHguUvjr8YkgAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-7px;"/> contains all the possible state transitions of <img width=21 alt="Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABH0lEQVR4nKVU0RWDIAzMCqzgCqzACqzgCq7ACqzACqzgCq7gChYx+mxLLvg8X38acuQuIUQ6ho4zDXiKNNN2fTOFfipHS0lZSoqrn6fMNIGMnj7y0d+KVq5EoTjSx0bEchUJpVt4JDCFkwkOrZJZhmVEKX1glTKOGlYcngCBxSKyprBgFU2+ghi52WTG9o7AdBEEmcB1EcS3BB0e4Dd3EPh2ELbo6xLhQSU8qHTKzFJ4VEVEXKP2WIYaX0CF14Nt35HqQ7KIgK49+E8Razq2mHYZJ0W6eeHrv1m7/aQI7MWuN3Pnk9R7Ca7shVC3c8ciRTQ90wmR8OjoMCzjoQN32Gqp2n8Ez7t4upn50BXLQvaO5PJbnksyZQZTnYpwF/MB5jS+yofco8YAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>, the semantics of <img width=61 alt="P + Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAAAgCAQAAAA1BtdpAAAB+klEQVR4nNWYbYGEIBCGqUAFK1DBClawghWoYAUqWGErWMEKHssg6gEzA+ut3suvXQEfYJgPhXiuGl43KXSi9aL9W7pInRjFS6yhvSwFuoQ3+Bw6T7btw0f79BtqHcFsSVrXOksBBBonkB5dhX86j79wD+4D9R7xrM6+GzYTRYcVHiU9umEDyCrzAuw+8UT5XUcJYvD3mmEg11zaaAZaCkXTngDZkBS4oIedVAMO782Zo/TmMuYn0LeAN96KKa6F6pCalg9TDg5vHZAeitq8FLgm9+OscvCJcaJL9vI6xeCNH9KxMcrBF8aJTklnGfQbXHnPjlyLSOXgHFNkg0sXfNdi7HJwyQLXHPC9LRa6NJyUgrcs8JEDDslVywjz0mcVxza4ixa33Gw8cMJUTJHj2wI1r+Xd3YqGnyN41kWkI2deTcGO51MGwtU5EWlHKXhK5V7FkC4AzGnKd7gHvCeNZaTO5B5wKomCIDhjUwC4wrqQqskONzec3lPjHDNKxckaKNWAi1Aoxuijw8av7o3gMqCbg61D6TjRNjC5UvWz0rgOHMr1xcPPrlyHZbDSuytK4lrwbfQQvjcQBfLV+gx8n4OOpherKcjd8zJUyHmqtm88V2zCl6XcVSX89zPV+ZpgOFzSr1p9vdTpe+bL/vo3piNtzDTOq+uj0fwA+pZwBc9h/9UAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> is just their union:</p>
<p><img width=199 alt=" \llbracket P + Q \rrbracket = \llbracket P \rrbracket \cup \llbracket Q \rrbracket  " height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASoAAAAiCAQAAABCF1x9AAAESklEQVR4nO2cW5nDIBCFsYCFWIiFWKiFWqiFWIiFWoiFWqiFWOgSIJvbMMwABdqvw8Pu9hLOHP4AIWSFWKMR46FcxadFWyiHGO9yak7ZxiTdnXiJQfSqLD+7CPnvjMb5jtS6+00mfRZFMd7l1MzV6XaaqHuu0FTx2lW1fHlfrtmRuyjxD6VtKQ+lwpX0mkk+qM7e8ZzLodnVxvvgOO3RjUH1/D/83M2tFQ7q3RzRaQVPfWbN5aJUGAU9qKAeqOjO1QEV1+lAqOaQ1pz2/5WLNWhCu8g0cbVJ7eOi6jbNdU62DqjmoDtXA1R8pyOgEpbXbUhrzt2XyeYbIUOmSRSaULb2HDorqAcqunMUzVIdzRcjcprjbRzidGKoZoJNVdQhsDsdwR8tCm5vFRz11g0V7BxFcwe2zT6wT2A6w5xODpVwVgRHCFSmXte5J23HPJx01Q0V5FxpqMKcjoKqLwJVY8dyd/R2fnLUVQ9UVOfKQhXqdHKoGmsNNfhQmVpvyCdaoHnqhwpyrixUoU4nh6r30n2ugRcjoSc03fJ+elk7VJBzZaEKdToxVI2t5IIKOdbAi4nQExo79gnVDRXsXFmoQp1OClVr11/OEzd38KGiDK9xUHWMgh2FDpXLubJQhTqdCCqpl/FfoDF4cKGSpFT7CKiWuQ2lYCtENKhw50pCFe50AqjWMilbuEuZXKg6UqrDRwx/fudKQhXudAKozO3QjnBrRgLDx00f+VxcR6Ol+hlzKr9z9UOVfPi7EyrdxpUxsLgvZM37OMImVf6kN2Vg3lGdq2FOxXf6DSvq7mgYPZX7Ng98EXtMai7y8Fo9UFGdq+Hqj+90Vqig4F/9mbMcuxwwHfdxEv2Diqsz1OkPhGoZRN3d8gCeYXSojlti3cVneA6opBeqWUmLvgvrDHX6A6Fy38Y0YZYRn6fX6UsK0N5MuGBDQy6ohN4+h0UP3J1bA9v3FeZ0Aqjc5wAlQnYpLBfkcJPOnfYEqKpv+PM7R9Pcg/kuMTc99m3K0gfP6QRQcVemzjXw4+FMdtCJQibUB5XfOarmhxOrVr0H786k6Axz+kOhkv/J3jcjvtmUOzrs/WaopD7icJj9NLqnGT0bJvE2DnE6Eqp5NI97zCEMKvMAwWTTfepJs0ncfSu7LqhoznE0X+3jCaOe7Y32L/8zfL496nyno6BK8XhDKFTLt29ieToF7+TrgorqHFdzqz436Ia/q99os13aI1ocp6OgShFxUK3H8K/91gQVNXJo5uikOV0cqoax98odZpkOf6rkBxUcPJ0Up4tDlSaWJ+mCx/k3xHdCRXH6S6CaZxOTcK2amPhBBQdXp9/pr4FqeW5uUhPKdRq5Hft/UMHB1+lz+ougWjflmv9S8FB/bTvpH1RwhOjEnSZAtS95GiQ0pLiqqeSo12qW7rlUDjH15tQcVhfkNPlY1B2Z9cZ5v2me/0oT411ezena2Kn7DxLPovmLQMCNAAAAAElFTkSuQmCC" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>We also have a familiar <em>sequential composition</em> operator, written as a semicolon as in <img width=45 alt="P;Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAAAgCAQAAADjow0MAAAB30lEQVR4nL2Xfd2EIAzHqUAFK1CBClawwlWgAhWoYAUrWMEKPsgmcids8+Xz/PjrThhf2BhDqf9SJ+umlau0QdlHk/fKq0mtuU3RJgm0Ycy58xjbMdzHr9dlk7052rWp9dEm2HO0PY0gplgNwCzSTc0acMJv9dESLJQEAd5vNAAJNyCGyheDO0LaO2NsK4CBcscYciKH9oioq2EofljVSsuNGh3j2wbcCxgdep+bZbmG0SHGIR2R2iELNj4EhuEWVsNwP6uDTW2fnVGwd0szhBsYHQ7p8z82n35qClojaeGEYTCTlOHU4W601vvrwkcYOiXi9QQBIK4JoUUYToJxtCUiXLtVrAjDSzDgSqNOw1MMxilBYILTSiavEqOnPz8TcxiTmOvhDYzApWp03Nju8AbGwLrFc/v1BgZ3dUHemSkTgGGoLkqlOorqsx/7+npDSgTkHJL7YL+YKE1NEJ8g6AAWYXB3yiadQUIRI1BS0juJGDNXsCo2+SCIwxjZ4mDEMaGdK0pJ8+bIYoBsrDv2ip8pg+9oEmLsMJLMekNXj3XgEtYdDdy5P2l/AYkiQ6qFSdY1GSyW2FMi1ZYFiaq6qR4rmE8Rqo+ipbv5wDZfr+Qp/nrVSXLpGFchZRFXuucPzq9aCj7M+6kAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>, which behaves much like the semicolon in C and Pascal. First executing <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, and then subsequently executing <img width=21 alt="Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABH0lEQVR4nKVU0RWDIAzMCqzgCqzACqzgCq7ACqzACqzgCq7gChYx+mxLLvg8X38acuQuIUQ6ho4zDXiKNNN2fTOFfipHS0lZSoqrn6fMNIGMnj7y0d+KVq5EoTjSx0bEchUJpVt4JDCFkwkOrZJZhmVEKX1glTKOGlYcngCBxSKyprBgFU2+ghi52WTG9o7AdBEEmcB1EcS3BB0e4Dd3EPh2ELbo6xLhQSU8qHTKzFJ4VEVEXKP2WIYaX0CF14Nt35HqQ7KIgK49+E8Razq2mHYZJ0W6eeHrv1m7/aQI7MWuN3Pnk9R7Ca7shVC3c8ciRTQ90wmR8OjoMCzjoQN32Gqp2n8Ez7t4upn50BXLQvaO5PJbnksyZQZTnYpwF/MB5jS+yofco8YAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>. Formally, this means that a transition can only be made through <img width=45 alt="P;Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAAAgCAQAAADjow0MAAAB30lEQVR4nL2Xfd2EIAzHqUAFK1CBClawwlWgAhWoYAUrWMEKPsgmcids8+Xz/PjrThhf2BhDqf9SJ+umlau0QdlHk/fKq0mtuU3RJgm0Ycy58xjbMdzHr9dlk7052rWp9dEm2HO0PY0gplgNwCzSTc0acMJv9dESLJQEAd5vNAAJNyCGyheDO0LaO2NsK4CBcscYciKH9oioq2EofljVSsuNGh3j2wbcCxgdep+bZbmG0SHGIR2R2iELNj4EhuEWVsNwP6uDTW2fnVGwd0szhBsYHQ7p8z82n35qClojaeGEYTCTlOHU4W601vvrwkcYOiXi9QQBIK4JoUUYToJxtCUiXLtVrAjDSzDgSqNOw1MMxilBYILTSiavEqOnPz8TcxiTmOvhDYzApWp03Nju8AbGwLrFc/v1BgZ3dUHemSkTgGGoLkqlOorqsx/7+npDSgTkHJL7YL+YKE1NEJ8g6AAWYXB3yiadQUIRI1BS0juJGDNXsCo2+SCIwxjZ4mDEMaGdK0pJ8+bIYoBsrDv2ip8pg+9oEmLsMJLMekNXj3XgEtYdDdy5P2l/AYkiQ6qFSdY1GSyW2FMi1ZYFiaq6qR4rmE8Rqo+ipbv5wDZfr+Qp/nrVSXLpGFchZRFXuucPzq9aCj7M+6kAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> if there exists an intermediate state resulting from <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> that leads to the final state via <img width=21 alt="Q" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABH0lEQVR4nKVU0RWDIAzMCqzgCqzACqzgCq7ACqzACqzgCq7gChYx+mxLLvg8X38acuQuIUQ6ho4zDXiKNNN2fTOFfipHS0lZSoqrn6fMNIGMnj7y0d+KVq5EoTjSx0bEchUJpVt4JDCFkwkOrZJZhmVEKX1glTKOGlYcngCBxSKyprBgFU2+ghi52WTG9o7AdBEEmcB1EcS3BB0e4Dd3EPh2ELbo6xLhQSU8qHTKzFJ4VEVEXKP2WIYaX0CF14Nt35HqQ7KIgK49+E8Razq2mHYZJ0W6eeHrv1m7/aQI7MWuN3Pnk9R7Ca7shVC3c8ciRTQ90wmR8OjoMCzjoQN32Gqp2n8Ez7t4upn50BXLQvaO5PJbnksyZQZTnYpwF/MB5jS+yofco8YAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>:</p>
<p><img width=174 alt=" \llbracket P; Q \rrbracket = \llbracket P \rrbracket \fcmp \llbracket Q \rrbracket  " height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQUAAAAiCAQAAAD8QQQgAAAES0lEQVR4nO2b67mjIBCGacEWbMEWbMEWbOG0QAu2YAtpIS2kBVs4yzXROAPDgISTZ4cf++zGhc/PVy4DCrGPXtzeyiw+G8OHFOU4UV5zyedCVDeKX7EIqYr/c2Q3SY8+8FtnVMidLllBUZ4T5TWnq8E9JarTTdpGfneN+f98LHMmJpOSclft+HJXdeI38NJVD4VcJ8pphtWcI8XTiDrcgMezct2lvJpb1K/pMZr6HoZuXSZVp61PIvW1gwLdiboopHrKQkFH5ywYnv8yORu2YAcPxewEHmNSNVmLGcKLRwknaqKQ7ikbBeEY20fnLFhjdwKIhqYqg6MYqq8dFOhO1EOB42lRFDR1tiH6IDEE4ZGuvvPtto0C7EQtFHieFkZBoI8OC1sLNqR0rkNbgHbaRgFyohYKPE8zUJAFUOjdyIWHdKPuuZ12UKA6QdOsp6J6Ajox1XA9LYxC7ww41jEILGwdPwHZA2ApQXjxKOEERfNoHpJdidzQgTauJt3TwijIE5G2s8IIvxH6ENudvU+BWkfh7ARN80MV27XPgQcaH67SPS2KQu+a2D94y98tKCkc9tbe5bWNAuQERfN4+A33LaSG62lBFAa3vj5OR+7B7urcidJk01EYE0q4nlwnaqHA9bQICp1JcP6Cty9MIhaOjiRbZqDgR2xKwWy3UcKJuGat1y8CB7COmBq+p9kovMqmhKftQowk2csfGSDiTlA0rwaGUb0+D1UPNsfC1fA9zUbBbr6Myclmuuy/MleIO0HTvLjh5R5YTuaiUHiAWAlNxsLKDmMEr0FaQoHqRJ0UE9fT4tnGtIAXisewt3bdLh8tSjhRBwWupx9Gwb5P2OTIK4CmdP9RCPdR6Z5+GIU52p0tCONUW98Pa+ElZF5NFGY3V1gDm3ohNVxPP4wCvt1kw6ZqHsAv1MUkdMoILuEutRYKP+Z9leZIDC/xzPU0GwV8f8E3HD6C6Rdi8DW6s9vANtobIGJOUDR34pVX4CaeuZ5moxDLJGzRq+6o8MWIhm+oPRTiOZW0bGMfuQ5Hgefp5SjEM3ndU/i6G98mtzeHvWvfjwI38ayD42kWCvoIZey8koyiYHfoNyf9YaZw9iZCO/ZtoUBxIjXxPGWgwPE0AwVqflFGUfBt/Qj5zLTFjG0JBaoT1MSzPTu9ZaHgr6N7moECNagovFqMZ8vaQoEa1MSzXdrytqOwq+OeVkDhlvh/V8KQ8r0odM+RfAKnfTw1FE8vR6EnveP78N8VhGYK34uCdFfNIvQRQaoaiqeXo7AKOEUUisGMk3A+wce3ouDPHep3GH+B0tXEPb0cBb18iSdf3sN+RbCpSc9rqnPVl0a0qDdXsBnScD/KURPztMJcgfe593D4FvGu/pZ6TrBs1EPhOjVhTwkoHEsd43V0CqLVzKblrl/5lKKcdstr5tYIeUqu6/0oKOe0UsnoToo4X25zgu/EFZrLPRdU3T/k05bBZ/wg/gAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>Where <img width=10 alt="\fcmp" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAQAAAB+Wt03AAAAoklEQVR4nLWSURGAMAxDawELWJgFtGBhFrCABSxgAQuzMAuQpsDB1oPjg/BTeF3bpYhc1cuMZxBHjWRZiVdEbYlHfO4YtYimEuvJQ1rhG07oeCjjrVDEiYTunSyInOkjgSa5V/tV4exdeabQhhqQ5Ji6nPd+NTUh+QE/mtpwwEJmqu47c/OVIuFE16uVyP4zWPGxhranwOKOMkeytbpSz25oA3dnTl2BSfg1AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> is an operator for forward-composition of relations, defined as:</p>
<p><img width=515 alt=" X \fcmp Y = \big\{ (\sigma_i, \sigma_f)\ |\ \exists \sigma_m.\ (\sigma_i,\sigma_m) \in X \land (\sigma_m,\sigma_f) \in Y \big\} " height=27 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-9px;"/></p>
<p>We also have <em>guards</em>, which are programs that do not change the state, but only permit execution when the given boolean condition holds:</p>
<p><img width=245 alt=" \llbracket g \rrbracket = \big\{ (\sigma, \sigma)\ |\ \sigma \in \llbracket g \rrbracket^\mathcal{B} \big\} " height=28 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-9px;"/></p>
<p>We can use the above building blocks to regain the familiar <img width=18 alt="\textbf{\textsf{if}}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAQAAAChSU5wAAAAmUlEQVR4nGNgIAa4QKESppQgw12G/2AYiiI6EyoKgR2YJsKkViFpOoOi6T/DbtzaEFIz4QaBnGcMNGQmujZjLA55BxVxgduOxXdpQA0gKAjlK8ENcsFUjBu40FgbatyUw7WVY48zCDiDYjZ60KPGJxJADcm75GkTRHOkMS5HoscbkUEyqm1UG2Ftq8BK3iFlEUguuAvP73AAACmk0y3eWXYiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> statement:</p>
<p><img width=383 alt=" \textbf{\textsf{if}}\ g\ \textbf{\textsf{then}}\ P\ \textbf{\textsf{else}}\ Q\ \textbf{\textsf{fi}} \simeq (g; P) + (\neg g; Q) " height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAj8AAAAhCAQAAACc5gJ+AAAJj0lEQVR4nO1dW6GrOhDFAhawgAUsYKEWagELtYAFLGChFmphX0iY5jVJZsiD9twufs7mtMnMZGWRx5A2zQ8/fDvGi+ptm/6CWq/yNg0JsRqOq8tpzw8fgpRW7Q5mXIeheTaPi+rumrVZto5VD1d6G0aMRcFYtZtbf+IarfuP4768pjy2sjCLml+XiV+7ee1et4yd7goPx61lV61l180nXv39mzN/mwc71up+DFt9ucWP196PLQq1BKiEt2ngscgbq8EikkRrFL1fS277CYC67xfUvWOn4/Md3mW7VFQeWahXW9wH4c9zq0+OXcbNJ7CA6k+/yYzNi9ot1Qof8pfKa++lUq8o4+15nGGRJ1ZDgwkMjHxmoWj91gxXDPyuHHkBYHSo5q9jxmd9XQ9vaF3jIScrUYDmt9TsI2RTfmq11LTZXGbkwWnvWmOSct6ewTkWeWLVo9SB5xt8oS04rB6OIa6LT5Cf5lB2HTA2nD3foKOmh5I2WJyBAzR//gxujMa9WoujJddBOO39ZHOgPSFYn7Tqc55FnljdjjmuUq3OolhZgNS56+OfKj97p5OWpT6T6nnYB6kxkdsb54Z8hNSaevVFhY7T3hObA4NTdgxlveUhhUXkWA0oxUrBX9fnyk+TKT71PJRe+Maw7fEQiD9l63IDxz2D8PvBae+RLQ18+SnrLQ8pLCLH6ic/OqZ/QH7kmGUNfEJ6+YqW9AnyMxPsPA9Oe3fstuPLT1lvOUhjkTdWdmbP/U2xOzvnp98Ubnp/q43odqvR+S7s0KdgZufstk/sQ/wRKbPf7s9idf0hlkR1dNv08v4uN1QKDoyOMAWhIGQbJj+7hfLzi7CTU17Yh9DkCGbuMVExuaFaa287ii2t2CkJ1xJj3BrdcQqxsI1wmtfe3D1hvvzEveXhfGxSWYTGarW+Ym+504eX47EhJzcsF7FiHyJa79RkdkV1p33PK6W66ktf3XvbT/2/HiK1thQqxQ+MjlP0OUCzzfX55sTjpcU/Vp4PC0FaZJzCMXG5IS2H7epYfuv0bo1XYNQQe9qHu3yYhXKCENq15LX3SmCBDr785Ex6SYtNKovQWNld4NnYFKPJzyRMB+OGwxC+/KiZo7JsFWUr8quNSJWF8hQjAvjr7pQyBEqJ+WVSpjtqicWFbhvEHsaCqxjfrNbn4+X58EK6lI3FsASHy42H4UeYmo9GZotM279ewkuM6H20Q4esjLEQIhwugd7eC1NOzsiPbWuHpkdiCZMmUmOTyiI0VnYXaL0D7BDkU1v/7EQgZOdMvvTPK5mAoI3vexBa6KIgWiphsrNKWQKlhGDTEXJ+48u0dNsg9jLfSu0sdCLLxh6X+svz4S+T/NjcAMso8jNaQjmJdnW79CMS2T5gZZyF3fGE91vKa+/S8oN52x9T8/D1tEZN6bFJZRFJfs4sL8phm1kpRX70+v1Lz3rQTGtBSJ7at8D6O7mUMBQdW5FqbkqAHxzbwA6s8UAiKeXhaEnEmUgRwblB4cuKdKO1sTNlb1HODF4raSzsxMqHH7z2fhSWH7+3MUyG/KTHJp1FaKxyyI+stEPu5ZCfBbknrX04tqvPLORSKL6p67XVSokLxzZTfvZVKXc8QykPB7Qnxd5y8oNtH8s3C1/NdCTvPwIdXbcAtzKFhfY3qO3Nzfy5Sn7SY5POIjRWOeRnf4o9rXvSufjULS4/k/ceTD7MIfwa7OK+ez6Ant+cHcIwzthmLo3Pxs4WpTwcNOJQJl/n5Wfw2jg2+jtktMwj3MoUFtrfoLb3FPC6bQbnuovPu5evnlzykx6bdBahscohP1gXwPMn8O+elR/4azVmva+s8jMT/fBZz7GtNbqiFCF7fSVUXtiWcFdaEHFzcVZ+2kCs262rP8Q+DIVv/g6ZwkIFXnuH5MfdxfRfvulzLvnJEZtUFhWSH/l5+7lVU37cS23spsoPngVL94tnW+/sLr2O5xOlPB8om+qyrNhE4vzkKxd8HTKNhQq89p4CHbJzxjj+0Y8v7nnkJ09sUlmExiqX/NhBqiE/9quxofJry89Z2/axwIwcakEpz4cZpZ+OQasphE+Xn7MsVODLDwf11n46Iyk0R2xSWYTGKpf8XDH5giS80M7PVfJz1jbAnq0NkkMtzweYBoQOhIo/2XZcLz++jfc0Fip8lvyE0gx4tabHJpVFheQHUtLNIVcN+YGlWvcdXJVMfpX8nLHtZjUdbLZTy/Mh9kqpzPiwlyYxXC8/vrTDNBYq8Np7Liw/4SRLKvLEJpVFaKzS5QeyYbGsgjigLliuujn/4xcOdfyDuX4/aOfD5ZEf/nHZZ2zbG+hufFbJD6U8P0C88CfTXu+L5ONnyA9+5AONhfvZfCFPee1dI+s5/VypXLFJY1GxtMPJKqN/Z6nEAROMdavtJkz05QRj96BmyJVRqWJ55edMx+LbJrfRn0dGMZyzN5PLCwE27l3qPBr6G3Dn5Yf2ooDv6DnTE3x1gcLC3rljg9fe3ANXr3rlNE9s0liExiqH/KgD658i3XvvMtQNTPNIe/3JQxMOO03M/sR18sO3zX2l03wSx8oLQb2iMWuz9/F4+ZCb/cGVn470ooC8Yrk/i2eAT2Fh/J0vXntzTyLky4/PWx7yxCaNRWissF9bgKcwPZ+z07rOLBqPOvnSj7U3M0zBMp0KcE/PLBje5w+nlOLDIiY3Zw98otkGsd93vUwJelodIVxeGHvujfnSqmwt3oFZGDcWy4+y8C/3UlgYS6/ktTd3K4AvP9zFbR9yxGbHeRYV/imC3shgmBvaYuYOmfuQ9tNtQ5ZSXOToUjzbVLasPxf2vK+DOPFIPgupx8t/FsJHvMdZuAS7GKe9d0t4bcCXn5wH2qfGRreKyyJ+rJKwNnkWzX4oARhof+cPSNJ/eAZj4UrsYnFM7IkRX3443vKQHhsOi/ixSoDcp7nqF7p+iENO4q74/bZ0UKmMs5C2KECB+xZ/3CL+sfFlOm6e2NBZxI8VA7b+yaONvnFo/38BLEZ+yq8ocNB6TnmksPDGWBQIY6z0O6c+b3koExsqi4rGyv4dRnkuH20r94er0B/HS1WckWdDj2wc0Fi438vxu1l7vlWtyGHe8lAuNhQWFY7VYgzk5DFSP/H5fIzHjpV+sMe3rAb1Th4JhYWdOGMxFTKNoKZsu97yUDI2YRZViBWc2QKHWK+V8l9/SIV6w34Vbff8qsmYKZU0FnYZuFnyV3/9SKmzbGxCLKoSq/b98zDTVw7m/7+Qb9j/Gy33Y6EfZWPDZNF/k3BRfX9HqeYAAAAASUVORK5CYII=" class=display-math style="margin:0; vertical-align:-6px;"/></p>
<p><strong>Exercise</strong>: Devise a direct semantic definition for <img width=18 alt="\textbf{\textsf{if}}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAQAAAChSU5wAAAAmUlEQVR4nGNgIAa4QKESppQgw12G/2AYiiI6EyoKgR2YJsKkViFpOoOi6T/DbtzaEFIz4QaBnGcMNGQmujZjLA55BxVxgduOxXdpQA0gKAjlK8ENcsFUjBu40FgbatyUw7WVY48zCDiDYjZ60KPGJxJADcm75GkTRHOkMS5HoscbkUEyqm1UG2Ftq8BK3iFlEUguuAvP73AAACmk0y3eWXYiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> statements. Prove that your semantics are equivalent to that of the translation into non-deterministic choice and guards.</p>
<p>Lastly, in any real programming language, we need some mechanism for loops or recursion. For our toy language, we add the very simple <em>Kleene star</em>, written <img width=25 alt="P^\star" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAYCAQAAAA8REf4AAAA80lEQVR4nO2UbRGEIBCGtwIVrGAFKljBCleBClSwAhWsYAUrcAssDHIsoDf3715m/FiWB3BfBIgSoCptBQmcFNvjYQdY33Yw2HZ6s6Cx91MnDwvAgJtTZCHkCVORO2G0I+OHXicIuK3IlJdJB2FudWGzgjIMbvuFzfqr9pFhGBAslkIiwGbfs/wASWoA5jRTjAVxsIkGlnlufetdmCK75PjTYzTea6ZhYW6giy1ZzBUgPjWsW8Jmcp4usurPLEzgWnSq2COprOjB+bpxOodg4YDLduH72qo+e6j6CfjD+rDOf+oe7LGzfgo70LKNP8EdfeX5N21llTjvaCpRAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, which runs <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> a nondeterministic amount of times. A good intuition is to think of this recursive expansion<a href="#fn4" class="footnote-ref" id="fnref4"><sup>4</sup></a>:</p>
<p><img width=183 alt=" P^\star \simeq \textsf{\textbf{skip}} + (P;P^\star) " height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARIAAAAgCAQAAAB0+z+6AAAFCUlEQVR4nO1bDbWrMAzGAhZqAQtYwMIszAIWsIAFLGBhFmaB1x+gf0mbQth4Z/fjnHs27tqkydc2CaWqjqI/3PIPCt23FQA9WFcNp4g3Z2c/hrZ6VcO3lQA9KKq5miRVQNSSV/H1kMOBIaqFS9fTeEpdFjk4DLV0yaKv789ehVZq4tq11PYw+Dw4SHuBNFEiNlMqLk3y77JeA9BEDZR1YTqBadUTM0e7j2T8qF4wFGX74E6Z7bF++TyoWifUX7ym3SroLXlnmw9y7qrZq/4OqQ4/BDpJvq2pQi+tGbuMYvs8uDwYrnUejLl9sXMwB1vZ7eJwlD6Eq5AjSbNryx1s14VbggIWjVBsnweXB1+41FiE4qLpzGX/ZvbvE0QhR5JK7sxmh6Yu3VS0xZFZg0ZGVNunweXBHpcKiagAF/SagYs0/h2QJ8lVKCfJEzU+1fZpcHmwQ8msm+ZFCLnDqc4HcHf9PP4nkoxo6YBm+xy4PCjwzRkSIVYRFirs2T5Rd3m1e3eZwaY3LyGljjrImqRUl+UQSRr5rXV69L+Fdzq9GT2L87Vyksxo8EyzvZKZ0pLPg2iYD4kw92bvDvwZh4rojaLvRItUee7hhFpbTxtRQpI0eyr4Wu/MVUgje+e562byn5K1sZwkeIZFs70ZK17v4fPgjFWeYhFiNeGZMtSg3aXm6qB7m8E1o0mUw7YkdtZryebgbTb4JGkcQm5zLs5uLNVC8uFawHqVAc+waLbPpfJ8HpywsYUitjl5poTcOe40Mt7OKmAxJKSYlM0mZUJ+tuuCSxKIImmS9Pp3jVN6oofjpSRpCkgC2372psfRXiggkKSWbtyy6XNPGebILMYhfkL6qFLh2RS42LTw/6vaP0CKpEhi79R7W/paUkqSlkSStO37JIn5PDikSeLu+8PpnAFK+WqtgprFrQ5oh8xAplWbB7hRTbsp7Jbhy6SQxB09NS7hJ8lZ2/N5EK2U9KvhHkA2cAwtun92XjyQ5nrvDXuUy62r/hQYJqQIlSS2fA+ZtdY28a+n/m18YZbLk+Ss7fk82GNr+7gvVlyoE9lMLYcy6IQ2x/U6CjDfTpuQJDEtOUgS51f4hcUMKZLw2J7PgyhJ4HrdHWDTWkuTLeoISRI7goMkomAlwbarFEl4bM/nQUUScCW6L0nMujMGNQ0DS5IZcTMHSSBwxiR3JMnFIq6DcHIYAxu4Vnvw6j9gp5Gk2+9SK6+cKfAfSU7iEaR9HUgShXpfTdxElkYSSzAqOItpdyPJmCbJXU6cWSiF3WCwRUniltNSlIjviL0dvapwhCTYOQ2a7YX8XapOwudBtJg2Fe3INEAnL+ELH7xZHV6SKKau4h+j8Uni5iFbXRcnyVbU65zAmJ44cj7go9n+nfkVnwfRE4f8JBHrc1vKhc/g2XGqvcLsxiKMTHCSxM9uSs7IlJNk2h86xv+h2N4P2Y/2QgF6nn/SD+LucEbEh8psfKK8HEM8AcNNnstHjzIKljZuoW4qNG85SdBwkGj7PksSLg+i1Z57HEfEYGue5/V015b6cK/lJMGPGFOl90mScHnwTm9DfA1QdlOOcpJU0QsVpUiThAs9ui3+EHhIIg6cszlr/ok9tYAQP7v/QfCQ5AjUcyj8PEgOojD/OoYOe4fvt/A9kphKztGTfmO1XL4RqDeVfz4eUdhS3+Nz+gyaw+89zhcHlKZk8UcRDZEp331Cg2O4Vuca0usfvwfQJHYJMWgAAAAASUVORK5CYII=" class=display-math style="margin:0; vertical-align:-5px;"/></p>
<p>Semantically, this is the <em>reflexive, transitive closure</em> of the semantics of P:</p>
<p><img width=147 alt=" \llbracket P^\star \rrbracket = \bigcup_{i \in \mathbb{N}_0} \llbracket P \rrbracket^i " height=50 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN0AAABLCAQAAABe8krPAAAE4UlEQVR4nO2dC5WEIBSGqUAFK1jBClawwlSgghWsYAUrWGEqzPLwgYpwQRFd7+c5u7OuAt5f3nCHkDfRkS8pA+/9kB9hp6YGAZNx44ebv+X3fk9NDwKmOCzd79T0IGCeLF3Bc/yXlxsv5cnSfWTsVbL4E/Nk6QiXLbSB9Q94tnRWMp685RGaQdfmyU8L+QixpTtiP5eFMl5kWmo68Wg1fzQ2/S7AUS9ZN6KpDI1p4afoIcWW7oj9bBbKSCPjtnRNRNQqst8i0jHY5VHtJizbfcQ5/P8q3dZ+ftYzWUjkN8qFs8Ruk66XCf+RTmbmbvhLvCPUGE4OTth1pJMObr19C7Uh0qkEqOhnScohCXNvQySr5u+IaMiKn7U8A0vYFaSRTgCxHlnceaJ0pqTTIfpGC6Ge3ijxTq0r1rdKB7Oefmdk6cS7o0TSs30+nDO1h1A6HZP1LpOODJHrV6tWkrnnj9It2Vpv30LW2O3SMVDkGS+9hWg1/71twLxXOpj1INJRU3nmL102RD4jminjp62RUDqdrfVsFuplvch4DWlovftLp851izPmz66EXcHdpNtaz2YhdXVr7nb5SpfJbuLPY1gUpZsxW89moWx/KMxPunzoq9S7j7IFKl3hccC5k3R71gt8uaHSUf6mjP03H+GgCRvrAMjRWsJZcw/p7NaLKN18fHnEvsPTby8w3daLKJ0aOC0Cp9rfLp3belGka5xJd/Ne6aDWiyLdGbPE75UOaj2UzghKdwBowtaT/fuHTwsXpTsAtHNgmlc2Hz5rXF4unXn2G8rbC0y39SJK59uTOyVhJ5FeOrf1UDojL5au58Ft5+B8SCsdJb5DZzpisLi3XmGXDma9KNKdsVUhrXTkkHTue232g1ovinRnkFq6LriVrApbe1fkDPuhdDuoEfuQbRdqDNLeFUHpIlIC8o4ZNbtmr6tQuqgoCXzr7Ure1TiuQumiUgU0VeiwFMFlE5QuMr13764BFrOJpVseZxk4Xsj+jKuzoaOfqmljWlW65shTHrbQesnOWdvO6SbkY137Y1Rg49BJONjYbbj97mWhGzOuFGmtxi2mzVWv3X5/R6qpYDIv7ymHUUd4jkMuI5/ylJCn0eYAW63GabHguidMk297dG92d/EESp7jvivRel6MYjH5EDJs2yEIgiAIgiAIgiBISjLDdM14DrkQX2fXyvNkJ73nfbRzvRyIxhHNCwlxds2GpQy6a5li5d0EuYA9Z9eU/6fW9unNVzGeT0WOy7QJnyJ4zTRyMiWXp+MilYalCGxy5lROS4lQussxO7uued213+gQ0mVcPCo/q8IWpbuUPWfXJRfONq3D5HKjclgwq3xyoXSXsufs+uto5rNhpRiTNV4uazyULgFr362ls63IpkV+qsarCFtIlw/7hXqcR4/LWjrmXH05XzHWeLVcaqSgsghmsh3qv3cB8WArnXkJEdOumD+rGo/KTrqinpaWCyd0rg0kyAGO5Dr111jjKb5a0dniVxHGZL2L1aeuU6g25ijYbyHdbb+e6T8wSjc7u7b16QRr6ais8VC6y9k6uy4dS9G37sYLHgJKdzkmZ9fV7vckF0PDv13lTIbSpcDk7FqMqPQLX2OuPtoopS5XuCMP5BClzEvbmQM7+SRYg5u3nkYz9QWxV/c4lNPH5Ase/gBxOOrFGHk3IgAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-29px;"/></p>
<p>Where superscripting a relation is self-composition:</p>
<p><img width=169 alt=" \begin{array}{lcl} R^0 &amp;=&amp; I\\ R^{n+1} &amp;=&amp; R \fcmp R^n \end{array} " height=52 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP0AAABOCAQAAABBYtisAAAESElEQVR4nO2d27mrIBCFbcEW0oIt2IIt2EJasIW0kBZswRZswRaykYsSlMtkK4mwfh5OzOcBmSVkGHF2URzNrehZebB/QVZ0xWsp3bcvBsSjYYIPRc0+1cXIPjffviAQiweTu5WfW4z761MyCbflzkf3O69iKir5uWJHfdwL/REa7u3o5bJ+T8lGcC9/v0felUkeTewWKJfzakPs+YwcqZhV+sVCTzZISv9/+mUG3hU10ueZQNwAw3IGpNcRDm/rP/H36d+kn6nkna26B+l1uo29LstW+oJNZi9Nbkivk5D0j52udJDeSkLS73VFfPeQR6ZPPzs5+ZKc9NXbd4PhyuidNeeA3EhOep1aLl/WpUuvhXE6bT7IkYSlr+XiTg/WVjJ2X/OzJ2OOyItEpa+k0zdtovQNj92L4M+vRfBrQvk/yUk/yEXeHKVqLVGqOcz7e6GMm/ZM0VeO8FESlP4o06ROctIrrz5nBy6MBKUv5a85Hsi6SVD62cmb0nk0cRoJSd9rHn5jPLgBWxKVXnXsWit3cwOFvRzhySQnfW0cX0f82+5eo/1yxGyWsPTK3RuvvgflJBKWfnX3Boi/g5D+/u3LOIK9rRrtgdGvtFAB7W2o+4L0rDPdZnw/+JSPd2101Ma1tVx8JWSb1CE6AAAAAAAAAAAAAAAAAAAAAAAAAAAA16bBC175Mb/lPmDLZ8qMlu/FflZInzC2BGsdn+oh/VcJT48802jZNio+bbtf0HDn1rue9DRrnVc3VQdLg2HpkUUWfDFJl+yCxuUsF+lJH2qt8+r+RAcH/vTIBc8BfZPv44h7rvW+eZaa9IIQa51X9yc6OPCnR1bM36134JCl9OHWOq9umg6kBs30yHqTKx2kl+xb67y6aTo48KdHDmuyNtIYvIxj8869pvTh1jqv7sOk96dHXpucjHPyG/Xh1tJp+c3vi1+G1k3TwdugOz2yalKXK2fpQ6ylKKVP3nPJXC+xhtZN08HboM42PfJek8/lkvYXNilLr2OzluKxSDP75s8D6qbpQGhwLz2yqPh9CfPkxw3r2n537NE8NQJCJsFfI9RaK7pQvXNAhNVN1SGwQXt6ZHEH6pWLRGujdaKzdVKFLo7L2xEzPXKotVY+k95eN1UHb4Mh6ZFNbs4sW7H+SErc9Mh0a42aUzZZH2p9VrfArUNAg0fnzrnaVB4G3Vp3PibVo2qXVaInqkZ6ZAqfWOsuzx49wyG6EkiPTOFMa0VXAumRKZxprehKID0yhTOtFV0JpEemtUW3VrX81rsT0kVXAumRKdCtVUkHr2M3gDuQG10JpEemQLfWsKzrfYHc6EogPTIFurX0Nfro3M0TXQmkR6ZAt1Z4IDe6EkiPTIFurTWQW765cUfU/U+QHpkC3VoikCt22U5O6aFEcty58E8exXc9vgHJsW6vxjOSrKhlNL7iEz7ICvUmzZjGH0sCFOZYXjTZ/wAmC1sRZ9VX8AAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-20px;"/></p>
<p>Here <img width=12 alt="I" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAXCAQAAACsCtdvAAAASklEQVR4nGNgQIBQht1oUIkBAxgzdAAl/oPhO4ZVDOUMgpiKIKADrCgNlzSyIpdRRaOK6K2oHJ+SUIa70DQeil2BMTQTICA0pQMAZ3hPOtTvvPwAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> is the identity relation, i.e. <img width=147 alt="\{(\sigma, \sigma)\ |\ \sigma \in \Sigma\}" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAAgCAQAAADTA95oAAAERUlEQVR4nN1ba5msMAytBSxgAQtYwAIWsIAFLIwFLGABC1iY2wfssCVpTgrLcvf0m/0xA2nT06ZJmjWGQmVq+6HQkN/egYIZEfd0Y8ofG8tdKCwPrhXyo5WZzGJG8zLt4bfazGb4geFhKO3IRkQFj9q87ed/R2l62yarSy89Olva6Ml5wlQMdnwYdU8YbRqNXYbHtthxv62W3zHY77qUsJLltrDCRNZvgFMOwdOJe3mCuBbPtOMlqbdT92giHXp2J94LlJCnEzesFKHnsEBcy6r7m6fbd8x2tcp4OnHOglF7i8OcJq5n1K3s97/nT36HG6O8959OXBjhGx6lcERwxHXQZN2DBlpE9xLXWHs0rnvovboXcvDS+ycnqIdM4l72hHsKeAdqj/uI67wnOHrH/dM6YKFv5jLpL67IJG4SfLnSh4ntbuDD6t5q9ikqRTioPbTE5WlQ2N/dMsoN9YO5XID3AeKoLZ6aqtoPfvZ/3z54/5gMfJ9qpEyAedEQl6tB4ZMVmnzOEcFcyu7WmJ5LJ4YCb5wa33EIIQrv5Abv0yXNesgI6KWMzCj3wInL16CH9koam7mUTu0hrXN/iNkdqkRYvkQ2+qVwcXOlXElcvgZXnaI1dM51aZ0Hcsg1q0rvjcn+FCgVLm6uFGH1eaDTmq/BAOZwZLyBRF7JHGIebttSW58nbibs8wTZ7DNSkEgOJS5fg4XJMWnBOYQxBnpMzo8aGU454goy9g/JHBx6KYiqGHH5GlQXGUr+GDrC3RP0ca/h+oC2tBxxNal28JNwX0sv5Tri8jXY8h5cw7zNwnvIWMhU+TR/S9lEd1BT3k0Ocfhq1Etxv0ne3Hni0m+HdHydaAgdA7zEhduZkYyQcojD3WS9FC5oiaWeIy6tQQG48BJahZls0yOip4Szw5VXMPateuUZp5dyHXFnNJhO3pe4vrE8pYMYx9HqcitjIdami7J0KmmlvC4MB/I1aE/dUIbAG/cERjLC/gJPHO0eDwdTQ0dBzmPlpxGVsuHKAFzb9x7YzSCNl5/T42lYrt/FZvjiJHNp4jslKu/QCX4WJuUDpHwBJU7b9x6V2rZs6ASf9Gi+M4njN2prtioJt0popfv1GT6tg0j5ALmNxxNSur7jdxf7hjZfWQqkUQ5TJnEpd6DxmYawpwby7RK4ppelfIDcYGkyiZq+Y1T+3UFVxRl82Zms8tpanJXJJE6aBle4mR54D6xkWco2FvlQ16aAsb5ptF/E79u5654YAnHO9tIZuLPFebPKBKVA32DEuLvmZKs51gXgOBa5PI+7B0Cmi0MBe2oyplsvXZ4CwQ3ig0KXDkOvRY/ovE2/opa/AWuZ/xZxjXyuhxoKamoqJpMpoxJ8Shw1VD0Vnvw7xDW+REJYrsVaJENVmVRwAXjcsdvHZ/db6XtHj/zSntVPKSjMR7X6mPnlSF/IE5DvsX1Q/IF/m7oQ/wBzIgFMqtVZCAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>.</p>
<p>We can recover the traditional <img width=55 alt="\textbf{\textsf{while}}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAAAYCAQAAADD5mIaAAACAUlEQVR4nN2XfbHDIAzAYwELtVALWMBCLczCs1ALWKgFLNQCFvpCaSAEuK0bt3v3wu2P0nz8CCF0AJ+IhQOHh6mroWA/dQ4wN6yGynGNR1dDJx1bWf18A/GVcBlyu2E1VJ6Hmxs6fw4SYMG3YahbVgPlvXD/HXLCIpdNYcKakqJxtMNNeMrDxhq2tWTBPbchZ3y2eLw2WNFP6SHh1IbmnHGFnivaSQ6n8Hek4bESS4uju7QYfWPW0UOzrdFLCXSwbJprZq3CudPWsSCq0ulBzqgdZ/Yzk/TUwLRixVPDPWWLbo+M5C87k+YWodOHpKXR0lWaqe6khzBdkrO84XTFySzxbEuEZ5C0rJ2x0BVQ5XIWSPY05FCU2/ru2Jifu5Br9T7rbFAJIcUkh8qgEohbJ3PdPqd3IWlrDXBxPciVIcW8UtpjtRByf2vfgcxFtbHhe5BUHaHB/FzbHFuDZ+74+R8JWQ/faveKYTiI1UnneRZZHQdJDUfDi5Lrg5zo5JBwF6Y/ApLaeP+bVAiB7JBLmSqm1btGQFJMC1JU+3LMn6hhRLHFXHlJjoDMl0b5naAxVZ1PEJ9MaGWPArLVzT6DzLkMN37YJ4V7uDaiJcl5oxqZCsiyvMdAZkw5OpDzVY+O1UN2IfsW/e/TjTkjnqdKg1e3FmXlMZcvn/fvir6G+Ir9BQ7TuUHct6CZAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> loop using our Kleene star and some carefully placed guards: One in the loop body, to ensure the loop is only run while the guard is true; and one after the loop, to ensure that the loop only finishes when the guard is false:</p>
<p><img width=289 alt=" \textbf{\textsf{while}}\ g\ \textbf{\textsf{do}}\ P\ \textbf{\textsf{od}} \simeq (g; P)^\star; \neg g " height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbEAAAAhCAQAAAD9yF3NAAAHt0lEQVR4nO1cCbWrMBDFQixgAQtYwEIt1AIWsIAFLGABC7XQl4Uh24TM0NDt9XLOP788YNabZRKoqh9+eBzdi+SKqslc0T9Fjx9+OBFttVTDi2TX1VxNkmhp3J6mywkYq7s8btLMNIR0/10fHeOu16BfNXu8RRbyWfFxkcl4NsrZQEUr5ZW2i+e/QeZYimS11O6DcV+P68417XbVGNz1fh34UkwzlSLwNNXKTvJfsHvYbXMfRTkbaFBNaHlZXP+pK3Co/MsNJd8YFLJYik2Mu16DsppB/20D3K2JcmYP/mzv9tKac5oMjv/inlSRbpCN/1V3AVf5/zQN3xiUcDbRVf+FYirM92CYItYkGRN3PI5ne/fMWRjHf0t0rpWa3bdjeMOJCQG0cF7WkbRg3fUKnE8x1RIbGWcNFp/r3caZY5cHx3896lNo4D+SXgrHwvm/KQZSzip8PNe71xMbC57/OpTsve6/7rKZ/1D8KLaP/uspNp5aEuf4r0ZsrqV2ilzDafNFFmqpdNid1kgtpnWM88NZyzZNDQi7yJzWezaeBI38PW6TVL5DGim33+QI4hMaT+eUZjBZHuVfONUpLEXqVQZVu7xkig0YhPRWl6F6boA1Z0sIe3ERSM654PnvHukybLXuAaFfW5x2uzlYI4Exo97Ze4g/2bThFKs7zHHzOmYot7bRXVb65NxtnrC3EBCi07WnZS3tTrrKle8lfKlKZ4pmSg6VZliK9IhX89qlJFNsSOl22+5KX5vro+K0drEfF6E12Kuu8vw3R2f7xP+hzl2ywkjIQXC3q7I55xZNzZnBu0eFc9b32rULt2MOgx7+brZgL7rFhl9UkvVaHpjTrvfnKFZvcnzNcc1uWrNlu4I2zItTBKTmSgQ0yRQbcAza26rvG/QzZjTRm2xTsCcnF5c2qynPf1NExzSgQ4hRo4ve2DJ4+LxsDo5BCGskWKAYGGjDC4/vtnNWhRzFIDWAuGI7Q6kDXYJmALTMkWDadG9XqX1WMzO9D5uQNMIUaVaq5MvcNMkUGzB0QQPW6wjGaTtkNG125OTjUq+9WDpSPP9xKIaN0EDGRDgWrwck5uA1CI0dclhFoC0Ny+/u4+MQ71MMSLk4ukD7lu/HzGDDDzOFYna1zk0sXDOfTjNZNzdFhHwarNLkCUaTTLEBxxz9tdFP7z15l6wX26QcWlxqPXNJg+e/gUExpXv/QCm/dyhGzkEIGBBq1GnvUgr6Nfvwe3SGT7Ehut5ekx8rG1Nq5Nx+ctjWPpYaajaid+ZnU64UoMxAGmLSJFNswIEV2oWWetNJ364JnWsM0hQ7GhfsKVT/4Stj58ClGMNWIJS5+KZDbM6YQV/Yz+Hh5FIM2mZ/mDITKTZXfv9nzdsvSYBlvgRfswmxzu3d8+jX+y9BTTUHmmSKDRjapF87Z25H6W3TFDsaF+wOqv96JoEfgUsxhq3QdipCNSsLXWdDSPcGhXyKwa/ZG+veiBTDrsJXU3xAEu+lJ56sds9lnjIjkYohaJIpNmAQu3+76GWC/QGcqxH+rKNx8cHz36soxrAVZgDjdolYw3jbHuXXHEtSLD72iskGrdMAZM3zUIJi+XDiuxPyoEk+SrFySFHseFx88PzXk5q9MrAUY9kqHBKpzm+u7Gi4CXo0gxIUg6HJkfanRZPpXIrZmmk+nGUpFkp+d4odiYsPPsWeBbspg2mrnRfBbXbtAsjmrgeUoBgkCmepGYAvIFJCyZmL+S0UXmTAcZRiNMlH52LlkCraH4+Lj/elmAXTVgjishJNwZyZ0bWqEhQDmfHrCflNUFDj9K+jhPK6aeHC1wzmpn7tED+L4yjFaJIpNpwNXM7xuPjg+W98CcWYttrRftxWYkEvQTG7xO3XX1rS27QLkk6UUFqpF+Rcv2oAv+0g1u66oPS6E2IXBTTJFBvORurNN1pcOumhPe/w/MdZelbalHqDjJmDtmgLrrNtZfygEhSz/ZjaYaeMtsuM+TTpg2c1W1ufw+hIVbg4m5TgaXb3hFktujpbvSgrMFNAEzpokik2YKBtEYq3CcVIbQOmxKWJzuBeoPqP81azyeoyexSZOWj7rLitjM0tQ7F4iZHeEtuP7yzrTr6RWOq127TgmCO58TUgi9ayHqcYTTLFhhg1aYuQOXJrY1O0IgSa5eOS36PI8x/n/ev0HkU+mDkIu8Bmp620BAhZD9+SapFzXXSmTvxWaIMBKXUfhPnIF9w16nuoY34RvHguEN1Ve7d4mqnhK3UPwcS6OgRFMs2G85AuMVDiMmUpxvEfp2RWr74tg+M5+HS068GdvTT6LgiF2fpFg1gl7o/K64OaPT7Wp0im2XAO9j/wlo/LlOlveZrwolOWBMdz8AMxV2d+fuYHH/RPvGFxmXcpxkHPTGlxaj/z1Tlo5o5HVtl+OAJqauNxKZfm8dsD+2iRiU8pfFkOhoMJ83LcG3yp4Z9AJN5Qp8TlUmw41RFrvBaUNwmo+OocDL9Fa1aPPvZ7Qx+JBimu0OJyK5TmLeNjD6DPvViefHkOTl6XbF4s/BrjPgZNtCZFiUut37V+FGYJglsg6wrOlb48B+ENJ/gsyfy01xl+8OEPlmhxqQtESxyspJarwH59DgrZfpiPw/E+wPbDufhPccnY+gdwtPg0A0mStQAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-6px;"/></p>
<p><strong>Exercise</strong>: Devise a direct semantic definition for <img width=55 alt="\textbf{\textsf{while}}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAAAYCAQAAADD5mIaAAACAUlEQVR4nN2XfbHDIAzAYwELtVALWMBCLczCs1ALWKgFLNQCFvpCaSAEuK0bt3v3wu2P0nz8CCF0AJ+IhQOHh6mroWA/dQ4wN6yGynGNR1dDJx1bWf18A/GVcBlyu2E1VJ6Hmxs6fw4SYMG3YahbVgPlvXD/HXLCIpdNYcKakqJxtMNNeMrDxhq2tWTBPbchZ3y2eLw2WNFP6SHh1IbmnHGFnivaSQ6n8Hek4bESS4uju7QYfWPW0UOzrdFLCXSwbJprZq3CudPWsSCq0ulBzqgdZ/Yzk/TUwLRixVPDPWWLbo+M5C87k+YWodOHpKXR0lWaqe6khzBdkrO84XTFySzxbEuEZ5C0rJ2x0BVQ5XIWSPY05FCU2/ru2Jifu5Br9T7rbFAJIcUkh8qgEohbJ3PdPqd3IWlrDXBxPciVIcW8UtpjtRByf2vfgcxFtbHhe5BUHaHB/FzbHFuDZ+74+R8JWQ/faveKYTiI1UnneRZZHQdJDUfDi5Lrg5zo5JBwF6Y/ApLaeP+bVAiB7JBLmSqm1btGQFJMC1JU+3LMn6hhRLHFXHlJjoDMl0b5naAxVZ1PEJ9MaGWPArLVzT6DzLkMN37YJ4V7uDaiJcl5oxqZCsiyvMdAZkw5OpDzVY+O1UN2IfsW/e/TjTkjnqdKg1e3FmXlMZcvn/fvir6G+Ir9BQ7TuUHct6CZAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> loops. Prove that your semantics are equivalent to that of the translation into the Kleene star and guards.</p>
<h2 id="getting-back-to-abstraction">Getting back to abstraction</h2>
<p>When we transformed our simple greeting program into a nondeterministic choice, we reduced the size of our state model, but doubled the number of possible outcomes for a given initial state. Instead of being able to determine which greeting would be printed, we must now account for both greetings.</p>
<p>This means that the more <em>abstract</em> a program is, the <em>bigger</em> the semantic relation is. We can say that a program <img width=21 alt="A" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAQAAACoou4KAAAA4UlEQVR4nJ1UURXDIAyMBSxgoRawMAtYmAUsYAELWKgFLGBhIwndo+0ogctX2xxHuCsA/6HBNaU7XV0gPcAOH6rXLJ2hKt2t0V2l72vauSzAA6gV7Vxobm161gbY1qZnbUQu9DRH1o2iJ/0p731DsES3cjLO639P7H6Q0+Nls2helpINHZVpKpD+JqOnmrVricyzp7kZiswTRJcbze19kEUXIxo7exqap6nprn18GZgXOtqIfZQ987hBNzr99PhrmGpfx/338HAydeQyXrz2qaIbB8E4rq5YpKbvXgQG+OT9F1R5fHP1sA4eAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> is an <em>abstraction</em> of a program <img width=17 alt="B" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAXCAQAAABU6iyYAAAAwklEQVR4nLWTYQ3EIAyFn4WzgIVZwAIWsHAWsICFWcACFrCAhV1pSu7C1oT+uPYHoeMjr30MmHGgPGTCm74o8UJAxsVZ6ejIE433RccgkP+pRHSqdLpSiXRDQNJGLVkQL+LMSLYggWvRghSeoRp3JDLgdhHHQ0/6gL9IZeeHjW0RqSJZ3J9Y3hc2wnP7RishULAgQTo0IJAX/l/EcbVbkDn6beTgn+xJroJ4AdSXfIptnjLQWnnfNE+GhGvJSh0s938AeNWZEm5GtZ4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> iff:</p>
<p><img width=98 alt=" \llbracket B \rrbracket \subseteq \llbracket A \rrbracket " height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJMAAAAiCAQAAADxeiNOAAAC4UlEQVR4nO2ZjZWDIAzHs4IruIIruIIruEJXYAVXcAVX6Aqu4Ao9PqsFAglwvb57/fNe79UeJP4kECLAVT1sXpuBo6Gyf6lq/XYi+j/CAxYQsrm/I8tMp/uIyyiiyF2uav12IvqvzBkDj4uhkLFqAm7yl7jOUd6HKfTbV28hmNYnxsv4HzfXwSTpPnS7WyMr7Pr7FkX1uZhWeQfmTqbEeEWYjAyo69UZDnnlkBiZZtCb2Owt+O3I9KVhMursmCnPKjCJABPIsIsb5GLq9Oi7/Jxlz7BhwU3x25d4xgWuxphGG3hMM54G6fJRtSfSMXXSkrCBF0aB069gWrhmAsfvCZcpomMSepEQmdWpMaZJXwvnAQfTVg2JjsnMJTV/06tTY0wbEuN0TMpibuXJi4pJPDecQ6+FmJpimjWkWP5Bx7TKVi9qQnD6Y/ZtLHdqhqnXhgQSLnRMsZDli4ZpuYCZkeXCeVWJ6a4z8F1PWdwhKqY2IUfDNLxsNiZ7wmZyNabFZuEO1VIVdMpeC1EwbV6QqaQAS1ubrk2jzZrL08sxsT5wlMc02vl/tlX7Hp/LjXc6sKD8DISzNqXOVlTlMZkTaNji/jXHNEEs8efsdGFyylcO0wxhEtzppCB+ZGmOCexTYZm5aH5D3mSAhNdN2MX26o/D9I4sXHkenjtTSUFzTD3ECh0cTP0vn+l65PG6X2JJQXNMLk1gmfE0yAV2r1rKU36vyFxSMpWCcK9tjGnQUR/+L7/etICpN03Qtt40ooF13hM7oeHmTQfiRGn10hVg21UvTRKc6hfLniowrZa8errT85biwVKCqUaY37fkXFI67GN4fdlUjGkInvBdBkrh0bG5sFcdu34DlJIr+W4S6blGVcwmjj4DE7XvGOyzX0wkfTGR9HGYpugbZb/lKpz/HtPw8sIaa7fMKP8eUxt9MZH0B5goZStMtf1L1coueRz/NMUrwXZB/9oSCVV1fjuh/v8ATuwZAXpwVYoAAAAASUVORK5CYII=" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>Equivalently, we also say that <img width=17 alt="B" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAXCAQAAABU6iyYAAAAwklEQVR4nLWTYQ3EIAyFn4WzgIVZwAIWsHAWsICFWcACFrCAhV1pSu7C1oT+uPYHoeMjr30MmHGgPGTCm74o8UJAxsVZ6ejIE433RccgkP+pRHSqdLpSiXRDQNJGLVkQL+LMSLYggWvRghSeoRp3JDLgdhHHQ0/6gL9IZeeHjW0RqSJZ3J9Y3hc2wnP7RishULAgQTo0IJAX/l/EcbVbkDn6beTgn+xJroJ4AdSXfIptnjLQWnnfNE+GhGvJSh0s938AeNWZEm5GtZ4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> is a <em>refinement</em> of <img width=21 alt="A" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAQAAACoou4KAAAA4UlEQVR4nJ1UURXDIAyMBSxgoRawMAtYmAUsYAELWKgFLGBhIwndo+0ogctX2xxHuCsA/6HBNaU7XV0gPcAOH6rXLJ2hKt2t0V2l72vauSzAA6gV7Vxobm161gbY1qZnbUQu9DRH1o2iJ/0p731DsES3cjLO639P7H6Q0+Nls2helpINHZVpKpD+JqOnmrVricyzp7kZiswTRJcbze19kEUXIxo7exqap6nprn18GZgXOtqIfZQ987hBNzr99PhrmGpfx/338HAydeQyXrz2qaIbB8E4rq5YpKbvXgQG+OT9F1R5fHP1sA4eAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>. Refinement is the inverse of abstraction.</p>
<p>Because refinement is just the subset relation on semantics, it forms a bounded lattice, giving us a greatest and least element. The greatest element is the relation that contains all state transitions:</p>
<p><img width=303 alt="\top = \big\{ (\sigma_i, \sigma_f)\ |\ \sigma_i, \sigma_f \in \Sigma \big\} = \Sigma" height=27 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-9px;"/></p>
<p>This greatest element <img width=20 alt="\top" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAXCAQAAAC2NjfhAAAAPUlEQVR4nGNgQAYuREFjBgygxPCfaHgXU7sxFlvOMMzEIqqEqRkb2M3QQZzCUc2jmkc1j2qmjeZVDOW4JQHYRTrGoPsLLAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> is an abstraction of every program, because it is so non-specific that it contains every possible outcome the program could produce.</p>
<p>Conversely, the least element is the relation that does not contain any transitions — representable syntactically with the <img width=63 alt="\textsc{False}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAAAYCAQAAAA2GOmqAAAB/0lEQVR4nNWYbZnDIAyAsTALWKgFLMxCLZwFLNRCLWChFmoBCzs+S0oS4Np7nm3Jj9utLbz5JJ0QRcyAfrC8BlS+G5IXHdRD7ukzVBOu6HdD9sRD0kmyfze++W58RVyZ3LePW/tJt4Jy6+Q9bkqN/zgWp/B5Y88lT2PJkJBRrZhD5WXRjQbS6ID15QItwyZQ8hbX8KVbLe5mgBkj+BsfcR5foM6/BYNezm+0mKanTHg6t2LKFYowfW5Es4N/lhiNJXjjCn7diJchfNHH30I5RV1ZBO+vJW1BB7OPDzFUB392a80j+GOl4lPHF/XOpk8b36K46aoxn/F1ilb+y+JbMOVYBqEUMp8+bfzliDRXiDR+jgKLP5L7a0idsslE3NPGj/ErEcZIKhkYHTk0tIziW4C8H6b8Dd97cgcmWPEk8KH+E/4s4BmwiPpE4PGpsXt2K5gECBMp4i9paCwzV2N0r/En9x+2eSUKHKcPhc8dc7nz167Duf9gnEXi02IJfJw+GN9HbT/g6va3VsbR+PxJNIivAUQUfOTQ+Bp8g5/QTXzlrvvPz7v4eHSmz8c+/rnbrFVa0Kt2+34P399TvzbSZVrX0Vbhv0CvkSgFKXzJvTbhbMY3wTnQMM9yq2VV6I7S1/EIR+vPJ+Br52vY91cQ0zb+7dea+5Kdo1Jfv/Arxi+9lkyua9nubgAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> guard, or the infinite loop:</p>
<p><img width=60 alt="\bot = \emptyset" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAdCAQAAACA/LNdAAABb0lEQVR4nNWY0RGDIAyGs4IrsIIrsAIruIIruAIrsIIruAIrsIINWApU5eK1XvDPS+Ga8xOTQAB4hnoYuBGuS8PMjUBTh6trEHYCCRZGuhufenCIK/CXggVWHBNl0I1HHjlF8YTQmuo6s0EvRQz70YorThIXtELEtM5dALaIThIXtC5ieMDR91xFXNA2YEYZtC2uSRWEB1ogXg7tAuxATUYeaIl4czESu9mKWoCeMFjirKW480BPBbR9M8ivoDnVdWh5wSjQPr7lvdBbCtHsPD5z6BHTEO6F/o9y6K3ceT0Gust2xsahU/VQ73IXZxuuHglPZ+eNxut02hFt9nwfNObMJdd16JlstS3ZBei+OCLddvYQ+H+q1RpVHapzKndepvVTngqruhRfw9HSkLNzsaEvTF9DHXcuRxutf9f9LLnF/EF9SMbYWHf4EgdJKELw08zt3W+Qj+HUjRvWmwGy/AXC+Ln3eITi0f9RErWa/AKOwO8RuIF72QAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-3px;"/></p>
<h2 id="specifications-as-abstractions">Specifications as abstractions</h2>
<p>One common use for abstraction in computer programming is for the <em>specification</em>, <em>verification</em> and <em>derivation</em> of programs.</p>
<p>If we define a <em>specification</em> of a program as a pair of a pre- and a post-condition, we could specify something like a factorial program as follows:</p>
<p><img width=159 alt=" N \ge 0 \leadsto f = N! " height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAAAdCAQAAAAH4ZgeAAADu0lEQVR4nO2ajdGjIBCGaYEWbMEWbMEWbCEt0IItpAVasAVbsIUcLKBG+Vk2gvlu8jJz813UBX1YWBYY++n/Usda349yLY/gow0b2cREwcZ9vxpVyorOQrKXKv3xVq7MPOGSLl2wWn21JtxG1aZfUhT/pGlx1YoFvsDs848L66GyME9I/wPCXl4CnxIHt1X3jBfA4KpnvnblqX65T7o1i/KKAQBPxeujsEDBDTW+ifalTYPq2xpw+s6wONh4gdcKi1neiFf70gB/af8t6bnM1pLPIgl3tLf4/RMHV6uHGUCSAT+g127zRw91h+egsmqhduNDvMoUQWFhJo0xbJCtJk8Ts9dgTJ0F7LMUF/c0U0Ivvsd3jR/VrjGXhYzxEfYFpuBonwdXq4UGznZIw8r46fszQ/A1y+sZHu4KicICBdeFMmc/mbPhajXZgIWnmfVj9U3yNrg5LFBwNQ7/+C1JcI1FHYgs6l/MwDp6P2Z9uD2EcwI+5Gz/xr3Bp6KwQMJ1IcRxaKTD1eJowP6oLxILEvRADPHCJhMWGBpdaqGGKCyScLdLgzW5D/vl4f/50kt0s1CKxZw14HaqHVhhh+Uuo8RFYTHuYvqEQTfzLTs/kxfFjBLshkWHy9Ur+rufOHmqQA/yOLgNe6FLyhqFRTSmPxpkNg22LaPHj+HyNcVRwnNbsH1OMnA7ZA2HXydkkHdPQJXLIhOui9XG3R10uexsOjlJg9sq6xPE5ssbNJM6bCExMp6ewCRGvgFumkUmXPP6W26IDjcvWqbA1VGle/Fx56Wt+igu1e/mrvfyTLbnG+CmWSThnvtxv4vVaHDNOhcLVovmucc5Ss+oxpu3ettDWDOBr6d0D9xcFkm4vhDDJbFbAtz8BIar8ThzmgUBfp07gE8u0ZSlUK3DdLh74OazEOHvHDLoJvMlM1o2uWU/2CE6GF6Toep3A7X/OnbrDgtXokusXVpXs4Db/Qb3e6s4uU2D83rOhVUxTD6QPuCfSG8qYvd3ZhTcZs1hpUtqJLuSxWow1KNcEgxjcIDqw2AXxMmKmb3nUzky9MELv8q9On2CEYVFExsR4oNPh4QbOolhlijYsGqwH9Tc67bu82buVDvxOeL3FWYNUVhE93NTM8sjdyhYtYVV+A+6zS3Svsp9R/OyB8GPRWERzX3J5MkJSoaqA0y58bKWsP76gufvOoXh4vTanpvPwqwxqh0lpJ/F2CzoufG6MIraijsP532hwmHVT39abnOg/CnBn6qqQez6/PRHxRGr2J+K6x+4hgqHt4t/YgAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-4px;"/></p>
<p>Here we are using <em>specification statements</em> of the form <img width=71 alt="\varphi \leadsto \psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAeCAQAAABum0PLAAACLklEQVR4nO1Ya7mEIBClAhWoYAUrWMEKVKCCFaxgBStYYSt4h4c6gwPirt/Ve789/FIW5hzmhSvEX0UrBlHfTeJaGDHD+Ip6Pv6lKP0fRdVfUQGNUOhJwfLmxnOpIId6YLAhFtWQWQa1mKAHVOvT4Daw4wXd4bchQc5iXSKOWFQFc/PKmIGtK9361MJT77wm4a3d6EpZ+uh8weoLGNVijDxDRXnZQ9qMFYGXTsjAFJ3Xp6jR7il4a01WlGc2k5RZoaIpG3gazesiX1mf8qFgdp4xMEqgsqJ8RFGuyMQMjt7IxRXGb5WnUQV/xrJkyM02ejsWBnRelHBZxTKbSGT6hfutk7ErfMqOcK5dVFQseStUk4xdVrAnzFjOiRpSzOYPRSkguFDukFcqkDQF37VrLcWjZ/c7K4r11JGo4/DDZkz4rffeVl4q+BUeo/PtFaJYj48kp/aimpNF3TcEKimGAZ+W1FNaCPicYo/GdyJJFqbnS9CggOTnx8wsBo2R/Y0iGcLUE7Eoma4wb8L2l+PA86CZF4sagFtypxG121hU74LzutZb3qUWZluAUVEmnxT+FtWhhQu6yyVZa+X7+aq5lBQsKm4frKGXq4FqFSVhyeTuYPfChPLfQZroUDg0uXxnIJ327WZuz0df7KP3oIDHgL4aJmB66oNIhZM5ukffg7e/fLkbxVPwFYXhu1ZBEt6A+uTdZsWT/1sr+Qhi8WxR9vpVehtBsP3pCYWcR4bZD/ZqWdc7NC4PAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>, where <img width=19 alt="\varphi" height=13 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAATCAQAAADGkM70AAAA10lEQVR4nK2TWxmGMAiGqbAKq2CFVbCCFVbBCqtghVWwghWssB/QuYOwi/8Rb4TxwscOALLNYCvPgsOIU3Irc3BAhOnxIqT7O2EZgSumhMdb0NtYgcEo4SrsObX0T6ggm8F/6mwk0HLdMiVJ9V1hpS+J3asulFhvjuPIKqEkKHaJraUmQ134FB0I3ptZ3+isb9N1cnnz32i7PqjaowbPVJGbJedL0KMbjyP2JJu4chDQMAYLHPm1XKjBEQ6MqlLrmQLj+bVQNz/u15rla5lw6/4w6TZ9g/4A8mJ8DWcToOEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-3px;"/>, the pre-condition, and <img width=19 alt="\psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAQAAAB6Dt0qAAAA6ElEQVR4nNWUjQ2EIAyFu4IrsIIrsIIruAIruIIr3Aqs4Aqu4Arc48d4YCl3Xs7k2sRIykdpeUAk20iWdGMOaxM5+B+h5jqqb0B71PagQUCHLJqsA+SCb/jn0R4xh28BbsioaSmy5Ghc3J6zxg1JaEdrGCuuWiWiXpZ+bDiUGiiFaqdrqOWqfR/9IqtQ6xHia2U7HNFjQ2c1OZxuxVwWLFGLrJWclPS0h3PU396xBu6HviT4FZ2RUQD3tb3PqMykthlI0JbC50xhqg3HEH3FMh9f9zteiR+gjb5KaEXuLXRDd6v6ka2rh54ZfJvc+V9UxQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, the post-condition, are referred to collectively as <em>assertions</em>.</p>
<p>The specification statement <img width=71 alt="\varphi \leadsto \psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAeCAQAAABum0PLAAACLklEQVR4nO1Ya7mEIBClAhWoYAUrWMEKVKCCFaxgBStYYSt4h4c6gwPirt/Ve789/FIW5hzmhSvEX0UrBlHfTeJaGDHD+Ip6Pv6lKP0fRdVfUQGNUOhJwfLmxnOpIId6YLAhFtWQWQa1mKAHVOvT4Daw4wXd4bchQc5iXSKOWFQFc/PKmIGtK9361MJT77wm4a3d6EpZ+uh8weoLGNVijDxDRXnZQ9qMFYGXTsjAFJ3Xp6jR7il4a01WlGc2k5RZoaIpG3gazesiX1mf8qFgdp4xMEqgsqJ8RFGuyMQMjt7IxRXGb5WnUQV/xrJkyM02ejsWBnRelHBZxTKbSGT6hfutk7ErfMqOcK5dVFQseStUk4xdVrAnzFjOiRpSzOYPRSkguFDukFcqkDQF37VrLcWjZ/c7K4r11JGo4/DDZkz4rffeVl4q+BUeo/PtFaJYj48kp/aimpNF3TcEKimGAZ+W1FNaCPicYo/GdyJJFqbnS9CggOTnx8wsBo2R/Y0iGcLUE7Eoma4wb8L2l+PA86CZF4sagFtypxG121hU74LzutZb3qUWZluAUVEmnxT+FtWhhQu6yyVZa+X7+aq5lBQsKm4frKGXq4FqFSVhyeTuYPfChPLfQZroUDg0uXxnIJ327WZuz0df7KP3oIDHgL4aJmB66oNIhZM5ukffg7e/fLkbxVPwFYXhu1ZBEt6A+uTdZsWT/1sr+Qhi8WxR9vpVehtBsP3pCYWcR4bZD/ZqWdc7NC4PAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> describes a program that, assuming that the pre-condition <img width=19 alt="\varphi" height=13 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAATCAQAAADGkM70AAAA10lEQVR4nK2TWxmGMAiGqbAKq2CFVbCCFVbBCqtghVWwghWssB/QuYOwi/8Rb4TxwscOALLNYCvPgsOIU3Irc3BAhOnxIqT7O2EZgSumhMdb0NtYgcEo4SrsObX0T6ggm8F/6mwk0HLdMiVJ9V1hpS+J3asulFhvjuPIKqEkKHaJraUmQ134FB0I3ptZ3+isb9N1cnnz32i7PqjaowbPVJGbJedL0KMbjyP2JJu4chDQMAYLHPm1XKjBEQ6MqlLrmQLj+bVQNz/u15rla5lw6/4w6TZ9g/4A8mJ8DWcToOEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-3px;"/> is true of the initial state, will ensure that the post-condition <img width=19 alt="\psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAQAAAB6Dt0qAAAA6ElEQVR4nNWUjQ2EIAyFu4IrsIIrsIIruAIruIIr3Aqs4Aqu4Arc48d4YCl3Xs7k2sRIykdpeUAk20iWdGMOaxM5+B+h5jqqb0B71PagQUCHLJqsA+SCb/jn0R4xh28BbsioaSmy5Ghc3J6zxg1JaEdrGCuuWiWiXpZ+bDiUGiiFaqdrqOWqfR/9IqtQ6xHia2U7HNFjQ2c1OZxuxVwWLFGLrJWclPS0h3PU396xBu6HviT4FZ2RUQD3tb3PqMykthlI0JbC50xhqg3HEH3FMh9f9zteiR+gjb5KaEXuLXRDd6v6ka2rh54ZfJvc+V9UxQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> is true of the final state. Exactly <em>how</em> the program gets from the initial state to the final state is left unspecified. We can make these specification statements bona-fide statements in our toy language, and give them a semantics:</p>
<p><img width=463 alt=" \llbracket \varphi \leadsto \psi \rrbracket = \big\{ (\sigma_i, \sigma_f)\ |\ \sigma_i \in \llbracket \varphi \rrbracket^\mathcal{B} \Rightarrow \sigma_f \in \llbracket \psi \rrbracket^\mathcal{B}\big\} " height=28 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-9px;"/></p>
<p>Our semantics for a specification statement include every possible transition that satisfies the specification. Therefore, our specification is an <em>abstraction</em> of every possible <em>implementation</em> of that specification.</p>
<p>A common technique for the derivation of programs is to build a syntactic <em>refinement calculus</em>, allowing us to incrementally derive a program from its specification into a less and less abstract version, until we at last have a version suitable for implementation. This process proceeds via formally justified <em>refinement rules</em>. Because they are proven to be sound, a correct application of these rules from the specification yields a correct program by construction.</p>
<p>Let us define a miniature refinement calculus for use with our toy language. For a calculus that is actually useful for more real-world programming scenarios, I recommend consulting Carroll Morgan’s great book, <em>Programming from Specifications</em>, an online copy of which is available <a href="http://www.cse.unsw.edu.au/~carrollm/ProgrammingFromSpecifications.pdf">here</a>.</p>
<p>To start with, we will define a syntactic abstraction relation, <img width=26 alt="\sqsubseteq" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAQAAACeTo3NAAAATklEQVR4nGNgwA/OMPwnCnYQMAcK/jPMZHAhAioRaxyR9o4aN2rcqHGjxtHfOOLKO0HijLtL3dJ4FAwSoMSwm0hYToxxgsAEQBx0gWgAAAaEZppXTdbcAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-4px;"/>, which is defined like this<a href="#fn5" class="footnote-ref" id="fnref5"><sup>5</sup></a>:</p>
<p><img width=194 alt=" P \sqsubseteq Q \Leftrightarrow \llbracket Q \rrbracket \subseteq \llbracket P \rrbracket " height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASMAAAAiCAQAAAC+Ane3AAAEwklEQVR4nO1c7ZWbMBCkBVqgBVpwC7TgFtwCLdACLdCCW3ALbuGCEDrbZ2l3ZiUDuXejH3kvwWKkGbSrr1TVH1A01fSjnM11tQXr4pDTiv1YF0CzN4EVp+qrGqp+LuHPk/KLNPN6+X3/VGNflmwSfCseAFiHR17LmXhJWXQz1etMNJTrzGZfQzkBfG98ib3CMH/UuKWN3lvBqS+wdhXdvhvuBqxHVwzzv26J08LktnwprnQzG8+k35jJKyvdRizzI9kIV19hXa9Vtd9/063V3ZWR4PnrkwrSWefok93MwTdyLyPpNuKZ22zUzE9PiR6+m1uBq6+y9uReK/dVjSI559kTUPSw5KWIpW7t2lEyk89Bs5GFOW+jeslJbmvIeS+t8nupFaj6Bhs5T/pOkEaBUoNyKxqlX5nsk6/JNrIxZ23UzrLes+ZHnI3i6ptsVAHilbKRf39qzKrX8DCQtV6in0BNyiHbyMacs5GrJTeoszaKqa+y7ne1UbPmEGn0UPx/xSkhb50IQVI9KQGszDkbTQUyQ6kVqPomGzVrRRLK2Mi//SI80UYapWFKjl7DnGPgsugC8MwZG7n3a5mPDtZGMfVNNurVL62UjSbAIj444KNIJ8wyXZDAeevhgGfO2GgsMrlgbRRT32CjZm1+J5IrY6O7OuoFwdC3OfbSGHEmRjZJACtzxkZcCE6Bs1FcfdpG7bqWoCW1ZWykB0/ORm66elWWINzMBwsVkgBW5riNyoQ0zkYp9Qkb1cui/hdkojI2qiExethGNbwoihlJWrizMudsVAKYjWT1QRs9d/AADfolbHSCxBhAG51m7pMyEoUyQGsxaQHszDkbldhT1G2kqw/aKKyQ4rS3sxES1Jo5GeUYXebnJ6W9uTbKz43k/BSDbiNdfZX1CHRHvOJyuZEsphdD6tAeDlPP8HnAJDyh50Y8c26mxi67xiC1AlXfuIqNVFxupiaHl/el+Z9olvChjS2vqJeWD+Jv9Jkaz5yxkZtVfnbdCFX/4DYaEyndAz58SGOGhzvjd4eDQLvkUTmbmlbmx1rF/iU2OqvBYQC++oB+kQ0pGHtJACtzzkbNLntq7zi4jbStV78YdoPrc+Jeo+f6HmWEbSkJYGXO7/Df5pKTam9oIz4Co+eNtC8pTDnjwo508nxRnm+I7RB5h9/G3HLeaKj8eaMu2sP55430/gVtxJ/nCQcwtaJ3VlgyfJdjWKRgNwQmcTdwAvKsAO3YmoW5/fRjamnVfvoRV/9jNiqHx9rz+JRp+OOcehr8DmlX7SxmMz+h2cjC3GajHGxkIzdc7nds3sEdE72vgtzWFNhJY80I+uQXeqPE089i88yPZiNMfZX1Ue6EueZeqnBbIW92UifGgoZcW0IvGDHMj2UjtDe2Z52JsM1wBHujNno8rTM/lo1Q/Hc2Cgt7eCL8ObACIMz/bPSE93vhqSIdIYsj3J4qsS2ZB1YAhDkjSAf1sHZC8sA2il/djRUL8XZJW/nN1tLgBdCZM4K0UA9rH+qBbfRpdOuKyPNFoe2zJYsAGvO/oLYp2pcb5tfMDQEbbALIzP9stDHc5cRxif79TuEtzL2YNXmHGHNrXfnIefN+rH8V+P+RIIWa3m0sB3srkqz/Abt2RYrJbvUKAAAAAElFTkSuQmCC" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>Now, we can give rules for introducing each of our language constructs<a href="#fn6" class="footnote-ref" id="fnref6"><sup>6</sup></a>:</p>
<p><img width=467 alt=" \begin{array}{lcll} \varphi \leadsto \psi &amp; \sqsubseteq &amp; (\varphi \leadsto \psi) + (\varphi \leadsto \psi) &amp; \textsc{Choice}\\ \varphi \leadsto \psi &amp; \sqsubseteq &amp; (\varphi \leadsto \alpha);(\alpha \leadsto \psi) &amp; \textsc{Seq}\\ \varphi \leadsto \varphi &amp; \sqsubseteq &amp; (\varphi \leadsto \varphi)^\star &amp; \textsc{Star}\\ \varphi \leadsto \varphi \land g &amp; \sqsubseteq &amp; g &amp; \textsc{Guard}\\ \psi[\sfrac{e}{x}] \leadsto \psi &amp; \sqsubseteq &amp; x := e &amp; \textsc{Assign} \end{array} " height=140 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-65px;"/></p>
<p><strong>Exercise</strong>: By translating the above rules into semantics, show that the rules are sound (that is, that the semantics of the RHS is a subset of the semantics of the LHS).</p>
<p>We can also derive rules for our trusty <img width=18 alt="\textsf{\textbf{if}}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAQAAAChSU5wAAAAmUlEQVR4nGNgIAa4QKESppQgw12G/2AYiiI6EyoKgR2YJsKkViFpOoOi6T/DbtzaEFIz4QaBnGcMNGQmujZjLA55BxVxgduOxXdpQA0gKAjlK8ENcsFUjBu40FgbatyUw7WVY48zCDiDYjZ60KPGJxJADcm75GkTRHOkMS5HoscbkUEyqm1UG2Ftq8BK3iFlEUguuAvP73AAACmk0y3eWXYiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> statements and <img width=60 alt="\textsc{\textbf{while}}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAYCAQAAADQMSLuAAACDklEQVR4nO1WYXnEIAzFQi1gAQu1UAtYqAUsYKEWauEs1EIt3FIgkJRw1+v4tv3Yy4/1soS8UF6KUt+DVSvYQz3BxgvRO9h8M7sbjrJ7KPq+rElxT3gq2dvF7M6YLpadM+mZeMffIX21rE7vZIenz7M743pZoxYww3x/nnT/7Nv4J/0JTJiYxUzlibCVh5fVysF/njB7F4ilKJkbI9gibWGFLQn3vBYh/UjpGyEdPZw0xtRlLfgd/B3TWv5EWproEmkT6O6Qo8FsyFvVIO/3nigWxF55nx68FFjWAVVcGGc3nxTSRK9Jm8BjJ7mm4kXg0gJljs5V+HD6OJSyfP5iI1Lka9KbkOnb515XpbzYBn9RWNYz713SVjzjVqiQsaY9ixjCBYcX36pULMsP0V3SS/ot1XjIpC0jYMNRoG2MwkuS9X+XdBErtUlsJYOK8RhcXIzLSYT9SeOlahVsaZEuYjw0OykqRl0dgv6kcac/AorR59E25DYcLFlPy76k8dvQmMotoBj3XNKnNmoR9ic9i6sd0Kepz4BiLINuzB4prS/pIWmo3h5JTwTxXNFjHxeSR05f0sXDN8gmhTURxUhDZjJBOA2XP0A+3DvipQnlvIZnKVI3smNsvHu49K6nML3FS1PBIUb+KuJnphYHkkNzih4mNClybGRjvTlf4GJLL85zoX0mqNnN4qdgoLmq7heveDWjJY1wJwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> loops:</p>
<p><img width=533 alt=" \varphi \leadsto \psi \sqsubseteq \textsf{\textbf{if}}\ g\ \textsf{\textbf{then}}\ (\varphi \land g \leadsto \psi)\ \textsf{\textbf{else}}\ (\varphi \land \neg g \leadsto \psi)\ \textsf{\textbf{fi}} " height=22 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-6px;"/></p>
<p><img width=423 alt=" \varphi \leadsto \varphi \land \neg g \sqsubseteq \textsf{\textbf{while}}\ g\ \textsf{\textbf{do}}\ (\varphi \land g \leadsto \varphi)\ \textsf{\textbf{od}} " height=22 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-6px;"/></p>
<p><strong>Exercise</strong>: Show that these rules are indeed derivable, using the translations provided in the previous section.</p>
<p>Lastly, it is also sometimes necessary to apply logical reasoning to transform assertions during the derivation process. The <em>consequence</em> rule, given below, allows us to swap out our assertions for more convenient ones, provided they remain a refinement of the original assertions:</p>
<p><img width=403 alt=" \varphi \leadsto \psi \sqsubseteq \varphi&39; \leadsto \psi&39;\quad \text{if}\ \varphi \Rightarrow \varphi&39; \land \psi&39; \Rightarrow \psi" height=23 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-5px;"/></p>
<p>Using our refinement calculus, let’s derive an implementation for our factorial specification:</p>
<p><img width=186 alt=" \begin{array}{lll}  &amp; N \ge 0 \leadsto f = N! \end{array} " height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARcAAAAdCAQAAAAqNuCNAAAD0klEQVR4nO1ai5XjIAykBVpwC7TgFtyCW0gLtOAW0gItpAW34BZ8ICD+goVi4O6dh7f7shtiFGYQQoixBw9i4KxlTYmBWqa+7RXs1bCBfZgsYdBfiyYzIXQmOJvYrH8KCIZr0956MNvaQK8W3i0pl0aPZiZOllk1UXBtxQQzMDKRcRQqE637TDF+pBswpFCcXITuM9xAL9frZ161t/5PPRhrJtaxHiTzyTwahYlqcglNRxNV/IJerz8jmeueYXB4xgyeRTrhqIqCMSu+h1fGx+TzLsyNkc5EFbkM0UFxcjHoNLmGYKpkXrC2utXzzNjh3TwvBIxuVzovsDFSmBCuf5/dOgdjJPua2Z30wMvFoHWSOXtSHBxGGjb/U7DW6vgXu9rLjpfOxFzWSukG+wT3zTS5GAj40mOi5ruTddIHpy4/3iD7cqAxUUkuPsg8ruUxWS4GTbJkZHBvrnOMV5XkksZEJbkYgqeT7cBOGy0aaSBEnPRvzHYynNJTXi4dBNoSyBnda9w3+A00JqrJJRQ40eViwNGSmYNyuWuNv1DbmnQJM5sA8+mz/KAxUUEuiwm9G359aFS7v9Nh0lD2mB07X+SXS6utwAO7GbUJLQYaE9YHFoPcKVa6QGvxBeom9Sp4bhhUuXAtw3M5y4M3kQkbG04uDZvRLf40GhOFI6y9kcylo5dU0fCzXPg3iXe/dxHw5GMSjcNE7t25CSOxwXeNUDediepy8ZH5sOpBh791ub4ioMhF6Gd/4BQ2bWRg0/cCEn/D4RO4xF99uWCYqC4XO6VLPpUul7STUbpczAnCT+Ww8iRCT7O/EvQxwLa9EfbUlwuGiQpyOa62bhWZ0+Ri8y5YqRhQvMt+rzeRifU4y6hiF25+wB9do4Zc0pmoIJez8M9feAmCXNJTdH7EfQxiD5TY8LQHvzFFrw2ktg0n4BpySWfCePBfrnUTETLSB1pT4snI3hmdS6WPbgJ3ZHW71fZ0/j6+DAErF4VuMcvuZyILVNDIde0JDv568ah2H/DGiD+TxpmE6DAFEvib5REll+ab971ucW97JxPZoA5nhwU+GY0xsoevFJbKhKiOG9n2poSjw1IcUrIu9yYIMaAx0UULNm9H3OW2SLmEqunsERcb8PaOItvXF0vdV8shkm5+tjmP/KAwUbze5WqHfpFd4BLw4kladmnlJqJeUXlp509hong1nbqsfqNkdVsgPvVsZCCdT5nh87Uq6fy6LetdKEyowlbeDno93fIEWfZ4GLCiZln5f4FwwPvgwQb+GjF3xfyDfx4N4sb5wQMHjsiqPMiOP7mjCpgGJnRmAAAAAElFTkSuQmCC" class=display-math style="margin:0; vertical-align:-4px;"/></p>
<p>Firstly, we have to split the code into two parts, firstly to initialise variables and establish the loop invariant (<img width=55 alt="f = i!" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAAAZCAQAAAAIurG/AAABSklEQVR4nO2WbRHDIAyGsVALWMACFmqhFmYhFmphFrAwC7UwCywEuo8WAu0Vtt7tzZ8dH82zEEKE+FVpoUqWSbT6UgLEZTVqhEXruY0dbrzTsqns/+yWDH6WmJbMcIg33NqLgT5wqwqpAw5shbzi9EC/XDzrRtIf7NpLBlLRtM/GrlFWruWTYExtAZr+tvzF0anpK58LjZSBNE0hJZ4cRJIqAdnTcsCi4woPBOsqAnYhtZy/QkjACWd3um0mWD0pRBuf9XgZy4OOW2+wmOb3zEdzecPHKPpGSBkOqsT4r+loNcnUmLYX5w95nE4BGcc5BaQbH9KbSiFNsSXbBBaS1VRYgqDYmIjshcxXtmMFH63h3KFL/gRs9W78UxA6R40Rn56QmX7SNu4n+7e36QXFvlWqeSQFerPU1LznLtBI8u3WVduzlM9kv+P0AIaV/J35f09KAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>), and the second to actually contain the loop.</p>
<p><img width=217 alt=" \begin{array}{lll} &amp; \textcolor{gray}{\textsc{(Seq)}}\\[0.5em] \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\  &amp; (f = i! \leadsto f = N!)  \end{array} " height=92 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-41px;"/></p>
<p>Next, we must use the consequence rule, to get the spec statement into the right form for using with the while loop rule. After introducing the loop, we can fill in the body a bit by incrementing the counter:</p>
<p><img width=363 alt=" \begin{array}{lll}&amp; \textcolor{gray}{\textsc{(Con)}}\\[0.5em] \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\  &amp; (f = i! \leadsto f = i! \land i = N) \\[0.5em]&amp;\textcolor{gray}{\textsc{(While)}}\\[0.5em] \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\  &amp; \textsf{\textbf{while}}\ i \neq N\ \textsf{\textbf{do}} \\  &amp; \quad (f = i! \land i \neq N) \leadsto f = i! \\  &amp; \textsf{\textbf{od}} \\[0.5em]&amp;\textcolor{gray}{\textsc{(Seq)}}\\[0.5em] \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\  &amp; \textsf{\textbf{while}}\ i \neq N\ \textsf{\textbf{do}} \\  &amp; \quad (f = i! \land i \neq N) \leadsto f = (i + 1)! \\  &amp; \quad f = (i + 1)! \leadsto f = i! \\  &amp; \textsf{\textbf{od}} \\[0.5em]&amp;\textcolor{gray}{\textsc{(Assign)}}\\[0.5em] \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\  &amp; \textsf{\textbf{while}}\ i \neq N\ \textsf{\textbf{do}} \\  &amp; \quad (f = i! \land i \neq N) \leadsto f = (i + 1)! \\  &amp; \quad i := i + 1 \\  &amp; \textsf{\textbf{od}} \end{array} " height=656 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-321px;"/></p>
<p>Here we must use the consequence rule in order to get the meat of the loop body into the right form for the assignment rule.</p>
<p><img width=425 alt=" \begin{array}{lll} &amp; \textcolor{gray}{\textsc{(Con)}}\\[0.5em]  \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\   &amp; \textsf{\textbf{while}}\ i \neq N\ \textsf{\textbf{do}} \\   &amp; \quad (f \times (i+1) = (i + 1)! \leadsto f = (i + 1)!) \\   &amp; \quad i := i + 1 \\   &amp; \textsf{\textbf{od}} \\[0.5em]&amp;\textcolor{gray}{\textsc{(Assign)}}\\[0.5em]  \sqsubseteq &amp; (N \ge 0 \leadsto f = i!);\\   &amp; \textsf{\textbf{while}}\ i \neq N\ \textsf{\textbf{do}} \\   &amp; \quad f := f \times (i + 1) \\   &amp; \quad i := i + 1 \\   &amp; \textsf{\textbf{od}}  \end{array} " height=375 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-180px;"/></p>
<p>Lastly, we just initialise our variables in the obvious way to ensure the loop invariant holds initially:</p>
<p><img width=253 alt=" \begin{array}{lll} &amp;\textcolor{gray}{\textsc{(Con, Seq, Assign)}}\\[0.5em]  \sqsubseteq &amp; i := 0; f := 1; \\   &amp; \textsf{\textbf{while}}\ i \neq N\ \textsf{\textbf{do}} \\   &amp; \quad f := f \times (i + 1) \\   &amp; \quad i := i + 1 \\   &amp; \textsf{\textbf{od}}  \end{array} " height=176 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAEICAQAAAD2XYeWAAAWzElEQVR4nO2dybWzOhaFSYEUSIEUnIJTcAqe1ZixZ07BKTCpQQ15qyLwqgxuCi7UoYajBhCdvT9WvfqvDeYgbR0dNUhFcWAe5b/+Hp/HbW87wHl5PHsFtXtbMQkp+2ZvO8C5ebQnkz6X/dP//aPuSzN7qP7oz20ftXHlZQsLp/C4KVsf70fzKLn9n+PZqXncebrW8TOPTp/in8drbysS4VXU2/ttzR/GPTouqOZognqUrrW9oO7Hs9NG2nzf247lPCr+JGcImbk39MqCS0YIvVGhUO9RX/yzK68pDiQoIfvequej4n83vd2qCBzITpvHRVp4piDBC1PMv/72tiIBLg1P5SQEznzm6JvmiIJiIYPrb2QhPZSdNkIqx7ZxCqdoL4b8vZBR/xgV+W1zPEHREaYMJA5kp40Ic/h/jy6XJE7h80PxvfRCpOz5tUFB9RU4OzZtsNHi6UOzxcJf72keVxHk8NTkLafAuZVpxfiJpJWlPNebc+Hf5SHjgic9RZzv78+RHj3gg+QZ4+RvnAZm6ybj0OvyIj5bIFKP8Cv7N4eYmjymP80yuOtphjDt6j2v0nb0uXZjqe/YqW188Zpctclay34rfXqJN9a3L1ZcWB+ecY767k58RqTYCfp2goFOF/b3/JzR1Ub2tPxQf1mFy8iKK/HZfOG/6W5Bbon2Z0Hhm09sPE3HfkPWgcGu34kWl+p5ZV54HM2jkvc209SQnJTvm3/vSNwvfEP0nfpl3jXwoYRvBr0R4R892GES8BkokjlyfWuLVGRP/z8zcS+yefkirnXu7v7eVKTXbMMBgzx37P0q+7MpTzPb4qv+rVCww1JGC08J1rDKFLoqrrbdI4kOheU++myU86o+cD/zPFXt/+4Q+EfaZFwc8Wy8wjU9ZEs3hmVyWtX44IeezmfLYvG39E1tb1u8tnL8K79/Y/6V+jSL7JXCk8WW7M0fCflpCb/hAtb+uBqdPxI+L3KsoDnPJ3OeFr4VuYfEHaq9DgDPaNJ3+eL34K+JJCMjYOYnCe/+tK/IIPzKjMh5AWg8PtT0kTU7zxa+fBpahl2eqpx5Rh2ayWCHzg8nN2wh89yypGoXYVL4b7uwON9Qwn/aTx0S/sG7NP3mzRI+CwI8PUSyMjYKhRA5b0l09mdT7kney2mOUuMQjvAvIqvV/6un8YaBgSI+ydL7Y9TAp6cu8JzqzE/0gCLVMO6fpPEXlKGQ0cX67hF+Zesl6PG9LvUQ+CukWcLvQqWci9GsKIXwL+as0DzC579U9U/wNMZtx309lPCl5x+exhvq5ZnLagY6/G9vLSPrxk51VjrfVrKAN77COBL+3Z+/ZioMn/Gr5VWV+ZnnfseerhYV/qSsDRcVNymUyGWWluZnORmaa05M/tC9IKK3hvJxyU8zy7KLG2zI2JxudelCzJrvTs7IiP0jn+o5itxd4Y+Co4it8mrRALc/I88/q/CLtF6dxuomnCX8wuj1XUP4gyjcXqWPc2wv/GZkgzpoT3xz2i92Z0ElXYg6XmbdkE34la6TvlT4oisvcr0l1NnCvyiPvLg78+IJBYjYWXrOhh+Dbfzft+lPM8tan+zDw4Y3PUV8/Kw8xGvj3Zm08OXIrzrMFtlwtZxZVH2t8GV/dVCGDyPio3sD/PcyRa4akouF77FYFq3L6FwnxpcBxW14mnCMv6jXgtdDRK/KQ8TykZEIWVt4Unvo23JGq40zyBjfXweaV/Nnf32v8C+iQg1cfXO6tyb1g9giF1MnsgifahqmC197Nlbwu4JEVviLenV4YEIULHqUgHlg55OXYSuba2MVIXccOK1XR4+2i45g4xvjannt7czCb/3CH3y+t1PK9XpS3GSDeNzz7YRJN1HMMgifsJd6w8kSPgsQervFBALraerhDEN6oSKeaOkwVWH0zeVBuKOxyEQBMf5NXOEXfhEYJ6bCIKfYPNVEavrpikgP3+7EyqWsMF++uNnttZe+Yhx5EpNuR9MdVK+F69nu/ZmJo6QPMkKWb2VRjVv3zIuZHvpppP2qCU49zQQr+fnXQKBCSHLsUszCx6VqXeF6dEL4coSWyK248NXModOO3Db+6px/fxmmANysZK2kKEadZjJBbta5LRWPjoSvrrUDkpuUXFJYMUSnL6PlUcoi5XYAjsVb8jpOC/8i5+ooifBed9l3Yo+TTrKSX/H0C4Oapyl/X0/pE8GWDJVUxK/zSPpkZ2Kecx9Ro79HYZVn5Jaw0TdXx1ufHQQqOUbnqDeYRNLqOYotOdyt5OvOZxwPqKtDBxBPQviqyy9pPuRD9GF/ZGFl1qp6ZNTD4T3MkVT9NB9r3qMriwlWOndz6xy3i7MZXdUqS8aT1h5qZMLq1QnMztQdoJ38XXUuNS3Z9vrvgPATdLUzVOKPzrk8XoYAROIHhrb65HRnsLve1jMFmV/nhjodJTXv0zy5vXZWd473DAvflaL7NJ3s9amsKQLJVs4WfuNYYtZqbJLGzXpqY85lcD6+2/sv8qtJEH4VEP6xm7aMKSbKPu/EyE2eneE9nPTBFnOuKJ+t0tizRxfZwJ/mYYYXrXPGiplt9D8RT6Ub3vNSffjVJk94kuJOd+YElVJhR977wh0Fj6TZCxvWNweycl/OoKni8BNICxlGHKShJMctRdvF7h49kJX7Elq340Ac/TWx8EDJ9uhXK61PD2blfoTXaToUR341WPYYZ3vHdTn85cPWbSIezcr9OFFKHHk5CNaheOT6SHAOK7cgvBzl4ZBD+ln6P3LjzkI5Juewcm3YePQRlxEOcGTpg3NwQtkz+IoJZzMaHAgoCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADATOqiKe7x0w5PVWCJc5BMVfwVn/7YT/pVX/Da/mhmC7fsrxVP8S6SdxbPStnbf8j9ZM5FxzMxfuTYqfCS8bemUzrP+irK+EXEb/wV1154TPzdClbGuPUFbq8U/Co+xbMXZPzIU7W3/f3+dvGUJRfMh3v7RhaBdrL0X/1Vwts2Gz9HzWuqnG7ox9k6EfcJD4o+vPpwX624zgi6an6NcAHlxlG+qi1bCD8Pv5GIJZeLvS1ky4OVKT6/4b+yDxWvqVhhg/Cz8BuJKPy73SS88c+unisoXtzj7g2En4UtE1F7ra0RvtreKuwyktAlEoi1Bxd+zH5gsJXwSyk+1g0Yo53V8AzxJCVrS6j11gBXXmAb3jx+y383Afvy22/iE77ffkCwjfDrXjDPoQc87PNVMy5nb//HK/zW+ov26KLvv+XW/8l/+z3/Gvab+ITvtx8QbCN8NdIpvH64Qq5lFqrAJKWzVR0+UoTfReWaFuqsYb9rNZVncfuBwbYNpUtSv8jVGJusyOE0+vCLMkX4rFiGR0RTY/z89rtW03kWsx8YHFH4+UkTfoyjN27BBCD8dCD8LwLCTwfC/yK2TcS9xj4hfODwG8JvivHkuHqyhCD8L+L4wm+Tj6f3N9JGbuOWzBF+DvtNIPwsHF341TBSGj/8nXmUyKnCEOY9Q/h57DeB8LOQOh8/zwC8EJua2OsbbCmLa/YZPUy05lxMMV/zZZxRRd9sSm0TrGG/bQUl/Lj9wOCdOLiSx8cI4bOixt4kooVfyqkBeaVzk7It5T3Ec5tC+YvWAJ8i5a2rdey3raByI24/2I2rUZR8Ee1aLyi++K/+GW8y2XeIj55+kgK1teyn3NH4+/0b34Ckk/LzV8rreczGqN/G9U0TEU69s8ePCT9mP9iZ+GSsqi8WawUKF96MpC1oIsJJbemsaX+ImP0AkJxdOGe3H+xEe/LG4dnt35AqeXDl++d5V0ZX6xk5u/2bUiYPrny/J3kVKa9FHpez2w92gvU3nfll7bPbD3bj7OOeZ7cfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQoLSWrgIgiFoJx/86XTksGHKdcFU6ddFkeemyib4bdUl6zbMqnkU3c8WeRqYLtoc7PGr1GL8QLsM5r9FVyxd0quTqZEulXwXXERKwBRVfg+2+Fz2nL3SreWdLF7AycQlr4bu7F+bI4Fxroj2T34VVW6L66qslws+7GCRYkXhW1cQ5OTO4Lcbr6k+FrX6Q+lJgM1hPr9hWBeuDMBD+aUjJqlvhbrecN4OXv76d7u+F8J9B+yH8H2BeVh0rg6f4eyH8YpA+1QyF8H+AbxD+M2GZWY0Qvl5adxzpQ/gno+qzy83GiggkzCVl7ayqijsPaq7O0q0X55fpDGYdky+54c49efFXdr8l3aLVRJkq4ZdS+t3I0veEX6ytFPMJn5315Cnz6r/DyjxZqYhEvxKNOJHdqmtSZ1VpNPvsRca7wu0AHGdwNayIr38h1kWp77hkdbLnxEVclfB1V6q7i0Dq+pj2M//JjTHcPBinDHteiD8jKgM0SrI6mdW2EU/rGpZVHb+2MzKyHJ1TeD6ppYRYljK/pv4KSb/uz332vyDOnevzp/p7U/i6x8puIaQJvxqe0k43O6V0yojtMvTuAd+/YORmvJwkrYiMUD5WNep01v3J6/SOKjfnHL/wVbar4lQOn/gFXcnvGqdo0vj2Dft38c/oszCNJTrlpc37twn2FIMfV+lm1pg6pdyUKXpn4DoWsJC7k+y66tXBjvI4rjc3s9rNvpjwVVExAxY1MBUfkU3Zib0y7IwdscDHFr6eZqBl2EbtMUc3zH4hN6VUytgiV4Xh+1fH3giVGUrmYm1fU+jVSByUXKYKn+4VT5NhmvB9tDM2aXCFr2pK7RyeCfZo727ippRKmRd57ZS+KBBEyVwEEX88yc2wxa0T6H6IqcJXHszuE+9WF/5lJOEUxsJXgdnTOCOGSlf7+dyUorfA0zUxyITyMEzmwv+rkENkqsouf1hDfRYTvvqrs7a5+Ftd+HP8PSV83QS9D2fE750ifCp1zdlP2GIiEyqmZFWrqFBLmUWir+dj/LswPskj/PHxlzCUM30ndsGlmLdWfVNQ0bVKuVuxpfDRs5OJ0pB2V4goUkWUteP9BTmE/7coG+cKv/Xu4hu/H1UcdTqtLXzdbwaPnw0db6sE1xN/VdaavdY5hK9EMK+XIk347n5h//TX/IfcSSxWHHzCN7enzh3j2zbRDWOwCD0WKuTPEJ90ZN96DuGre45f/SsT+qpThF8V7n5h/yv+O/pMHLHpaq1X+KUxDBXjTp7pppRqc9n9N/SnYBE6ftSZ8rI+s5M7h/B1L7sdc1/64pca44vCWCbWGtdifpjQjjywRo/GxtDPfCM+U09NRfN10rg2mIweSFceWHuncbyZQ/jmW01iv/Gyl+aTuBuFuPbZS+PWF5Q0MbxnxvcMJnx/b5CSapyX8cyMmzEdQT+1Ht9t+Kjy3ZjcgZHbrGj/rkRkj3vaTdA8wjfjVvuIC/9qnJ0m59sCfx8TvnITcUpnfs7H+LsJnKVkj2lqmaml5zGn22pZulmuGnQX4rOr83c1OsOU38UJqf64F09BzYxPfZlkib8XzeSwXSkjt4xyiNZFoS1HKSe4G3WBEH0Db/9tqIli0/xZfGqZZpm/z00pnzdmUTUzZQCQpDSYAfgybpjOC34R+Hvwg8Dfgx+kTJr0BsCXcYW/B7/JcboxAQAAAAAAAAAAAAAAAAAAAAAAAAAAAPM55n7kJV5WBOtxWfgK+3pUfDFezErdmGr3GZFbWEAvOM5W0TzGok9PrMKzHWxrm79d14DZyoKSfKGxspYO34Jn4DWbeUuig8mwhZDY+jA3nv17rPK4nQUN+YKLXmx3C2q+ulB4hTcsKr4BbGkkscATk8UeHn87C3zRfcsXh5p653KiQM1dIkNe/U0sygsyI3ZTUQu57hHlb2cBu5OvP2dOcbskrsOmUKurvSPCZ6vhIc5fmbmbNZzRgntmQU0VfsOXk42v6XkNFFCQiVckE45kQcgrp9QVL2trpOVMFb4iJvxqs/bGDxPLhONYUAbWWC55D3gM3zliM4rpQdZawi92z5Mv5ip3FXnLNX3F4Q8ERGblDBSmWiAWkaWkL3qF4lE6JSe9S/mbuCLMesLvsIfKWjTGVp1/w65SPtJ3L1/LAgEl/VTZF0QAUfN+HjWGMNXnryf8lL25wCLSAg21k7ruvrtMOHJYoHClny77mhC+GisWXn9qzw6Ef2JSZXftz6L2gIofsV+f2sowpZ8ueyFTX5Nx3tbT6wk/dcMKMJvzNG41SvpTZH8u4aMnf3XOKHwl/SmyXyr8kgjh7jz4Gx+xtkKa8DFtYVXOKXy1cduUqHyZ8G8TgrtYFwCEfwDOKXwW5LwD/foUIeHHR4+rCR4/FqSkCX/vSeJfzhmFX/J+7tLbr0+zTPi+X5xDmvDBqswVfpt8xKQ51QIle8YU6VPdmQoI/+eIzRSkqYaR1vgR29N2mgWm7BlTpH8e4b8g/LVJ6WlnlMV1pagz1QJhhS17Rrr0P9557kL4amp06vg0BrBOjNgZPUYpJxasIf00C4QVY9kzUqXvn8gmhM/2Z7/1NdARhI9JaivzSark13w5L80CBi17xi3JttY7Ee1qdEZOay5PoSW6PmmBH3UdiK+h3t3jp1rAeAY6Cq8Jwg81GTtux1+0RWKynvC3fPH9R4n3OguqXhLrxPipFuS4U2hYKD6djvq9NWC/i6WlQEby7pa+lvCbGe8GABAgr6Sqld6M7fDiIcgLa6scPXq+Yi01kJ+aL111XC67rWYHvpz6sL3kFbcMsgerccyZj/ss6AUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwELqotnxjaR97w5+lkru/bSP+La+e2nt6QJ+mDWXiTra3W98jU68xA04LV9Eaa+X3ebcvZy4+o140fCzaxEHB2TfNzyn333qWjaXYcUyCB+cmKnC17uWQ/jgxMxfvQzCBxLtDc9zdwgfLKKUa8J/EhbVE+u551zda8rdbSB8sICar8DeyJ70sNdVzcN8/e1T7k5ZMw8IH/RiE3ITfjfct1JL4etuRGqLS9+x9O4uED7IQNpW9ldrzLMitjfwHeGl+tLuPr5mHhA+GJgjvX3vDuGDDBxb+OWE3cTjLQUIHwwcW/i3CUFVvOkN4YOBeRsbb3X3aoLHj3e2Qvhg4NjCp0CMDzIwT/ht8hHerRXCBzsxR3piqkHaEX7xA8IHO9EYY6elt4FYFtdVZvSk3d0GwgcZENJ79nJibyjR0ltvV/OUu7tA+CADV6ND0BePr/eKYMrdKWumQXV+gp+n40L4C0Tj63n8lLu7QPggE76pZJqqF+Zas/bjd3fPh2zBDwLhg5+kOvS+5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAJaeTKBniFD/wU79XWyQHgwGB7e/CTQPjgJ4HwwU8C4YOfBMIHp6cu7sWT7z3y6oXs2yqZncW2abjynaIgfHBqql7u7irA75H47bP+jJ0EIXxwQmq+eLcQM/P470HQ5urD1XAWO6+zCgmED06IErHeUOE+CFxvfdkOn4niUMpxWwgfnJIrIXJdGNSmOvUgcnN6AoQPTstTivdlfaq8eef8ba8oD+GD09KS4r05Qn/Jv1rrLAgfnBZavJfhc7FxTwvhg+8iJnzRlIXwwZdBi/cKjw++GyVpe3dYtzGLGB98GapXpwt+encKggDCB6fFjeYZeixX9eNXw1l6A+UKwgdnRo/JNnyT5Psg+7cxqPUazhLSvxlTGyB8cEJKZ+bNZ5B9HTyrg/DB2bkb/luIvrGmMDDKIfIXjeFS1gJYZQGcmooHOuzwzcZn4hdnVBvaBb6C/wNIs1BqUx6dHQAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-81px;"/></p>
<p>Treating specifications as abstractions of their implementations is a powerful idea. It gives a semantic framework for the gradual, step-by-step derivation of a correct program from its correctness definition.</p>
<p>Moreover, it shows that a common informal definition of abstraction that is bandied about by programmers — the separation of a specification from an implementation — is just an instance of the more general notion of semantic abstraction. If we were to interpret types as a particularly weak form of specification, then we can view type systems as an instance of this technique as well<a href="#fn7" class="footnote-ref" id="fnref7"><sup>7</sup></a>.</p>
<h2 id="data-abstraction">Data Abstraction</h2>
<p>One of the most common techniques for managing complexity in software engineering is that of <em>data abstraction</em>. Data abstraction is the process of <em>hiding</em> some particular piece of state behind an <em>interface</em> or <em>signature</em> of abstract <em>operations</em>. This allows for a neat separation of concerns. For example, consider this program that only succeeds if a string <img width=21 alt="w" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAQAAAAWVWZ3AAAA9ElEQVR4nI1TXRnDIAyMhVrAQi1goRawMAtYiIVawEIt1EItdCGhW0Jg346X9hIuvwB8EeBFZ4EeAaLjUk8skOHmc3SWyhfDRDiJMxKBKKToB0tsxlKZy0nesNv4kvjGpqws2PIKxvsi5nRlMS6T8Er/ImprxkGpDcVoFypLRNEVgTCE1CeITWp38aqXnwwjqYpLS/zlurB3c1GI7BxV/NoJ24Uwj/84V/Opxmm7gHaEPWSQySSJahcifflt7QSQ4usk02fB6g5M0xcUdrZNCk32GewfAn2Uo72TyfQ18nDL8vChTQU2x658/WfzHiwTt3Xs/gaROXeaqLoDBAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> of parentheses and brackets is balanced:</p>
<p><img width=603 alt=" \begin{array}{l} i := 0; \\ s := \textsc{Empty}(); \\ \textbf{\textsf{while}}\ i \neq \text{len}(w)\ \textbf{\textsf{do}} \\ \quad \left({\begin{array}{ll}           &amp; (w[i] \in \{ `\texttt{[}\textrm&39;, `\texttt{(}\textrm&39; \}); \textsc{Push}(s, w[i])  \\         + &amp; (w[i] = `\texttt{)}\textrm&39;); \neg \textsc{IsEmpty}(s); x := \textsc{Pop}(s); (x = `\texttt{(}\textrm&39;) \\         + &amp; (w[i] = `\texttt{]}\textrm&39;); \neg \textsc{IsEmpty}(s); x := \textsc{Pop}(s); (x = `\texttt{[}\textrm&39;) \\       \end{array}}\right); \\ \quad i := i + 1;\\ \textbf{\textsf{od}}; \\ (\textsc{IsEmpty}(s)) \end{array} " height=260 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-125px;"/></p>
<p>This version makes use of an abstract <em>stack</em> type and four operations: <img width=75 alt="\textsc{Empty}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAAAXCAQAAAB5GAMiAAACDElEQVR4nN2XbYHDIAyGsVALs1ALWJgFLJwFLGChFrBQC7VQC72WzwQIzW2323rhz/jOM94EKkQ2yyhKXNg2RtHvdvIZ064cGEv4Dcsk1r3HvtvJ520jMfR/B5R7z/zH3rzAaEDfd3mrAW2qY0CbUs/YWGdKvXG2bqatWdzBrPE0jx8mwXzsK9XeBcxYy/4rXxQZ0DTWWZmAfsQQxkhyTCwvBdTVTegh12oVRWzjXZOgblzLBPrXlLlNuJo0yPDZvlz9jta/u/m47QeAtVl3qdQinUL7GeBhCrQpNEcWex+1G6gvTuJDqg+CcVf7E8man08BZQPEb8QDFMAtiwRfAi6F+2MBZBww/AsIwLbyaUBbjPBojwLqYjTeDZ8PlClDnnEz/JI5B9SF07mVA+jPQT0E6E913ddgyTMC0jFYphkb3F3BE+AW0g4P8OZcXJrCKgFbNoYkxZJnxKEBZ7E1AY+kEoNdhziiAecU4UuI+bawOIA5YzPkGXFowHLDCKgA+ByyKg1Y3oJlTOLR52a58owI2C2dpg4kYBZpFGgP0IAI74mKC9hOXYT1XgH1hZABTTi3Kf2X/Czad5w77hcAVQdQhsg7nmj+VC4IiK/h2BIXXnY45TKit4sBDmEZHMoQ0IgNvTU+DvDsHe9L62siLp5fPfDLof010c95dbbljexC8gCz1YBTkvDHAH4DG4CJgrlKSsEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, an initialiser which sets up an empty stack; <img width=93 alt="\textsc{IsEmpty}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAAYCAQAAACCPt3gAAAC4ElEQVR4nO2Ya7XjIBCAsRALWIgFLNRCLNQCFmLhWsBCLGABC71AAsyDV3dvz23P7vAnJTDMfGFmoEIUMaRpMSeazeRtVtdbyoM0MznPsJm8HS+1/MWiYwtu2Pi0Tc7b4mgbZ2rW9uvNx8szewWKabqv/oNpuR/eLH9j1DtIG8zqv70SMj4v/heWHpjwTv2cib8jdTA34XIitR7KwcZwMKFarfldAaOypq/K+itI2XQ8bJZUulFdXLN3WDu0nvcPwNxir4sLJEBjMAXH7p/2ChjH9p0Q90kw53yJ7O419QowuOCap8Fs7CSTnL2z9S1yBNtQdEj/7CIa/F6D2rrnXw7pW4muIEulr2IAdloxQ+2TYLioGAw8mNarfwQmiAR9kqyONQRL4OFjj+8l6DnE8KzVAgNFN8HAqK65B3WaqAeP0NHVOTDnmibPs2R00bAzex0CscW9NygPHAzferJy/Kuff/tgFHP2nPNnYAwZXTTwDwl9mgijpJLuBnvFbI+pIVFOIxuLulbBa5XeOTBOpKT+LJgUTuHzToRRUkmVSFCsXS59WPo5hqbfhCDUoBsy9s7cKnZBDYvPT+092dutSc7kPRVGSWXtgKcBnBDPkrzvg9ECFuwCZgXuLiIV8BYYm/PXcdnRCoAZMDJ7M3X3b4E5RfvvdBpFN18fDK1QKq9ivabzuhBOS1/ZhhoY3GznmjsDRlxpfvLm3wdziqlw5mDCrTvtq6MJpgRTCqQ2GAMyWN/tOTD1zNUZisEsfgmaVRwb1bsrCfaugJHXPllBgM4m374XLwejWA8slLCnBYYev7BOEzPLHWShDwLzIMnWCXpq7YGhxy8MZoshFI4EKWd8FBh4YdvEQzxI6uv9UXV0d6EU5zWgVLo3A0OzfjIc3oZLqaSXylGr3a7huTUZCOfw8ePCQNdt44GjhtfHFpjNBw485MEzyRyY2v8xaY1VlL8g3hBMS2QOmu0qlf+AfAMOXEiNCkb0JQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, a simple predicate which is true iff the stack is empty; <img width=56 alt="\textsc{Push}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAAAYCAQAAADO+BJdAAABeElEQVR4nM2X7WGEIAyGs4IrsEJXYIWu4ApdgRVYgRVYwRVcwRUsIkgIoDa980j+nOdLePhIQIBktukKvqAjW099gZ9PA0ZT3jeoOfyObgOs/TQitjqQCLDdzGoLdENd/AboxtpLrP27kRlXgHQek1IyoyBrg0r/TmXK6LFjhf5LUYTb9SkpR6+CkxYyi/0Y6L5pVl/o5qL7N4DWlh5D4q5xBOvnURCwsxYJ9mSLtECHajLdAc3XIQ74TaADmKLDv4BijXwd6OQzNHks+FNVfQW6FC0VGTAbtH6E0tm8C6qPwQ+NPtmgC7mU6Gb1vAMKDhJndhlLNaeHkUz/AQUHNwNene9eQSOuPvb7cNGCXZ5eAZre54pOQGWhMKRAPQRKk6NWR0vFw6C2Ul0X0kE5GAP5GfcA6Oj15ngW4WSnEVeU58I/az4oLQ33cNWhjnejdAGhcfeqnGsYtyceKK2RE8Hc4io3f1hjkIZ9zeOZDJ+BFHJHudZc2i+6aukDeIXK3AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, the familiar operation that adds a new element to the top of the stack; and <img width=45 alt="\textsc{Pop}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAAYCAQAAADpVpO1AAABWklEQVR4nMWWawGDIBCAr4IVrLAKVFgFK1iBClSwAhWsYAUrbANh4j3wMWR3fzaFu+/gHgKsYkXV8ICK8srqDH0tEO3VOZ3C76g2wNhaKE54h22AqXYqEohDmf0F/R0EwPh3nbBPeS2Y1DKI8u80ea4/OZWmtSU4fPIbaMqBtF+IpdDjP7MLsujzCgi9mpg3KZyCwa8b0G6L7MZzFC9TAmmYZLX+SUvWaiZaDOJkyrUEHqQJcaaxd5mIBhYa212AMyBjqIGosaGNxNkkWFEE8hIIn+W4Xka2hqJMKJ84kFwowel26Bm2e7iVSgTBjimIFtpBYv7YTDkPkga4O73uBNm77Isg2eIjx25hO9WlUXEBhJboKrS0uWQtBNKRTrvKeKiPFAJZLmdmRlfP1MOtIMq3fTx/LGvjBAjO6iPbIorruq4oZ3bv1u4tIE4M+R7BeXMS5Dc5WJSSvAGW5nMkafYxYwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, the inverse of <img width=56 alt="\textsc{Push}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAAAYCAQAAADO+BJdAAABeElEQVR4nM2X7WGEIAyGs4IrsEJXYIWu4ApdgRVYgRVYwRVcwRUsIkgIoDa980j+nOdLePhIQIBktukKvqAjW099gZ9PA0ZT3jeoOfyObgOs/TQitjqQCLDdzGoLdENd/AboxtpLrP27kRlXgHQek1IyoyBrg0r/TmXK6LFjhf5LUYTb9SkpR6+CkxYyi/0Y6L5pVl/o5qL7N4DWlh5D4q5xBOvnURCwsxYJ9mSLtECHajLdAc3XIQ74TaADmKLDv4BijXwd6OQzNHks+FNVfQW6FC0VGTAbtH6E0tm8C6qPwQ+NPtmgC7mU6Gb1vAMKDhJndhlLNaeHkUz/AQUHNwNene9eQSOuPvb7cNGCXZ5eAZre54pOQGWhMKRAPQRKk6NWR0vFw6C2Ul0X0kE5GAP5GfcA6Oj15ngW4WSnEVeU58I/az4oLQ33cNWhjnejdAGhcfeqnGsYtyceKK2RE8Hc4io3f1hjkIZ9zeOZDJ+BFHJHudZc2i+6aukDeIXK3AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> which removes the top element from the stack and returns it. Certainly, the version making use of abstract operations is far more readable than the concrete alternative, swapping the abstract stack <img width=13 alt="s" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAARCAQAAACVkV9MAAAAqUlEQVR4nH2RARXDIAxEzwIWagELtYAFLGBhFrAwC1jAAhZqoU3SjDEWenmvhddP7kKBfzkEvBCxGd86knGiotDzJHgBVRzwso4C7haWfzo0Km9hB2Gx7yJ1N8U2ZR38o6Lgw4wsL7Zc2U71BYuCjC6y3do72p5BRqt2NBSGtZOcxtx876MJX/Z7hjY5Pf5Ftg0zBk2TdJdWyZxO2OjdqHeyoFuebLkmswvKE0WZP7RyDQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> for an (infinite-sized) array <img width=21 alt="A" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAQAAACoou4KAAAA4UlEQVR4nJ1UURXDIAyMBSxgoRawMAtYmAUsYAELWKgFLGBhIwndo+0ogctX2xxHuCsA/6HBNaU7XV0gPcAOH6rXLJ2hKt2t0V2l72vauSzAA6gV7Vxobm161gbY1qZnbUQu9DRH1o2iJ/0p731DsES3cjLO639P7H6Q0+Nls2helpINHZVpKpD+JqOnmrVricyzp7kZiswTRJcbze19kEUXIxo7exqap6nprn18GZgXOtqIfZQ987hBNzr99PhrmGpfx/338HAydeQyXrz2qaIbB8E4rq5YpKbvXgQG+OT9F1R5fHP1sA4eAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and an index <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> to the top of the stack<a href="#fn8" class="footnote-ref" id="fnref8"><sup>8</sup></a>:</p>
<p><img width=588 alt=" \begin{array}{l} i := 0; \\ t := 0; \\ \textbf{\textsf{while}}\ i \neq \text{len}(w)\ \textbf{\textsf{do}} \\ \quad \left({\begin{array}{ll}           &amp; (w[i] \in \{ `\texttt{[}\textrm&39;, `\texttt{(}\textrm&39; \}); A[t] := w[i]; t := t + 1  \\         + &amp; (w[i] = `\texttt{)}\textrm&39;); t &gt; 0; t := t - 1; x := A[t]; (x = `\texttt{(}\textrm&39;) \\         + &amp; (w[i] = `\texttt{]}\textrm&39;); t &gt; 0; t := t - 1; x := A[t]; (x = `\texttt{[}\textrm&39;) \\       \end{array}}\right); \\ \quad i := i + 1;\\ \textbf{\textsf{od}}; \\ (t = 0) \end{array} " height=260 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-125px;"/></p>
<p>Mathematically justifying the above translation is a process called <em>data refinement</em>, and a variety of techniques exist. One of the simplest is Reynold’s method. Starting with the abstract program, it proceeds in four steps:</p>
<ol>
<li>Add variables to represent the <em>concrete</em> state (in this case <img width=21 alt="A" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAQAAACoou4KAAAA4UlEQVR4nJ1UURXDIAyMBSxgoRawMAtYmAUsYAELWKgFLGBhIwndo+0ogctX2xxHuCsA/6HBNaU7XV0gPcAOH6rXLJ2hKt2t0V2l72vauSzAA6gV7Vxobm161gbY1qZnbUQu9DRH1o2iJ/0p731DsES3cjLO639P7H6Q0+Nls2helpINHZVpKpD+JqOnmrVricyzp7kZiswTRJcbze19kEUXIxo7exqap6nprn18GZgXOtqIfZQ987hBNzr99PhrmGpfx/338HAydeQyXrz2qaIbB8E4rq5YpKbvXgQG+OT9F1R5fHP1sA4eAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>)</li>
<li><p>Define a <em>coupling invariant</em> — an assertion that relates the abstract and the concrete variables. In our example, if we assume a stack model like the following grammar:</p>
<p><img width=140 alt=" \mathcal{S} ::= \langle \rangle\ |\ \langle x , \mathcal{S} \rangle " height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAAAiCAQAAACAAk/QAAAEKElEQVR4nNVaCbWrMBTEQizEAhawgIVawAIWsIAFLNTCs4AFfghLm5BlhqRp/3DeOYVHcjP3ZrkLVfW/QVbj+WuqBNFSVK1qc1daCZCM6qpRF0upBIbq7/w9Vx3RsqkW9XdfWk749AsyqtXAZkVnUn+LGiKjhs9DGDQ4FfJGEuQ0QBDWL8TooRseVDrd0SPzMFOwju+1IdTqrobb8kYypeVATL8AI6lemY1h9drmv4PJOiOeau6h4I1kS0sFot8oo7VJbzxpfspIK8nWeNJZpENgjXSVlgpEv1FG06WT8fLkm+gvO7YgtmPWSFdpqUD0G2VkdtI4Ov0u/hyjGeGVzhrJJS0NmH4jjHprz/wtF7xVo7uOyP3UBc5IeL84MP1GJEvtbTwzezS5MHhmGDrjOSO5pLWqva0bSWgL1W+EUb93g5OZ9NEnnHc54d+r0bODMdJVWqukXFVcq5XxBPtcgek3ymjrZlEzCVnszf5257jLC7/Xg3phjJFsab1SbL+b6eWWC/VkJj1ARL8AI7lHw4ih6v3NxnG3oiGuMELxwwRFS4yRbGlbgCnU83d+T2UiPJg+gOgXYiTVS4s+5mKrolUdPjx3ch8McoV9tDqoYCwzgBvJL03qlM62wQ23THT0E9YvnOuo93mDx/SfQ3iXXnNs8WgJN1JIWr+nch4JJtoQ0m+A0ZrM79U/5XlvLu/vIbaiB+D4xo0UlvanV8AdEzH69TBqleBB75fz2Uzo5V2ypuJCE41Z2nhiEjZSTNrjpnPE6dfJqD4FP404eNCdfhdxb6cDxogaKS5tKzJwYPXrZDSeD2v1+2XDbQ/+NsbIav4DTk58uwtLO1xxroTD6tfJaPHs6mnFigm+wkoOeztYXQk3UkjaGtQKbSZuLXH69TDyrZehup9klaolesXmZegwR9wGLk7ySRN78LqdS4xeOP16GM3OBSy0HxPy2M3PO+587IHBbwi0yM0YySdtOmf95pcds/3gvMaJ7rEw+vUy2g4w+/Uxcohu3sm8D9K8ywv/loYGfoyR3NK6N7+v2YPRRn9RNJ2tfKcVo18vo81nn43swTOamTqydb3jLjd8iSEsKcRmwa/SpHahXxjPbMmRdD34u9wORr8BRmL/jmXRi3rRCfPYDC23knxuNl7k5ox0ldZZq0ucGYOXlqZAigvVL8Co0VFxA8fT8i2Ctu/ywl2swIvcnJFc0mzVCfWGrafYVyFx/eYv2xeFK37Bi9xs+TwWm7kxJIUsK/KX7YviWlhmityske4V0M18Ao9PlO0Lw55lvpK6C/x3d/ycrpMT0gyjH4W5XzMfdN0xEn86pKajOUY/Cmkomvk0cnNquK8vJGlWqUPTlHXEMfpZvMcQzEfG6dIQyMTa2+cZFcHjjF8klFbNJa0ESjAqhBeNEhXjskpzMvoHefiQBG1/+JsAAAAASUVORK5CYII=" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>Then the coupling invariant relating <img width=13 alt="s" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAARCAQAAACVkV9MAAAAqUlEQVR4nH2RARXDIAxEzwIWagELtYAFLGBhFrAwC1jAAhZqoU3SjDEWenmvhddP7kKBfzkEvBCxGd86knGiotDzJHgBVRzwso4C7haWfzo0Km9hB2Gx7yJ1N8U2ZR38o6Lgw4wsL7Zc2U71BYuCjC6y3do72p5BRqt2NBSGtZOcxtx876MJX/Z7hjY5Pf5Ftg0zBk2TdJdWyZxO2OjdqHeyoFuebLkmswvKE0WZP7RyDQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> and <img width=41 alt="A, t" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAeCAQAAAA1U976AAABcElEQVR4nL1XYRmFIAykwipQgQpUsIIVrEAFK1jBClawghV8Msb38Kng5pPjl347jg1voFLn0MolQ19EvQIvPahJrTiamtIBQNLu8UzsujmSnh6IGtWrhbt4QEooOoilnaRubpMGosp3u+HzgcpkHu62Rb7lUELOHstGnetJ6yTTHsncbxSoJwR2T09tmdgnYi2Sb5B2sGrEMZNHwlNx4wyu87t+Tx6Y0t8lsAo+/hTYG2ypIW3xs7LJGJBu3peeqYf9DpnBGNLtbp8DAA0ma6e3pYPIMXAQt9Pb0r5tjifvZQZjSOvLMC022E3p4SJnj0nU06J0oV75oKvDz22LzeVkqZFGnC5+zh4Tliy2d3eH75aM520SAcmhdJgkV5iFJvG9OMbFe0x3yQLirbhl0zFr2PItNfcoM25CcQJNDSjHbInHvial8E316G1X7HSAzBcw/+XOKgDwL0D/Qoe+qPp/EmAK3/eLaM4NUwdWKvwBXD7fZTxgDJQAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> can be defined as a recursive predicate <img width=17 alt="\mathcal{C}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAA6klEQVR4nJ1UXRnDIAyMBSzUAhawMAtYqAUsYKEWsICFWcBCF46utCPp+vXyAiFHfkggkuEo0ptWSKGF95ewlNl8pmnbRRD9FaGwkTnpAkiTTsiCvjBllimZj6ygT6wPEsHzQdrW5hSISln2NCeE0utUq/caCQZJtrAc1l9K3b0lH82MNi/rfm/1WMQMUcp+l4dhRBZJJjRKOmkcRDGvSAPlLx5SpJe/QDhU7Cbmw7vchAVFaT4N5Wk20gRmLWADP2OhHcZZgYef3zZXW7+h1a2PssFIRJ3Qwmh/S4LUVr34Kjosewssfkz7A53ybJQqWahTAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> like so:</p>
<p><img width=480 alt=" \begin{array}{lcl}          \mathcal{C}(\langle \rangle, A, t) &amp;=&amp; (t = 0)\\          \mathcal{C}(\langle x, S \rangle, A, t) &amp;=&amp; (A[t - 1] = x) \land \mathcal{C}(S, A, t-1)\\        \end{array}     " height=53 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-22px;"/></p></li>
<li>For each operation that <em>writes</em> to abstract variables, such as <img width=56 alt="\textsc{Push}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAAAYCAQAAADO+BJdAAABeElEQVR4nM2X7WGEIAyGs4IrsEJXYIWu4ApdgRVYgRVYwRVcwRUsIkgIoDa980j+nOdLePhIQIBktukKvqAjW099gZ9PA0ZT3jeoOfyObgOs/TQitjqQCLDdzGoLdENd/AboxtpLrP27kRlXgHQek1IyoyBrg0r/TmXK6LFjhf5LUYTb9SkpR6+CkxYyi/0Y6L5pVl/o5qL7N4DWlh5D4q5xBOvnURCwsxYJ9mSLtECHajLdAc3XIQ74TaADmKLDv4BijXwd6OQzNHks+FNVfQW6FC0VGTAbtH6E0tm8C6qPwQ+NPtmgC7mU6Gb1vAMKDhJndhlLNaeHkUz/AQUHNwNene9eQSOuPvb7cNGCXZ5eAZre54pOQGWhMKRAPQRKk6NWR0vFw6C2Ul0X0kE5GAP5GfcA6Oj15ngW4WSnEVeU58I/az4oLQ33cNWhjnejdAGhcfeqnGsYtyceKK2RE8Hc4io3f1hjkIZ9zeOZDJ+BFHJHudZc2i+6aukDeIXK3AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, <em>add</em> code to perform the corresponding updates to the concrete variables, such that the coupling invariant is re-established. This step can be formally justified using a program logic such as Hoare logic, which is analogous to the refinement calculus used above, except designed for post-hoc verification rather than derivation of correct programs from specifications.</li>
<li><p>Each operation that <em>reads</em> from abstract variables, such as <img width=93 alt="\textsc{IsEmpty}" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAAYCAQAAACCPt3gAAAC4ElEQVR4nO2Ya7XjIBCAsRALWIgFLNRCLNQCFmLhWsBCLGABC71AAsyDV3dvz23P7vAnJTDMfGFmoEIUMaRpMSeazeRtVtdbyoM0MznPsJm8HS+1/MWiYwtu2Pi0Tc7b4mgbZ2rW9uvNx8szewWKabqv/oNpuR/eLH9j1DtIG8zqv70SMj4v/heWHpjwTv2cib8jdTA34XIitR7KwcZwMKFarfldAaOypq/K+itI2XQ8bJZUulFdXLN3WDu0nvcPwNxir4sLJEBjMAXH7p/2ChjH9p0Q90kw53yJ7O419QowuOCap8Fs7CSTnL2z9S1yBNtQdEj/7CIa/F6D2rrnXw7pW4muIEulr2IAdloxQ+2TYLioGAw8mNarfwQmiAR9kqyONQRL4OFjj+8l6DnE8KzVAgNFN8HAqK65B3WaqAeP0NHVOTDnmibPs2R00bAzex0CscW9NygPHAzferJy/Kuff/tgFHP2nPNnYAwZXTTwDwl9mgijpJLuBnvFbI+pIVFOIxuLulbBa5XeOTBOpKT+LJgUTuHzToRRUkmVSFCsXS59WPo5hqbfhCDUoBsy9s7cKnZBDYvPT+092dutSc7kPRVGSWXtgKcBnBDPkrzvg9ECFuwCZgXuLiIV8BYYm/PXcdnRCoAZMDJ7M3X3b4E5RfvvdBpFN18fDK1QKq9ivabzuhBOS1/ZhhoY3GznmjsDRlxpfvLm3wdziqlw5mDCrTvtq6MJpgRTCqQ2GAMyWN/tOTD1zNUZisEsfgmaVRwb1bsrCfaugJHXPllBgM4m374XLwejWA8slLCnBYYev7BOEzPLHWShDwLzIMnWCXpq7YGhxy8MZoshFI4EKWd8FBh4YdvEQzxI6uv9UXV0d6EU5zWgVLo3A0OzfjIc3oZLqaSXylGr3a7huTUZCOfw8ePCQNdt44GjhtfHFpjNBw485MEzyRyY2v8xaY1VlL8g3hBMS2QOmu0qlf+AfAMOXEiNCkb0JQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, is <em>replaced</em> with code that reads the same information from the concrete variables. This step should be justified as a direct consequence of the coupling invariant.</p>
<p>With all abstract read operations replaced with concrete ones, the abstract write operations are now completely superfluous, and can be removed.</p></li>
</ol>
<p>Following the above steps with our original stack-based program will yield the concrete program we devised in terms of arrays. So the method appears to work, but what does data abstraction and data refinement have to do with the notions of abstraction we saw in the previous section?</p>
<h3 id="semantic-data-types">Semantic Data Types</h3>
<p>To be able to talk about data abstraction in terms of semantics, we need a semantic model of a data type. Formally, we consider a data type <img width=21 alt="D" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAXCAQAAABZ9FzfAAAAwklEQVR4nNWUXRXDIAyFrwUs1AIWsFALs4AFLNRCLWABC7VQC10G5OyvCTvp05I3whcC4QZg88iCr0iICFDN4UZbj+rlDS99dceCSU/Stn6bpwr2GksangW8pWgJFhsOun+7hvgOOs7x1YrP/Xxnw51e/gjn3sxWPGvt+w/c/HT7FXy61vfYFSnYCN9qPNrw2HUvlP6bYIUf98T9SSSM1c74Z35P0DGGWRCljsZA0y8RsHU0j8Ylq/nVH8MyUaLTIXkHvrGmOBCRTSMAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> to consist of:</p>
<ul>
<li>A set of <em>representation variables</em>, containing the data of the data type. We write <img width=31 alt="\Sigma_D" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAcCAQAAAC0AkUaAAABFUlEQVR4nLWVfxWEIAzHV4EKVLACFaxgBStQwQpUsIIVrgIV7nDAe4pjeOK2P+49uX2U734BnG2ElXAP3+Af6DKHkJrbPviSMLoPQ5sKV3/hG2tm0rcbGbxF+CYDz9LMMvgojZdJa5bGycCzNKMM3kjqDtjuSgZt2Vo3F//DhkaX2pST7TTafPidW7dVIWhr/CnmpHzm8BUTF7iPr4F/PwABz7FM9HRzcNFwhQItdMhwe67Q8FgKnjqIzdOWhIOPtROHTR+L65hQnZ4dO7YGp1IdbGaX3O7rU7huos+JrsEn6sSkDU9t/+zHCq7Bl+KGj4wrRbaNnsPdOyvyClcoib9ZyozpYpmYkGyPanejr2W7z0dbgn9hTNBBzfs/YgAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/> to represent the state space <img width=17 alt="\Sigma" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAXCAQAAAC/3ZebAAAApElEQVR4nJ2UYRGAIAyFV4EKVKDCKlDBClSgghWoYAUqWMEKChPu1Jt6j71/jk+f4wHRvTwtijbai1ZSK0nzTVGH5ta2elsvUyx8vPOtuH2LMSwKlDGoWwwYdlrcsHF0iwmDukWPYTzyXySxMRgS8b1yeCpM2dqMWquxdRgy4dbcaO5Aa0nCw6LrIGx7piQkfB72quWJ2F9EGRC3G0e7jbqmc+kBbK58YsyCR6gAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> <em>extended</em> with these additional variables.</li>
<li>An <em>initialiser</em> (or a <em>constructor</em> if you prefer), <img width=105 alt="D_I : 2^{\Sigma \times \Sigma_D}" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAhCAQAAACCENpQAAAC00lEQVR4nO2Z65WDIBCFaYEWaMEWaMEWbMEWbMEW0gIt2IIt2MIuz2SRgRkNRj3Zm18xZoSPeYGM3U+CSeBzvq3Li7OB/QCf8WRbN9FoJyguZ+sW4mzSE1aXs3UTNWzRUx6K93TANc7aXbZIQ1KZz0Mb7y+VRjsbbk3hjinJXMbLIEi4LYK4NqN8ypwieJO/uugBfSY/SP/kTo8K1mhHmRdf4Vt/32KLLAcqVaNXbbG/ve3iiCSbo9o3gAC5vQsKztcdL1wldBRbRKkMPKPG4zuylEv7BJMohmccKBDfiCb6gKyMLm8r7QGRuCvBC1P7OSz/OR/on9+F98LU26VeyFxI/7VnsGHocraE7QMfHlyvv016PIXIK8MLvz/QYe9TmzQOwmfbOKGbGKAtoPn/XLyjbGu9cGMpcWHwWu97+Krvkev4e+Sa8af4npxwz8Nspajm/OwxePzQwB2AIJXJtYno+ZSch9lK4Q352WPwQj1O202KVDb9OwnbVcZpeQ1vBDKUSe3rTo1SbXFbleGp3Q1LKDe0kAvqo//AW/l0RJQ+j2LrMvCaXSE/RwUDauJdIx/3aZQdBsVWOlNTMjL7kSPhmXKjNjaj7c6nQQvEd2zCUo9e8tWbCu8zO13ufeO8QyOoVcnmexzeksAzO1F3dU7S/TtyLfOZ6GJ4jZ5dcRuHwROZPq+p3v1dAZ20+TZkQqVBFkeDwet9IKXCPHabroBuszB4c7bZqAnPoVP3QofBc34Hb6PrwXPoXrmm21yjTxLlSAquNrXgrdGxWqdtx8vBg/ohiZzmUeCZtwjlUEzRsQ+2Rm9Kgb7V+Jd0pYNQ/CibW/xLAV/IdX8PIHt2m/dbk6+mvR14p31gfB6Lq+L641MMe9v8fiG327wFvBYcuOlvOrTyGZ8qC/e8HLyj35ucLkrOE4RF+ErVbZK/TP/wdktW39t+iQR7+B5wqXqqcnn9AjbbHd31QZhAAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-4px;"/>, which augments the state with a new instance of our data type, introducing our representation variables.</li>
<li>A <em>finaliser</em> (or a <em>destructor</em> if you prefer), <img width=108 alt="D_F : 2^{\Sigma_D \times  \Sigma}" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKIAAAAhCAQAAADw37jmAAAC3ElEQVR4nO2Z24GrIBCGaYEWaMEWbCEt2AIt2AItpAVaoIW0YAtZbp4oDDCieFazP0/RxBk+YS6EkKuKkR4Y97B2iigZyRsY4gbWTpSw02C3tHaaKFF6WvKW1k5URyY9sXHnUwbgGiWPWmudJg2Pp/4x/4VhdLCbrNv1DBVFNrPqIFgoa1R/TfqQqVYQlb86aYPnxQWmp2Ksi4zjwvq6RzTAGH6usuaAxer0lCZ7b+8Gwkms8uCUAEnJS9+FtiReS2w5hBusyQREo85jbJ/apQU36iGs42bEccpIJMJ9XNel99CMLo8wZw1wPwWRaFfchNrGR24RfjRXaRTwZwKuGjH7q6cHyPUnpV9Hahc5fCWEaWuB8hDn+0/Mo6qlotckwB1gdkbudYahR2SCEdP3XlmvStYWKkF8JFfFcXoHKxG+ZlYPLzwnRPZKeF5eiWVrC5Ug0hM29BvwIfZLFfdDDHEEPcfExLK1hUoQ5/wNh3m8DZlZy6a0Cd966JcA4pNJJsssjoOIyc4YaxlnU9+oL3Tm5ITeHFbTajvDBwKhXxiImDoRZ22h9hC7ioAwBIkFaglcW7Cs4mIvRdRzYDoWnLWF2kM0yUluLJCVXYdbu6XQS6qfEWZg6FXSna0kGuLHOAWPK4/M3mPF9jeCSpw9sRytMsQpgMhs2P0seHVw9uaVCNcQO51d9zaIaJUgMrBOfBRL1VrVI+xtCJijl9RATzs8KUHkfs2txUibI8t6hP9VJYgvcFp9E4iuh74cwhJE7tuvMG20gMiDjCyvczyPOQqLM9zxEEOEQ7Oo20AOIlQn9ZnTxN5OsddTHf3IyfyHkQ/yIUJX5lxsJYZrrft30gw36A7iuBhpUd/CpTG6oDGs6s74eOwXS/nsy63rw+psWSansWU7z71zGnSqU70IxAfgurQ11pDdgFsglldiCuLNtS2xsMIr+VK1qRO/TH8QD5DrU/+0S71t9b9WP391JwcN39CbAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-4px;"/>, which eliminates our representation variables from the state.</li>
<li>For each <em>operation name</em> <img width=9 alt="j" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAfCAQAAAB9yzRkAAAAh0lEQVR4nMXSQQ3AIAwF0G8BC1jAAhZmAQtYqKdZwMIsYIEVWJaMfHZYslAOHF6atlDgGRsEATQcSjuUw4WRoUFWynrTMPAz+h5GWxFYRtLaKThGsEjYbx5ynXbZsyt6XtUvQ1mAk0X5ac7+8G6OmRP0V18HSZyMQub1KiW+XF7XSmbrHFnOCQ27SUAmG7gaAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, we have a relation <img width=116 alt="D_j : 2^{\Sigma_D \times  \Sigma_D}" height=25 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAAAmCAQAAAD35mjQAAADCElEQVR4nO1a7YGsIAykBVqwBVqwhW3BFmzBFmzBFmjBFmzBFu7Ch3crBIIK71ye459dVAbGJIQoY5+GhrXIUQfbn4KzgX0hx1gB2w0w6uk1VbL9OTibYbqySrYbQLAVJjxc7KVD2jh7FWKDbmTgmKDz/kZhvNPOKi71MXuRU1kpJmIONui8AyFNyJ534s62dYUBlY8/AlgU6xDhGvUYr4A78rr/87JZGCF9CJjsqs9ddpEI+M+DNIcMCMzZAmcx1z7GNSK/y7BpyIC4CsLKWyoV4bp/5ZwDhKLVegsu74guM35WGvO0TdK4tLnYWFxcBrcbiyoTfyfoefLGgjlkC6JzpL3Rmelkp9rDvxmsLuxrRlZK2lxshLjb+SlyxVlwhHnRba5DKg8KP143cI3RUNbA2SU6roxslLgva7vYk7yGFnlsWJuytj7Sjz+5JThe2nJzspHi8mKBobVL2B5+20z4jT/dITDelJibj43R4m75hJ9u05BaqLDNT3DWHZYr7ojEP7WwiLc70qabki3kY9OgxZUnE7JtMYw5mQvhhAW8kLIfT9p0U/LcfGwW5cQVJwLK6Cxo2BbHbHPer3HHpnpxd1gpO7R8bBblxFWLoTyUivNgKhaDOzaVPfv5AB6Dj29y09gsUsX9F5UGFd1jaRAOLDk6s0IUYKPFXRFxXyy8lzqL6ZS0++kK3UuGjWseNkrcBs1zTei/WDna4ay0rb5vi43x8s91HGSjxO3ROMihPafrnZX25qDEXQ6nU8ehpF3qk5YS19gtnljncr9p5xlCO1slSCk57gMAt9lovPyRiskJOqrvat62yuDS1AaquQNcbSqxlO2qd1Txa1xpzXgqs1x3cRLWOsNWJMnc1zyAWMK2LWPvB5UYfhRmmw30emodWM1oF7EvpKzyC1rcrbYQssPtvH9UghcyNfOysCMc+rrlhsT9j74aCIEWV+UU1CN6gCJF3Acn8YhbEI+4BSEzF24evGGpJ2W6G5qaNql3g/rWJP+XDA+YqpU90haBqomVfI3y0fgG11lKn3hujWQAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-7px;"/> — simply the semantics of the operation.</li>
</ul>
<p>Let’s define data types for our abstract stack and our concrete implementation. To make specification easier, we annotate the names of the operations with the external variables they may touch. More elaborate refinement calculi include <em>frames</em>, which make this technique a good deal more rigorous.</p>
<p>For our abstract stack, we never explicitly provide an implementation, merely providing specifications. Because, as we discussed before, specifications are in the same semantic domain as our programs, we can use them to provide our abstract data type.</p>
<p><img width=489 alt="\begin{array}{lcl} A_I &amp; = &amp; \big\{ (\sigma, \sigma \cdot (s \mapsto \langle \rangle))\ |\ \sigma \in \Sigma \big\} \\ A_F &amp; = &amp; \big\{ (\sigma, \sigma \setminus \{s\})\ |\ \sigma \in \Sigma_A \big\}\\ A_{\textsc{Pop}(x)} &amp; = &amp; \llbracket (s = \langle h , s&39; \rangle) \leadsto (s = s&39; \land x = h) \rrbracket \\ A_{\textsc{Push}(x)} &amp; = &amp; \llbracket (s = s&39;) \leadsto (s = \langle x, s&39;\rangle) \rrbracket \\ A_{\textsc{IsEmpty}(x)} &amp; = &amp; \llbracket \text{True} \leadsto (x \Leftrightarrow (s = \langle \rangle)) \rrbracket \\ \end{array} " height=145 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-67px;"/></p>
<p>For the concrete data type, we just take the semantics of the code we use to implement each operation.</p>
<p><img width=510 alt="\begin{array}{lcl} C_I &amp; = &amp; \big\{ (\sigma, \sigma \cdot (A \mapsto [\dots], t \mapsto 0))\ |\ \sigma \in \Sigma \big\} \\ C_F &amp; = &amp; \big\{ (\sigma, \sigma \setminus \{A, t\})\ |\ \sigma \in \Sigma_C \big\}\\ C_{\textsc{Pop}(x)} &amp; = &amp; \llbracket t := t - 1; x := A[t] \rrbracket \\ C_{\textsc{Push}(x)} &amp; = &amp; \llbracket A[t] := x; t := t + 1 \rrbracket \\ C_{\textsc{IsEmpty}(x)} &amp; = &amp; \llbracket x := (t = 0) \rrbracket \\ \end{array} " height=145 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-67px;"/></p>
<p>With both data types, we can start to devise a definition of abstraction between data types.</p>
<p>Any consumer of our data type, such as the bracket-matching program above, can be viewed as the sequential composition of the initialiser, some sequence of operations, followed by the finaliser. A data type is a <em>refinement</em> of another if all such sequences are a refinement of the corresponding abstract sequence.</p>
<p>Thus, to show refinement, we must show that, for any operation sequence <img width=114 alt="j_1, j_2, \dots, j_n" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKsAAAAfCAQAAAAyuvXxAAACa0lEQVR4nO1a7ZWDIBDcFmyBFmyBFmzBFtICLdiCLdiCLVwLtODxYYwooOgQLvcy/MgTLuPOSHYBj8hFQ4JaQgHLVgYADTVNpmGswLKVAURDO5M8ICFh2coAoqEiqSik+kQAy1YGIA0VcaANWLYy+A8avvjiNCqVmgWxP8lWBgANwqTniX4gAWHZyuC2BkYjDQvN3RmGZSsDiIZa1TsNYUj4zZCwbGUA1cChRmDZygCi4WvrFllt1QcOGLZaZayBOvX5GchkK1dtVH0DhK2f99jTRcb3A2jremZOZk98x9YXWzdfsbnC9veCfQv2jkBIhLnC2CpXSxX2IYuvTLZaYGx1r4b74b4BPkcaapfjl9qkyYPDmLy2tg7zZ9rK1Z7LJkW9sf2Z64Q8Q7I/C/fb2qje2AFviM1CbkpBnC3XaKqGh7KTzSXXztn2uKiF6p7P1uMXErEqqstXd5ot1+hVDbrv9cMfkbbyOaRwPQ/b2qj+MYHtOepPGtdHr2rQfS8IpK02O8ayboit84qMsw27B4EZvaYh0VZ7sLDfAYVuzKMh+dl6lVX9P7o4Wy5c0eAWqVO2+qpa6MbdYUguW2VMtSHUJumfZ8uFVA0a7jcObR0DOSh049Df+0f1e8xxCaDbBRNny4U0DRauH/1S9LzrV+7JQcIcjegnNphj3TXq6NJiz2bXe88mnfx0xJYLqRo0qk1vb64bNVE8pa9SQ3KXRQaaVs2ds7F9vY9t2rTzbPmQqkGDb77TkH0146kYmmJM2qMzdUsZeM5YtnxAaWD+g069JRPJ/2bAAgFh2fICq2GDB/QsCctWBrc0/ALvcecFjo40BgAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>:</p>
<p><img width=580 alt=" (C_I \fcmp C_{j_1} \fcmp C_{j_2} \fcmp \dots \fcmp C_{j_n} \fcmp C_F) \subseteq (A_I \fcmp A_{j_1} \fcmp A_{j_2} \fcmp \dots \fcmp A_{j_n} \fcmp A_F)  " height=23 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p><img width=366 alt=" \xymatrix{ &amp;\bullet\ar[r]_{A_{j_1}}&amp;\bullet\ar[r]_{A_{j_2}}&amp;\cdots\ar[r]_{A_{j_n}}&amp;\bullet\ar[dr]_{A_F}&amp;\\ \bullet\ar[ur]_{A_I}\ar[dr]_{C_I}\ar@{}[rrrrr]|{{\text{\resizebox{0.5cm}{!}{$\subseteq$}}}} &amp;&amp;&amp;&amp;&amp;\bullet\\ &amp;\bullet\ar[r]_{C_{j_1}}&amp;\bullet\ar[r]_{C_{j_2}}&amp;\cdots\ar[r]_{C_{j_n}}&amp;\bullet\ar[ur]_{C_F}&amp;\\ } " height=157 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<p>That is, data refinement is “just” program refinement, but for an <em>arbitrary</em> program. Next, we’ll look at common ways to prove this statement, and how they generalise syntactic approaches such as Reynold’s method. For a more detailed introduction to this model-oriented version of data refinement, and comparisons to many more refinement techniques, I recommend this <a href="https://www.maths.ox.ac.uk/node/4411">great book</a> by W. P. de Roever and Kai Engelhardt (who was one of my teachers).</p>
<h3 id="simulation">Simulation</h3>
<p>We would like to prove the above subset obligation using induction on the length of the sequence of operations, but the presence of the initialisers and finalisers makes the induction hypothesis useless, of the form <img width=253 alt="C_I \fcmp \dots \fcmp C_F \subseteq A_I \fcmp \dots \fcmp A_F" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAAeCAQAAACFpW2kAAAE0ElEQVR4nOVc4ZmDIAxlBVdgBVdgha7gCl3BFVzBFVzBFVzBFXoG0OJVItGghT5/3WcPeLyYhIAKsY9SqIBf5YjfZf7DKEQlWjGKl70G0Qh596AuQQrMpaid69tGFxvR2BdTc+N01eIx+TylDcEYQcXXyVciFeYgfSt6O7bH3cO5GJHYl7rJejICF8r6wO8yAF5cwRxE65Zosr5GYluF/b+aZWSpgZl9qWXeErm0HRUb93JAfOYQTyB1qqde1MZVEtur7bj6k+NKE6zsCy1+i3SVq8ePzxziycg4f4VOyfqsnZEfzOwb3ZBvuSAzziZjMwehelYDhdVIYf1evrr4wMpe6mZ8Xu8oCp3VdreJU+reG9To4jB30TGbvfF4cxp2Ns9NQSMXvOzFM8LyVelFW6eDUndDSO50FtjpRMYvawzmLmAWqBk8DuPxAKNeN5xBGhq54GRvB+AP98cwTJdpsZrafrK2vY/K8QcDUjWJwdxFyxxNpMMLT9JCkIZGb/CyF8KW7TihVoEI/Mm16Bw+kA/6dmL5ma/BHU0aR+zqZLRKRaM3ONlrvDjCxgqpTCo/cxfciQ5kts3yV3FyfZKKRjN42Wu82GlLZ1DrAV+DxjG5FgmJ/MxdKOZo0v1j0h/Y/HojFY1m8LIXc2WD2++1elph8x/yt6urBkofQIDtogYxbRrzYnPzCVsSKtb1g9Jjdfs2xyqOx5QUNHr/OpQ9QacXKdNVdh0OA2kRYZvpvtlh809pjdYTztxVduE6ouGQwlxOjEbLqLO1kL0AzVlpH8T2gYetol5OGhmEsyfo9AqQcA1TRz1bAJNoz2fuhoLaxoMYG1u2BKLaSEbMrrNv6z4XjQBU9oE6dV7P4QdPNcQ8mT6PdOZuGKjMJXFNUJ1KRd4wIn8aUIsadx4aHWEfqFNtAw7FO/BMKpxZ9PuDM3fDQGWuiIbPtXNbe/rFi3p5aHSEfaBO8ylEis/fn9TK5mXtLUeppN3iwBdtVOZ0w5cMZ3WkN2HAj1zkodER9sE6zYuM8LC8N6lP3TW8KTPcsh1uXiupdTjEppXGnG748HDBDumZRW6L9NojyUQeGh1hH6zT7Pl8BvD5vOGTWjhP4h3b4bWTW+Pb4TTmc1GtWl6AC0GhPduwvN9FO4+v0HSmRiJWDhodY0/QqVoM4P+zB0Wn4cMf4C8CuLuC0itMPLi7gg2y/ANQmCtrwDXJ8AFyOUX+eeHbMIPAKhTKtrH18OSg0TH2JJ2qRYheL0nUZAi17vj/S3kAPJSktR0ezvxIqnMO++dHR/vwQM16/bv0NTrKnqjTvNhwfZHvbXbcT7nb4Y8bJtXdDu93DT+c+dWGX+jsG/fF86t43WQm6xGnrtFx9od0UlMTEByeaO65t3BqxbxzNt4wqWY7vNOpynYNePu/9phf7/FD4NuSz1GjrXY+2UfUab9U1ti3a+44AGXycxP+wCdwnZj5TsP34Tc1Mi3fZvjF4jUfO1laHJSLF+gZD+DlZfh5agSIppNZTWO1knm5Uom477T6YIhLvYTiOxOvdmswazysT8OvOPPzqxoBqDoFQS4f2huRk39zfRzI3fGpu/lLaCNrfVrprDQc5aqk5rv4K+i/rBGAqhMrzJcO7/u+I2SOuX4NiAs/p9EfcJpE4wtDVoYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, which does not refer to a subexpression of our goal.</p>
<p>One technique to resolve this is so-called <em>downward simulation</em>, where we define a <em>refinement relation</em> <img width=102 alt="R : 2^{\Sigma_A \times \Sigma_C}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJkAAAAdCAQAAAATdAb/AAADBklEQVR4nN1ZC5XDIBDEAhawEAtYiIVYiAUsxEItYCEWYiEWerBAy2+BlKTXdvLuvbu+lIVhd3bgCPkcMMIzz/fHugiUCHLPPMuXx7oUC0yb/VysC0HJqpYhfy7WpRjIrhYiOkeZMp9RMl4RS1d4+sxvFcUJCmboGmNNNEnnVErOCbGoGkRaIdzUbxL2QT+7Ckh7hn6Aw7hSRcLG0yqzdsWgEWnx32fGAqxAksssnXmGuP6hudoIvz/lt4HCW7niaodPEk7YObEUZECZxmCX2Dc0hzFuUOwul2WWtKUiy6zBQzmiSoS1xNKrn61Aof01pYyohd47+4vZz/nxN7MZlyoMV1ldFgGmpHxL5phG1GSVCavF4ur7Wsup+rnhSbNkKBPdlI3J95lVyVB+dR+rtxsGG1vrdgw0GUct1hQResPESaCU9XhjM8Jc+YzCrtYhFR1rRV1rWVaLxZKsolhGikzrXbu1TGTKkCefrWon6xiBhrno3utaVoulZ9wIszgf3JZQqeolKuYGupRu0RJjypZMDC314fZpEhjJZUH4Trlj1mPJdo8QU8atyYjdMwneuWcKr4Y5+E7+oJzmplDUm465IXlS92UtsWS7dvuUDbYZ7EXCnjbk2DlhC+T/bt2fjJ41yKUBbLV4WJVcXtfdf0ssebQwV2s2drWTuFN/YgRHfwQjYjLK8Jc+IKWZ2zh6+GC0tKu3o6zXVpRBbZRj1y8iMg3bhTPkYFGajomuMNduY4HDGNujhDGV8+G+i8NicAQimuOExXKUUdSf9+I1wgj03BDMzrDv5gPHDDM1Orfgm/OU/8H2yu5ja4BXCcuDnXTDUorA4chUgPQ65kjOOJD7oHbfvv4K2YdPmcu5+CT4Kgxhz1KfDvfZj0R8kyFPIy0mjJxzW/X/iClzbaDccPXdernYUsLIC/b3I5G7YnT3shhpFN7Yi8dko2H+v1nnS53fG5G7YpyIu0XNw50xcUOCnep+hLItcyu/QGkuSB7Vswyj7HzX9w/Aiq+sVExl4k8ZhxL+AE6m/4bzdQbcAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, and split the above obligation into three parts:</p>
<ol>
<li><p>The initialiser establishes the refinement relation:</p>
<p><img width=113 alt="   C_I \subseteq A_I \fcmp R   " height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKkAAAAeCAQAAAD9E/ZpAAADjklEQVR4nO1a27GkIBAlBVIgBVIgBVMwhUmBFEzBFEjBFEyBFGbl5aBA0wy4d2t3Dx+36o5gezj9oJWQGjgR1Wv+AwFKZrISTd5+7GQh7KeNisCIjMbzltHL/cJ4YeVmputjSDIdU4Ql1xE7P2t3AwylK9m8XdPj9zMSU6e81DGC3AxPFJ7MraH3y4Rfop9UQ4Y61X8dunEt6ufJbqtwcFsYlOmkZ/6zQZO4vShHHPfmV3YEhDHC7LI87iAygzeuJ71N4CMNhLpQahBYKUqNWkLXwq+yU6VG/3pg8KDW6bbujcYjpZT4oKhKUxb7cynYs66YZQjYhj66cTvqlfp8NDVYMpRKiFJmfyxptBdqMKFOo8H1eqMptylnqVgoi5Qu+QmvB7O6OFZujZQwnEYNtI3PPVA2HrssDund0Xd9jg1iTYFu34d1sPpZpEw4XNUxR2vtYNXhKI0hfKVSULdOJozDaPUvEYlzp3ep6Kll4tgx7pSG0rKo7He3A5Uw2u35JXrRzhzwHaXce4eGQgVYDHRBDFa/ujn69sUx4YMl2vAVDCHSV8HKk7kevgEkNPawSsfFaGHtjI8IayZttKynbb0sLLmQqAKlaPG9m2KpOM+5+/FINcJGVo574TibFlJYG0WkOwjB8TeocIrxzlRdMDj65LJiDEBhzjyMO/Xlj6V4G+sIlFK/rdVqWH1RNGN1PQ9KUI68dNtXgLhxdcwnPXFcG0nCNVYWeHPHnJ5kIYpBhdQ4SlW01kQQDc/QVWnRKd5cNuCMz4qhCTpM121kmIKIXCn9SBD0PoW5qNHcD/gRgfauNLUCmdaljFwKqtvoGu7Srg/Zd+9EIfgKOi1dlOqjzamoVcN+vi9o65cK0NFk0cNqNsoozsMH0julIU3tkPfNJ6n33TKFRjq1vf3Lzh5na1d/J1DdLPwa6bbUbIxPTwtYHeRa0KGvjyDVXCatdqbj707SlyfO3GfOWynqfTLtt8W06eLrajbiD6S5FnTgC7xHCNaxekpvIXsOgi2g9iUanDjl+XCvi7U1G+MD6VahdM8IywUzxBtkcRjmXqxCEe653tU3MD6V8yTYRncgVZawfNUbUHLuoQ3RP4vSPOo2CkuoCReyUDX8RvwdlPJTf9tDjSM0XJbFlO+T1wE8nnjvhbHRJRdm08/Y1zlNYOcHPhrRieLZD2DSD2J+xsbwNY0ebsE/jNl+rjEEvwAGLnJ3qfzzdAAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-5px;"/></p>
<p><img width=153 alt="   \xymatrix{   &amp;&amp;\bullet\ar@{.&gt;}^{R}[dd]\\   \bullet\ar[urr]^{A_I}\ar[drr]_{C_I}\ar@{}[rr]|{{\text{\resizebox{0.5cm}{!}{$\;\subseteq$}}}}   &amp;&amp; \\   &amp;&amp;\bullet\\   }   " height=139 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-130px;"/></p></li>
<li><p>Each operation <img width=9 alt="j" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAfCAQAAAB9yzRkAAAAh0lEQVR4nMXSQQ3AIAwF0G8BC1jAAhZmAQtYqKdZwMIsYIEVWJaMfHZYslAOHF6atlDgGRsEATQcSjuUw4WRoUFWynrTMPAz+h5GWxFYRtLaKThGsEjYbx5ynXbZsyt6XtUvQ1mAk0X5ac7+8G6OmRP0V18HSZyMQub1KiW+XF7XSmbrHFnOCQ27SUAmG7gaAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> preserves the refinement relation:</p>
<p><img width=141 alt="   R \fcmp C_j \subseteq A_j \fcmp R   " height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAAAiCAQAAABvwCTuAAAEdUlEQVR4nN1aa6G0IBClAhWoYAUqWMEKW4EKVrACFaxgBSvsJwMorrwZ7t37HX8qMJx5OkDI72Eg/BdX/5OgRHieVwciKZnIQnbyNs9GZsLQV6kDu+2+t1QVnCvy5EmcPB5L5H4MpYiC7TDjeAjDQWF6lQlphTYoNS1kNTKNnVer5lwLyM9phBm4oog1wPyfAnCzRpuiFMHy9ND7sxfORc040SRRLio4l7chCgOatQ+wvG8eu0atz6qtKXsUx+zc8wyF8wkjD45xplDB+XMIMWFJNgpDQUlL4K1oMATlozti0KQQctYmwylBBeezZ4hAUZOeOZSUWXUeUKSuqHSqoEPNrntnJ4UKzkVwyBxchkJWkNEtMZgj5EstkMhK0r5kA09bdhqAlzkhXwXn+vU9lq/ROMkhRUv4SgYFenWq5vhD2lZoX1LYId/VQ0J209VbzITLOTdDXHBTK4UUsB2PDmXT8d0rInI45NVjQfZQ5nhQPEynMDkzbdFas5zzxxBbLIesgd8CQzia7g9RcIDtobOjmKkpAkhnv+IR1FyUcv4xZDD2tEcG5Krp3RhAwqtjhrzhlg9oUz6tU1MO5+eQ1QSp/RByiiZA5mzkvsk7MGrFJziyh8qPILeS8l9ji9kxoSUaPEs5d4bk07qAolTbZwvaAOvoTXj5joOM7m/x4knu+bPt8DfHQWExLss5Px1wTRThLuZjc3qhsKO+C3PTCHaVVgHmn81G/K0mf1GelpA7/hFDBed2CDVCY3W19Ibzu+2+ItWHJdOU0pg8FOnOib9llCthGhWcX+lsQGmIWshCpdOjtM/xkwmJKq2QpxnpsOfLFLkSplHBuXSC00jwjhgESfwJVAOnCyECeaGtKM9DBefukIvcuL1OxlmXCF2255vrT+yw7LzigCH09FgwJIebXGkJWV5xXcP5Z7dWJge9wA7VqeMWaRblzGRBzfZyK8MBOiEtAWiJ1Fg6sd8VkiehPv4UMHtMunLOH0NsWtsCCqCOrcWaRZc/hZa/1hTHFzpX5BbbmrbtPBMuO2/i0TAjPFEgR0LhZM14s6iUc8+QK635A4vbhWCP7dwxnYr6tC1Vun4KJYsqQ316aw/HP5/4L+oW9Qtu5niqOi6h24WYA2XI9WUJ594hF72+sJDbLLrPpAQQYOcjBMvnwXu5mmqR7t3vRtXqUML9Ll9N8WZRKecwZPNQpkOK7/6P2ywak2q60qpr6f4bPD+jJgoZNV7YiJOy103SuIRus2hNqKmMcxDbj3AMXojuR+lzlbxmBz82rK86hbPGT3lTDpTfP5mJS6ibRRKU4P8nsyjnvAqzOaOMtV7L8U1q8iMlIQdeVKAUBeVQJ9DTI8ZEjC/D31fTcPrJ2qHtXAibHieCe9chT02jsdj40+MORlpCnQIYfId7EaACw1kMSFTHztvc4L3e+7zu2wMpCe193r3T+oVgXe5bb6THoTwm0hJOcMHzPwZDLUd64Psl/AEI5Nt3+Ph+Cbvj9fUUfL+EnaHaqN8dz39Fwn+DcVg5syz2RwAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p><img width=153 alt="   \xymatrix{   \bullet \ar[rr]^{A_j}\ar@{.&gt;}^{R}[dd] &amp;&amp; \bullet\ar@{.&gt;}^{R}[dd] \\   \\   \bullet \ar[rr]^{C_j} &amp;&amp; \bullet\ar@{}|{\text{\Large$\subseteq$}}[uull] \\    }   " height=146 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-121px;"/></p></li>
<li><p>Finalisers will converge from <img width=17 alt="R" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAQAAABOiyVOAAAA1ElEQVR4nJWUbRHDIAxAYwELs4AFLNQCFmYBC1iYBSxgoRaw0AELO6D5uIY/wPFK+ggAjDAQiPYGB0IY8JDg6u2svQQFR6XCRkJzX+b+HwqIZglKC9TC4n7+CQTw6XOJhyIBBQ0KLBQ1yC5zWfunHzSHQ+2C9B1yqPzgkRWyqKXIyIAyqi9Vt5erYYYUyXR6WdNMQaYWbeuFJ1DTULTzGZEme4deqndo7Fu2CmEgt40VbIeGkFM6LeoSjrvLYtQl9CiEPexUE7k/I7EnGOFFQ1wKy/IvOVWY8BvxYZsAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>-related states:</p>
<p><img width=115 alt="   R \fcmp C_F \subseteq A_F   " height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK0AAAAeCAQAAAD0+FYTAAADkklEQVR4nO1aXYGEIBCmAhWoQAUqWMEKVqCCFaxABStYwQp7MoAiMizo7N493OfD/ToM3/zDMvabkEz96vpfAmc68wwf2DxnPZvYyl7+WdjIBPkqzyBOLDzUzm7Y7Js12xM2v27COY3GYMAVJHab0RSQ7FbpiVaggaV2YrPXraMQ6YQFT3VE2N/MFMK3BGDlp4ZSfg0aci0pZo+I87M2yuL+PU2hmDlRayHJvEoChTk5YY2nsWFdwcac3lZRmUc2ytNeLxLHulLLfMiah5I5EDshf9UExrMxsRImFg6JayYx+oYxQ60modZJxgqCeJzPLBEzWU2wsMmQ+90TZFuNUjui70goemNxWwJkYD5LAUNMrPPZkKwIsq2j8ZyT5mKuNZCLXD+B23b4cBegLlo/hfNZixXyN4FAS0EM5Wtr3iP6yKJLoQKbYjp4jok4IkS0r3Iqq0ZKbWiMMH800X/rSyo5sF5MRgvqiBgjMnuaiIupld5eayHQa6l90QQVAup0IE+1hdPUCe37OONJnTZrlYrDGG1qKoQNRY+BQxFHhEl2Mt8YNy4I1NZSoWBstQ36WHhDNHgtzzb75dqvSPO4Al3j1adMcW/WNSSE+U3DFStyeDiOV3WuFduq6x47Jhm9cfkkcz5guQzI2LjbpGuglvsFSKZnFqitPUXrmjPzVOUGNegzLuUmyfy4W63rUcYk6aGJaTKUaM7MPVEhcyReXcClhFyoV+tqosDtGN1xny52xynUjaJHM41pZGW8AavWNab2IKTkD6KiRTvOtur89g61guAMQaBpCx/UG6lVyc8lct3BtoaQKZH7XtINdU+QW85bHpWzqbCuK1HXPuQ2taGcLYg/6CjHlQbdw28xctXpe9f+9PsVSh04RNCy32G0ndeqYvrTSNRV65o7Cg/tRY7ceBobkUQf0O/kpp5lG7jYeMoTpBuptRD7GWvrLcNSrPXKy0jNU61r7ig8UJJz+9pB9yzJGkqDH3Xb14Wllzr3EsIzvD+bW715bAd7/F9DQlgyl4wuzHL3rvGgO1d0rqHoxZ50vTH9PrUcrlrL0aF3Fxsijat1xQIaGyPdoGvAJPmOMP/W4K/isbz7fa+tQW6M/aCuCog1kMapJvm/Sm0OH9RV7nacyY4N/6kFOMECChrVmal6W81TdD52ys8n7ubada3GtJejgUymgvzdApn9WNX1Y1b0aNe1AT18pOIfCX4ApeeEqV37QAMAAAAASUVORK5CYII=" class=display-math style="margin:0; vertical-align:-5px;"/></p>
<p><img width=162 alt="   \xymatrix{   \bullet\ar[drr]^{A_F}\ar@{.&gt;}^{R}[dd]\\   &amp; \text{\large$\subseteq$} &amp; \bullet \\   \bullet\ar[urr]_{C_F}\\   }   " height=150 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-141px;"/></p></li>
</ol>
<p>The second part can be generalised into an analogous theorem about sequences, via a neat induction on the length of the sequence:</p>
<p><img width=438 alt="    R \fcmp C_{j_1} \fcmp C_{j_2} \fcmp \dots \fcmp C_{j_n} \subseteq A_{j_1}    \fcmp A_{j_2} \fcmp \dots \fcmp A_{j_n} \fcmp R " height=23 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-7px;"/></p>
<p>From here, one can straightforwardly use the first and third lemmas to show that <img width=19 alt="C" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAZCAQAAABnC+2SAAAA1UlEQVR4nKVUURWFIAxdBStQgQpUsAIVrLAKVrACFV4FKlAB58D3PO+MiXh3jnywu7tNNoB7WHAdXhdM4GGDBLlahBVMDw2JlOg7k6LjICWAv0vwQ05IAa5wNQOFbNlFcrBVeRLuONWDuDXCoqa6ctxWOwzV3rzKiqaKpaeLMoKarorS/iGUVzNMDSNE81b1Ra356YgVlJ+DI1Rkamo9cA3nbAzphqprx3VbZLWF/kv+HzBHOUW9Dyc506JB3k0znVFYOgJMHfmfHSvuwUQ5ml8kW+S6d2CTbS01OVkSAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> is indeed a refinement of <img width=21 alt="A" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAQAAACoou4KAAAA4UlEQVR4nJ1UURXDIAyMBSxgoRawMAtYmAUsYAELWKgFLGBhIwndo+0ogctX2xxHuCsA/6HBNaU7XV0gPcAOH6rXLJ2hKt2t0V2l72vauSzAA6gV7Vxobm161gbY1qZnbUQu9DRH1o2iJ/0p731DsES3cjLO639P7H6Q0+Nls2helpINHZVpKpD+JqOnmrVricyzp7kZiswTRJcbze19kEUXIxo7exqap6nprn18GZgXOtqIfZQ987hBNzr99PhrmGpfx/338HAydeQyXrz2qaIbB8E4rq5YpKbvXgQG+OT9F1R5fHP1sA4eAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>. In this way, we remove those pesky initialisers and finalisers so that we can do induction, and then just tack them on again after the induction is complete.</p>
<p>So, for our stack example, what would our refinement relation look like? It turns out to merely be a relational form of our coupling invariant from Reynold’s method:</p>
<p><img width=392 alt="    R = \big\{ (\sigma_A, \sigma_C)\ |\ \mathcal{C}(\sigma_A(s),\sigma_C(A),\sigma_C(t)) \big\} " height=27 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-9px;"/></p>
<p>In fact, all of Reynold’s method is just an instance of this downward simulation technique.</p>
<p>It turns out that downward simulation, and thus Reynold’s method, is not <em>complete</em>, in that one can construct a pair of data types where one refines another, but that a refinement relation cannot be constructed between them. <em>Upward simulation</em>, the mirror image of downward simulation, relies instead on an <em>abstraction relation</em> <img width=106 alt="A : 2^{\Sigma_C\times\Sigma_A}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ8AAAAdCAQAAAAeana4AAAC90lEQVR4nN1ZDZnDIAzFAhawUAu1MAu1UAtYwAIWsFALtXAWdvyUjdEEQsd61z2+27frBoFH8kgYY/8Tgo1Au7alk8CZZHegqQtbOhXKL0J8laUTwdliF2W+ytKpGNiPXZZ8Y4QJeMbZ7QOWAAg74LP9hXNPPqyGw/2XnYI5T4NoetcSAEef9o7t2n7P3sVgF2dsK22N06XlsAWeEZj/389SYQqBvr6uzR/bEppBKORstZ9CQUi3o4D3/S0hiMd6z53hXmsWLwrav7/bV5hAVRH1gc1+nBndgEBamby6JXEkG3QLlZun8LauBWg7mk7+N+gGjdY+bne0fWb7yu2fRn0nEFcjr2zJ0Xfz/tlEoPSDyq7qF+TgFat/li/fnYj4dKdswRqNEGHHXotzKluKo5g2EQu+5wbvqX6jH01Xn3HvWxjEjm6OeE/d+8qWIpw+Ly0iJh/7+1PdPzrG7bB4xf7ZktGZzy33YBgU7StbCrj53jO9PhGJx7UVNsZTgSuJtp/moZLTpwAtcvIdczND8gPKyVuzFPsKBvk8CpUQNoHaBGPczup6ODwxZMELl/GphBhCmUXJ++qWwrf0dvKuBE/dFvQ0xQFtKvW8N55RKtuemCyZrC2P7xhC8FKqjrqlcLDE6svQchCTBeviczMabrZ3SwLKD2SWihAN0AbyA6VZSvlAicLRHxXp5aHuXxUm07sTEgdohv1yURwyOzTXumysBD3oBX2APAfpPfYZIdNHboiFndurt8maME1sf9saC63eOEqew+y3OWiV+tD1utkpvtgcCYnEQNR+Mrpz6RbHPEpeQKhFzwji1GbBngSSWoeW5IUGvSnsF0GgSYdoSF4o0C9iMPibv8tDI77nsDTVHnU7qZIqQG8vh7EYoJJ4+rrfE8ok5+Sx1tuM/4m1eDUQy7Fy9heOHuz60yEeGGnbX2JdDnP1cIg3w6ZQV0SSMV+Kn+/bpcF9Pl0OoFhgG/RyvO59GH1f90srBEqWJaxnftmv9jh+AYs44l+tJD+aAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and performs induction from the back of the sequence rather than the front. The combination of both upward and downward simulation <em>is</em> complete. The proof of this is presented in de Roever and Engelhardt’s book.</p>
<h2 id="syntactic-abstraction">Syntactic Abstraction</h2>
<p>Many programming languages provide features that are commonly called <em>abstraction</em>. The most common is the <em>module</em>, consisting of one or more <em>types</em> (usually left <em>abstract</em> in the sense that their implementations are hidden) coupled with <em>operations</em> on those types. We can consider a module’s <em>signature</em> or interface to be an abstract data type in the semantic sense, where any type-correct implementation can be considered a refinement. In this sense, module systems in programming languages make it substantially easier to do the kind of data abstraction I discuss above, as both abstract and concrete versions are in a machine-readable structure. However, the presence of a module system is neither necessary nor sufficient for data abstraction to be possible.</p>
<p>A perhaps more common use of the word <em>abstraction</em> in the Haskell community refers to the <em>λ</em>-abstraction<a href="#fn9" class="footnote-ref" id="fnref9"><sup>9</sup></a>. Seeing as <em>λ</em>-calculus-based languages have a very different semantic domain, based on Scott domains, I can’t directly relate the notion of <em>λ</em>-abstraction to the kind of semantic abstraction I present here. I’d be very interested to see some explanation to see if there is a solid connection between the very <em>syntactic</em> notion of abstraction we see in functional languages, where “abstraction” essentially refers to <em>parameterisation</em>, and the kinds of semantic abstractions we see elsewhere.</p>
<p>If you enjoyed this article and you’re a UNSW student, this article is a whirlwhind tour of the second-year <a href="http://www.handbook.unsw.edu.au/undergraduate/courses/2017/COMP2111.html">COMP2111</a> course, taught by Kai Engelhardt along with yours truly. The course goes into substantially more detail on the <em>specification</em> and <em>derivation</em> components, including a detailed study of Hoare Logic and Carroll Morgan’s refinement calculus. Feel free to enrol if you’re interested<a href="#fn10" class="footnote-ref" id="fnref10"><sup>10</sup></a>.</p>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>In my undergraduate years, I remember thinking that data abstraction had something to do with header files or object-oriented programming.<a href="#fnref1" class="footnote-back">↩</a></p></li>
<li id="fn2"><p>Further internationalisation is left as an exercise.<a href="#fnref2" class="footnote-back">↩</a></p></li>
<li id="fn3"><p>This is why deterministically simulating a non-deterministic program is exponential complexity in the worst-case.<a href="#fnref3" class="footnote-back">↩</a></p></li>
<li id="fn4"><p>Here <img width=43 alt="\textbf{\textsf{skip}}" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAeCAQAAAA25NDSAAABvUlEQVR4nO2WXaGGIAyGqUAFK1jBClagAhWsYAUrUMEKVrCCZ6CwMYZ6vp/jzRk3ojAext6hUvfMqg3afDJCqyWM2VR/0+evzB3Ou+qI7hixqelpAPcMQJsAhmcAlDKwtG/6KYCv2h8BNCC3CRbzbcjkJAG00OtgDtpZvw/HY2FW1UxKo9jWBMEB2qT6Jc2f2RjsW/CEXp2cJVFGc4hBnGxFgDY5XMmOuApwG3xjYkEbWRFp4Bl3QwHk5c8AhjCuTdvaINqFOUHDhn31AKayfB0Afeo0V4iBO5yaLI04wEjCyE/yGkDBc3xb5AF+8hgTnD4d4shXefl7AFiwC0HrIllWMogDSPX+TQAqLUSIp8wBpIr/NoCPgoHg55rlAHPVxQcAojUk13OAUamUiCtL1zsAfXpbVETDtNmLAHucYhRyMd0BQPjCfNmxpN9VAWgpos6vAZo0bywB9l0tAOGvkP7ox8qYA9B7A6+sGsB2/CP0JMmFWjOTCdi4CqRgRmc1gPIuEArxroAcYiGZuv8V5+p3zN1UBaJFzp3nvw4HwO/114xGRH/M64sAj9g/wOMAUX72euh3rAkCFDWP9gO/jCaQ2DBM8wAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> is just sugar for the program that does not change the state and always executes successfully, equivalent to the trivially true guard, or an assignment <img width=61 alt="x := x" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAAARCAQAAAAY/BgYAAABLklEQVR4nMWWYRWEIAzHV4EKVKACFaxgBStQwQpWoIIVrgIVuIHg07tzMB68+++D740Nf+JgAFw1gQYBd8kvz3gxOCZ4gUfbb8MKHHooWcyxHT+NxWHQaVLCdnoFehxO9CwdMzwsnaCZHCoN7zFBJ++OwYp8jUrYOUMz7Pd8TRwSA3z6HWsROmjCEpnPbF9tlpyVzWHipDNaDfQ4sTlCZbk/QzdwzF03WbvYHCH8NY6nWiyOfADN5dChYnGE417EhJb1ttW29uQQ6Vg/6sowoSVm1Bq9hkwOe56nx4Gfd7EkXjARo61icSwYkAeOtu3wKbHNPjUHEduC6wzO4gid6Vpx29nR9serUr6TcMuJEpNjufyMoHwzWIn73YjVZnN83rEEbolSj5IY07u2ixxvuZjjLoqv+J0AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>.<a href="#fnref4" class="footnote-back">↩</a></p></li>
<li id="fn5"><p>Because all of the semantic relational operators (<img width=18 alt="\cup" height=14 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAVCAQAAAAd112uAAAAfklEQVR4nGNggAFBht0MhMBuBiV0IReG/0CMH2BRMaptVNtg0yZIUBvIYGNM4bsMHXi1dTC8wyWMxTQoUALK4jD2DE6NxkC5M0CPYAWgHP6fYSZaHlYC2vIfKINDEwSkAf34H4h3AxV3AEkILw2fFoSTOoB27gbCVUAWFmcDAIVERImbu6vvAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, <img width=10 alt="\fcmp" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAQAAAB+Wt03AAAAoklEQVR4nLWSURGAMAxDawELWJgFtGBhFrCABSxgAQuzMAuQpsDB1oPjg/BTeF3bpYhc1cuMZxBHjWRZiVdEbYlHfO4YtYimEuvJQ1rhG07oeCjjrVDEiYTunSyInOkjgSa5V/tV4exdeabQhhqQ5Ji6nPd+NTUh+QE/mtpwwEJmqu47c/OVIuFE16uVyP4zWPGxhranwOKOMkeytbpSz25oA3dnTl2BSfg1AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> etc.) are <img width=25 alt="\subseteq" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAaCAQAAABxjObzAAAAo0lEQVR4nO2UURGAIBBEtwIVrEAFKlCBClawghWoYAUrWMEKuDf8ouK4M/64O8MX84A7boFeDZiwoDS9d1MoR1DBxjUhNOz7UR4rz05PTj+/1U6YU6DAOslQgbV6UJFrZVqmoim8SfpIg8lksEGHK4g6WMasgyVlC6QTYNEjnE1LjY2WNcKxDTXP4ts8q7KkXRVJ++szRU7AvTvT2PND3Husmw/FBFeH2lT1tQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/>-monotone, this relation enjoys all the usual congruence properties. You can refine a small part of a program, and the resultant program will be a refinement of the original whole program.<a href="#fnref5" class="footnote-back">↩</a></p></li>
<li id="fn6"><p>The notation <img width=58 alt="\psi[\sfrac{e}{x}]" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAgCAQAAADN5iyeAAACfUlEQVR4nM2YfZmEIBDGqUAFK1iBClSwghWoQIWtQIWtYAUrcAP4BQwwonfPjf+sLsz8hJkXkLGnpo5reOzrD3xb9mWm2yWHvmPxX+fVwGWZoLmboHG9KdlVAWgF5JYRYyho2Gr6DHeBGG37J7gT9Kak0J/gDk0UwzQFg4o7d+IK9oFpdiWygo+SCfLMENuJLlwNkOHZCL8sTDluGjSFZr+I6xJIRncG7TdUXqQVw9sIzj+XUDmujP7FXHG4Xy5IBu5wKCdhVMtwOYBaf111MMYNU5uKeuxKbqM5QM66QiovAStJwlBc7jsLyKV4NGPc8ELp1MaulB9dt85NVfl3EtZeHgq4bOsqq7gcQGymlDnuStDShShhBdxgQxU3jIlNpCl2JZAXyk0gSdWByxq4zGevSnqkpWYhbU6bkHH8RCk1+W3MFV8neN24JsteTMisz10BvxdAS3P0KmGuxNW2oOztNPR6Ebc2uidwGGUsjLpI3W76mBMNMdIXfIRby91gHJ6JQuVzVMJCGUuAxUqwinvi4LlbU4a2zYUdrvQJgetFFfd893xVi8uoB7csYd9s5pox4rpOcQ2iqfdwZVHmxqTgSDG+kW7GuArdlNzDNcUNzwKgCpm9aoywEHw34Cuu2xZim5U7uEO0WzuNQ0TJQhnuQzJcxrkSY5chDQ7mrfRmv9nG16E7uBqRsPB8H1O5xXZ7YRLuvpsyh3ou2SrTh8sLpTRG+ayTcr8Ro+80UbLyIT0uvrG3nN/FpR3SH8Sg4c6kwzf1kJ4apx9BA279RLVn+NrYEhpUouq2HN5v4NankHYmoB/SH0QRfhV/4+tfScJeNvp5qm7tLzok+wEoQXnZh3yhjwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> is a substitution, substituting the expression <img width=15 alt="e" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAARCAQAAABzuJQIAAAAr0lEQVR4nIWSARGAIAxFV8EKVLACFVaBClagglmsYAUqrIKODdF5Qz933MHe/f2DAXhCyLDJSm69K0IBglXwg9cO0whNUg7tlAVffRS5RB2tKoK73rWUzY1Gib6vLSTuU2DxfDWhKvCJ2Bf9vFfLif12eY8wAm/4kMbD57Jw/sOemYcprZavL3hrbplnc4uvb+rS1NTHB/mGRsEubx2gum9fD4htGhT/GdCqyBB6jifhOVQ1y01p3wAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> instead of the variable <img width=15 alt="x" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAARCAQAAACcev82AAAAu0lEQVR4nI2SWxHFIAxEYwELWMACFq6FWqgFLGChFmoBC7WAhXbDoxcmzDSbj07DSSawIRr1I0+GZlmRaehFNyJNx44yMkIBydAKjjdrkMloJOTacSoFvmUTYLca5T9pLgOx4hdcx+L+G0IBs/gGWQsT+nL/XQezGL+0cH/QTQOzXaYUKPqbZkudP3zhJ6KqGtZfx67gHUA/8AXP+FqsxSlhdjQO/0cpkGs39B6t6RsU1ytMYvcMrjx5+wCUhUrYrBXPkwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>.<a href="#fnref6" class="footnote-back">↩</a></p></li>
<li id="fn7"><p>The view of types as abstract interpretations is expounded in great detail in <a href="https://www.irif.fr/~mellies/mpri/mpri-ens/articles/cousot-types-as-abstract-interpretations.pdf">Cousot’s paper</a>.<a href="#fnref7" class="footnote-back">↩</a></p></li>
<li id="fn8"><p>Doing the refinement to a dynamically-expanding array is too much pain for this article, but feel free to do it as an exercise.<a href="#fnref8" class="footnote-back">↩</a></p></li>
<li id="fn9"><p>A lot of Haskell programmers don’t seem to value semantic abstraction anyway. Perhaps this is a case of anti-modular language features such as type classes making real abstraction fall out of favour. Or perhaps Haskell is already so abstract there’s not much point in further abstraction.<a href="#fnref9" class="footnote-back">↩</a></p></li>
<li id="fn10"><p>Assuming UNSW hasn’t gone to hell, the course isn’t cancelled, and the teaching staff aren’t driven out due to poor management — a big assumption.<a href="#fnref10" class="footnote-back">↩</a></p></li>
</ol>
</section>

<div class="tags"><a href="/tags/verification.html">verification</a>, <a href="/tags/semantics.html">semantics</a>, <a href="/tags/abstraction.html">abstraction</a>, <a href="/tags/refinement.html">refinement</a>, <a href="/tags/types.html">types</a>, <a href="/tags/comp2111.html">comp2111</a>, <a href="/tags/imperative.html">imperative</a>, <a href="/tags/reasoning.html">reasoning</a></div>
]]></description>
    <pubDate>Sat, 08 Jul 2017 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2017-07-08-abstraction.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>Trifecta at Nara</title>
    <link>http://liamoc.net/posts/2016-08-01-trifecta.html</link>
    <description><![CDATA[<p><img src="../images/nara.png" /></p>
<p>I have had considerable success at ICFP2016 and co-located events. I will be presenting two papers: one at ICFP, on the <a href="http://ssrg.nicta.com.au/projects/TS/cogent.pml">Cogent</a> project; and one at TyDe, about my work on proof-automation combinators in Agda. I also co-authored a two page paper that was accepted to the ML workshop, also co-located with ICFP, but I will not be presenting the paper. Details of all three papers are presented below.</p>
<p>Liam O’Connor, Zilin Chen, Christine Rizkallah, Sidney Amani, Japheth Lim, Toby Murray, Yutaka Nagashima, Thomas Sewell, Gerwin Klein<br />
<strong>Refinement through Restraint: Bringing Down the Cost of Verification</strong><br />
<em>International Conference on Functional Programming (ICFP)</em>, Nara, Japan, September 2016.<br />
<a href="http://ts.data61.csiro.au/publications/nictaabstracts/OConnor_CRALMNSK_16.abstract.pml">Available from CSIRO</a></p>
<blockquote>
<p>We present a framework aimed at significantly reducing the cost of verifying certain classes of systems software, such as file systems. Our framework allows for equational reasoning about systems code written in our new language, Cogent. Cogent is a restricted, polymorphic, higher-order, and purely functional language with linear types and without the need for a trusted runtime or garbage collector. Linear types allow us to assign two semantics to the language: one imperative, suitable for efficient C code generation; and one functional, suitable for equational reasoning and verification. As Cogent is a restricted language, it is designed to easily interoperate with existing C functions and to connect to existing C verification frameworks. Our framework is based on certifying compilation: For a well-typed Cogent program, our compiler produces C code, a high-level shallow embedding of its semantics in Isabelle/HOL, and a proof that the C code correctly refines this embedding. Thus one can reason about the full semantics of real-world systems code productively and equationally, while retaining the interoperability and leanness of C. The compiler certificate is a series of language-level proofs and per-program translation validation phases, combined into one coherent top-level theorem in Isabelle/HOL.</p>
</blockquote>
<p>Liam O’Connor<br />
<strong>Applications of Applicative Proof Search</strong><br />
<em>Workshop on Type-Driven Development</em>, Nara, Japan, September, 2016.</p>
<blockquote>
<p>In this paper, we develop a library of typed proof search procedures, and demonstrate their remarkable utility as a mechanism for proof-search and automation. We describe a framework for describing proof-search procedures in Agda, with a library of tactical combinators based on applicative functors. This framework is very general, so we demonstrate the approach with two common applications from the field of software verification: a library for property-based testing in the style of SmallCheck, and the embedding of a basic model checker inside our framework, which we use to verify the correctness of common concurrency algorithms.</p>
</blockquote>
<p>Yutaka Nagashima and Liam O’Connor<br />
<strong>Close Encounters of the Higher Kind: Emulating Constructor Classes in Standard ML</strong><br />
<em>Workshop on ML 2016</em>, Nara, Japan, September, 2016.<br />
<a href="http://ts.data61.csiro.au/publications/nictaabstracts/Nagashima_OConnor_16.abstract.pml">Available from CSIRO</a></p>
<blockquote>
<p>We implement a library for encoding constructor classes in Standard ML, including elaboration from minimal definitions, and automatic instantiation of superclasses.</p>
</blockquote>

<div class="tags"><a href="/tags/cogent.html">cogent</a>, <a href="/tags/verification.html">verification</a>, <a href="/tags/agda.html">agda</a>, <a href="/tags/model-checking.html">model-checking</a>, <a href="/tags/types.html">types</a>, <a href="/tags/semantics.html">semantics</a>, <a href="/tags/compilers.html">compilers</a>, <a href="/tags/standard-ml.html">standard-ml</a>, <a href="/tags/ml-modules.html">ml-modules</a>, <a href="/tags/testing.html">testing</a>, <a href="/tags/icfp.html">icfp</a>, <a href="/tags/tyde.html">tyde</a>, <a href="/tags/ml-workshop.html">ml-workshop</a></div>
]]></description>
    <pubDate>Mon, 01 Aug 2016 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2016-08-01-trifecta.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>Publication Storm for Cogent!</title>
    <link>http://liamoc.net/posts/2016-06-11-publications.html</link>
    <description><![CDATA[<p><img src="../images/cogent.png" /></p>
<p>The language I have been working on for the last couple of years with NICTA/Data61, called <a href="http://ssrg.nicta.com.au/projects/TS/cogent.pml">Cogent</a>, was recently accepted to ICFP 2016, topping off a string of publications at ITP 2016 and ASPLOS 2016.</p>
<p>The ICFP paper, entitled “Refinement Through Restraint: Bringing Down the Cost of Verification”, outlines our approach to the language design, the implementation of its certifying compiler, and the various refinement proofs that it generates.</p>
<p><a href="http://ssrg.nicta.com.au/publications/nictaabstracts/OConnor_CARLSNMKHHT_16.abstract.pml">The paper will be available from NICTA</a> after publication.</p>
<blockquote>
<p>We present a framework aimed at significantly reducing the cost of verifying certain classes of systems software, such as file systems. Our framework allows for equational reasoning about systems code written in our new language, Cogent. Cogent is a restricted, polymorphic, higher-order, and purely functional language with linear types and without the need for a trusted runtime or garbage collector. Linear types allow us to assign two semantics to the language: one imperative, suitable for efficient C code generation; and one functional, suitable for equational reasoning and verification. As Cogent is a restricted language, it is designed to easily interoperate with existing C functions and to connect to existing C verification frameworks. Our framework is based on certifying compilation: For a well-typed Cogent program, our compiler produces C code, a high-level shallow embedding of its semantics in Isabelle/HOL, and a proof that the C code correctly refines this embedding. Thus one can reason about the full semantics of real-world systems code productively and equationally, while retaining the interoperability and leanness of C. The compiler certificate is a series of language-level proofs and per-program translation validation phases, combined into one coherent top-level theorem in Isabelle/HOL.</p>
</blockquote>
<p>We also were successful at ITP 2016 with our paper “A Framework for the Automatic Formal Verification of Refinement from Cogent to C”, where we present the details of our low-level translation validation refinement framework. This paper is <a href="http://ssrg.nicta.com.au/publications/nictaabstracts/Rizkallah_LNSCOMKK_16.abstract.pml">also available from NICTA</a>.</p>
<blockquote>
<p>Our language Cogent simplifies verification of systems software using a certifying compiler, which produces a proof that the generated C code is a refinement of the original Cogent program. Despite the fact that Cogent itself contains a number of refinement layers, the semantic gap between even the lowest level of Cogent semantics and the generated C code remains large. In this paper we close this gap with an automated refinement framework which validates the compiler’s code generation phase. This framework makes use of existing C verification tools and introduces a new technique to relate the type systems of Cogent and C.</p>
</blockquote>
<p>Lastly, Gernot Heiser recently presented (on behalf of Sidney Amani) our systems paper at ASPLOS 2016, where we outline the implementation, performance, and verification of two case study file systems using Cogent. This paper is available from NICTA <a href="http://ssrg.nicta.com.au/publications/nictaabstracts/Amani_HCRCOBNLSTKMKH_16.abstract.pml">here</a>.</p>
<blockquote>
<p>We present an approach to writing and formally verifying high-assurance file-system code in a restricted language called Cogent, supported by a certifying compiler that produces C code, high-level specification of Cogent, and translation correctness proofs. The language is strongly typed and guarantees absence of a number of common file system implementation errors. We show how verification effort is drastically reduced for proving higher-level properties of the file system implementation by reasoning about the generated formal specification rather than its low-level C code. We use the framework to write two Linux file systems, and compare their performance with their native C implementations.</p>
</blockquote>
<p>This concludes a string of publications for our project in the three main fields it intersects: programming languages (ICFP), systems (ASPLOS) and formal methods (ITP). Congratulations are due to everyone on who contributed.</p>

<div class="tags"><a href="/tags/cogent.html">cogent</a>, <a href="/tags/linear-types.html">linear-types</a>, <a href="/tags/verification.html">verification</a>, <a href="/tags/data61.html">data61</a>, <a href="/tags/publication.html">publication</a>, <a href="/tags/icfp.html">icfp</a>, <a href="/tags/itp.html">itp</a>, <a href="/tags/asplos.html">asplos</a>, <a href="/tags/file-systems.html">file-systems</a></div>
]]></description>
    <pubDate>Sat, 11 Jun 2016 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2016-06-11-publications.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>Bits of Hackage for <tt>liamoc.net</tt></title>
    <link>http://liamoc.net/posts/2015-11-11-blog-like-mine.html</link>
    <description><![CDATA[<blockquote>
<p>Work hard, boy, and you’ll find,<br />
One day you’ll have<br />
A blog like mine, blog like mine,<br />
A blog like mine.<br />
— Cat Stevens [Paraphrased]</p>
</blockquote>
<p>Over the years many people have asked me to share with them how I developed this website, seeing as it has a variety of very nice features including:</p>
<ul>
<li><p>Embedded LaTeX math actually rendered with LaTeX and embedded in the document. This means I can use LaTeX packages like <code>tikz</code> and <code>xypic</code> for diagrams, as well as well typeset formulas inline with other text with baseline correction. An obligatory demonstration: For inline math, <img width=117 alt="y = mx + b" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK8AAAAfCAQAAAA7UVWLAAAC+0lEQVR4nO2ZbbWEIBCGqUAFKljBClvBClagghW2AhWsYAUreIfPFRkQUHfv8fjyaxFleIBhhiXkUY0oaaFwVR6drokspohfm3JXtQ/efMntXiqJ932BLTeUXIulkngf35ulB++luhwvIz0UinaN1Z4tCr1z0nk1254bqGHo2y/ESlZg91G8DCznMALUOkqGSKDRQs1S4fZL1ZPZWKD76shofusBMLDQttgeJy8TKI0ezgbaj9n9H8GrGS2evd6nJxUga/P9GRerIV8nAaUHbNo8iWuGmsnhHNTECwd4vcY5QOSm7Qc8Vd94ZVtQj5erieXOhgVG4okapFw99Je3QOpC0/ILLmbssDvIttMWzYCTmhYiWCGNeTJ6C2GEt5qk1dsx1OGV1lo61oYJb96rh744UueLrTbGXtkLwudNG4rAjB0oTL2t3cFQCLcer++oLAu077YK75kSwRSIAGb8vObGcXTFcM+LHPw9FHTx//GOiXBoUq5kDy5FnFavoIQl5RYxvPy/4+XFNR912NESaZVXUt8qxFvne8/UUbwkdbQ4sYLVm4qc43jRtzCU38U7ZcCcE3htcNRFnsd1lu/l8enFArMcvCK7DMUGlxxtMl6mCvDe+g11Ft4hPvmY38gJzHh22VtVR/BSk0Z0iQmI6yy88mCNHIehYTaM/5ZwvO+gDbYLhIs5Ri/2TKdEVrV4/bS7TzkmHbLPZv0ylSZPP8YbJiP68KLKwtENpl+5tdaNg8HU5P2fUIN3G+PKW46k+7NZ82zyp+bLR1suXgl47TbYZmBvF1iNmbdmNXhtys7h7ZfKFHecX7O6ldKzIoINcKWW4BpGgvRjz8EtgU/LnviJqM3+h+wryRq8H1s05Ky+/GgvzKOuVBiOh/mXvRf2B7O9G6PQ4uorHSkdQ5em4E6pKPNOqsV7SAwJ1e4pVnA3fKATX/yrnvfmoupfi/XvmUTuLh+VS4cz9pxm6vQtz94fRfQyYdmkMiAd9z46UTKcGQDrG5zEg/aw/gC/BT4SN+4zUAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, and for display math:</p>
<p><img width=205 alt="x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}" height=51 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-17px;"/></p></li>
<li><p>Literate Agda support, such as in <a href="http:/posts/2015-08-23-verified-compiler.html">this article</a>, with semantic highlighting and hyperlinked jump-to-definition, even for the standard library imports.</p></li>
<li><p>Citeproc based bibliography support, which reads BibTeX databases. Most of my technical articles make use of this, for example <a href="http:/posts/2015-11-10-patch-theory.html">this article</a>, and the article linked above.</p></li>
<li><p>Atom-based feed support (see the little button at the bottom of this page)</p></li>
<li><p>Syntax highlighting for most other languages, such as Haskell, visible in <a href="http:/posts/2015-11-10-patch-theory.html">the same article linked above</a>.</p></li>
</ul>
<p>Up until recently, I was very reluctant to share the code for this website, because, among other things:</p>
<ul>
<li><p>LaTeX rendering was accomplished through the use of an ancient, barely working piece of C code I cribbed from the GladTeX installation. It was very system dependent - it required <code>latex</code>, <code>dvips</code> and <code>gs</code> to be in exactly the right places to work correctly. The formulae were then embedded in the HTML document by <span class="underline">postprocessing</span> the output of Pandoc with <code>tagsoup</code>, and detecting any equations in a very ad-hoc way. They were cached using a liberal mix of <code>unsafePerformIO</code> and hacks, which barely worked and typically caused problems if the LaTeX failed to compile.</p></li>
<li><p>The bibliography support relied on a hacky workaround I had written to provide <code>Binary</code> instances for an unexposed part of <code>pandoc-citeproc</code>.</p></li>
<li><p>The site would mysteriously corrupt its own Hakyll cache for no reason.</p></li>
<li><p>The Literate Agda compiler was hardcoded against an old version of Agda and was pretty unmaintainable.</p></li>
</ul>
<p>However I am pleased to announce that now I have cleaned up all of these problems. The LaTeX rendering has been completely rewritten in Haskell, and is more configurable and useful. It’s provided in my <code>latex-formulae</code> suite of packages, available on <a href="https://github.com/liamoc/latex-formulae">GitHub</a> and Hackage under the following three packages:</p>
<ul>
<li><p><code>latex-formulae-image</code> - Basic support for rendering LaTeX formulae to images using actual system LaTeX.</p></li>
<li><p><code>latex-formulae-pandoc</code> - Support for rendering LaTeX equations inside pandoc documents, and a standalone executable that can be used as a Pandoc filter.</p></li>
<li><p><code>latex-formulae-hakyll</code> - A Hakyll compiler that uses <code>latex-formulae-pandoc</code>, and adds some useful caching for Hakyll <code>watch</code> servers.</p></li>
</ul>
<p>The Agda code has been cleaned up and packaged into two useful Hackage packages, also available on <a href="https://github.com/liamoc/agda-snippets">GitHub</a>:</p>
<ul>
<li><p><code>agda-snippets</code> - Support for preprocessing <em>any text</em> document and replacing Agda code blocks with coloured, hyperlinked source in HTML. It leaves the rest of the text untouched, so it’s possible to then read the output with Pandoc.</p></li>
<li><p><code>agda-snippets-hakyll</code> - Adds some basic mechanisms to integrate <code>agda-snippets</code> with Hakyll and Pandoc.</p></li>
</ul>
<p>The bibliography workaround is no longer necessary, due to fixes in upstream libraries.</p>
<p>The other features (feeds, highlighting) are all just provided by Hakyll built-in. The source of this website itself is also available on <a href="https://github.com/liamoc/liamoc.net">GitHub</a>, in particular the <a href="https://github.com/liamoc/liamoc.net/blob/master/site.hs">Hakyll code</a> for it may be of interest.</p>

<div class="tags"><a href="/tags/hakyll.html">hakyll</a>, <a href="/tags/haskell.html">haskell</a>, <a href="/tags/agda.html">agda</a>, <a href="/tags/blog.html">blog</a>, <a href="/tags/latex.html">latex</a></div>
]]></description>
    <pubDate>Wed, 11 Nov 2015 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2015-11-11-blog-like-mine.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>The Theory of <tt>patches-vector</tt></title>
    <link>http://liamoc.net/posts/2015-11-10-patch-theory.html</link>
    <description><![CDATA[<p>Recently I released the Haskell library <a href="https://github.com/liamoc/patches-vector#readme">patches-vector</a>, a library for simple, but theoretically-sound manipulation of <em>patches</em>, or diffs, on a “document”, which in this case just consists of a <code>Vector</code> of arbitrary elements.</p>
<p>I approached the development of this library from a formal perspective, devising laws for all the operations and rigorously checking them with QuickCheck. I defined a patch as a series of <em>edits</em> to a document, where an <em>edit</em> is simply an insertion, deletion, or replacement of a particular vector element.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">newtype</span> <span class="dt">Patch</span> a <span class="fu">=</span> <span class="dt">Patch</span> [<span class="dt">Edit</span> a] <span class="kw">deriving</span> (<span class="dt">Eq</span>)</a>
<a class="sourceLine" id="cb1-2" title="2"></a>
<a class="sourceLine" id="cb1-3" title="3"><span class="kw">data</span> <span class="dt">Edit</span> a <span class="fu">=</span> <span class="dt">Insert</span>  <span class="dt">Int</span> a</a>
<a class="sourceLine" id="cb1-4" title="4">            <span class="fu">|</span> <span class="dt">Delete</span>  <span class="dt">Int</span> a</a>
<a class="sourceLine" id="cb1-5" title="5">            <span class="fu">|</span> <span class="dt">Replace</span> <span class="dt">Int</span> a a</a>
<a class="sourceLine" id="cb1-6" title="6">            <span class="kw">deriving</span> (<span class="dt">Show</span>, <span class="dt">Read</span>, <span class="dt">Eq</span>)</a></code></pre></div>
<p>We have a function, <code>apply</code>, that takes a patch and applies it to a document:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb2-1" title="1"><span class="ot">apply ::</span> <span class="dt">Patch</span> a <span class="ot">-&gt;</span> <span class="dt">Vector</span> a <span class="ot">-&gt;</span> <span class="dt">Vector</span> a</a></code></pre></div>
<p>Patches may be structurally different, but accomplish the same thing. For example, a patch that consists of <code>Delete</code> and an <code>Insert</code> may extensionally be equivalent to a patch that does a single <code>Replace</code>, but they are structurally different. To simplify the mathematical presentation here, we define an equivalence relation <img width=37 alt="(\simeq)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAgCAQAAAAcASjuAAABcUlEQVR4nLVXAbHDIAzFAhZqAQu1gIVZmAUsYKEWaqEWvoVa6JLu7l+7vRdoYY/b3VpoHpC8EJxjiLSnDt6F2qGj+3O5kW5wi5uFtIJsk18PZJl2gdDLkNSFTDFLM5HcWrMFlSjuVLvXPu1NvDPIbFpj8owkFuluPa3OW4jWAibxXF8MQkdDbzEiyYvTY0EiA3i3cZu8SyN229tqCAXtzSKN0mFTWXpUj0n+Ke0C1xGg4VnGQwRCp+5+Hp51pSsIgAxFROlGQrd8vdV16NhjFD+IpPNVOiQOv5tRP457COkTThBUeZhupOET/8Nno2RvOhjPmM4bkehlC7NMJxkCuUjXCqVDcfxDOggmhB/RcZm3YLLojNPpJqjMWYpO1e0B6WiKniUzfmLYP6hrSHtGfWC49TbO+faEfkXf0aJR4PYs+xQJuKe++zK+T5MTvKRduteXEct1dIBH5x3oXaPiYhLKxXYRb/lU34JgDr8Ajyy8AHaiqVcXitb6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> that captures this <em>extensional</em> patch-equivalence:</p>
<p><img width=332 alt="   p \simeq q \stackrel{\text{def}}{=} (\mathit{apply}\ p\ d = \mathit{apply}\ q\ d) " height=29 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-6px;"/></p>
<h2 id="documents-and-patches-form-a-category">Documents and patches form a category</h2>
<p>To define further operations, we must first note that patches and documents form a <em>category</em>. A <em>category</em> is made up of a class of <em>objects</em> (in this case documents), and a class of arrows or <em>morphisms</em> (in this case patches). For each object <img width=18 alt="X" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAQAAAChSU5wAAAA6UlEQVR4nJVUYRWGIAxcBStQgQpUoIIVrEAFKlDBClSwAhX8GI49lcGHxw/f3rgNbocAFRpcXnteASQssOV8kzMQ4aS1CrS9ZIxUURH1yLWf2Lrl6ChH2eBe5dKIhLCFlh799qaQgOsWnmP3iLrQJIziaIKE8IWGYuNdYyNQB0uRAOUOgqoDbDxDPU9CxJcwk6iDUF9IC1vtU7+Q+6xEFH0oAQds6YsOncLKVpIdKgJdETmyc2O4Bn3fdDk0dhlQ9Xs/mvPfQb1Y1w3ePKfbW1RhxBvawXCrMKntmMpfq2clTxP87FFzL/kDL82A5llNt+cAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, there must be an <em>identity morphism</em> <img width=119 alt="id_X : X \rightarrow X" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALIAAAAdCAQAAACkyf7YAAADK0lEQVR4nO1aa7msIBSlAhWoQAUrWMEKVqCCFaxgBSpYwQpeXjqgG+WxHc/9vln+OSoDy+V+sT2EhOBEkJ7cgZKGtGqkIOx2bD24WWlSxxhh06v78L0/yImRhazquJa5N2Ps0dTzvUVD5L5eB9yfvsYEhVPjfiZuF2FukW892rberGwkRB990D/LSb+BRTnDPcSX7YeqhzkbgPW9NySu4pQisMa3RSYqC6zGBHy7mZL87jk8zKl5IRLaSDfs5yI4ewePcnpDZO5yBtvPcCVOC5SVnFhCWdaYg74iMlEPoFfVpZGOh/KUcuowF7l5BifqoqzOljCYm24ygX1BFHkys6YIRvd1RyCr10JEnx2FE1e3B7XI4pn+ccSijq2C3mplDJG3wvF+E+SvvBa49h2YmrUt+F0iJ+aEFZGh3MjvExjQROaZL0weUg0mhkL/yOJkreoM69A+esRw0aq502vdrWx6Ykuvo2rJBj2LEyyyvdoC144is4jD4AlC9w3tM7asfXbMtOZMTrDIA3D1KDLfFwoF5cl7yDSMarYOMSOcofPTnDV3JidYZL15lODIcEortB9WtPthSiycR4nLOsjH1vTKP+ZE/8vmJECR11NEjsVkm8Q+8XVElVhbi61k4a4BjCb7sKaSZssFnCCROShyrHchyGcvL1Al5oE/tY8VcoNXqj7CKS7yMVzEG0TSJYAOVWJb8vvzTSCvWgwZrAs5xcPFesi4cZHtS+mV82BKLE+OyEhq9zsdbUY6LeYkvPqA7k4DxZqrVmduG5Sqh7tOMgNoH1sjAK+fnNO9KOZkhwxKoE4t2AdXF0+2LvhQdawqKcmpY6nrhcRlju1Dt1SDFZm7k7/GUcFpC92hSJ8ySJrPh4vpdFjhB/N3uIx0d9P6AHcfvdqLV7bxXVCseUo2jEpOEhzAvWpzMXKw/SzMxNS8iLDKuMadJS/mq3Dsrn2dxxddhvT2UDWnBoym9iO38Gi05t8H6GGUdMUePW1M4mDqlZZvvBu0TXuD1jzF4wTA72Jx9Nz/A7Fu4od7gZz7fzASH+1W/mTGhAA7sTZhzkXfG35IBkP/Evff4R+Vy1jEhcCcuAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, and for each pair of morphisms <img width=98 alt="p : A \rightarrow B" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJMAAAAfCAQAAABJnjc9AAACwklEQVR4nO1a3ZmEIAykBVugBVugBVuwhW2BFmiBFmjBFmjBFu74dV0NEFY87sHh6TyBMEkmwW8J+WtQwneD/vn+e4xEAYOTl/lPZ1iaJFnIjxtTV1sGs78IlizBcZJo97fqT5U10BvHexti4IliuyczWc2T1VjZGXzzYX/wE03EpN0/cOJgPMVD4nX3GEgTC4nXFdwFNP8H6uStSdEkOlnk4GPJ1pm7Anutkl+Ipsk9m6HX6aFEUzOVmwmt04Jv4miFUjde3UJXkQ/RpGDdHLbC6M1m7kU/VpjVw6IKSSfdRZDfs33vxKvIP9M0O5JOdlGzrAhl0KqFdHSpHVW5IGbhnRfKKLEjZk6H9iXQKs37pIk6CznsdG/4KxxYbZPGQJ3MbDOGWSzzzv7dtzAOxbW/hTBuxooFD62JDQvtAqRwEgaIauxwcpjMBriYUIckW1xSt8dgDouln4eq5rvwSJVIiwEDoiL2yy0UhAVfvYcspvS3sHkgURF11qaozIlCANFEwhRMSpWgN637HPd0u6PZr5hABK508dSgwuVouo4ZaNgGp32YKwsNKlk/dCETYJomkrxMpWm63t14Qs6+9WmHSQ5WPZaPcpQCTBNJa3KaputtOyfwHemupsBWuxXVpDSiSTdQJprUN3pTUyDQVxaYJm8XWIUhmmgiCuogM6sszSrpG1OFa2GaYpsAAKJJIAq2/QqYOybLJha/odrV3OogmmJbDVLNTkWQIXRjCN/60kTpbBGIl5123dOMLAoeUN+05hzLSLzq2k2oW6AsrvGYKf+9iiK9hn0VupvPQ1WVHBmst7Vx2j4X6vStMB44DonycD6aBneJzqdAvBApQ2kLjaq5+I6HM9teSeSdFTXEdx34sKVmzrXj1e1XXu3WT8dwQ/DggIcmFM6V7gEA6HvTgxMemlCYHpowsD88eAQcwC9Be+Ib5MRPQwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=99 alt="q : B \rightarrow C" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJQAAAAgCAQAAABebpk8AAACqklEQVR4nO1Z7ZGFIAykBVugBVqgBVuwBVugBVuwBVqwBVt4LXgBwvsSJSAOzjuXHzc3d2JYwmaJjN34hGCy5st1YCjWw1+ugYZ1bGQPtuCY2cB4jTBaeLELYQKCzBghGPO7rk5WA9E8YCiIUsIwlLlYuzoBOareE7uze/iAUOtBwNYtQNJnDBKzqwpVakUUg8O32DBrQVhCQnQIzKoKmxgiSuLxq4PG0jRu/FVdKaMcUUONcJgXgy3R5qBZiRDpjwQQIqotrASPhNLA7bu38okIibXJENRAfSqhIiGitK2D5ZASaX90k6Qt3BNwrW1NmqNyq63OxGRvTVRn31PSryiIlgq9e/Ci6Cw5fjkCy+QeURLrQx+Z+ZMobhXiuywfhTlOVJlwK8uEXO26W97ey30hjVl/hYbTuPLZut8zLgsDzEsj3znwTMyrYh1Slm+08Ez8rCuscE79PFmlrwpGUWkCfcCYhGoQhSga1jNJ1ImyhtPIxRjNKn4ko9aXjHOJMtDRo50OAQTED/aSr1FT4NGziWpRubbB3271aWPePdY0Zd15lLK8HGzNFN9ZmTwmqz/7UR849lclKhUD5GDMrPh4snoXS8CCnU0Ux3DLYSBeZLytycipUA/mbKK8aSiFNiFajZuU3DocAyWTQpTpYMbdUGgm7/zLWc+U257PqS2qNqPylxHvQsSzKbq3kAb7lDGqQj6qdB/RXMBSNKd7UvVtUKS1xJtzeWJMwXZNrXhGeXpjOznif5mq1MLPCfO3pIfSyYe4e1vxKzbXCNihvEFiXF4ZeuJE0TJKPOd9BTYU7yDmWFf+/PDhh/nQQLhYNUDL68xSNIrDgit83AlAZncjJBgKdeQTWrmq9+O4iSLiJooIVbiA/yxU/tXxf+EmighjDPuLFP+K+APjYdjx6AYgUAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> there must be a composed morphism <img width=124 alt="p;q : A \rightarrow C" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALoAAAAgCAQAAAAP+qpfAAADkklEQVR4nO1aaZnkIBDFAhawEAtYwEIstAUsxEIsYCEWYgELu5xpEq6CIV9me/vxa7rTpHip41VlEPriPkyIPm3CSBDEg0WeNucEjGa0Ion+uLWj5ZdZ2AlN+oo2dyz2tDkHsLJLqsWVTVQtTb+1cX7atFHA7kD8aUMcJuMGXNkVgjqv/xDauSN9e9oQg8mQm6J2cnbixHf/GLAJ4+2XHAcbytfMt/xTPF1nT+y8/fmsvhg7cgWTPGXhNPTG1s996N6R1aXaGwpirMj5efGHZ/lFVAnQVTgOXf0NJKCpk3SabKyk00hqrJ9rSCPLxqPF3ldPqcQuPLz5FIlDZ8rLZtR8Kio7UrWTLnGr2Umav8qHEGZXWHYmwW7lwO4Hb3iUot0GYgT87KQNM9pyVxu9iQ8DzWuGEmZDtO/HJrdziXTqdn2BLF6CI843CTLSUCtklZHkDTRe7uAioivMVqwq0yyBYQtcL3deVkEaZ33tcvyFe/NpFYtyPVjkvXNEM2jCH1N+TSut9x6lHw4glKnfwPxVXEJ5M3E1HroOwR4mJOFmEHvou+uD5yuWCHcI6S1W7qbJ9muNUuAo6Ehfq95Ofu7pV2pEI2FL4vqRpO9HpTmve4YBk7rfXrW8XuWyKJEOx5a4fhzp8ymfW9huEDIMIMH0r23txViH16MIedJbQif11EeRbumN97EJBtY7tK7tJC3SEP2xlif96lsl3Ek6zxSsu2SjTpYSIGPt+WTPDChN+t5IV6rwjiGdZHfpbsMrWIDDAC94O3w9RTppFkOp6fEY0teCLVujxoKANdgsnK83a6gU6UtCjPHiC6g1IaAgpGN1yBJptJhC+A0KpmX64n09R3v27PZY7PLJ9Zi2b817v2/ovb6djldWJdJtiZQF2vdiQfd3HafWZ2BpDq+3tF87bz3Jyva2FPkBl76AZEbv9dmLJ1nLODvar3u6Jy3nW/U5nnTWC3BnW4Zokg8ac3BubpQPM2Oz+BVeAHr8yPtqym+Ia0/ywMeD0Xtoquuklz0dmwFcOdj9PYV6QCNye8+rEXJMa/2Stf9W8FnT6tNSaNXbJax2eD8ySE4n6s4/I6tmdetuvXtR9dj1e4QXJNmlJWMMDCD9jJFjgA8DlHTaLCO/pGcRq5c0dN5qKzJf0rNIzdNjTFUdEYN3/OY/AYx0htob7jtalw8BA1JDm1XGl/QsmMrU9+Rd/Z9YY9TzB+Avr5ZXxSXnb1MAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>. They must satisfy the following laws:</p>
<ul>
<li><p>Left-identity: for any morphism <img width=97 alt="p : X \rightarrow Y" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAfCAQAAACmXFwDAAACn0lEQVR4nO1a3ZmEIAykBVugBVugBVq4FrYFWqAFW6AFW7AFW9jj10WNQFhkXxxeTlhlDMkk8TtC7sdIhB5KjwlcH8hLr8Nr94BaNteMCOFEkpmwfpSY3u7txx+wruxKR0LaSIKsCUbUrvQ8Nr+tM9Si/WaP1yXVezFoLmZnBawpkGkHBFJiN0vtifY3kQHzvjQe5jk42wlu83V3Qupktp5wgS53c+4wXz9iRM6kxIliXwRfio9N/EKNYoyeFN2u2ppoRQeJOkiACf+kGlGbqml0zfQ1bypgcssbxq3nxuK4oEOXeQkImFJqNHj6RtXdzWpL22tWWJXNEiUvPPjUyzSd9vlDePYYqCi7spRCUv1wqX/oXoBbey622AqGSrlxiOwysXsVPbMO1LLHwbGf7d8zWBBEjzcIL6C20m70hktJWVCa0nJwBnJKK8gK/wzFrCkwaf7nDKhkhDdBClxvVF7rhFKggBAaRumwuYl5mSmMBQZ4xLDLSN9j2JqUe3zJ+P6E9CZ1WXsDgIzUureabCLABSgOo/aKBfVsAUTQJVJGagPhpVVEmTQNurWi2LEUe38jI+FTK4S/jQrcyV2xwo55l3zyaGSkFvoxbqnWgN9WCEjte7jeq4GRlibq4crI2CQqqlDaQVY0J+Jb4abltyfgctrxM8kbc4JF4FUH+rWRZEFIDJpcWiQl6DOhBmv3PQnfvX14oIzEDzO5V3CBlCoOxYX6BPlupUwmMdT0gxVGMnWM2Yram/OnzDJhwxOlY5DvfBNdAlWZYCqM9BlT0QnnPGm1rfLVqvQ1TYv8iW9vHYQVg8JjYl4hXLVR7rhU31PftrBmLQ+GcwyKYQCXAA92eIxUgHN2e3AC9D3pwQGPkQrAHyPlYf6X4pHtE/4B/kyyXEM5K88AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>,</p>
<p><img width=103 alt="\mathit{id}_X ; p \simeq p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJoAAAAgCAQAAABAp6mPAAADN0lEQVR4nO1a0YGkIAy1BVqgBVuwBVuwBVugBVqwBVuwhWnBFtwQREFIRGZO727n+TM7YF6M4SUwW1UUGnLkCwJztVSaGe+rEa7lZNYvgwlHz4zbgJlL3ebTX48OLn5crYGrb/LoP8GAQfviEiYI2fi0E/8avop2GeqraA4SBZ4uAg22Gma8XNEEWJEMv/JGJcxVVQv35NtuT3pMiruQX2J/Zq4pMdpvowt8KlU0gVbmhOsCej5r/YV/N15jM59Ucwu1eTgzwjGTnhXw25BRrUSP3w4wrjfXShStIe6V4KoG16ztFjP5tbXQOVKg8Q61eTglc6pOJkQx/7D29xKnhCneB+2uynyMtHM20+IlJD0mk8VuRr0+yMDabQ/tuMm6Gb49QpN7mAJ+GypZuZCEY8dt1fJGj2Z0g1adJpGHKoNvinK3RglRgR51UTq8xa82jYrVasDc8LEQiiaJ7OPEN+V0+GBidZqzsiTE2qrUjC/JFAidsVcu4k8tznj7Hr8N+15j0zW6nb+QU067vS6Xn1RRar3ylXO8UMQfZ1UX6RfVo9VRlgoQ0ysh452mIZiiJOAJNFjgROFN/jirYo2je7QaRzpv5rWQcU6/LtkpRQF/nFX2hjD5uR5NYaaK9fPVkHFO33NyV8C/L84abrSPPh1ukJuimX45Doqb3xWEjHL6dVr1PoUC/l3gd0k/Ghm2bByicmBgl2gPRCV9XMppyWT2p3GZXwW9mlvD4fLsvJ5lTpYDZ4d6My1Yo8OZcloTPH8Cl/md5MsgHIOnUvv+04YvLY6CKe+1F3Ta6fbwzfnOU2VfvK3L/DZoEwZmDG4yYRtxZS9r+bWzUr8jCBjTEXVojd63OrYOX5NEn85DJnGXmHfxBaWA3zWo4T5rPz2YvGOh9G5QrBsav4qGGDOCtl/DzWd2RfxdcJ60I0zshphlQjZunyj5HE+D1uHGp8k+R/scHuDXsIQdUU1m1HQatOd+qr6d/1hlVBXuDxzOC8GvCZpO5M+UCBtddQ3i6nUvbuVXEIi4MNgDvFfgBP8vD6nzrDvxND9CHsRU4okqjaedfpqfgGQVo33Y6af5i2DOV5/8N68M/h8dg3KqatcZ1QAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-6px;"/></p></li>
<li><p>Right-identity: for any morphism <img width=97 alt="p : X \rightarrow Y" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAfCAQAAACmXFwDAAACn0lEQVR4nO1a3ZmEIAykBVugBVugBVq4FrYFWqAFW6AFW7AFW9jj10WNQFhkXxxeTlhlDMkk8TtC7sdIhB5KjwlcH8hLr8Nr94BaNteMCOFEkpmwfpSY3u7txx+wruxKR0LaSIKsCUbUrvQ8Nr+tM9Si/WaP1yXVezFoLmZnBawpkGkHBFJiN0vtifY3kQHzvjQe5jk42wlu83V3Qupktp5wgS53c+4wXz9iRM6kxIliXwRfio9N/EKNYoyeFN2u2ppoRQeJOkiACf+kGlGbqml0zfQ1bypgcssbxq3nxuK4oEOXeQkImFJqNHj6RtXdzWpL22tWWJXNEiUvPPjUyzSd9vlDePYYqCi7spRCUv1wqX/oXoBbey622AqGSrlxiOwysXsVPbMO1LLHwbGf7d8zWBBEjzcIL6C20m70hktJWVCa0nJwBnJKK8gK/wzFrCkwaf7nDKhkhDdBClxvVF7rhFKggBAaRumwuYl5mSmMBQZ4xLDLSN9j2JqUe3zJ+P6E9CZ1WXsDgIzUureabCLABSgOo/aKBfVsAUTQJVJGagPhpVVEmTQNurWi2LEUe38jI+FTK4S/jQrcyV2xwo55l3zyaGSkFvoxbqnWgN9WCEjte7jeq4GRlibq4crI2CQqqlDaQVY0J+Jb4abltyfgctrxM8kbc4JF4FUH+rWRZEFIDJpcWiQl6DOhBmv3PQnfvX14oIzEDzO5V3CBlCoOxYX6BPlupUwmMdT0gxVGMnWM2Yram/OnzDJhwxOlY5DvfBNdAlWZYCqM9BlT0QnnPGm1rfLVqvQ1TYv8iW9vHYQVg8JjYl4hXLVR7rhU31PftrBmLQ+GcwyKYQCXAA92eIxUgHN2e3AC9D3pwQGPkQrAHyPlYf6X4pHtE/4B/kyyXEM5K88AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/>,</p>
<p><img width=102 alt="p ; \mathit{id}_Y \simeq p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJkAAAAgCAQAAACrkBKMAAADOklEQVR4nO1ZibWrIBClBVugBVugBVpIC7ZAC7aQFtKCLdiCLeTDIIjMsPk1eXkvl3OS4zIs1+HOjDJ2LbhuXzRgYE+2sD55vWMP3Wa46wuA0mRMGT8T+rpt8wtn9aPBNWm5jWmuK6Ds/rI5/QL0QJl69zQ+CRIoE++exidBgZJ942oDPlrJrBjz4FjoY6lTAXynIM6GEDp5GJO+Y0ay189Vsk6PKwubvByOahiAwcZduDdLdgnAwm67e21q8MgMrbytJEaa/NXnOso5Sqb0TN2M0w8hlQG2MMAMm7M2uK1DSr1RjOEjMArTUUdIeuomG6OThw4S1xme5uSneIaSjb7fEdZB54O9Pk+hjYHVxGDwz949937tJFy6jXH00DZpsBn/iHzREuYWw+HoHCUzcxqCY+NxC+Hjo240WhgIIAhloXxKZFJUQ5SZVpfoKyyg1GlKNqFeevBitdOhW1EEahmIDPaddqtB7eZxPeB8y0r93hfie4zgisSycot9EhJt1cnomoCw4B5mDs0MUAbsoETjbYmLdJyTOQmP5VZllyuSwUj6kPCsIOwAAzmDNmCPYqBce0WgA8TE4jK9BwVMpzVdZnN3mv5Rr0FVPfRmBtIGrW8asEdhbUvlZAL52aTHz+eBZ6GZgbRB2aX3wB6F+05Xl/fdFFX2ndu5aGaANpiblWzbliYft8uVyO9Gr2Sx4PPAz/gBHT2OZgYoA45kvIxN1jfZVlE/vVeynnB75c89IkW8Fs0MUAbGF+JtoTL1o4GLTl3gLXHfs1eygQwCC9w9vLhkr2UgMpDRmTjg2ww553mODBWQEYr9Vmea45kYw6adSzZOhlDVDY8Uoo4BZGCKUDNRDkvGt5dqTLb2MsHvNrwN1dP6P6+fSSaWqgfpsp4Ch2qwruUDWR0DyGBrd9IhXW2YhmSu4A6XzL1vLbCx5drPnCAGZ3bXo44BZHBbi5bcligltzyxBUT0Riq3Uc6qP1tQz8DOoBzSuyJlZ+B9lDUkNbUG4kDi0Y4PoqwsuTXvBP4f76OsLugEBqVp9kG2dSXIF8gXo46BZgNJpJ5X4B0f6popk5UG4td+d6xlIDAY//h36woG/gFN9mP9RWUI6wAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-6px;"/></p></li>
<li><p>Associativity: for any three morphisms <img width=105 alt="p : W \rightarrow X" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAfCAQAAAC8YLyNAAADOUlEQVR4nO1ZXcHrIAzFAhawUAtYwEItzAIWsDALWKiFWqiF7/I/aBOWbnT3pYenDlrCITkJjLGrMTNbGj7mifYppjtvjsbkZtPBVtgizh6uH7f2AnM29heaAEcsoW8C+3h493fkyWSNbzPQb0OP/Jk9waRojgL6ptQHG6Q7pF8FkQhc3da1eKCkXopojgZ6TCLvAfQJ9K1rwR1xx5lFiIKfU5f37Bh+vIQ0RJEO+/8/oIJNW+N79r9sJMs+9Hf4/RGCuUfsT/WlQlQ3U5518/RjrGBaWINBMLHe3FF5bUMSEo6sxaI8dakTIU2L6lm6Z3WQzc+gAbGVybMsmBZWt+RRqWL9IOCiGvvt8xq44DzwItxRY2RaUIz8dyJpQ9j1SVa7MIjvxWDVQC6ehyqM/kA7sx5LR+Ax8xaIED5zGqzcYE+irQjsOX0uRKB8WZvixyzNrNkTFZAylp1cfweBFEp9PEjrT+GRB9si01MitKc9/UrthWWnbKZ4gzikDDm8KDA970GxAPGCQAIeoBE5r6Hcwt8vVTcU88ZXt90cdniJ4nXrfPrJJQtBeyXgQbzJOt9gbrZGN2H5bIJDDPc7Dx9Fz1Pex8thjeB7EHnjznOiEgAvxrVBbS42F5XGk/vuemIlz5AsaaLUJW8EthACHvPOl2vBoPqdKKeTs20lxZFOSUZXVUgHOHljPOFVz627EwWvUgbd7+TptjTpsIdXqQSfdAFjMPLGHExycM6Ab63Jv31A94uez2HI356askpRChaYvHWI4r2MMOHssEdWVj20vqthyIe0WB7XY6N1C/oGg8kTbNxlZL4egDxZJ/O2i24uFNkFYo7dX0fhdz8JEHnmnbuG6RSxlNnQAMihcZXf0U+3BvSxXO+iqSySp3a/vMt8PGVRCn0WzVwC9ckR8CpL2xSNbG5OG6grSZYvAvxEInzofdGQz7aUndWdkVvJxeNhiZsCXV+0fehFSaYhtydJYM94ngoKCo+0l+kdY9RrgS1ch2ArMSluQHJliupYE9G1R7h3aB7DO9shLlI7jzOr6X8HXSdcqtwg4SbvCxyz7Q0yoPu8G0Tc5H0B6L+EG0QoV8Hc6YKMf2LaFqBKS5wpAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, <img width=97 alt="q : X \rightarrow Y" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAfCAQAAACmXFwDAAACoUlEQVR4nO1ZfX2DMBCNBSzEAhZiAQu1gIWzEAtYiAUsYAEL3eVz0Aa4oyHbuj7+WcmP5Hj39Y4JUQOtALwMXkN2vRE9rufXroB0tmzbI0QntBiFqmYRQuGB93DdMuvGrdQzSaJL5h17pFup57TFwZ6oCeNmjX7T2CvRoCX2XJNZM1k7qyCaBau70vm0NkUWKsRS+3C/y96tBn/8vPKReaKtHnya69U978r+hyxyeDQLnoysiRhLS6fB2WrUYgyUQRvMkulXWYpmZpqYhwJgk59cjZRr2uDIsQFYLiF06hx237FweeRaqkIBiBio1Ui5rBzxAeM2mA6rhnFdgva6TWi+Cvcv30EA9+TBLHqrotbHmyMmapY2vNLeozGzqcWuT5qpfAexCodXGrz1o/t7zAqCjUeWsg7cnb2DY52hi8Ex01VKQbPjM0pZKzAl5YHpSV4BgYAOn+EonSgFSCYxYSsdrzupIHKJudBltC+FJB6aNKRcE0u2RAysaDKb2jsDnSGkPEkDvsSNnaIctBgXE2NvOKy7C3gP5zYo9zIQKhyEID+GTMMo95qICc0i6X45SbdkTH6Sy0Oxr9GlD9XqX0VSm5qtRXeZENAYe5zp6wRJ6xAtR5KXkUtKzEKjlINmDyfAKdzzhd3N97THzyR3jg9J6E5YyyJpyBRTCkkNmnZUInU2ZkBsfx88hzNzJoukOGBEldEG2vZJ8mm0Lw1ho/rE8l2qMtnGwJ8HWSSJRIr1+uzoOo6kSO22B7sd6RjL91wkmswpgcokqUkJYAlSgpJux5E0u/9MbK3rkOQl9Dd3vPUAFxQsJzVIyXfwU2qSxANemcNUsSlOnfr4Il89v/xY8ob4kETAhyQCoLCOeUuw5pr/ig9JBAAqiP6SD61/Bl8M0Lh4orerhQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, <img width=93 alt="r : Y \rightarrow Z" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAAYCAQAAACCPt3gAAACDElEQVR4nNVY0YGDIAxlBVdgBVdwBVdwBVdgBVZwBVZgBVdwhV6QYLUFmwjY3uOjrcIlvJDkcULUgRQGx5SY0QstrOgq2U+hE491mOhQ9R2QYGRBJ4boe/cmRVo9BGLiI+ZpBTRixui8w8DzGWbcjUa0kafT3WEK8Xl1po8+/Ra8N8u9YTKrUX145k/SeKcbJ2gw5ft7zYYzs4+G+kp1ScF8qdqh4We9lxChctVlyUzIkZZGAzCntkkDfJdZZh06NB0wFa0uc1aLbTGNTkVDC6oi9Pj9r9QmzDqTEnmza4Xd4fTkQwE112E/p9Gwcj8gg+7TYLPV0fmhdlBKqJ9r0ZVY874OmVE2FSWNJL7WONmdE9894qKnRWJoytXgXCf68pPzCH2xYoXQEmkdDwpwOFnWw3apStE7UadJu/Dxe0oQn+SV3VtzLQOT1MD5cCV0YvqsKWm0hyemPNRL0y6LFuI/My6kPS+NHH6BGLldP7ljJlWwoHVZCfgLxDgvuMOuicppBcy70W8Qw4WGbVLL+sgQGjvUJaZO8dWMi0HQumxP1L8jpierKQeLacRWU3RiGnCJ/ufrEcO5LalrafRc+hm+stOZr0XMwFBdQesup2U8ASoxwQg1WrWIMYm73DuC1v00EjRPsJxi6sqJsRX+2UwXaSOJFpvvkoRt0muMLH559OiKXF/klkhbd/sDgC191eb1hYQAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>,</p>
<p><img width=179 alt="p ; (q ; r) \simeq (p ; q) ; r" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ0AAAAhCAQAAABpAjZ6AAAFC0lEQVR4nNVbC7WjMBCNBSxgAQtYwAIWaiEWsIAFLNRCLdRCNx9SPpkvbZO3l7NvT9+jk7k3kzCZBGN+ieGn1nM0pivc4h6l2W6oy1uN3jzMVLjN1tzN4oQqjxpsN9TjfQG9ebl/NTC5TiotUj22G2rwvoDGuWmrtb64qyTqst1QmvclWPOsGMGlx3Bdthv+wtzFouZzN7Y/F22tLtsNZXlfQOeit1627mGdB6XGcX22G0ryvoRbdQeHgt1Vn+2GkrwvYXbPXg26r9NpnUSlEkMt2+8A1uxnvFtn1rqf2+fefR6AMdGTJZY7myn3oSUb6EH5PWV/dJ1h3z6NB483vETZeuNaGpjUDbK+B8xWrqX3gWvDg9MsIudN2xeo2bhU6hWux+rIsn5+uVExHu6Nf8FHOt0tvjj0coLOwc4zfDrSxO137nvRp+XwKQ+ku7s4+JVFYoiPNW5OgDpDrmUTfHgywcFrlnDmTdkXqdmGLHtcpRqcC57WsqO0v30zB4Oa1MbgaBqn3dri8X7M/hjGSvLS/78EkV7ACsF7TmMKHP04nILFOyofjbP3Oi379XfUY0CiWcKZN25frGaU5fbulrMj+0VRjK4bQqQjiEZH9xO4BWYIzH67TnzTOv68xE2gM2b3cqExnFrwM8gTmKkmZmEKsdVo2a6jGn+oyTRLOPPG7WvUfLtxpGpXisffgV9/28BC45HNBjYjztlPoqc7RlCkiQmNe+ZjnFDtIRsYAd+OwNlKtfRZCdWGVLOInDdnX6KmgSLUR1KkI0mVkg1YrOHgRARFk2qBWzByK3zorzFHeAYpfXo6gY+q3BcqND7TUq+ZvrIhUdPAdFJaKO0+XKwJsHM9NGhY0mqPZkrDOzWFcxjIF3loaLXUa0bzxv0U3gbT0TSFZc+5nTqh0RBpX+PG6OQ409Pw3hd9aMih1axCaDxUTWFr7rKhIZ+2r+NKaMi11Gum5/1xaMg3kP5OaJTAldDQbMZdCQ0dPgqNh6rz8MUrlIL976GBs/2GlnrNioaGr8vrjohgYqXiyh5XQsMKyMyFQgNn+x0ttZrpeUvUNDAdnyMfC9Gto0fVHV7IqYE5WD8+aSGanH0JGb4a+i1gbGVa+jXRQuwYSTVLyHnT9pWhMZx+c+6mJzPSse21VLSd11V0txI/2+Lsy0KDHp1WfFFB6kGz5bTswGzibIXXLOHMm7OvDA2/BeQdacPXcmlSARjDgubgiZbfsXgGwtAI4OxLyNAnr9ogoezikkaMrUxLfg9FplnCmTdvXxUa2zWDU5EVdB2M5l0q9rZ7A0+OnP1ZcOQO3+P5NjC2Mi1TpYOqs0g0S8h5c/YlappEZwyF4p4onlqy6+jjq/78wCYStoeiTddyD0q9tIOxlWoZO48+gCPRLLWZ8+btCwAvuHJwXSc/fP+b0LCqstKngNlKtTTrtp4ceGjAvLX2QUjpLMxd8q6BaXL2OeT7qr8EzFYeGrrSORUaMG+tfRB5Vg2hNXkZ5gh/tkj2rIcXr5x9GkPh97hgtjIt48a/bo7DQgPmrbcPAjpjkGMWNNaBB2NyWJOXdCT2cfjDcqVfDobYyrSMS3XdeyyQZjhvvX0QMjp3UZLXiV60s0CLMvsQ4qK0xlvjOVuZlm04XaZDrhnO+4p9EIMw0rkyUAL/UIBCQ27/jKbIbiuGY9tSLVt1VpVrRvHW2wfhTzaVfWvSujniVrVDf4XfaVlIs3/x2f0cEBijCAAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-6px;"/></p></li>
</ul>
<p>The category laws laws comprise the first part of our specification. Translating it into Haskell, I made <code>Patch a</code> an instance of <code>Monoid</code>, just for convenience, even though the composition operator is not defined for any arbitrary patches, and therefore patches technically are not a monoid in the algebraic sense.</p>
<p>Then, the above laws become the following QuickCheck properties:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb3-1" title="1">forAll (patchesFrom d) <span class="fu">$</span> \a <span class="ot">-&gt;</span> a <span class="fu">&lt;&gt;</span> <span class="fu">mempty</span> <span class="fu">==</span> a</a>
<a class="sourceLine" id="cb3-2" title="2"></a>
<a class="sourceLine" id="cb3-3" title="3">forAll (patchesFrom d) <span class="fu">$</span> \a <span class="ot">-&gt;</span> <span class="fu">mempty</span> <span class="fu">&lt;&gt;</span> a <span class="fu">==</span> a</a>
<a class="sourceLine" id="cb3-4" title="4"></a>
<a class="sourceLine" id="cb3-5" title="5">forAll (historyFrom d <span class="dv">3</span>) <span class="fu">$</span> \[a, b, c] <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb3-6" title="6">  apply (a <span class="fu">&lt;&gt;</span> (b <span class="fu">&lt;&gt;</span> c)) d <span class="fu">==</span> apply ((a <span class="fu">&lt;&gt;</span> b) <span class="fu">&lt;&gt;</span> c) d</a></code></pre></div>
<p>Here, <code>patchesFrom d</code> is a generator of patches with domain document <code>d</code>, and <code>historyFrom d 3</code> produces a sequence of patches, one after the other, starting at <code>d</code>.</p>
<h2 id="our-category-is-indiscrete">Our category is indiscrete</h2>
<p>In the case of patches and documents, they form what’s called <em>indiscrete category</em> or a <em>chaotic category</em>, as there exists a single, unique<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a> patch between any two documents. A function to <em>find</em> that patch is simply <code>diff</code>, which takes two documents and computes the patch between them, using the Wagner-Fischer algorithm <span class="citation" data-cites="WagnerFischer">[Wagner and Fischer 1974]</span>.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb4-1" title="1"><span class="ot">diff ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> <span class="dt">Vector</span> a <span class="ot">-&gt;</span> <span class="dt">Vector</span> a <span class="ot">-&gt;</span> <span class="dt">Patch</span> a</a></code></pre></div>
<p>It’s easy to come up with correctness properties for such a function, just by examining its interaction with the identity patch, the composition operator, and <code>apply</code>:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb5-1" title="1">apply (diff d e) d <span class="fu">==</span> e</a>
<a class="sourceLine" id="cb5-2" title="2"></a>
<a class="sourceLine" id="cb5-3" title="3">diff d d <span class="fu">==</span> <span class="fu">mempty</span></a>
<a class="sourceLine" id="cb5-4" title="4"></a>
<a class="sourceLine" id="cb5-5" title="5">apply (diff a b <span class="fu">&lt;&gt;</span> diff b c) a <span class="fu">==</span> apply (diff a c) a</a></code></pre></div>
<h2 id="our-category-is-a-groupoid">Our category is a groupoid</h2>
<p>As there exists a patch between any two documents, it follows that for every patch <img width=97 alt="p : X \rightarrow Y" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAfCAQAAACmXFwDAAACn0lEQVR4nO1a3ZmEIAykBVugBVugBVq4FrYFWqAFW6AFW7AFW9jj10WNQFhkXxxeTlhlDMkk8TtC7sdIhB5KjwlcH8hLr8Nr94BaNteMCOFEkpmwfpSY3u7txx+wruxKR0LaSIKsCUbUrvQ8Nr+tM9Si/WaP1yXVezFoLmZnBawpkGkHBFJiN0vtifY3kQHzvjQe5jk42wlu83V3Qupktp5wgS53c+4wXz9iRM6kxIliXwRfio9N/EKNYoyeFN2u2ppoRQeJOkiACf+kGlGbqml0zfQ1bypgcssbxq3nxuK4oEOXeQkImFJqNHj6RtXdzWpL22tWWJXNEiUvPPjUyzSd9vlDePYYqCi7spRCUv1wqX/oXoBbey622AqGSrlxiOwysXsVPbMO1LLHwbGf7d8zWBBEjzcIL6C20m70hktJWVCa0nJwBnJKK8gK/wzFrCkwaf7nDKhkhDdBClxvVF7rhFKggBAaRumwuYl5mSmMBQZ4xLDLSN9j2JqUe3zJ+P6E9CZ1WXsDgIzUureabCLABSgOo/aKBfVsAUTQJVJGagPhpVVEmTQNurWi2LEUe38jI+FTK4S/jQrcyV2xwo55l3zyaGSkFvoxbqnWgN9WCEjte7jeq4GRlibq4crI2CQqqlDaQVY0J+Jb4abltyfgctrxM8kbc4JF4FUH+rWRZEFIDJpcWiQl6DOhBmv3PQnfvX14oIzEDzO5V3CBlCoOxYX6BPlupUwmMdT0gxVGMnWM2Yram/OnzDJhwxOlY5DvfBNdAlWZYCqM9BlT0QnnPGm1rfLVqvQ1TYv8iW9vHYQVg8JjYl4hXLVR7rhU31PftrBmLQ+GcwyKYQCXAA92eIxUgHN2e3AC9D3pwQGPkQrAHyPlYf6X4pHtE/4B/kyyXEM5K88AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> there exists an <em>inverse patch</em> <img width=118 alt="p^{-1} : Y \rightarrow X" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAAjCAQAAABxjiMGAAAC9klEQVR4nO1aa5nrIBCNhVjAQixgAQu1UAtYwEIsYCEWYqEWujyzeUAy0Bluv7s5/OgmYQNzmMeBtutoITpJPMIfBjdt6t6d/tcT+X/xNu11U0wJ6VLETTE5MChm5h2+jZkeolMmKfGPR4JicA6Un1HfPc3z3GyRgUOxdCnHtkfyuX3SyCAHX2XyM9LuSaMlx0oUfTe7aafeZg2aTY+2YIHm48jPLPUkwMvFPHjNsLsvkndbIC77VpYyF3HNCMYtdz781OaeN/OJNkYZRNBNaz/WB9KLwZfik27b9cOkOPrx2iDZOAvvsV92eXACcuCKNr0LTBuUeFn4VZFuhrDsbLk6JZg5KcJW19xci49MwKWYh8CMGFGz8FwV4GrRMzZpTXm2+tDVVkgLHjzGm1SfvGEUa9cPspR6Va3551lvAxlsL0MfBCU3NJ9EFDMPlZm47yycd8wus0aay31Fhv9/uc8zKmKOhRQt33dyf0/IO0fmbC/HE8YS23TWi2weAu3lJeV3eXJ6NiLmM5hUj7LebkfYdfciqMrMPiW0TgY8ofNkIIAS4qBE8uAhnVFINZtNa/RJFG+AJecJb+o3NfMboC/joh42asdCT+6X7TTAj1MUN95xAyATsYaHwXjyXGTt6AQBMNmdUfw9KKGYLQdIpW0Gxq0MRVKu9NgJ8hTXyBkqlHkxL27TpuCf47HMJH1ikZhOjuLGm8JT0CYKZfweWkiHRUBaCIh0S1M8f1UmjhTTlDtVsI32m451b71S7RmkKGZk5tSCjmJR4ExeR+wPMt9XEZaiWF25PgJ6YxxcFNJRXHJKoZL+GncRWZXvKRa7O9THyz7g4Hs1Kopt6YIqYpnJurHoZd0ynmQ93FDMvYj+/J5fh9cGVBRrcFEXJxuNWPQyh2fR2NjGJl/Y1HjxRLD08EMgf7SVm68KCjm5BDzkEa8P233hyMyY8FzMiDbzeBbz/AzTou0GIm6KyXFUFDeQkTovvoGKm2JyiJtiathfON7FDhk/M4DmOdDU7gAAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> such that <img width=123 alt="p ; p^{-1} = \mathit{id}_X" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALkAAAAjCAQAAABiWWPyAAADUklEQVR4nO1aC7WEIBClAhWoYAUqWMEKW8EKVrACFaxgBSv4+PmD4bfyxHX3cs4edXGEy3BnQBH6BLSoKd2EbwFGlJM9opmT/sMloJzsGU0/yq8DkZJCi1GOUVXkucVRivJKzjFfFOkQQ0Ow1geiFOVUihr11JjX4qv1gSgnLG2AypaXUQ7Mw1CO8hiI4M5KNyI37kw5lrJy19btQLlf+Epj1L5vp+gTlfzelLNzSk5kOCC7c8rPaz557JoUuJpqJRbXU17J9M+Vk2M+C5n+/4SSY/4Qle6M8pzK8Zv16s+e6PCDUqzE42rK67XN0FM7tKWG7H0lJ5yijlMySRM16iVpbEfYfsRbfe2clTgwvdhQdq5ALd3Dlfz18mrH/+/P5uRKCF7r6C1mKk1gbzRq5kScsxKH+VD8oAnFjUmvJRvgif1hccT07D0FCkwUyKfpQa3ftZIXxBgeX3HPl2YVxcGqp1xtk0e3wCYASnmwbqab4v+xUgZMOwuUb0/GPIVcS4A4BBTsO5xlskTFymOlLGxZsTe57H5WepPLdK1KChA4ED6y4pHHSlmYHq0ylaNuwzl5ZUkS5lLlINxH1pjQ3DxWSgLatrW13ZWTm3f3bsJ9ZHUJDc5jpSRsj0aWbvt2V1p5P9bHHsJdZI2JGpzHSjr8+zb7Ehr6TVaWhBJbft+svaz4rxkaB+1gjZ9wmCySnAjlsZIKtdEQV/zr4K39FG3raDMSTetMmABnUuLy4ncHln8QWWKSmbe1/GooLw9buSu2qLP4qsBRRro1J6/AILqsRILzWpFVG1dMn3gFlgBxVu4LpntXH8jcB8tln4XpY0iolBQFo9fyEUMjpZ/IkbKpCq0k46zcFwxBW1aq12KvR0nKsNaC3o9i/n9nuR4Aio4L4x4UAyJDYYjykJX7gugdocnIR/pdj0TAHMBaAoJwcXWfuThAdVxWWz++qmHKY6zcFy2Y/qkQvfl0A9YShLP1KJA2xL5WwhGUf8rSPj86rgKLo1We7F0iliwaET6/lXIzN2utjP4AO9dwm3XH4lgrT0QH+LT3ey7XduQRoQ/H4qw8EeJdkv0aRr2gGWEnjCOrRv73O99LuQvEnUTUkWTZewrvWPkBCbK6DGEvj5XH4g+mCJNW70qLpgAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=123 alt="p^{-1} ; p = \mathit{id}_Y" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAAjCAQAAACNmwjMAAADMUlEQVR4nO1abYGEIBClghWoYAUqWMEKV8EKVrACFaywFajg8aWoDCgoiHv3+HGror4Z4DEzHkJp0aAu8Rv+oUF4G9GE6NNE/gom3ti/w/Ohk2LybodXqH6aQije7PBartLW06Pn1o2HvbLizQ4nUhSJp8e0NF+vrHizw4Us+h0pZPMjh6UYvNvhZ1BYYFAUmQSopKAkzTUId6GvbbePb3c4KUvBv9/h9IqCY7kJ4NUx4ccNXzbxgB1e8Sdj4HwqFqGoZcDnisErvoqpvh6t4BV/hQpwPvKYyLGbdL4YH2VCdCpJkwEuT8UiDM3yTkibe2SCQRqr4Jgb2HODmHxAgwZpMl2ZG55xdfp+Jv+uSRGHOSlYhKORnF3h3iDP9vz6cC0GV7PtZxm5+SG1Nn8IfqJx07Sb51jPcJvoNRYkoLnBdN7YyjduMWx4U73yLoAAM6/T5t8J7E0p4ljgzQD7m1t120XO7EqnkhojbOTgWScABTmVJuna5O7HkyyoHmoovma7NWZPDOxZP+BZOKqk8UoVhRJY2IJil7Jsnp2Wvv32LtZnD73GZ2o+lMBiP5tVdLLVaygGr6QUfTbnxFCNcFjrNvUDdU+E51lAhVlb0+EYnFj3jpy3I4twmwouiER4noU9m5Gl1+4qyrCZGkJmnOEsbOonq4LHs/DXeNbtaOCMoMxbYGXN23ZhWe/yZrzqi/2sIVPx1dAnGHEsVEngXPPnrOb9BJmcd7+DsGUVMIttt9xHeVYRaKpYXndneI2nUpGPhQtmtxhXMrYVkH6JwWtw61SD8HOUMCpTm92Zu2sYNfInMXlYuEG1K5uNK9db5FxPofq3LVGtvNcRmxgoU0WZSHTEcmncb6irlpKXhRsUQYUpleuK2g7Tzpx7wd8995MGxOyKuQ2JlrG/ypaLhQtYpy9sx3BYMRLb5Aj2miGuefVbYI4hVYKasgJNDx2eg4UbHchObcxmPree0qxvSi3I98FoPHR4QZ+tolCYw483zT/k8EOpvwxTBH2SRVoEODz9PxgzMJTKzSItTn0UzGOqiAJ830m+w+GnKvdNJlOxV6FzsSgADV/oz29WZbBIhF/B04emOZ9wAwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>. We define a function, <code>inverse</code>, in Haskell:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" title="1"><span class="ot">inverse ::</span> <span class="dt">Patch</span> a <span class="ot">-&gt;</span> <span class="dt">Patch</span> a</a></code></pre></div>
<p>And we can check all the usual properties of inverses:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" title="1">forAll (patchesFrom d) <span class="fu">$</span> \p <span class="ot">-&gt;</span> p <span class="fu">&lt;&gt;</span> inverse p <span class="fu">==</span> <span class="fu">mempty</span></a>
<a class="sourceLine" id="cb7-2" title="2"></a>
<a class="sourceLine" id="cb7-3" title="3">forAll (patchesFrom d) <span class="fu">$</span> \p <span class="ot">-&gt;</span> inverse p <span class="fu">&lt;&gt;</span> p <span class="fu">==</span> <span class="fu">mempty</span></a>
<a class="sourceLine" id="cb7-4" title="4"></a>
<a class="sourceLine" id="cb7-5" title="5">forAll (patchesFrom d) <span class="fu">$</span> \p <span class="ot">-&gt;</span> inverse (inverse p) <span class="fu">==</span> p</a>
<a class="sourceLine" id="cb7-6" title="6"></a>
<a class="sourceLine" id="cb7-7" title="7">forAll (patchesFrom d) <span class="fu">$</span> \p <span class="ot">-&gt;</span> inverse <span class="fu">mempty</span> <span class="fu">==</span> <span class="fu">mempty</span></a>
<a class="sourceLine" id="cb7-8" title="8"></a>
<a class="sourceLine" id="cb7-9" title="9">forAll (historyFrom d <span class="dv">2</span>) <span class="fu">$</span> \[p, q] <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb7-10" title="10">  inverse (p <span class="fu">&lt;&gt;</span> q) <span class="fu">==</span> inverse q <span class="fu">&lt;&gt;</span> inverse p</a></code></pre></div>
<p>We can also verify that the inverse patch is the same that we could have found by <code>diff</code>:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb8-1" title="1">apply (diff d e) d <span class="fu">==</span> apply (inverse (diff e d)) d</a></code></pre></div>
<p>A category that contains inverses for all morphisms is called a <em>groupoid</em>. All indiscrete categories (such as patches) are groupoids, as the inverse morphism is guaranteed to exist. Groupoids are very common, and can also be thought of as a group<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a> with a partial composition relation, but I find the categorical presentation cleaner.</p>
<h2 id="merges-are-pushouts">Merges are pushouts</h2>
<p>So, we have now specified how to compute the unique patch between any two documents (<code>diff</code>), how to squash patches together into a single patch (composition), how to apply patches to a document (<code>apply</code>), and how to compute the inverse of a given patch (<code>inverse</code>). The only thing we’re missing is the crown jewel of patch theory, how to <em>merge</em> patches when they diverge.</p>
<p>I came to patch theory from concurrency control research, and not via the patch theory of Darcs <span class="citation" data-cites="DarcsPaper">[Jacobson 2009]</span>, so there are some differences in how I approached this problem compared to how Darcs does.</p>
<p>In their seminal paper <span class="citation" data-cites="EllisGibbs">[Ellis and Gibbs 1989]</span> on the topic, Ellis and Gibbs define a function <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> that, given a diverging pair of patches <img width=100 alt="p : X \rightarrow A" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAfCAQAAACvt/x5AAACzUlEQVR4nO1Y0aGkIAykBVqgBVugBVqwhW2BFmjBFmjBFmzBFu6AgKdugOCx6344fO2Th8MQJomMfR4D025YNyb0OWcv9xx/9h2IwDANcSMTJtnM/sQxIs9teCK/zusfRDisxFLdyCTSASqLi6MjXlkRvw0exdJ3E/FUFoSKYOuPSMUcMxBrvpuIhwpU1kNs2d84SeYPc3VMIP7P0X8LwJ3M9lsfft0LHY5R/4ZreQwx0MX2q69Uq1vzGiCuEkNCrItT4hQuQ2mncs+gNIHMxMDD5s4Bv1y+0nqzhzWkoSJ43EaaKOOVAZepGbCfa0kb54GMLxQmJDP+L3RtmxmIXTSZXexnJi9u0hg3otxGvGh2J1gpvGWc8yIRe5HWvAZx0W/MTp6xXsrA1LQRu5WIQxSwVF8nJ6KWlfPJ5nvCXIjXo3fy6n4jJGJvqfooQTl56bVSKiE+0VZ4J2xtnOzp2s2BXRUSiZBU1/baGt/ais/Elr8LU0N0yWA5cjcmmklgYvXu3aaQMNoubhsGt/mFvPayeehxVPNqSaw+0NGC9S7zliGia7aPhXAbRiTCIWNXm568WNdSMkZNR0JYp5hj1TrmQ5LKA2R5nwcXsXKV82L18JfhcF7qYwWEcRLQyhgdRH0HoXzIibV0cRc4xb00cL179/iG3PSIrG8KSvmAiSUy6rcBcuD580z/70eq4WCnws7megWAiWUIV4U7kmUzNWgMpRqu3/csencoi2/W9WOEBdTpL7WtwAUrFZk64058S9x9nGus2/KGpZi2ZJ0XTPF1kH+lCJusn3paOHcOYOV4ikg2X2/WKbDkRFT/mL1GXjbXnaRtpzGRTrwWWfDC3FMTa6Ie+ZbaRvPwmaB8YZNFWCcsyj3dY6hW6C2DcP9zvR2S3VqpFs6U1Yrr4aXDAxSPWA14z4YPssC+Zz3I4BGrAeoRiw7lqp3H3rP4C2mXye/z6gwPAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=96 alt="q : X \rightarrow B" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAAAfCAQAAACiqYw+AAACxElEQVR4nO1Y0ZWEIAykBVuwBVqgBVqwBVugBVqwBVqwBVuwhT3AwJ5ngOCi+27fjh/3XE5NJmGSwNgd4EzZy9hrQtc7Ntp1fO0qiwxyKWsHv9GKCMFm9oBrQNaNXxE3WtQxyTRYNPvwuQAt/t68h6QeSFqscXuMSeKuhj4EZmCr/WU92HgLOoiQ2v3ae5PeQQ+zlhwzd0RsvA3Sf3wfH/M+c1CCBGyzN2FTGx3v1e7ubqQJqrSJ29i3AQdh7ONdW3rWKoHFCJI0RRSg7I4Ypx3tNsEmjBO8d24sh3WWYgQZX9eyEF5MZ+uE8YqxFFXC+F1Lc7XzouzMmpCK9iqUfWfNfx+rmPO8zz00eFLCQxzcyREkYNuMRLPG2BO17zd6+1a6HOwJ6n12q3zQxIHT7SW5jwZdoTd68xkhJEJX5KWCRtF10Yvv0Yo+LIcSh+3Tv5D2mZpOJpT7bCqfhFM26tCiIFAKRqGNJJ22C1NwCkF16OLgcU0OOVmYSFl09E1AI5KQlGPrfQVBk3VgqN6WNeA2DwjbJeGbSYvKFlnKS85DwccVTGZl9FAo6q+lsIlx3yQoE4LH5QQNMX3xyQyHqL5mr6Ulq1O+YTwkF1oSxHeRkZcVe21zjtJ0nCRon5btCNpaxN90mHQyvwBNHjhw33qosQjWC6vYVrv+HnU8yNuMCllhLe5bKP4IJkQ4KQS587lST6PRXFEsfc54DjXTGOYbj6MQgjA0hC6CA2V5gjo4hctRpBJqE6S6lRK5IkCf77A+CNtFvxAIcdFePVXlDAq0piMn00kbpXptkkWmqvmcwG5X96T9Gw6FM4NVF5PekeNoKRNUzqDVTzupdQ1mteira0ZVHj19JoWmhKmzdDwTnqJBvX3tK3OVaDaVifuP29uPGh+GL0EFfAkqQDXuUz4Oqnmv+2H4ElSAa5/GSw5H/wV+ANna7KquQJKMAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, will produce new patches <img width=105 alt="p&39; : B \rightarrow Y" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ0AAAAhCAQAAABpJ2FTAAAC1UlEQVR4nO1a69WjIBClBVugBVugBVpIC2mBFmzBFmjBFmwhLWSHh8boyMcM435nz3r5kaMJMNx5c6IUH1qZhtn/NWb1Vs/fFuJfRA/EtVDXK48MByv2glJSoFcpxpNfWDWoqd3XnkDcS3Xs+V0U5B3HBJSFMUZLfoPwv0GfBgleWaIH+n345oxWAiZYxjWvksjb6vERxW9RSgu6VXlHeHg/t8vVxQ106zJA/p66ZM8SauHBZLvb271F3zLwgGWG9mVQ6syp3v8OfNz/+3SdXFIcRWyuRJ2EYnhY7G7rmk4mygVIWQVGnT0N1Dy8yG7mdyFDwxrFKKdjltObZwPPFpliD8flAqPOx5wrh5kcN5PdvdbnsRTlurVQmPNkn5/DEnsLGKqO5qNtljPSkbpHJE4iGHz2mMlz/MbyTSlpaVh8yGXBG2xqjBT6DX3fnM8V7rREjHJo/aZORwU64cJExzPRYHK9GTCVg1PS8jMf16+H6TOd9BDZ57XKju2yiEFNc1TYFX3xwKjHfJY+lMkVPmCQisplCuiwsP1P1ulyNk3dxELfIOqwqbSgKt/k8FVZkhjETrpMnexhFhxjnTnkNwkE7xmJlucp9SVG3cd0rwCWYZcdqfGpjB4siBYOHEWFJequAU6d3QRpHHpt1KljrvYfIero6b0OOHWqIr4a8pi+EmCtbM3UXdUW8amjYgA7pfWgAtTNl0W6M+rSzdgLncHDwGjHXGua0PXTGcCpW0oWKfAax2bqQn3Pu6UK98A/hWSMuqUMl7N0ehcbwKDO7t7w7jC6fNtbJg+r6xJxcjcnoSvmtHYM6kK7H7bScTL3CEsPW9b3mH8TMqCFzykXEJI1nWe6PoO6zxgbLpRrrK7f7RdquUHQ3hK4xbWL8lRKY7KrpDqo9f5Cw0rXtG80cE+iKdLjxcmNCtzUsXHMsDcqgd3X3ajCTR0b9qaOi/AHmjtJVOIP/9/gpQJfdbMAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=107 alt="q&39; : A \rightarrow Y" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAAAhCAQAAAAb6APlAAAC0ElEQVR4nO1a7YGDIAxlBVdgBVdgBVdwha7ACq7ACqzgCqzgCj0+PRFsCYT2Pvr4dfaM4ZG8JLaE1IMS1nD3BxqK3Mnt3U78ZoyaQEwKKeGHRdHs1ngi/RIX/zGRhaztOXjTBG5kaDWzw1AotGN3uyY0u3WebN6POfu5+eSKXgDMZnm7mRMG7zq+ZagfyvohM59JfV21B4/bKn66cU/him4ZCuY9GU/Xp+zVCszazNJu5oRBJxD3yYwnEbWQ1o94lwNeERWdYtCoK3+7GjqEODweJq9VwTHZUF4l2uBiMNT6Hmq4ARNQnjyh2kKxCjLfXBjqTPDGGzJ6gN9W873Cb1aw8XHexzO4ONz2v0WpCjKb76u+QVoDKomJpUjupY3VUk2jh6cs3YoV9GDkobVhpbkxW9pCjI2+Q4pvVdl+KUZQklLpXQ6kzZc9WRsoWGPZoT9Yy8TL3XJM0lpxHz2FZQk/RrVvwGpeEyzgjk76XRiZKcoLlRQKDiAixqQtlUaSPCXuGmkQHoyuw47GBVVxKzNlEqiewnIw6yQ7LIHVwCYw0iRAkSgv55QMlgxdr6BQ+aQ/rz5j3qifpwA74hBf3FyQM9CTwtykM9gyVlL36f5KALpUYc0HUXh/A4WOrNS+SCaDKzDwWm1ilu7px1PIL3SmV2Nj5GoDTbkVFMbh3ZdCemkd7a3cCQt4zOOQcrK9vCKLB86tmQNtRc1oCqJQeJlNDdRQOGiHHxPAHiYrKIEKAZ2Sv/0opDAMZaFvGj2pNRS6MvG4o1fJgeW8wesO58ICFQNEIdkpMw3FZsmsjcJAwPWp354WDCcsm/0qCKOwyKrXxEAKwwtPF4uM1Cfysyg0o5Z8klbBF6npxtDEuhe53AYU6AgHTdh38tRrIdWPbd246eLwvgKos0Vbd/GKAe+P40NhMz4UNoN3G7T+DXo0uP8MHwqbYX5dgNOV/VF8AWRkyiLTacfRAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, such that the result of <img width=47 alt="p ; q&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAAhCAQAAADO1hXtAAABwUlEQVR4nM2Y67mDIAyGswIrsAIrsAIruIIrsAIruIIrdAVWcAUbLla5HAXFh/P5o08phjeEJFqA3qLAeyPs0rDC2BvCiSHKv4EZEWUB0hvD6YMwsjeEE7FBor0xnAZEUb0hNk399oWBiEZWmP+aTPEoyQOpKUcSDaRn3fxSkgHcWpQWgmBFCY+qQJhswSMYu9Ve2puZ/XeTekO0xHrm02+WKWcfDMVsbegkbxT+mhHFqQqXXOwywsZSo5EdiB1mSz92psECbH4zbzmE0ZGTBxyj0S8zJ2amw1xhR7Jeebm9O4ZAejcrxDP8uX3gwdlKpZMwygSvECa8hXiY8hR0OxeGoBEM+JNTbkhl5jeGKdcnM78pjK6wksu1pjA1HeRVGF1pJnfgG8HQgmobankvm1RUf51pdZLq06GtPIYR0UhctMeL3sR9oCbfTJnHuwVjGqMxQ60/af+47k3b4qZpLBbr9s7s15QECMC11XMY8gM2Njg8CNOAn/ziieW6DBK0sLvSLLVzC9XV5FdheHW6N8mmvFRlTX4Ac/VSxTJFrQym6p4yGAHhk185TNW7oyi8hVe/7dyCUS/9WyKx/I1XLnwBEL4v31D8OiMAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=47 alt="q ; p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAAhCAQAAADO1hXtAAAByElEQVR4nM2YYdmEIAzHqUAFKlCBClSwghWsYAUrUMEKVLCC7xj4CsKB+OBxfz/c48nGz7EN7gjpLUZEb4RTmuxk7A1hxQHlZ2BGQNkI7Y1htQLM1BvCiuIisd4YVgOgzL0hDi1P4sKJfIMFUNSdYQLSylwGgkIvCJOMwvNPb8TQjnn3Av3EFSMBptjwBDaiFYKosPD0JeMpfGe+j3EoZMCOl3aelLs344fL6BnmKGhAw4OY48QhjHDuryXJAGEGe2shMSM04JxAPBivI7yL7ER+8Cbn2p90C4D9J0ajm1pFr7TkJ79KR0k1RXg2Lz6vtkjEbXKAFZJoEAYvBZNXHN2jvVUV8pxw0waGuMyp8LMmQtkWpkKpdW0Jo38JpmofSiVZKxhd6cV1gzeqid3dh04tXivPwUhwHHbTEswc9d+ijka/uG2NO7zQNS80MBH1bBHF+5aOyc1GuSFWHJlPe1P43GyM5pUYeniAYjrl9I+zIEJqmdQNmN3zU7lAIZDwzNMJrIowA3yaq+nJPw2TO9WnS/tFmHICfw1myLb2uJoaw4TVsGVbe+o80xTGd21OelvG4qswpb8x5JswK5xqa35qSVjCR+n7B+mhMWaxfvICAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> is the same:</p>
<p><img width=164 alt=" \xymatrix{  &amp; X \ar[dl]_{p}\ar[dr]^{q} &amp; \\            A\ar[dr]_{q&39;} &amp; &amp; B\ar[dl]^{p&39;} \\             &amp; Y &amp; } " height=157 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-143px;"/></p>
<p>They called this approach <em>operational transformation</em>, but category theory has a shorter name for it: a <em>pushout</em>. A <em>pushout</em> of two morphisms <img width=100 alt="p : X \rightarrow A" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAfCAQAAACvt/x5AAACzUlEQVR4nO1Y0aGkIAykBVqgBVugBVqwhW2BFmjBFmjBFmzBFu6AgKdugOCx6344fO2Th8MQJomMfR4D025YNyb0OWcv9xx/9h2IwDANcSMTJtnM/sQxIs9teCK/zusfRDisxFLdyCTSASqLi6MjXlkRvw0exdJ3E/FUFoSKYOuPSMUcMxBrvpuIhwpU1kNs2d84SeYPc3VMIP7P0X8LwJ3M9lsfft0LHY5R/4ZreQwx0MX2q69Uq1vzGiCuEkNCrItT4hQuQ2mncs+gNIHMxMDD5s4Bv1y+0nqzhzWkoSJ43EaaKOOVAZepGbCfa0kb54GMLxQmJDP+L3RtmxmIXTSZXexnJi9u0hg3otxGvGh2J1gpvGWc8yIRe5HWvAZx0W/MTp6xXsrA1LQRu5WIQxSwVF8nJ6KWlfPJ5nvCXIjXo3fy6n4jJGJvqfooQTl56bVSKiE+0VZ4J2xtnOzp2s2BXRUSiZBU1/baGt/ais/Elr8LU0N0yWA5cjcmmklgYvXu3aaQMNoubhsGt/mFvPayeehxVPNqSaw+0NGC9S7zliGia7aPhXAbRiTCIWNXm568WNdSMkZNR0JYp5hj1TrmQ5LKA2R5nwcXsXKV82L18JfhcF7qYwWEcRLQyhgdRH0HoXzIibV0cRc4xb00cL179/iG3PSIrG8KSvmAiSUy6rcBcuD580z/70eq4WCnws7megWAiWUIV4U7kmUzNWgMpRqu3/csencoi2/W9WOEBdTpL7WtwAUrFZk64058S9x9nGus2/KGpZi2ZJ0XTPF1kH+lCJusn3paOHcOYOV4ikg2X2/WKbDkRFT/mL1GXjbXnaRtpzGRTrwWWfDC3FMTa6Ie+ZbaRvPwmaB8YZNFWCcsyj3dY6hW6C2DcP9zvR2S3VqpFs6U1Yrr4aXDAxSPWA14z4YPssC+Zz3I4BGrAeoRiw7lqp3H3rP4C2mXye/z6gwPAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=96 alt="q : X \rightarrow B" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAAAfCAQAAACiqYw+AAACxElEQVR4nO1Y0ZWEIAykBVuwBVqgBVqwBVugBVqwBVqwBVuwhT3AwJ5ngOCi+27fjh/3XE5NJmGSwNgd4EzZy9hrQtc7Ntp1fO0qiwxyKWsHv9GKCMFm9oBrQNaNXxE3WtQxyTRYNPvwuQAt/t68h6QeSFqscXuMSeKuhj4EZmCr/WU92HgLOoiQ2v3ae5PeQQ+zlhwzd0RsvA3Sf3wfH/M+c1CCBGyzN2FTGx3v1e7ubqQJqrSJ29i3AQdh7ONdW3rWKoHFCJI0RRSg7I4Ypx3tNsEmjBO8d24sh3WWYgQZX9eyEF5MZ+uE8YqxFFXC+F1Lc7XzouzMmpCK9iqUfWfNfx+rmPO8zz00eFLCQxzcyREkYNuMRLPG2BO17zd6+1a6HOwJ6n12q3zQxIHT7SW5jwZdoTd68xkhJEJX5KWCRtF10Yvv0Yo+LIcSh+3Tv5D2mZpOJpT7bCqfhFM26tCiIFAKRqGNJJ22C1NwCkF16OLgcU0OOVmYSFl09E1AI5KQlGPrfQVBk3VgqN6WNeA2DwjbJeGbSYvKFlnKS85DwccVTGZl9FAo6q+lsIlx3yQoE4LH5QQNMX3xyQyHqL5mr6Ulq1O+YTwkF1oSxHeRkZcVe21zjtJ0nCRon5btCNpaxN90mHQyvwBNHjhw33qosQjWC6vYVrv+HnU8yNuMCllhLe5bKP4IJkQ4KQS587lST6PRXFEsfc54DjXTGOYbj6MQgjA0hC6CA2V5gjo4hctRpBJqE6S6lRK5IkCf77A+CNtFvxAIcdFePVXlDAq0piMn00kbpXptkkWmqvmcwG5X96T9Gw6FM4NVF5PekeNoKRNUzqDVTzupdQ1mteira0ZVHj19JoWmhKmzdDwTnqJBvX3tK3OVaDaVifuP29uPGh+GL0EFfAkqQDXuUz4Oqnmv+2H4ElSAa5/GSw5H/wV+ANna7KquQJKMAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> consists of an object <img width=17 alt="Y" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAYCAQAAABOiyVOAAAAp0lEQVR4nGNggAAlht1QuIoBOwhlmMlwBlVIiaGD4R3DfzBMw6JFCSyDxUBBhrtgqd1YNO0Git8FqsACXKB2GWM4DZsoion/ga7HdEE5Li0Iu5Ad0oHdN5h2dcD5SsAAwuEbdLvewfmr8PkG3a40uBEdBNQj2QWJyDNYIwCPXS7gCFciVhPELgIBjcsuop0GAR1oAT98NJEVEMNP0xmsRQweoIQvoQIAvXxknOsPkDYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> and two morphisms <img width=105 alt="p&39; : B \rightarrow Y" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ0AAAAhCAQAAABpJ2FTAAAC1UlEQVR4nO1a69WjIBClBVugBVugBVpIC2mBFmzBFmjBFmwhLWSHh8boyMcM435nz3r5kaMJMNx5c6IUH1qZhtn/NWb1Vs/fFuJfRA/EtVDXK48MByv2glJSoFcpxpNfWDWoqd3XnkDcS3Xs+V0U5B3HBJSFMUZLfoPwv0GfBgleWaIH+n345oxWAiZYxjWvksjb6vERxW9RSgu6VXlHeHg/t8vVxQ106zJA/p66ZM8SauHBZLvb271F3zLwgGWG9mVQ6syp3v8OfNz/+3SdXFIcRWyuRJ2EYnhY7G7rmk4mygVIWQVGnT0N1Dy8yG7mdyFDwxrFKKdjltObZwPPFpliD8flAqPOx5wrh5kcN5PdvdbnsRTlurVQmPNkn5/DEnsLGKqO5qNtljPSkbpHJE4iGHz2mMlz/MbyTSlpaVh8yGXBG2xqjBT6DX3fnM8V7rREjHJo/aZORwU64cJExzPRYHK9GTCVg1PS8jMf16+H6TOd9BDZ57XKju2yiEFNc1TYFX3xwKjHfJY+lMkVPmCQisplCuiwsP1P1ulyNk3dxELfIOqwqbSgKt/k8FVZkhjETrpMnexhFhxjnTnkNwkE7xmJlucp9SVG3cd0rwCWYZcdqfGpjB4siBYOHEWFJequAU6d3QRpHHpt1KljrvYfIero6b0OOHWqIr4a8pi+EmCtbM3UXdUW8amjYgA7pfWgAtTNl0W6M+rSzdgLncHDwGjHXGua0PXTGcCpW0oWKfAax2bqQn3Pu6UK98A/hWSMuqUMl7N0ehcbwKDO7t7w7jC6fNtbJg+r6xJxcjcnoSvmtHYM6kK7H7bScTL3CEsPW9b3mH8TMqCFzykXEJI1nWe6PoO6zxgbLpRrrK7f7RdquUHQ3hK4xbWL8lRKY7KrpDqo9f5Cw0rXtG80cE+iKdLjxcmNCtzUsXHMsDcqgd3X3ajCTR0b9qaOi/AHmjtJVOIP/9/gpQJfdbMAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=107 alt="q&39; : A \rightarrow Y" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAAAhCAQAAAAb6APlAAAC0ElEQVR4nO1a7YGDIAxlBVdgBVdgBVdwha7ACq7ACqzgCqzgCj0+PRFsCYT2Pvr4dfaM4ZG8JLaE1IMS1nD3BxqK3Mnt3U78ZoyaQEwKKeGHRdHs1ngi/RIX/zGRhaztOXjTBG5kaDWzw1AotGN3uyY0u3WebN6POfu5+eSKXgDMZnm7mRMG7zq+ZagfyvohM59JfV21B4/bKn66cU/him4ZCuY9GU/Xp+zVCszazNJu5oRBJxD3yYwnEbWQ1o94lwNeERWdYtCoK3+7GjqEODweJq9VwTHZUF4l2uBiMNT6Hmq4ARNQnjyh2kKxCjLfXBjqTPDGGzJ6gN9W873Cb1aw8XHexzO4ONz2v0WpCjKb76u+QVoDKomJpUjupY3VUk2jh6cs3YoV9GDkobVhpbkxW9pCjI2+Q4pvVdl+KUZQklLpXQ6kzZc9WRsoWGPZoT9Yy8TL3XJM0lpxHz2FZQk/RrVvwGpeEyzgjk76XRiZKcoLlRQKDiAixqQtlUaSPCXuGmkQHoyuw47GBVVxKzNlEqiewnIw6yQ7LIHVwCYw0iRAkSgv55QMlgxdr6BQ+aQ/rz5j3qifpwA74hBf3FyQM9CTwtykM9gyVlL36f5KALpUYc0HUXh/A4WOrNS+SCaDKzDwWm1ilu7px1PIL3SmV2Nj5GoDTbkVFMbh3ZdCemkd7a3cCQt4zOOQcrK9vCKLB86tmQNtRc1oCqJQeJlNDdRQOGiHHxPAHiYrKIEKAZ2Sv/0opDAMZaFvGj2pNRS6MvG4o1fJgeW8wesO58ICFQNEIdkpMw3FZsmsjcJAwPWp354WDCcsm/0qCKOwyKrXxEAKwwtPF4uM1Cfysyg0o5Z8klbBF6npxtDEuhe53AYU6AgHTdh38tRrIdWPbd246eLwvgKos0Vbd/GKAe+P40NhMz4UNoN3G7T+DXo0uP8MHwqbYX5dgNOV/VF8AWRkyiLTacfRAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> such that <img width=120 alt="p ; q&39; \simeq q ; p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAAhCAQAAADab0lJAAADHElEQVR4nOVa4bmrIAxlBVdwBVdgBVboCl2BFVyhK3QFV3AFV/ACYqsSk+CLH/R7x1/XYu45B0wCrVKl0SpdmsJtqErbqGb1LE3iJlSkrXNUqiEjjKq0PR2VSTWladyCqrQNjowtTeImVKStCS9XW5rGLahK28NR6UuTuAlVaXvVM+fiKKitU+ZwZ1bvIky2SFnJANHWutRtN7Pg223raKR103/CqaY6RLRBSuO6yn1pMI4Mt6Fv3EhDjOauH5wVpo3v0Km2xuWTOVxjJPOOf/sW5XEgOjPWog7t+uBeoXeIMSY1uHef8mDd8yuX8zo+MSJRrM615Th0qq11D/du8CLHhPwyukDfUN1O9nIPwyP8+3VOuxh5b9KY0IPRBzZ+LfUhzgCu3Y4xbTSrM215DiHaFurP+NA7IfPajDXhDiZrWRfbV8dGgvkwh92VX90TEKknazyH1bm2HIdIaGDdQXOsd5kqxZi8fjYRycWQJIsubgW2mfHBiM5jhWvjOkQgnfO18c5pVZZVsX91rhs9A6VmyZc+X+tQJHtGzyrDSsYhMIyKeYhPpwfGXzVanxZd8ymQM8NmKVYyDqFh+BiA8VeNbpAuo3Hrs3fsLCuuDCsZh5AwY0YUKGNdTx1SkGEl4xASJmfX/n8anXWuAYcZM8lApaEWo/+VlYxDYJg2aYooTKJdhxRkWMk4BIbx1bo7jPN7tPNm5qW+G9XvE6WN5rLCtXEdIrCEMYc7x83ksjs6n0MdX9NX7IC7KPKa0ZZ94Rt6HiueNsohEksYf0TiybRhxtMg9E5oleA3s1MQd3VFt+E8gXdR5YjDitLGc4iE/lBZZx96JdqQ/DGjmw9hH0OrGlIHjxWljecQCR0Lhg4XduJMN+j+BPlLogajPTisaKM5DqGAmxeIbuZOqBqj94BY4dq4DhHghtHZDc3vGI1rEzWaPjXmnJbt8TtG49q4DhGATltTdCpt/SnYC8/cj5QVpY3nEAleGKMyv09Qq6RKfrfzQcqK0iZktGGG0dm/WPgVoyltXIcI+O8q7smj1m0SntX9WCaf1WWH/gBvWqjJ9mp/DgAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>. The pushout must also be <em>universal</em>, but as our category is indiscrete we know that this is the case without having to do anything.</p>
<p>We can use this pushout, which we call <code>transform</code>, as a way to implement merges. Assuming a document history <img width=128 alt="d_1d_2d_3\dots d_n" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAAAdCAQAAABWdat9AAAC3UlEQVR4nOWai7GDIBBFacEWaMEWaMEWbMEWbMEWbMEWbMEWaMHHV0UBdzUQ3uQ6k4zBnFxZYFcmhMRUEUYa0ouDRq8rm5BDSVx2ZN0O9m8JOZTQJSXzS2wJhBxK5rJ/jS2BkEOJXJbQfT8dAPYaWwIhhxK5LKH7fjIATB3VC2wJhBz6uEtKBoWaCBev/AG2BEIOJXFZCxAXla2WrXAx2BIIOZTEZa3i2Bw+GZDYEgg5lMjlpCbUUR0SWwIhh5K41Gmk8XwGxZZAyKFELvUk8v3UFSu3np4TajF6JnF1/ZhAxe9LRivqj/zC9BRCiwDMt1hZdM2XCYghjGTfvDpTYITj9hf/QghgLtHydch1ZVtNyeULAIQgR4+cPXIMS874wIP8XrvRzl2RXjCXSNVe7HWHo1fd5wsAjCA7z+6aU9VGkQSXcV0MUgvq8hH2PJpC2HAA7girmQFak3MG9cDM+Nch5OGbSiJ4TzWHHFWbJ+aI9JrqXoIJAIzQOunbDQDOg/3+4G1JKYhLJjKFXqorsTwtW8aKaDmNTh92txBKwlCCFj+1wQmT6ny/D6tGtHYJWiEuO9Hx1DjU86C9W6R6E6PjaNU7HNrIMeL+G8cQpIbL+IUTbBXUkpDq6BVvWnEu97M5HgBqIHJ969UW02IqXi7eF6er/AHAEOQYu66kOIIO4Uj8Yobke2J51wp36ZYIfTwAdofDrla6WLRn7nQMTX04YQjcHpygNUZmweQJ8WdaoS6RASAqYchCc3/Mls+83WXxCK+9MMIojIa67Z7glsXxPJBKsPt00y4gAFC9uelKdb82UqsUhdPoZI5vBQAm11sRAahE58+bjeGBpdFZvG4S25fl9tO+XL7YPulNAcjVuz9JxaRrY3twgn+OZSbZMVVr538Qg6s65ZFRnTfCe6hwAGjaks9dFe7XejqezKR2e7CRN1TunxbZqUZrlOMFvegWKVb8P0Z9ou4W/B/Kx/8unjGZYAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> and an incoming patch from version <img width=27 alt="d_k" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAdCAQAAACdgo3GAAABL0lEQVR4nNWVbRECIRCGtwIVqEAFKlDBClSgAhWsYAUrXAUqnMvCcKAcrMP90JcZ9U72cT9ePICRBGgw4HDJ4T62LOxl6WuQURKeVyMBi/4HpP5ppKYlrkFK8IR5QMDXsI5UCAnoySS77ktFWZnqjl9FPqjgWnYNmUZhOvc+kYKHTEX2fuZAujw2x0NuuPU5Qcb87nzk/tHJfi9vXKTqIntnXH+HfC+cg3SY94mSrdtZzpCCxnWa80bh7ddjpMIYPzJUCg8V4JbPuM0ZtUiDbZocApkBsaPJf1v2asD3+LlGOjQTw/CqQPfcIVmubNkVq4lN8uegWgJDYwbHsYyPXdvk46i7ng+dy+WBXQh1xQN3gqYKlv6mD6Sg53wa3qndeciAg4QGaoYRU71bR9UXL9W9uARJtBzKAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>, where <img width=101 alt="k \le 1 &lt; n" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJcAAAAcCAQAAADG4eXpAAAClklEQVR4nO2ZfZnDIAzGsYAFLGABC7WAhVmohVo4C1iYhVmYhV5IYO1WWsLHtrtne/vX7elB9iOEN0yIRVoYMcKjxVdZzbfHvDkSKZywb46BISXOT8NlAMGV9aYVF4hhfEIM3WWegsviMrjMuBrecLcM/xe4RHdclCsTY0wTQLnPxCXhKxMqxXpf4TGjQgy9cElYMN78VeqDy6O6wsNFtY2hB64YxdBhrB1tcfkD4Aem5kqFIMeC/9nG0IpLwVLNzCgGeOu0ek/DX/4TxlI/4tIw5QzAeF6Mgrw0oIoxtOAysLw+Co4Z0cEN+KLhRbWWnmse2D0ujXlyYgY5sYPMx1CLa8CjguvbTph/NuAZIPoLVtCJez6vcVnMK071MRhkD1QxhhpclBk5w7KWDrvAhWxaEmNcZVwmVBMm5watOx/95aNRUeefwo8iOOuCI4OpySji8mnKzxUTtkAfC1KGazla6g0D4brXmY9rgulLG21TVDVyMXDzmn/+HSmFy3FxXXinQkK6S7nn4urn/ytx0Y6lknmuXLFoJk5P913qtjhtuVWNK7bY5LZ+qqdvs6olOaOwcLRux6kNl/cvrIMUpQDstsjL6hJcusXaWi4vh7tp+xkbF9t5CLrO80OnejNb1GaTaiqShM1fPlNUCk0hLoGtxAJMHxbwI0/Pv8Qh1RfwcqNK2sMVM06mF+Eelwz90zm0BbnO/qj08m9TW3vGsjaI5NALbD8j62qxNUro8TaVSv4czkuOWor8nHjqVNqUuZ1SH5+drtnguqwTzyKwEodfX+T74fIquR1xifwZRLzd3TXsMjG0BIjlmdJWenuJbEZ+qdPfT6GleqFikX/nL5etFvbFsl3b74+Q4biYr9YyzFvZP61fxLWuLU8cFtIAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-4px;"/>, we can simply <code>transform</code> the input patch <img width=16 alt="p" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAAwklEQVR4nK2TWxHEIAxFrwUsYKEWsICFWlgLWMACFtBSC7XQhsdOgYZSdjb5YBLuoQmkwGUShlwWsaJYQ4AxAYsj+hZjBZ/jAzvWVi5JZim9R4GGi6AvoOWOBPvkbU9fSLbkQxxXVigkbJoqZ/IhD4CqciID8i2A3EmbHQKvS0rANgvYGWDrdcADMr5LxzjAcu9cA7rJ3CapBcKwCaTpfZR/gctdv5gSWGkNzv4HHNC5wj8CeiysATMW/gzoecCOWj4BlY14M+ZzShoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> against the composition of all the patches <img width=86 alt="d_k\dots d_n" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIEAAAAdCAQAAAAnDcfjAAACAklEQVR4nO1YgbWDIAzMCqzACqzgCqzQFVyBFVzBFVyhK3QFV+gPBLFaPsYiFd//53ttFTzPMwmxACkIaECDwU0m59WAIlpbeIatOY62CApqlXC/hAUWxbSay1hQTOu/BUh4HQsKaf3DFjRuE5ew4HCtEjpHNcCIn2PVFhTRqpBoxHWWMK23dVpQRKtyTuqXI121FhTSOrigekVbrQVFtFI50ZFj77Qi50IHYI/WHaBAil1qpjW+9JicCx0AjtYP8ECC+yatgL4CC3had+P5ll3x/LpVYAFX6y6oKG2s725Ot4Cv9QPadXBxLDAYF98FX6tGbSKcRV1kAtRaLKdsWSBcefx+THC0NlgxRhctApPk4c8ZU7Q0aXk7aQsUntMlfdUooC0wytHaojLpU4Zi4baVKsa7NE+5+b6bhEy3OlmgMRTTmae88/FEyRnlaoVVtNzTFkhPYrOM1v+HX39H/La/CWSBwcVxq0FqPF88UXJGuVph1T+YrYKpAvHTZ7gMe3NIWhobiN3vRAFDpGwdM8rTutsCcIXDPuG59bR/TbeL5000HdOEcuBohVUBZFjAwURzvgkcLPuHgy0A1ypPK0KNb5MWSwv6UGCzXvRmC4SrsFSAvt0e8SBW9aR3+xoV9zm0Bm9ahUuQCTp5xnmw68rrzWpXHrMf2DqEVHRWrZBLvT8aEY/2pGgF+QAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, resulting in a new patch <img width=23 alt="p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAhCAQAAAD5GNrZAAABBklEQVR4nMXV7RGDIAwG4KzACqzgCq7ACq7gCqzACq7gCl2BFVxBXziqUuNHhLuGH71W8wghWKL3oaktyF7D00x9KdIAqcD0QCZSpcwHjC1FVFySLmU6IK4UIRpqzIWAjGeXNEpmd88I7WXJMLthwLCtp7DSOQ4fv7d42pzGhErk4bBP7Dw8LnVICGkmrtwD2qgmu98f4BUK0aekcZ1yk+iBT+OjjSl5U9lEi5m8eCoxgu3lGEoVErwUrhhBnDO+DiM6PzzjZZXhGX11fp4z7tDDDxnz88tJ498x4SiGU61jB4uRL7ONQbqcPdPhM4zXb31+w//LmPsbnzDFf2KVGFOLce8KvACc245Q60qyvwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> that can be applied to the latest document <img width=29 alt="d_n" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAdCAQAAACZd137AAABKElEQVR4nNWVbRGFIBBFtwIVqEAFKlDBClSgghWsYAUrWIEKvmUXFXwO6oA/vMyoOOuB/UKAkgRoMOBwyKLdI1lYtqHbYYMkTG9gAQPwJaz+BFbTEO2wEnpCjeDx6ttgFYI81izLtqlbRbszyZu+BXYk51PZeiynx5y8q8Kyw2dLVWFnBEztsctfZBvEVp1iq88Exh6DcIY10GH/rV9xNxbEpZ+bHLEaM+DJK4EBmuM3voRlI1fEWsTJGC7ec3cVJhdX3k26eCZwM+9+5F5NZayMkBBhR0fNHGvZ4z08p9h8O8Wkqg0cUI6WWmc2sXuIBUpE+IXvLRx+6faQyDxJN7D3lNf3S9gB5x09Fev3SuLQNgPNDaZ0qMGG4ycFGErhHHfcUBJrKNEPEaS1oLi+ZXIAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>.</p>
<p>Note that just specifying the <code>transform</code> function to be a pushout isn’t quite sufficient: It would be perfectly possible to resolve two diverging patches <img width=16 alt="p" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAAwklEQVR4nK2TWxHEIAxFrwUsYKEWsICFWlgLWMACFtBSC7XQhsdOgYZSdjb5YBLuoQmkwGUShlwWsaJYQ4AxAYsj+hZjBZ/jAzvWVi5JZim9R4GGi6AvoOWOBPvkbU9fSLbkQxxXVigkbJoqZ/IhD4CqciID8i2A3EmbHQKvS0rANgvYGWDrdcADMr5LxzjAcu9cA7rJ3CapBcKwCaTpfZR/gctdv5gSWGkNzv4HHNC5wj8CeiysATMW/gzoecCOWj4BlY14M+ZzShoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=15 alt="q" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAZCAQAAABwKX1bAAAAsUlEQVR4nM2TUQ3DMAxEj8IojEIpmEIphMIohMIohEIphEIohEIX37qo0xrP06Rp7kdq37N7qhzAExNmGxBEPoqdUNqbgRasyEhY2lmZDfFARLqN2vIhLhRlV4msDLzrh5enSnwZ0GOmFLz49UAy8EwJXnz9AX724vWzP5MoFS8um53U1kpj2gYMcHRZV6yy0Ziuyxp7QyJk4vcWaTYc3o/iD/HwHtzjxtX+Es+4PNbuBpZXfk9dQ7PIAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> by using patches <img width=37 alt="p^{-1}" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAjCAQAAACalVpAAAABCElEQVR4nO3X0RGDIAwA0KzgCqzgCqzACq7QFViBFVzBFbqCK7ACjQFP5dQWJbnetclHD1p4NLWxBeANA5ZZSKExnxBgkOECppfjLJVRjIvx536Y07jBWXZ1ubI44RR9V9RqrHFsoKnPNeCoDwQYaTyVLKT0WYFucwoRh5t62t5AT+ywIttiyKb1nh6zRh1L+EibD/juYrTpCH0xtxw1HJVU01Pbk9i0gCEipzdzTeLUwZrK3FyWfJaZY4hjbpTlnBw38nxy+5zia7N7nLvUUwo4k81c75gfcVNLnu4CijoKGzZzS/ZcZVxzHf0C1rfucwUcy0X/NZx5/8KanNBfJHHOSHOO90J5AfWWrBD3hkOpAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> for <img width=23 alt="q&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAhCAQAAAD5GNrZAAAA8UlEQVR4nN2VbRGEIBCGt4IVrEAFKlDBClagAhWoYAUqUMEK3LKnzgA3s96uP27u9Y+Dvg/7wQeAXDNYhftShgKrFmIQ8gBmRcgOkxaTEOO1kIlSmrWYBSFBCwGIklgMuG6kwHbHaLF89an2CVdIW0yHGHbpWVpYCQPfqKl56EnAr4wWsp5zGXwvAybjX0wkpQvY00hfG0Z5KJ4fwKwcWdqABZjwwSLAJLK0EmDKD2LavSLA7M90KpIlazH2SCseh6M5wF9i4LLVrbkTUBBNPRT8BYpkFmHeKIvpnBJjWv0xhjnt7mLU9+NjmITXPnO1vQBAtZRsDvgDRAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=37 alt="q^{-1}" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAjCAQAAACalVpAAAAA90lEQVR4nO2WfRGDMAzFY2EWsFALsYCFWpgFLGChFrCABSzUAktfuzG23j4K6e22vfxDe+37lQQCRLpqaFAmJBli6mmWqKIBKF8LZ6lDKivhov64H8axWDwKux1nqC083Is4lrcmRMAcaJIrNRyL/UwjOSz2GKnhLBCcRgZtqARnUcmwO9Y0K4Y5X810mHm/dnHfEllNOM39Ns4v36YW1utHWRHXZ6wVcWMmy4q4XFG/DdfUwvm6T6aD9VQLxymdTtpykEkHUMLRxT60aA+w4t2Fj83S6xwgqriIZEnjWeq4tf643XH2+cI9caX/Kp+PG+l407aLdQKFrbJOPq5YnAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> for <img width=23 alt="p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAhCAQAAAD5GNrZAAABBklEQVR4nMXV7RGDIAwG4KzACqzgCq7ACq7gCqzACq7gCl2BFVxBXziqUuNHhLuGH71W8wghWKL3oaktyF7D00x9KdIAqcD0QCZSpcwHjC1FVFySLmU6IK4UIRpqzIWAjGeXNEpmd88I7WXJMLthwLCtp7DSOQ4fv7d42pzGhErk4bBP7Dw8LnVICGkmrtwD2qgmu98f4BUK0aekcZ1yk+iBT+OjjSl5U9lEi5m8eCoxgu3lGEoVErwUrhhBnDO+DiM6PzzjZZXhGX11fp4z7tDDDxnz88tJ498x4SiGU61jB4uRL7ONQbqcPdPhM4zXb31+w//LmPsbnzDFf2KVGFOLce8KvACc245Q60qyvwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, and they would resolve to the same document, but probably wouldn’t be what the user intended.</p>
<p>Instead, our <code>transform</code> function will attempt to incorporate the changes of <img width=16 alt="p" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAAwklEQVR4nK2TWxHEIAxFrwUsYKEWsICFWlgLWMACFtBSC7XQhsdOgYZSdjb5YBLuoQmkwGUShlwWsaJYQ4AxAYsj+hZjBZ/jAzvWVi5JZim9R4GGi6AvoOWOBPvkbU9fSLbkQxxXVigkbJoqZ/IhD4CqciID8i2A3EmbHQKvS0rANgvYGWDrdcADMr5LxzjAcu9cA7rJ3CapBcKwCaTpfZR/gctdv5gSWGkNzv4HHNC5wj8CeiysATMW/gzoecCOWj4BlY14M+ZzShoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> into <img width=23 alt="p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAhCAQAAAD5GNrZAAABBklEQVR4nMXV7RGDIAwG4KzACqzgCq7ACq7gCqzACq7gCl2BFVxBXziqUuNHhLuGH71W8wghWKL3oaktyF7D00x9KdIAqcD0QCZSpcwHjC1FVFySLmU6IK4UIRpqzIWAjGeXNEpmd88I7WXJMLthwLCtp7DSOQ4fv7d42pzGhErk4bBP7Dw8LnVICGkmrtwD2qgmu98f4BUK0aekcZ1yk+iBT+OjjSl5U9lEi5m8eCoxgu3lGEoVErwUrhhBnDO+DiM6PzzjZZXhGX11fp4z7tDDDxnz88tJ498x4SiGU61jB4uRL7ONQbqcPdPhM4zXb31+w//LmPsbnzDFf2KVGFOLce8KvACc245Q60qyvwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> and the changes of <img width=15 alt="q" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAZCAQAAABwKX1bAAAAsUlEQVR4nM2TUQ3DMAxEj8IojEIpmEIphMIohMIohEIphEIohEIX37qo0xrP06Rp7kdq37N7qhzAExNmGxBEPoqdUNqbgRasyEhY2lmZDfFARLqN2vIhLhRlV4msDLzrh5enSnwZ0GOmFLz49UAy8EwJXnz9AX724vWzP5MoFS8um53U1kpj2gYMcHRZV6yy0Ziuyxp7QyJk4vcWaTYc3o/iD/HwHtzjxtX+Es+4PNbuBpZXfk9dQ7PIAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> into <img width=23 alt="q&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAhCAQAAAD5GNrZAAAA8UlEQVR4nN2VbRGEIBCGt4IVrEAFKlDBClagAhWoYAUqUMEK3LKnzgA3s96uP27u9Y+Dvg/7wQeAXDNYhftShgKrFmIQ8gBmRcgOkxaTEOO1kIlSmrWYBSFBCwGIklgMuG6kwHbHaLF89an2CVdIW0yHGHbpWVpYCQPfqKl56EnAr4wWsp5zGXwvAybjX0wkpQvY00hfG0Z5KJ4fwKwcWdqABZjwwSLAJLK0EmDKD2LavSLA7M90KpIlazH2SCseh6M5wF9i4LLVrbkTUBBNPRT8BYpkFmHeKIvpnBJjWv0xhjnt7mLU9+NjmITXPnO1vQBAtZRsDvgDRAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, up to merge conflicts, which can be handled by a function passed in as a parameter to <code>transform</code>:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb9-1" title="1"><span class="ot">transformWith ::</span> (a <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> a) <span class="ot">-&gt;</span> (<span class="dt">Patch</span> a, <span class="dt">Patch</span> a) <span class="ot">-&gt;</span> (<span class="dt">Patch</span> a, <span class="dt">Patch</span> a)</a></code></pre></div>
<p>Then we can add the pushout property as part of our QuickCheck specification:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb10-1" title="1">forAll (divergingPatchesFrom d) <span class="fu">$</span> \(p,q) <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb10-2" title="2">  <span class="kw">let</span> (p&#39;, q&#39;) <span class="fu">=</span> transformWith <span class="fu">const</span> p q </a>
<a class="sourceLine" id="cb10-3" title="3">   <span class="kw">in</span> apply (p <span class="fu">&lt;&gt;</span> q&#39;) d <span class="fu">==</span> apply (q <span class="fu">&lt;&gt;</span> p&#39;) d</a></code></pre></div>
<p>If the merge handler is commutative, then so is <code>transformWith</code>:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb11-1" title="1">forAll (divergingPatchesFrom d) <span class="fu">$</span> \(p,q) <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb11-2" title="2">   <span class="kw">let</span> (p&#39; , q&#39; ) <span class="fu">=</span> transformWith (<span class="fu">*</span>) p q </a>
<a class="sourceLine" id="cb11-3" title="3">       (q&#39;&#39;, p&#39;&#39;) <span class="fu">=</span> transformWith (<span class="fu">*</span>) q p </a>
<a class="sourceLine" id="cb11-4" title="4">    <span class="kw">in</span> p&#39; <span class="fu">==</span> p&#39;&#39;</a>
<a class="sourceLine" id="cb11-5" title="5">    <span class="fu">&amp;&amp;</span> q&#39; <span class="fu">==</span> q&#39;&#39;</a></code></pre></div>
<p>We can also ensure that <code>transformWith</code> keeps the intention of the input patches by using <img width=25 alt="\mathit{id}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAZCAQAAAAcLy9eAAABJklEQVR4nK1UDRGGIAylAhWsQAUqUMEsVKCCFVaBClaggt+ciD8bP9+djztP4Tm3tzeVqkErUz37C0ZtuOYGIyhQsctCWKQkvNaxldViEXyH4nGt9MFPkDAUfBFIU3n+i1B2TKkRQE8pQ22ueUpj6yGfd5RypcWSBuFmAWgr5SjlWpMX2g14vvQ9lbJ3Z6JJgc5Xj5yqSu0BVrqLTAX3GhGbi6wAcu2SX/Z8l9uzHfMUL48P96Cn3hkcnXvq0vWUnIGk3dD08QwU02Vw+q7ybNZCszznopTB6yQHuuS0xRqWtSGVzFNdfHh4K4gFhuIp0xIfMsk9SHeRzzmEfB+kMGcoPqqenlfcP0qLhdX4/09EPob6jmuAFxI6iiwGLxIm2r9ymN+sH4TC02BqHN7tAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> as one of the diverging patches:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb12-1" title="1">forAll (patchesFrom d) <span class="fu">$</span> \ p <span class="ot">-&gt;</span> </a>
<a class="sourceLine" id="cb12-2" title="2">  transformWith (<span class="fu">*</span>) <span class="fu">mempty</span> p <span class="fu">==</span> (<span class="fu">mempty</span>, p)</a>
<a class="sourceLine" id="cb12-3" title="3">forAll (patchesFrom d) <span class="fu">$</span> \ p <span class="ot">-&gt;</span></a>
<a class="sourceLine" id="cb12-4" title="4">  transformWith (<span class="fu">*</span>) p <span class="fu">mempty</span> <span class="fu">==</span> (p, <span class="fu">mempty</span>)</a></code></pre></div>
<h2 id="coda">Coda</h2>
<p>And with that, we’ve specified <code>patches-vector</code>. A patch theory is “just” a small, indiscrete groupoid with pushouts<a href="#fn3" class="footnote-ref" id="fnref3"><sup>3</sup></a>. We can theoretically account for all the usual patch operations: inversion, composition, merging, <code>diff</code>, and <code>apply</code>, and this gives rise to a spec that is rock solid and machine-checked by QuickCheck.</p>
<p>The full code is available on <a href="https://github.com/liamoc/patches-vector">GitHub</a> and <a href="http://hackage.haskell.org/package/patches-vector">Hackage</a>. Please do try it out!</p>
<p>I also wrote a library, <code>composition-tree</code> (also on <a href="http://hackage.haskell.org/package/composition-tree">Hackage</a> and <a href="https://github.com/liamoc/composition-tree">GitHub</a>), which is similarly thoroughly specified, and is a convenient way to store a series of patches in a sequence, with good asymptotics for things like taking the <code>mconcat</code> of a sublist. I use these two libraries together with <code>pandoc</code>, <code>acid-state</code> and <code>servant</code> to make a basic wiki system with excellent support for concurrent edits, and edits to arbitrary versions. The wiki system is called <code>dixi</code> (also on <a href="https://github.com/liamoc/dixi">GitHub</a> and <a href="http://hackage.haskell.org/package/dixi">Hackage</a>).</p>
<h3 id="acknowledgements-and-related-work">Acknowledgements and Related Work</h3>
<p>I independently invented this particular flavour of patch theory, but it’s extremely similar to, for example, the patch theory underlying the <a href="https://pijul.org">pijul</a> version control system <span class="citation" data-cites="Mimram">[see Mimram and Di Giusto 2013]</span>, which also uses pushouts to model merges.</p>
<p>Another paper that is of interest is the recent work encoding patch theory inside Homotopy Type Theory using Higher Inductive Types <span class="citation" data-cites="HoTTP">[Angiuli et al. 2014]</span>. HoTT is typically given semantics by ∞-groupoids, so it makes sense that patches would have a natural encoding, but I haven’t read that paper yet.</p>
<p>Also, another paper <span class="citation" data-cites="SepLog">[Swierstra and Löh 2014]</span> uses separation logic to describe the semantics of version control, which is another interesting take on patch theoretic concepts.</p>
<ol>
<li><p>References</p></li>
</ol>
<div id="refs" class="references">
<div id="ref-HoTTP">
<p><span class="smallcaps">Angiuli, C., Morehouse, E., Licata, D.R. and Harper, R.</span>, 2014. Homotopical patch theory. In <em>Proceedings of the 19th Acm Sigplan International Conference on Functional Programming</em>. ICFP ’14. New York, NY, USA: ACM, pp. 243–256.</p>
</div>
<div id="ref-EllisGibbs">
<p><span class="smallcaps">Ellis, C.A. and Gibbs, S.J.</span>, 1989. Concurrency control in groupware systems. In <em>Proceedings of the 1989 Acm Sigmod International Conference on Management of Data</em>. SIGMOD ’89. New York, NY, USA: ACM, pp. 399–407.</p>
</div>
<div id="ref-DarcsPaper">
<p><span class="smallcaps">Jacobson, J.</span>, 2009. <em>A formalization of darcs patch theory using inverse semigroups</em>, UCLA Computational and Applied Mathematics.</p>
</div>
<div id="ref-Mimram">
<p><span class="smallcaps">Mimram, S. and Di Giusto, C.</span>, 2013. A categorical theory of patches. <em>Electronic Notes in Theoretical Computer Science</em>, 298, pp.283–307.</p>
</div>
<div id="ref-SepLog">
<p><span class="smallcaps">Swierstra, W. and Löh, A.</span>, 2014. The semantics of version control. In <em>Proceedings of the 2014 Acm International Symposium on New Ideas, New Paradigms, and Reflections on Programming &amp; Software</em>. Onward! 2014. New York, NY, USA: ACM, pp. 43–54.</p>
</div>
<div id="ref-WagnerFischer">
<p><span class="smallcaps">Wagner, R.A. and Fischer, M.J.</span>, 1974. The string-to-string correction problem. <em>J. ACM</em>, 21(1), pp.168–173.</p>
</div>
</div>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>Up to <img width=37 alt="(\simeq)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAgCAQAAAAcASjuAAABcUlEQVR4nLVXAbHDIAzFAhZqAQu1gIVZmAUsYKEWaqEWvoVa6JLu7l+7vRdoYY/b3VpoHpC8EJxjiLSnDt6F2qGj+3O5kW5wi5uFtIJsk18PZJl2gdDLkNSFTDFLM5HcWrMFlSjuVLvXPu1NvDPIbFpj8owkFuluPa3OW4jWAibxXF8MQkdDbzEiyYvTY0EiA3i3cZu8SyN229tqCAXtzSKN0mFTWXpUj0n+Ke0C1xGg4VnGQwRCp+5+Hp51pSsIgAxFROlGQrd8vdV16NhjFD+IpPNVOiQOv5tRP457COkTThBUeZhupOET/8Nno2RvOhjPmM4bkehlC7NMJxkCuUjXCqVDcfxDOggmhB/RcZm3YLLojNPpJqjMWYpO1e0B6WiKniUzfmLYP6hrSHtGfWC49TbO+faEfkXf0aJR4PYs+xQJuKe++zK+T5MTvKRduteXEct1dIBH5x3oXaPiYhLKxXYRb/lU34JgDr8Ajyy8AHaiqVcXitb6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>, of course.<a href="#fnref1" class="footnote-back">↩</a></p></li>
<li id="fn2"><p>A <em>group</em> is a monoid with inverses.<a href="#fnref2" class="footnote-back">↩</a></p></li>
<li id="fn3"><p>What’s the problem?<a href="#fnref3" class="footnote-back">↩</a></p></li>
</ol>
</section>

<div class="tags"><a href="/tags/category-theory.html">category-theory</a>, <a href="/tags/patch-theory.html">patch-theory</a>, <a href="/tags/haskell.html">haskell</a>, <a href="/tags/version-control.html">version-control</a>, <a href="/tags/quickcheck.html">quickcheck</a></div>
]]></description>
    <pubDate>Tue, 10 Nov 2015 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2015-11-10-patch-theory.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>Ad-hoc Frame Conditions are Logical, Separately</title>
    <link>http://liamoc.net/posts/2015-11-09-seplogics-behind-it-all.html</link>
    <description><![CDATA[<p>The main direction of my research thus far has been to exploit linear types to make purely functional, equational reasoning possible for systems programming. I’ve talked about the <a href="http:/posts/2013-11-13-imperativereasoning.html">difficulty of verifying</a> imperative programs before, but my past entries about <a href="http:/posts/2014-01-01-context-split.html">linear types</a> did not discuss the advantages that they can bring to such a domain.</p>
<p>Chiefly, they allow us to reason about our program as if all data structures are immutable, with all of the benefits that implies, while the actual implementation performs efficient destructive updates to mutable data structures. This is achieved simply by statically ruling out every program where the difference between the immutable and the mutable interpretations can be observed, by requiring that every variable that refers, directly or indirectly, to a heap data structure, must be used exactly once. As variables cannot be used multiple times, this implies that for any allocated heap object, there is exactly one live, usable reference that exists at any one time. This is called the <em>uniqueness</em> property of linear types.</p>
<p>This is a very simple restriction, but it proves a considerable burden when trying to actually write programs. For example, a naïve definition of a linear array would become unusable after just one element was accessed! Other data structures, with complex reference layouts that involve multiple aliasing references and sharing, simply cannot be expressed.</p>
<p>For this reason, when designing the linear systems language Cogent for my research, I allowed parts of the program to be written in unsafe, imperative C, and those C snippets are able to manipulate opaque types that are <em>abstract</em> in the purely functional portion. The author of the code would then have to prove that the C code doesn’t do anything too unsafe, that would violate the invariants of the linear type system.</p>
<p>Specifically, Cogent extends the (dynamic) typing relation for values to include <em>sets of locations</em> which can be accessed from a value<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a>. For example, the typing rule of for tuple values is:</p>
<p><img width=317 alt=" \dfrac{ x : \tau_1\ \langle p \rangle \quad                y : \tau_2\ \langle q \rangle \quad                p \cap q = \emptyset               }{ (x, y) : \tau_1 \times \tau_2\ \langle p \cup q \rangle } " height=54 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-22px;"/></p>
<p>Observe how we have used these pointer sets to enforce that there is no internal aliasing in the structure. It also gives us the information necessary to precisely state the conditions under which a C program is safe to execute. We define <em>stores</em>, denoted <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, as a partial mapping from a location or pointer <img width=12 alt="\ell" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAZCAQAAACWALYfAAAAyElEQVR4nH1SURXDIAyMBSzUQi1goRZqYRawgIVawEItYAEL7BJStrclHB/JezlyyQGRhUCRdrMykahRoY7o4oVyRMyIwaZs0mX0G2RTqqPXkzlz1VlikiPWZ+lS2T+coFTNm8qaE437B7LNJl0oZcmyRgOPhWyE0+dDKiu3q5AOun0KiQEHqMvH7XLOFYUg07HhEkFnWqKImOsPg+0r03EHvFH6emAXSU0YiPZ8UUi3fNsdazjftwqtynTO5+X7TWhtijqIvz3eKndTR9IfsMkAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> to a value <img width=15 alt="v" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAARCAQAAABzuJQIAAAAqklEQVR4nI2SAQ3DIBBFv4VawAIWsDALWMDCWZiFWcACFmoBC9tx3Rru4JK9pklz//PzCwA/DmQQAiyBFUNBx5ufbqTCs6athMrvZS/T/PjOItRwkETQObQE3FSR5iLBN2eRHmq21NA5ZMznzjpopnVaFk+Qaf30c8F959aRv5Nvhmrd/AoX9f4lsme3UiQ78Tb2zU0xRDGfbN3urmVzH3xebM3/Wcc5OqkfjVhHdZXl1YQAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>.</p>
<p>Assuming a C-implemented function <img width=87 alt="f : \tau \rightarrow \rho" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIMAAAAeCAQAAAClbGVwAAACI0lEQVR4nOVZ7ZWEIAykBVqwBVqwBVuwBVuwBVuwBVqgBVrYFrgQcE9PPoIHz+dz8md3BS5MkiF4jMXRgb0anM3swwyYZuJuZ+4CZwpIGNiIVKi73bkLK2x+xE82J16aDQKLwakCf686zEjD62FLQt7tBAGNy1VWo6FjfcBGyLcasqthnVIMMEeiTVDw0SHWNB6Ts7fIYLbRFXvO8XnMpuINnGE9LYEA8g1bvnv8+GPgtKzj6YNDpLcY+syGJnyq/CrmsGYNEmyuGQgdFQL+/m8ZcaQkOZ9WFMLT0EeeK9AYvvtmLqRwDgtENZ6tf/05hkz45jAKqjYMMCqYVsyybQ5HbYb5i+CwjZU0csBsPMLlQ1Rma0hkD5HaI5U3/4FN9ZWQEQuqwvk3Ew1kJRr2m+bNaLBEaLDc2jJQlK4/ipZqvQNzQ59Ovx06f6ErN53sd0NFeRMN1LGlptDfdD6EsvEmGqiaXoYF8id/AIdUYE4LdysaWmjDQmypQ3Ff08HRj6FhIK9qTnviqEKJ4/Y8JQwObtCu4X26Ci+DfqtwMrr3ds7JtmuCc+C+6aYQ0flm2o4dK7XSdiW63myN/TZ+ygfGkHR9u1PQ4qG/B5uq9iJHnhqiOJwYKsyfxXuTnC0aZIOrYjs6dWMtRUl7vmnT9qJZ5ef2RFc7SEt6ZDvyulSUrNeui30UdBOJfhxCd4oXon5L+EjIwPuGF0KmO8a3IPtvpx9FgFBHo1qFNwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> is evaluated with an input value <img width=79 alt="v : \tau\ \langle p \rangle" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHcAAAAiCAQAAADPc45FAAACwUlEQVR4nNVZbYGEIBClAhWoYAUqWMEKVrCCFbaCFaxgBSt4g+CewAwM7Lq7Pv/c6QFvvoc5Ie4AJR7FKyYhL+HyAYxiKV6ziv4CJh+ArKJeo6KfQCe2CsdsYFVzAZvLMRVHrsUMFr4dFFiprVrZQxDcLl0N1TEoQVHdW7l8AAsIXIsHBMKt0IKF1BWrJRh+QD6qF/1fCY085qyZsXqM7KNg5Zmn2X8AwXCWhG+YsN7gCYO7h3cpWhN8p/sXuX+nnnwtDaNPgvh2rY1nfdp/ReMUjfwBlg1O4DMJ6d5R9UtniPf71xl2nxyx1f08sRoHP7cqoD6CUJZTC5FpxJ5OIsc80bwuT+R9Ww5JcRp3jCa+z0BJnn7bCtNOWDmtC/fu1Ol5buNUgNXnia6+Vk9n11QZt2thDZXsZZAotsIK2hCKtGbxFTc4FcRI9GQdQinlzGnoQK8pP8BAVVyN7CSduHGqlURUi8OWvt626jKvPUqyWFzqYoCJe3gmtv9IJ9s5iF5dHG8UdKGfaLJmpsTF0NLnDkH0vu8apUk6OOhemRYX52ryO4HWi14qWdRAR2kwhwdxE6LFxXPwkroZnaN3fpMjG+AkU6ByKr7TQuyeuff+OwWvzeOiXFwqWWE7qb0OY0gkKoPebWa6l3xzLsHxeS08Vi1zwKli4o6EDbODn8b1pCsji9omk6OWo8jZv+2YsyfcEXXUHZg3eG1lDH7SfXJ8MNdmy7O3ndmXOmwAo8VxJTCCqL2aUJ1dooU88Egs91Fi3SPrr0CPn5+xIqKfattcp0yZhjX4UQXNgALF8K/f5m5adnvGBjBW3M7dnFP71Q9+voa4+vJz/CuDny8hHsBwxX1t8PM1hDaKMzOOePBzC4QRyKvgtxy7GqjAdXni3nKobuFXz5Yl7i3/ZWLRedW3BUFyiUpVz2B+AuXUUYX8AV8Be3GQ/AykAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-7px;"/> and an input store <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, the return value <img width=104 alt="f\ v : \rho\ \langle p&39; \rangle" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAAAiCAQAAAAAcXjDAAADlklEQVR4nN1aa5msMAythVqoBSzUAhbGAhZqAQtYwAIWsDAWZvti6CNtEzp377CHPywfDclpXs0sY38Vgi0da2VwvzL+CYXugpntl9fu7MWm91/P4B4Foa+7gtPNfWPQtIXEEbaAM6U/bJbvWswd8dC6Xw2wSa99BqsNkSgWONv0wlF/3JC3Xfz8/8XakeE2bbVKnsyYhYte+LB3xu/u6HFCWzBeXMttpMVJaoo8sIAhWMhvmuVUR2EwQZ76F3+7UvWjhrh7Y09CjYIl8zf3dMUsbL701RhB07GArUfIXNHEce2+ChAnPtQwjlr6aq+JJHHO9BdaUqipaXCVlp9LNQTJ7KlB0YtHK1zZ5m/396qi8OQbljRtTo1K7DamRcRga9v81ujZzjEeaT7iWsrLt1YG0mrw8rqnUuei7sW8eezu0wpc/VWCefvo9cJGk/tnpVosvcr15nTQUs56zi2J2DoZV0ChzZ19Y2UkLJbANSAv1nQvblCzUuNC1anmaIj3SFWJGby6cDgc2BIJQ+AxLaQ9lwvQyX93fX958GTi+7213s3hc9zxdtyji4ZHjXpNPexG6/MxtqofnxgKm+K2OM5SypOJReM0QiPuAQQRzsQyZqCTcnmqnedKmUgCfs49cdgKzOuZlkacAHYSG1Q1DdIKpoDvQCgd7SHijnipp40Q5dLBqMS5IArFSZSBNUCFAEecLPpPjTg8xlosUYlTSZbrmYM5QCbiiCtXvjJxFG2nLPcmwijEjZGHlJIzBVA2U8iGZClUyTJxqLmHx157m0oci3xh6wzTVN6BJaveMEqVDyZuJ21zYy63k4k7HV59ZHr3yjRwbTWu44LLA0ScIFpaLQ2Q2i1MXinTn7dLO9cBV38rbxIUocWBzYOIm0ltU3MYn58FWjj6eszQk/sjXY06p8F5np2QrcipTa6HzHKkRPWFJ5rDeFo37VA/n4Y4zqo1GpyJmx01zDZ10FI4NOh23zUNrDFeWB+m0NY8cA0XPC4ctreA9TgTVMcQYSOOwaGm4diw41qIZxvEMF5emKYJghpCU9zOcT0tDTTolr7JkfaiW9gzjP817N1nj7ybg9sRik79bdY/B3RWpSEfdPcR1zeM/zXQW/AcqYfkVZWCfBj/lVhZPo+jIs1J0DwOC9SPg9+AFX1KKEMkgdlDHOrn6G/AZ34Gj/uusYM45D9A/BU8onAftfHXSoMgHcz+BD5lLkj4D7vR+70JW7IrAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-7px;"/> and output store <img width=23 alt="\sigma&39;" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAaCAQAAACXpS23AAAA80lEQVR4nK2VYRWFIAyFV4EKVLACFaxgBStQgQpWsIIVrGAFvWw+33no0zPm+CHujI8x75Co3jwFw+rDZlqpt0IaQF7A9IAs5KyYCZhohTg+krdiOkCSFUI0vJELATI+B2VhBSQej5GwLA/5Mi0wD9ILCF4hrZGLuOA580zexBK+0621HN7x3CH8U8gG+HiIbd4j/pjDfr/KHGrUEU/K9JydsgVzFYbCN134bk2UWR4hsVdh4RIT2du8g1FU5w6jEL5cRKXIo7Y2xKopdx71vZxOx6rSjd9757usSsVyHUlGAf1VCcnWsm6ln5PtT+SwXHW3bVfnd2cy1MdlAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> must satisfy the following three properties for all locations <img width=12 alt="\ell" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAZCAQAAACWALYfAAAAyElEQVR4nH1SURXDIAyMBSzUQi1goRZqYRawgIVawEItYAEL7BJStrclHB/JezlyyQGRhUCRdrMykahRoY7o4oVyRMyIwaZs0mX0G2RTqqPXkzlz1VlikiPWZ+lS2T+coFTNm8qaE437B7LNJl0oZcmyRgOPhWyE0+dDKiu3q5AOun0KiQEHqMvH7XLOFYUg07HhEkFnWqKImOsPg+0r03EHvFH6emAXSU0YiPZ8UUi3fNsdazjftwqtynTO5+X7TWhtijqIvz3eKndTR9IfsMkAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>:</p>
<ul>
<li><strong>Leak freedom</strong> - <img width=284 alt="\ell \in p \land \ell \notin p&39; \Rightarrow \ell \notin \text{dom}(\sigma&39;)" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaoAAAAhCAQAAAAihifSAAAHrklEQVR4nO1cu9GsNhSmBVqgBRpwQAFOaIH4ZtsCHXhowJ7ZBhzQwA2YcQUEboDA43ytB0IC9DgPLT/rez+Cf3d/kHTeR0cSRfET90BVNF89hB8GLePZvZzKooY+WIoHwTd/KUoyg3g0lsWYmUNz8SoeWVvEgCvx/Px4FxrB6YHx/F5OVTEJysv0Y32xiBtf4u/9IccKIMn7HIdGar8h1GIsX2dUfInj+TGKa1FUX4lG9MfJCHxyGoShJWh/rN0O4m9OtXkHKkUiXhX4NM6ZXY4cUV4zxfXNlTieH6/tug4lW25+OUkHEUGlfJZEz7TpKzAoJmGVkU9jJ56rCM+FMX1ZZpBD4hR+9OIaLzYqfn7hl1Mi/vVbcJOf7p0ly1DcCiYtSHXk0ziysvIzSqVcec0UihwSp/KjudioeLOpmJzm4hnr1jC2vzjbxWPcPCzO/3Bp5OblZ0hPn9dM4eBLnM6Pa41KO2EOwnLqw6lz5RD5jOeJO7Siq1GJx1zz26OcFSUuVt2RxmeWONUSxvO13LjWqB7sKkFYTm3YYDvFHI0FWIt6qBrOqHJkez3ePumenICLiVVcGn8Tn/7MTOMLoc5h9BtdcPAlbvhB4ca1RvUU4+YhLKcqPCfut8dakO8s10Is1stWShyV870R31uEWPZTY0ys4tLYA0UDp7HNlE6WYLOw4Escyg+NRiXto/hbFSGjqrYYKOdA7phqxUOT9lfr58GJkbb9M6aE65ISaoRm2dAwrK1pmcXlFDS455YzDoAcvxTDXNBBv1Sl29fmIZu1BvRSxcoO2MpxyvkAxyoujRDzxdE4iD7yoEXLgy9xuDtr13Upcw3KNR6Nqt/d89o5CsvFYuOwvmTW8ti1f9aHWD6gJTSvPSy71NY4jbicptB/zQKgLLOmvVYPumuPSplDt5LfKqHOyhsYEiBK4Uv3oCsQPBo7QF6OpXEGu5I0AAuRO3AlDuGHRru5GR0FJsdALB7ql3HliLnLmFW/Kfu4JaDDyudBqb9ue15/2SO8aKHHpvvUDlE/qyOj6T0upzGUyBoWjwAFpdZ8tFAeK0NtoK5X5kRKkyv8yV4HNHEejbCiLJ9GX5sN6FqEIsLNiitxeJFaU+72YvhjUXuMYVTG4rqh16GlZpcVmHHZCGPb9tNYqrG5ifMzYoAhBI1qVo21oHRkYE2umxOLbeBPIVSWgAmYQ2MDjKT2biqNR1SHpCh+LWB3x5M4nB+d15kcF3/7kwEZQ3O56KZkbjvuc/2Jy03QUHSvrkZpbuNCxhCSqk5XYMVR+PzHh8Yz7HJViXi8qbZAfQRsXZ9DI6bozKHRhxoYqRqVskgFgsQrnsTh/Bi9anosVPij+FzsZ0NnVzUe4hTOqGZPrxM6nwiuVGmBQ4ylJiZ/Bj6FC7F+jyFSOIbEKjqNYXP2g04jH3Iv9gKoy3IkjuHHMT0zo3RV/xyTNPpDZDrzbyyORQi4UZXeXgd0PhHc5AW3T5PHhhOQuO+LKVwM8VVxSKy6P425oFOuKcqRq7jxOqm9bXP/zW9Ux3iWz6j8vernMZXUgFGVa4YNQaO8VCwFiScfYYWLL2Am9gMnYxWdxl+Lf4o/LqExD2ThRsaqmGJwJH7mR4wbn2lUmHyi9zt07UNh1ZwyGjHSCCtcrP90xTEVq+g0wlfCDGg05kCt1pPSqRlH4jh+fKZRYWa+3p2Tg6ruwDfMTCzV8CvcnDCaCZCqxGIVh0b8DmcajX6UqigAvRZxd1rheRLH8WMpjhU7ib1R6Zqbv1DhxnaaUYVK6rXX4M/Pp+A1qhrZVMc6m+JTuCohYFh1L3YXnUbYJp49KDSGUBY98JKzJNhmJY7EsfwYvZ7/WA6Q5nNcZStPpkYzqvDi7+IZGz6feIb4qIdignyTyLajZ0gS8CmcZHFsBgD1jfHTPTQaU3M5Hyg0cqFnPnBQJY7lR+OJB2aPhUXnScX0CF2a6Ebl19fh1CtlnSq4+KtJ176iTm54qRmzg2YnTPNLTB3gO9HjS5IUGquCMoPE08hFhT6wSZM4hR/HrUPGpPYxQu+EsJG296SEVKMKbag1C+u2TdqOiqCbMbuDR5Cldip7p5wE0sKUk2kpxkoxIaZuuDNTcT+Kp3Eu/gb3bYGlkQ9KPKVI/HdC/bLatruaV74szm7IcbtrXrlm90raRQF7v4lxx+23koL9L5YjY3DU3XpvL55vSSYVzaPM7rQF6IlqlcMP4m6caR1XPZ6JpAhXa4pXCbE0/rL62HfTyAVl3keR+F/i7u9obugjHS43GodDo3OXu/982R3+4BlV7GRzu23wlT1SluYTM9kG2Wjn7Di2F2Rh1Kx7XP8WIQyNMvH89gE09ujTVAY4iffFv8qwcNzQ0KfMut03X99N8D90pBZk5LsPqeevcbtCgSizLP7eE+ZQyf+ZRgw0P7DcuANyv1jOgnLqOjs+R+HoryP7HBoxyP96tuvwPtWf3mauCJwrY3fFSF44+BwaMaDz4+tBeeEABC3yaOibENqScjdwXkf2KTRikP/1bNeiBhdk4GgueHcYCJ+icLGDJil8Co0YcPhxD9SkhYcQKtXaLUzKLP3dX+EqxvzhU2jEgMOP+yAfDeWd+NESVwM+CT8CjT/hwX+78UYJwc65lAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, that is any input reference that wasn’t returned was freed.</li>
<li><strong>Fresh allocation</strong> - <img width=277 alt="\ell \notin p \land \ell \in p&39; \Rightarrow \ell \notin \text{dom}(\sigma)" height=22 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-6px;"/>, that is every new output reference, not in the input, was allocated in prevously-free space.</li>
<li><strong>Inertia</strong> - <img width=283 alt="\ell \notin p \land \ell \notin p&39; \Rightarrow \sigma(\ell) = \sigma&39;(\ell)" height=22 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-6px;"/>, that is, every reference not in either the input or the output of the function has not been touched in any way.</li>
</ul>
<p>Assuming these three things, it’s possible to show that the two semantic interpretations of linear typed programs are equivalent, even if they depend on unsafe, imperative C code. I called these three conditions together the <em>frame conditions</em>, named after the <em>frame problem</em>, from the field of knowledge representation. The frame problem is a common issue that comes up in many formalisations of stateful processes. Specifically, it refers to the difficulty of <em>local reasoning</em> for many of these formalisations. The state or store is typically represented (as in our Cogent formalisation above) as a large, monolithic blob. Therefore, whenever any part of the state is updated, every invariant about the state must be re-established, even if it has nothing to do with the part of the state that was updated. The above conditions allow us to state that the C program does not affect any part of the state except those it is permitted (by virtue of the linear references it recieved) to modify, thus allowing us to enforce the type system invariants across the whole program.</p>
<p>Presenting such proof obligations in terms of stores and references as described above, however, is extremely tedious and difficult to work with when formally reasoning about imperative programs, particularly if the invariants we are trying to show are initially broken and only later re-established. Typically, imperative programs lend themselves to axiomatic semantics for verification, the most obvious example being Hoare Logic <span class="citation" data-cites="Hoare">[Hoare 1969]</span>, which provides a proof calculus for a judgement written <img width=123 alt="\mu \models \{ \phi \} P \{ \psi \}" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAAgCAQAAAALD3piAAAEX0lEQVR4nOWa25GjMBBFlQIpKAVSUAD7w99+k8EWKZACEWyVUyAFbwikQAqsXhg9rqS2Rrb3campGmwDVwep1WpgrI06NjDe6FxGPRPyr8aJ0Fv3j3hISLBD/rVRz+5sZyu7sbHiaM5mud2ln/kv95BVS+CbbGqpb3C2FK63SEeTs99pCOE2Js5C8TDKG/Kch4ZqB5wT+sUof1O6njrP6uwr4Js+7pB9b5Xb3e4dEkwXHVvyMFd4aKh2wNWZSsOY0lgGGttZ5FdcHiz23ZuBXumhkdoBHwlnojV2A41d9ZGuOov89jYPTdQO+NyssSsJuOrlJrBcYYXiYar20ESfAF5KQ6nAmQV+XZXiQfx/wEtCjcVHfhR4D9Ih9Fl8+XcA53Ion9nGXWYXKrFLeaMC5xZ4zkMvP7vJ4HMpBD543+Y8OJp0U/xLCT2pUO53O+B4dcd1XrvKX5jAMGj4O0jrjFb5HTp7CHy2ty/loZOoD5vLXNfxgffaR+wbeXB0A8OENkG1BY40SOubvYaLrdO3YQeNXcCZYuBcozq8/ul66OT3s+12bht94IZc3JuRh8hOLfAftoJQ2vLhSQWMWH4PCrFtQQ81mgjAexuelowH43fIAj8z/HAiRx4iOzXAv7ODvOWnkQWu8VQQuT4PsZmVZ7hU4WCQX0eqctvCzpVm2QPPAj89hAt55MERmnlp+WarHq56Spzu9SCLOLyjEDYF7hZ8Mgc3fwc1GeyBFYAzPQbjGxV7cISA09KfFjF81tMh6g8h4DgSp0aOqtnN0a0yRSsBsKY9lIGvRA+OPg/8Dqtr4XKFClxFaAX3AnuLjqR6oAGPe3jswdHXQkqLLEXlBHE+Wwe8003Nn4nugQY8vFXIgyME/N1p4QryDYPJr3W42DiM4WoaC/sVBTj2wIJJEcfw8HrIg6N64N/kb37pdVV5y1eaUR5+LnR8T5cmmKWgHJgGHK8FDi9kxCvNA0yPhTxcBA07L07r4T/hMxX0lCUntLSfgx6M8vB4RbeCjJ4OPG7x4SENga9BTT3twZGIhia3K6zxsZ8+8nW1lLPagRc+M+gmSulqYenBMAZuSJwEfOAzGGEpD46EbZiJVFxXKozFTRdn1mRO+eri1Vnv6Jw9oxHGb6U0cEo1Mv7NaD0Y5C7wRXLC45YI/NwWeXLu7Kej7+urhbO98ePj/153geOpxn4F+LVsWnThzHTNST/VSY0ZAvBFz7a7hu1e5pa1+Y7yLH/UCc/trl9jeKY8u+o0rVRsznmY9HlPB1vh7QEC8Dpsn3gAUcKGGkt7WeltDyD+BOBTYvpxRXvis1c/3qJ4oAEvePgTgIvsXGF0xvC88FTaygMNeMGDYLVvCrUD3jNU2/ZFWRsM1W2heRBeulzpgXJn00e2etXNFIFyEboMfNDvBta/TFn2IAp5G8nDyNDylCKeyRaelXpotiaLnUqzTVmR+kcB4Stv85Y9CC+Tq/QgGmJ7pbrGr0bXqYrUb6L1ZfSU6DnzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>, which states that, assuming the initial state <img width=18 alt="\mu" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAXCAQAAABQH/ylAAAAn0lEQVR4nGNgQAfGDIJEiSGBcoa7DP8ZXFDEXBjOYIihgVVABehKOrCIoQFsSminzQWLknLytGETo502Mh1JZpAQrS2UPG0zkUSUwEnrP0ManI9T239gMECUdDC8Y9gNFrkLdEMokL0KnzYYnAnUqoTE78DtyJlAG/4D8Uy4gyC+W4Xbfy6EPD9YtJWTpw1HaOEDaeAQI8O2NPxlFAwAAEMsbZPmxj4kAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> (which maps variables to values) satisfies an assertion <img width=19 alt="\phi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAeCAQAAACVzLYUAAAA40lEQVR4nNWUURXDIAxFYwELWKiFWcBCLdRCLGBhFmqhFrCAhS7LYCtpYIOP7Sz8lNPcJC8BAFpmwcOl6aHaDDutARD/DbSjYJdZWAgLDG40EqQOm/eQJ/eVnFcGHQeJ9OVbsCOXkBpyLNVwuAiTjk0cOf+UGgMXrtq9OHzuJPg4SbOWr5ybBA3v/RmUjudx7Nw2tdBfgK9ZSdDWNOaB18Cl1lUUEbU5xjOWS6kdABT1KDm3pPMIzjV9JRpYCab8jtVHTV1ZcL4XeW1w/eRayewdQAkOGBY97ga//Tz6kefRtKAbW7+k5CxkFBoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, then the resultant state of running <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> on <img width=18 alt="\mu" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAXCAQAAABQH/ylAAAAn0lEQVR4nGNgQAfGDIJEiSGBcoa7DP8ZXFDEXBjOYIihgVVABehKOrCIoQFsSminzQWLknLytGETo502Mh1JZpAQrS2UPG0zkUSUwEnrP0ManI9T239gMECUdDC8Y9gNFrkLdEMokL0KnzYYnAnUqoTE78DtyJlAG/4D8Uy4gyC+W4Xbfy6EPD9YtJWTpw1HaOEDaeAQI8O2NPxlFAwAAEMsbZPmxj4kAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>, satisfies <img width=19 alt="\psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAQAAAB6Dt0qAAAA6ElEQVR4nNWUjQ2EIAyFu4IrsIIrsIIruAIruIIr3Aqs4Aqu4Arc48d4YCl3Xs7k2sRIykdpeUAk20iWdGMOaxM5+B+h5jqqb0B71PagQUCHLJqsA+SCb/jn0R4xh28BbsioaSmy5Ghc3J6zxg1JaEdrGCuuWiWiXpZ+bDiUGiiFaqdrqOWqfR/9IqtQ6xHia2U7HNFjQ2c1OZxuxVwWLFGLrJWclPS0h3PU396xBu6HviT4FZ2RUQD3tb3PqMykthlI0JbC50xhqg3HEH3FMh9f9zteiR+gjb5KaEXuLXRDd6v6ka2rh54ZfJvc+V9UxQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>.</p>
<p>When our assertions involve references and aliasing, however, Hoare Logic doesn’t buy us much over just reasoning about the operational semantics directly. A variety of ad-hoc operators have to be added to the logic, for example to say that references do not alias, references point to free space, or that references point to valid values. To make this cleaner, we turn instead to the <em>Separation Logic</em> <span class="citation" data-cites="Reynolds">[Reynolds 2002]</span>. Separation logic is a variant of Hoare Logic that is specifically designed to accommodate programming with references and aliasing. It augments the state of Hoare Logic with a mutable store <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, and the following additional assertions:</p>
<ul>
<li>A special assertion <img width=45 alt="\mathbf{emp}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAAAXCAQAAAD63DoZAAABgklEQVR4nO1WW4EDIQyMhbWAhVpYC7WAhVrAAhawgIW1gAUstDzChkD2XtteP+4mP5AmkyHlsQAcF/BwLxbSuGGBNZlPpsu8jvNswQgFpnhMGoGQZ5Bdl5ntuAVcUUKzG/rX3WPSOHQRMc0X2FiW2fkozyfuyKI8EzyJCGXFClyZ6b1HHpNzaVNsQ0+W5YrHorS2Vsqr/hrlcL5JIhYUQbBDqMEIWkUroXePZl3so3LfGhR2xsAEPRDmtWTPKKMvUZvuGM9M7wcRxC30ww9FZ0oz9KLJ0B/kNGY/1QtCPUyXjMvgdFXGOvF8RYaV/5bflrEey5iDe/wlGQdb5mUyvLC9oW0Z7r6kEnQyzsiIk4y7vGyFl0yP7WlbdPRZ4cZhP9GTdh1knZPRey16eOaUENNo6+4+eqKIkHs8tFuWrGcN5fqO7I0RrnJaMb2DYVd7Xkb+3Ynch9DlHZz28I/Rn5TK/amEV0A+sP8y3oT69UVn5Hn77VuQTtgboPCrtdnhCXkAPzGo/ywkWBYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, which states that the store is empty, i.e <img width=112 alt="\mu, \sigma \models \mathbf{emp}" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAAgCAQAAAAsofuKAAADSUlEQVR4nO1a7ZGkIBAlBVMwhUnBAO6P//Y3GVyZAikQwVWZAil4IZiCKczx0WiDDeLI1c5O+aipHVno7vdsxGaXsXdCw3rWfncQn4SOPfXnRjXcglbGLWhl3IJWxi1oZdyCVsYtaGV8pKAP/Xpd0leCVsvTMc7E2iRTttH2agr60F6ets36u0djIzIRcPCo4MpH1OooTY8ISoxtngDr3F5JZJvAoJ3HlDo2vUSzs4RmoLXonzMQNFepObUE7Vdfrg3Ig2tCf5/RiEVfN5brE41hu3lK216CUSpd3Y12QEhJEH2lhFwWNPo+PvXH4KEtiZVejFqC9pCZxn8LrDj4V3CLlRXRrZsJeozAI6wkJ7LPv22e63ejRrieUoFQ4r0iaGPvIZZtDO53CkbQ33ZxHbf0Q6gBOTfIiLSAEVtmebH42sODzMajFqRGC9ma4FZLUGHdYsptkZWvaKHmmkpa4ZE0Jr9MT8wJi+WW9BjY2QulIjk324kc7QjawwuCzrvgmF1WcR/l/3qGqkg+g1AcEeWnZ84zc7zl/Y2cCX+B2XhTOitoQy4CmXYb+Lr+DE3ldChoKAzFslRQmV70dQTtSAdumWVfMn6ooDTfpNnzSz4naN5OPUHTT1gfy7cJen5TygmaP4+/BSXxICmJgmfoLz3iL9QuRy39EpbZJFAs9QRVxIYWmO13zs/mzUJko3ErD+YZ/39QoZprJAELSRA0BcUWzxVB91XeM30DnVlMu4Uqgq/XPiSVEXm/75W9h9ZZ8s5XSHyqtinFfY5r4oXQV6wDBCZsDe6qil43BRMHCDm1Z7dgZwuwvFKqUXpKiNnH10cCXxMU98odU8Ls1qSWpkXX3pAIhKfA1xmdplMmZ83DEU/dJMTEtvomZmiiCnsU4ucbtjrbB9oS1PZJbp0V0U2QaHm7pMYV7Jw3xExW+JMbY6tMpprHdwKdCc2r1euCmt+PpO2LhERB1jXBVnCM2gfM/GD7Ogu8yzvbB9GeITQXLuMzePcTe/q1KYNyQk3uUfwyPlLQ9EaDMbD4vKYGPlLQkmX8ONjjX8X7CupO7Lf9vfC5zNnxmaWBea+b/sP/ybXoj2XvBertoGhaKaFzu/fPRxsVvsl19A9nhPl0FiGniwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> if and only if <img width=116 alt="\text{dom}(\sigma) = \emptyset" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAAAhCAQAAADq41hoAAAEB0lEQVR4nO1aibGkIBA1BVIgBVMgBVOYFEyBFEzBFEjBFEzBFNwG5G6QUYf5U7WP2vo7ytE8+gLsuv94En33+rYI5xgutCEwtW9j6sS3RSiDdSsI+T5ot8DUyOPynIGAts4wMleSj3WNBJSt26G0BIPx2OXWE0yvLb09cMRhYaW1LSB7pfXstrQDAXL4rR5EU8OU1Dovy4GrSpvjUERjcjkIe0/z7mn+u1iCpVwUX9XxgjUm95q3jfuYH5CkBgNw4/SWKGJXoLgSbcnt31n3LKRxtvG7U+BjX4qpqd7vtiV3fISW4ZElqsEacDMri5FLW5kxtCV3Bo97HxQkvhcU68fxudkUqa9SUGMq3gr4S7scuRTer+qN9JHUe9NDC24jNj3+P3mG4vpPsZxEegqtGIjPbZmO3kJ935tkDCwYR/6iyVMPw5HXmjKpdYjJ5UGd/VgxDeGlb1NQS5rMGPSf5gUlUpjqez1G2Ozy6l8hlvqgcgMhjRzkMU/XtPJwiLoeWrGgee6onogjSppahl5uJy3UP61d27FUu0q4uRJkR8wnb85aNj0mUT3pttpSYh8nmrgyHpBr8vOMI9UU+NMbE3J7hBShSPMj5B71xOyyOayJxvVZcomSzadwLvrVc3LZGyUHn1xqs2uU3Jc13lhMvypPiDSE+1NNTVX347fjiRAsSxhPnIgOJrmJTyfk0sixlUreUfnkjna+KLkCFTeuii2A1kIR1QppEokneofcFRl1QSVxfX8+0/XJna0sKLmx2WJVUx11w/iami6TSHSgnlyCjjrhvs32/fktsCOXdG6nliU3NYGwKiuQG+v3c+Tio/LE0YTvPk+uyxZkuKXe00RJf5NcnELuTfZzcDROXuqH5rm/SS5OIT8JaM/A7dD8Y1KOxYKtS5PxmFxaCGi+KVwjN5eK9ejCp+3Dd2WI6lI6pdvUOH3gntCzBYFqQhw2JI1LFIlJQvk1cvObiA2RTfaYm/h8Qi71NtBnpXThOKl5joFSzlgkYIh+mD2bwwsxUU2TL8R1cvHkakpGLee5bXZomp8RlM1f5A3b/HbJltRQG+qM3lk5xeeIq7hKbu7gxiT9rs+zHVqrq55V5dtOsbLHndQeq5iryc07iHEbPb0Im6ql3y2Wflff6Hx8zCMJyu2BBL7qnbGYXd2wDifUPnOfUQcdD4ybJKVbEBqQM6uddUoBDc67tuDQ8R65pUA02IMkOWI5i60+rn4AeqHN7e9c3hnSwI3rX9hUWPbNdZxdLpLjlPm8l3afh2zqVM58t/CncfdiXYJnncvzMEfkP4EniFmaXPJo0IYO6DZIkIlcwdD8m5sfgvyG5frdrfxa6/uf4/1h9BfzVKra/af2FFeCBPlroeUfiNIbyywLHqwAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>.</li>
<li>A binary operator <img width=97 alt="\mapsto\ : \ell \times v" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAAAZCAQAAACbMgQdAAACZElEQVR4nO2Y7XGDMAyGvYJXYAVW8Ar8629WYAWvwHWDrMAKrOAVWIFK/ipQQFLqNPSON3chF/whP0i2hFJXl1ZG1e824sqyalKDmuF6a1cdwDFw7eGq323MFVV5D0LZiOrWRgimy7/u/WhHLoNBRLd+qAIsCcwjBty/1lQ8EFoA5PLo3Wnbs7k1wL6EXPFjGYMr+E4Dv86WqeF+f3hvPPVADY/C7oxecU/QltdM4YIc3Shr8Ms/N+KRF94fAkhqDyAhoDP/7uAuhvO0sQWTjZGY08sIzhHcORpmW+PNmongSQkjHv10qOxBogBZmMNGSN2qX/iPsXYjykZ68COec9YR0fnYCdHADOEtJAqQitaGB7b2Gct4hLkzH5EGRA9m2wYWTgWx84gansN7LSHRgL41eCDLx1u9BhF6xwSQShUKsw9dJzopEyQJoNBru028JNBQNSzJFSoVQjDyD4ygAEkCKPnMOpxn3vHzEc2Uf1yBXGSEcbiBu1TH9YDNXMuANtx3C9jwE74ln9Ef57/3Ix33Inm/0fek0oS17GY36rkpjDzQejIP5ipsobKFBkCjTwdlfZvVblTz1y1F1BcrQzBZHHJ2zVUChJJCWu5GI997ZYiagu90ELRdlLEcLQGhZJCGvEFbQZohRCSp0jQApTZ0u3J+Q4y+BYSSQOpiMtuycvnFtFQdtTaH2zYk+JQpKevFUWsic98DlKziQarjSVz+jUXWIHDqVKNRXuei2QPpzfuAUC37XGTXZc+KX8RyvShk66EOp8buT3ysYSJ6PJGoimREhUcFxvAi3vzZa/3qyIO+ANMqON/lruNFAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, which states that the store is defined at <em>exactly one</em> location, i.e <img width=125 alt="\mu, \sigma \models \ell \mapsto v" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALwAAAAgCAQAAAAC5NoYAAADiUlEQVR4nO1a2ZHbMAxlC2yBLbAFFpAf/e23OsioBbbASQGZUQtqwSlBLbgFBbxkHTxAGZkkth9n11qtBRBP4CNIibF/CZx1TPztTrwjFFvghxIc7ElSiy8JauI1u7MJbGpCmy8JWuKHYM3AJyez+pKgJF64bLfQ5AL2cqAk3tI9rEcfnS+Ckvh5pdsS/0ERdMQLsBTpHoPkfJAFHfE9WJrD8T1IzrO4/1nBkokKIHUOAwE0KiBBr81A9tmWtkdHvJUXn+cdHNEsymZ0WcpdzGevIsfj4JRxH7pit0t0KFdBz+734iqM2R35v3LXUBE/giXjjkz4zKFH29TrGCpjgPh8lPxwfgEukxjdBfvQdeJcHZ27ygfFXSXtw5dgSWeHPh3xcdlki8pSvquGisfOG131Wxp860D9Nk4eziW9pUi+Qrx3snU7otaPlobvTp7qrSx+kfip4rXtVhvI+Zro8tXuMb/16WYc/vU88fo00ATKytcqRvVWrlRmR3yXG9or2ojnYHdEftdL7JmDJPEqQc9wgXgb9rGDt8S5lH+ajF+cLMxVGWkVNwkJNaJKjT704dirZI9SxKfOlcHdFcchbjaVdQ50Gr9s5hhajxJu54y4RiRYWHLTMw3xKkm8zt/v3ZU0xGPGl0WLuO3bXC1SbweVV/l5jkZqSsSX7VARz4PG12E9/kCKW2w3N8PU+6kPKm/y5WiK+PbJtUR8OUuoiPcTW7l+v+rRoFfC3U7lZckTDfEyWXVohMZ/g2/8CmvbWsvns3Hr41rd49FKvGnaONgm4K00AlViJr5STt4T2T0hctD6/7nZYCi1/MQpGe42R4/42LpGJqZ1OtXlwladhqhwivaoDyKZuqhy5iQ2uDqedq/mkUIqm21tHvG7NR5xfuwr6+dAfCzyxfrM0t63DtoUKgVvMD/oRLDzCAm/cqUhPq4c7dQmC+tNnt2wO6NnrY8QZeCuKk+R+NgMUCg2f0fq9O4G5Trpr1Bww3C00z8IiZt0VPs/mOl6j8L+zBbKkX132Ww2smIvHjfdFyGsEpldEClvCxc6JfFy3SOsb2zhgNkiO2JkmGVcU+AakcX2rZaWvXDq1zsUsbX2pxICVwO1BI5dorSA/oWm/wT4wPmFIpPS/4tBFSfMLQaG2a244v9ticfIh6zUNM/4f0vie4bb0+tcjUz/Xq+AHrzly3YKHXhbtfLBCb8BFxs56KLx6qcAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> if and only if <img width=235 alt="\text{dom}(\sigma) = \{ \ell \} \land \sigma(\ell) = v" height=21 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-5px;"/>.</li>
<li>A <em>separating conjunction</em> connective <img width=56 alt="\phi \ast \psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAAAeCAQAAAAYofFAAAACG0lEQVR4nO2X7ZGEIAyGacEWaMEWbMEWbMEW0gItbAu0YAu0YAu7IaArCAE/zpu5udc/u7OEPBuSEIXgJIUSHbviXg1Cn/E3iDc+z4HCWX+nDU/qH/RujddA5f1EGXXXQJ/TCVCJxwDCkOGELQqwAzQHrIeKVS3u+hI9A9oHvybcKFyucRtNhj1Bz/hJVcJC8RwaRHzTM2/2DEFb8tnmtujxZ+MXb4++Ifw5b3gAtMF9AH1MUQRDUPdXdHqL8F/EOWooEXKSa9ltQdMZ56LYs6CNT71kMdvDhvVbDOpuqlz+WdvRAxiPril1cpIs6OJv3Bu20cIYtKHvKuO2I6wXrurowGwSzYW85kEFnS/szWKwfXtismaFtfk3UflBsfhKoDrtT18Gde4MxaGmQ9SAJiJ6B6iNqaEHKu60GtBEjjrQbyRiUMnmqE1+QxtbWEnNRxVgw2JJ52hih6XB50BHtupf1LxaIXwxLfZc530HR7u/mWxxJgRRxFJ9dM46hTUvx9XKxZYH/aLEoLYwk9bSX2vphg9RvPMqX6GLpqClh6DAnJ6HmXxktqBDIT/jXeqmgsH7kztQhdFkRxsHZ2jRkmM9ZW/BcCO7vnbWAn+KioYfV1wj+tflqUKuc9PyTJhHR8a8Y7Ijpd54NMfffCFqVz+tvzzhO5X74L26CPrcW2jHXiiMfgc0MYSUBBW39Z3qaH494a95EHLxmNUHrXFzm0ipXJ4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, which says that the store <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> can be split into two disjoint parts <img width=24 alt="\sigma_1" height=14 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAQAAACEL4QbAAAA8klEQVR4nM2UaxWEIBCFpwIVqGAFKljBClthKlDBClSwghW2Ag7Xx4ry0l97OSqMw8fAmYEoJU1G2kB8NEsOTSX9kzLi7mnG29NXvjN666hZPSYM6CuJw8sT1MkCTJ9WjJI1feQ+ypjb49jFCP98DhoRmqegcBrjxTYlbBUprH7diIX1rj6/ZZMEMaxd5GcQp3sDOp/SmggvQTqyMHBZUIcp19+cOaMCiBBwvDohw+1TkL1tLp9HRZDeauo3MZ/ZRRBJlfktKiOZUiqQCigk2nTUui0URxUUpASgKz5NoBb9E4hx6a63p3tzW+1yx9V7qoQFlYaJiCriaPEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-4px;"/> and <img width=25 alt="\sigma_2" height=14 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAVCAQAAABr7e8lAAABEElEQVR4nJ1UARWEIAxdBSpQwQpWsAIVrgIVVsEKVqDCVaACN6ZOQJDDvyfIYH8bDABq0DCTGLAiCBuLqq5vYCaDAF9uA3jqv/y3jwawsInhf0WxBPoiJnJh4fM/kSK/ITNYaWxHYjlhOYl0PzRHOY9TxV1ZC52r6LpQHEGZDrI2x8SnidQ3MFepLGtTo1VONBDhMNW1W3is0dT6VvJPVFrGPhnpYk4wVUO2xV7l7rZWsfiKl03KdIfJTJtUeEuxV1e+NauPc7kmn6sdi4gzmIPMEt3SIYr31TVneYGTdwAfUsNHNwJFFJUjTrCSI9Mn6juKRHu88Qq9powPkZPE8d27scNzGZ/ib1d9AKEQuR0/qQqdyXxIb/MAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-4px;"/> where <img width=95 alt="\mu, \sigma_1 \models \phi" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI4AAAAgCAQAAABu4ogdAAACyklEQVR4nO2Z23GEIBSGacEWaMEWKCAvvuXZDjK2QAtUkJltwRZMCbZgC5vDAVZEroZd48weJhN1FH8+OBdZQq5hDekIPVvEfzVG7vD3Nq89Dw4l4urYnwWnh34vvyafBYe/4YTtDSdibzgRU3AuXiQ8F062tVBw5VzLMQoDYpAR+KMJMmIr7a8+HEoG0DMjnAl0cdAZVTXgzVsRDB49IowBgjv0N+LrF/ivhKiz8t5qwpG1zR0Uca2uQ1ALHIkwoJsnPB0LWR0+1eNxg1IEHrfQEwcppVYTTgcYZt2b7VZK5wIaveYDcQROg7NgI5DYeVEfW5NwvtBJ0y3usi1qMwDcmDOjk3mtFhyOM2CLpH9MmZ8Pl0y3MdrTuJkmF05vrXjHmGcIw4FhSf4359rkuZZvtVZO64zGhdPguQhJ2AfkUjjqBa4TiUDS5P558iirEXNcGPtUHlx7deAwLxwlYw12DSb5OTMW1YIz1oVT7lYxOMy5a7k2nPKAHIOzFuoUHYqdAmeNSi4cWhZzyuG0Xvr+Qj0Xzgfc96Or61SL9WeKvpCqIZWtus21I6l8cVaJkbWfkZKV8219hsRaLMBzZ2X46pxA/c52i4piCl5ZmgHLwjsMTOwcK1TnvNqtqK6F/EUg9yyOjQTZBt0Rx28ieWWGRzo4VpXKoINpoNB+SFiHE6qQXw3HAJh03LHh9OF4YyTYTcAwqXVuhsE3EH3WP55gADX88fB6OEb9jN5gCowOF8ESc0mGQBa8TVguJDu4WeKo/sKODavTDqn6Cg3sDDjKJ8bNMphgfIktixIJPGNYstCL77KdA2c17qT2ShJya9v0G8+Hk2X5EpoDCT70xvPhhBLLTkLeRtSAIe1vG9OyYJuI2i2MbzP8i18fcuexTeSqPNtmxrSyk+H0JG/PpcP4/sofNGgqlxw0rguWDGPZElJZ6CrWxMbxC2h7HbdkT5oIAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> and <img width=95 alt="\mu, \sigma_2 \models \psi" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI8AAAAgCAQAAACBIOMjAAADBElEQVR4nO1Z25GlIBA1BVIwBVMwgP3xb77JYMsUSIEItsoUTMENwRRM4W4LqLRCAw66Y5VNzR0f3OZw6BfconiGsKIpyv8N4udKXXzg7xWPXEkPL/qnU38dPQI0P94yX3pIeekh5Tp62peekOaXHlJzgu4KSrCYZzFSwrA1JE6xNglJdG6p+nLRUwGGDkpMrNnW3aC3SNpiPMCoi+EUtBpI+IC+Xg0/wf9RXem7dG3fp4cBMcv42/Jgeip494FPp3QOQzsX2Rv1LW5gSbiWZvgaNLaJ2nLQw2Diwiy2rQvToxno3SpcVJyhh6k1sEmYhxVJOrDMk/itXDXcfI6rnzckPczYuHN/l4sesTPgOQp9Lz98rY4Zbp619yDZxx6u7p327YriZ+qCeQW63bPB8SxecljPIjQ9hbJ8p6W76EmvC5j6xn4AqZ5i4SqLiYijipyJPURP77PAPPTUTnq0k245gVmZLByX7qYn2nrSnYuiZ9MzghE3qrf0ezvSeSc90bEnPTRT9CxuVMH1sEYJru5COnPSs03fHXuc7p6HnsqZPwSKPfuRjnEJyy94/9dU3KEWclS8eMeq2ZtCdFdcVJ9J7BOyFC2zyUqkl+8gUzIj+2NtTqjGSU16rI2APT09oPekCt3VnkRpqky+3i+Tow4g5cG96LpntrfRq21Blsu5BrR4mB5hzdUJYvPMEjpPZs80qq1ab1jX4Xry7U0MGfaE6Kp5pECtyHLRowu/wRBk0yNhTgSOhZ6lSVBRWvfLBAWi0Q/ho3Y5TYAccXNi3/BLwNaambRq++xb8BWEVJFjUtTYyjoLXmlqFmpSjTFircs3NQa9Jv8RAkKW87ynBDp64xnaO/wYT4GIWXMG2qiKeC4Nh6gRf8RxWAqIMYIeWkpFjqaPBzaSD6OHnUj3x7G61bbGGzPXUXMCPXFHVa3y1/O/eleFPkFcWugY4mp6QrXS2jXGYapA3ooFZTd63KvpiQoT3F9QI2msuuEeKQHbuZ8DQlKjLB3oGguCzkjPEmLG/wD/HSgTOt8KkgAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>.</li>
<li>A <em>separating implication</em> connective <img width=69 alt="\phi -\!\!\!\ast\ \psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAAAeCAQAAABqbpP2AAACSElEQVR4nO2Y23WEIBCGacEWaMEWbMEW7CDHFuggxxa2BVowJXDSQI4PacAMA7iALHJxNz7s78PeYJjPuYBLSEyUTKSLjvgfDYSX+DWQFa7rAbFSv4onPllvoOqJT9ZYB0TP96hSXR3Q9VQARCGsjAicOEPrZtDxmtMcomAtXS2sfiO99Y0P1Du/BpabYDgHMxwn9gi3wLvpJCiWHPcGUFa8FmttF6hF39pHJnr4WejBdso1iLk8npihVKAG1mPgy+xFxAVSyDxswqX1a0hgApaKbu3FBopXgopKHwVqdGkEm5dMMrZ98oHUySEn/33bo3ZQ4CvF76L5r8fFgIxf435i6w30gRr8PGWC3N2Q7t/ASocJIpN7SazLOBDBvGL7aT7Avm0/zlbp5vH1Qb7IL/mExGVYH6lN5giIh/3iFUCD7kYp1w/ez5yOmQIUiFANEE2KkIrRN9SQAOvpZ5AUoEANKaD7nfOBaFUNySgKXFjWEMVmPCVCuUUfrqGAJbORGvlAY1WXu2HTbwnRTcHYT9nZViel9icF2WwCYl4EQvvQkgXhWjd1M25WVayOtTou+0AcvApaobpowxsr8+JXrvSjj9HsbJ0uEItljXJ61nfSBhoq68dfJe9UOGi/FJINNEF0okWgIAQOMjneY3UdTMyQtJd7zGU6eyY8LKsmMYKf/LgG6XbONtcM+Xvm40OZ5CMNtzwT+f9IMa+NX0XvJ1aj9H3itaoEut6/Pl3pBn9toMBh9Egs47T1SnX4HFXgV3NBGKVI5/0DPryTWYIRxZAAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, which says that extending the store with a disjoint part that satisfies <img width=19 alt="\phi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAeCAQAAACVzLYUAAAA40lEQVR4nNWUURXDIAxFYwELWKiFWcBCLdRCLGBhFmqhFrCAhS7LYCtpYIOP7Sz8lNPcJC8BAFpmwcOl6aHaDDutARD/DbSjYJdZWAgLDG40EqQOm/eQJ/eVnFcGHQeJ9OVbsCOXkBpyLNVwuAiTjk0cOf+UGgMXrtq9OHzuJPg4SbOWr5ybBA3v/RmUjudx7Nw2tdBfgK9ZSdDWNOaB18Cl1lUUEbU5xjOWS6kdABT1KDm3pPMIzjV9JRpYCab8jtVHTV1ZcL4XeW1w/eRayewdQAkOGBY97ga//Tz6kefRtKAbW7+k5CxkFBoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> results in a store that satisfies <img width=19 alt="\psi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAQAAAB6Dt0qAAAA6ElEQVR4nNWUjQ2EIAyFu4IrsIIrsIIruAIruIIr3Aqs4Aqu4Arc48d4YCl3Xs7k2sRIykdpeUAk20iWdGMOaxM5+B+h5jqqb0B71PagQUCHLJqsA+SCb/jn0R4xh28BbsioaSmy5Ghc3J6zxg1JaEdrGCuuWiWiXpZ+bDiUGiiFaqdrqOWqfR/9IqtQ6xHia2U7HNFjQ2c1OZxuxVwWLFGLrJWclPS0h3PU396xBu6HviT4FZ2RUQD3tb3PqMykthlI0JbC50xhqg3HEH3FMh9f9zteiR+gjb5KaEXuLXRDd6v6ka2rh54ZfJvc+V9UxQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>.</li>
</ul>
<p>Crucially, Separation Logic includes the <em>frame rule</em>, its own solution to the frame problem, where an unrelated assertion <img width=27 alt="\phi_r" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAeCAQAAAAbFv9oAAABHElEQVR4nOWVURXDIAxFsYAFLGChFmYBC7UQC1ioBSzUAhZqoQuhZRsFTsP42Vn4KW25JOElCNEyJayYmn8wzYgdx1Ak/DdSjUcOMiVmBHpCrigkwNOX3+AsghxiHCEfhN/wyfZhH7jYH0fyHrikjTahuUBN3pzL8lx6SgPTQqiQZjkyVpPh+fipwxwpaW45yBxxFdFOB8cw90PIl/ZypOLn8pR2DTlfTjyUQXRBl9sLZF6UdLmlmUaNhu8eoUstJTGwmtQhiyH4F1cs+HbCzYplAEejkBekqeRxTe1vqnUAOIIx6VmjD45CLtWNu9P+VOpB51gxtFpzu4XMPW43tC5k27qQ7Q7pe5DtG5J5O91DsmoeSIlDL13Zh3sCtT/B6dz/pqMAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> can be added to both the pre- and the post-condition of a given program in a separating conjunction:</p>
<p><img width=188 alt=" \dfrac{ \{\phi\}\ P\ \{\psi\} }{ \{\phi \ast \phi_r\}\ P\ \{\psi \ast \phi_r\} } " height=52 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-21px;"/></p>
<p>This allows much the same local reasoning that we desired before: The program <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> can be verified to work for a store that satisfies <img width=19 alt="\phi" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAeCAQAAACVzLYUAAAA40lEQVR4nNWUURXDIAxFYwELWKiFWcBCLdRCLGBhFmqhFrCAhS7LYCtpYIOP7Sz8lNPcJC8BAFpmwcOl6aHaDDutARD/DbSjYJdZWAgLDG40EqQOm/eQJ/eVnFcGHQeJ9OVbsCOXkBpyLNVwuAiTjk0cOf+UGgMXrtq9OHzuJPg4SbOWr5ybBA3v/RmUjudx7Nw2tdBfgK9ZSdDWNOaB18Cl1lUUEbU5xjOWS6kdABT1KDm3pPMIzjV9JRpYCab8jtVHTV1ZcL4XeW1w/eRayewdQAkOGBY97ga//Tz6kefRtKAbW7+k5CxkFBoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, but otherwise contains <em>no other values</em>. Then that program may be freely used with a <em>larger</em> state and we automatically learn, from the frame rule, that any unrelated bit of state cannot affect, and is not affected by the program <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>.</p>
<p>Separation logic makes expressing these obligations substantially simpler. For example, given a program <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> with an input pointers <img width=16 alt="p" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAAwklEQVR4nK2TWxHEIAxFrwUsYKEWsICFWlgLWMACFtBSC7XQhsdOgYZSdjb5YBLuoQmkwGUShlwWsaJYQ4AxAYsj+hZjBZ/jAzvWVi5JZim9R4GGi6AvoOWOBPvkbU9fSLbkQxxXVigkbJoqZ/IhD4CqciID8i2A3EmbHQKvS0rANgvYGWDrdcADMr5LxzjAcu9cA7rJ3CapBcKwCaTpfZR/gctdv5gSWGkNzv4HHNC5wj8CeiysATMW/gzoecCOWj4BlY14M+ZzShoAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> and and output pointers <img width=23 alt="p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAhCAQAAAD5GNrZAAABBklEQVR4nMXV7RGDIAwG4KzACqzgCq7ACq7gCqzACq7gCl2BFVxBXziqUuNHhLuGH71W8wghWKL3oaktyF7D00x9KdIAqcD0QCZSpcwHjC1FVFySLmU6IK4UIRpqzIWAjGeXNEpmd88I7WXJMLthwLCtp7DSOQ4fv7d42pzGhErk4bBP7Dw8LnVICGkmrtwD2qgmu98f4BUK0aekcZ1yk+iBT+OjjSl5U9lEi5m8eCoxgu3lGEoVErwUrhhBnDO+DiM6PzzjZZXhGX11fp4z7tDDDxnz88tJ498x4SiGU61jB4uRL7ONQbqcPdPhM4zXb31+w//LmPsbnzDFf2KVGFOLce8KvACc245Q60qyvwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, we can express all three frame conditions as a single triple:</p>
<p><img width=346 alt="   \left \{ \bigast_{\scriptstyle \ell \in p} \exists v.\ \ell \mapsto v \right \} P \left \{ \bigast_{\ell \in p&39;} \exists v.\ \ell \mapsto v \right \} " height=53 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-21px;"/></p>
<p>Here is a sketch of a proof that this implies the frame conditions listed above. Assume an input store <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>. Split <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> into disjoint stores <img width=24 alt="\sigma_1" height=14 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAQAAACEL4QbAAAA8klEQVR4nM2UaxWEIBCFpwIVqGAFKljBClthKlDBClSwghW2Ag7Xx4ry0l97OSqMw8fAmYEoJU1G2kB8NEsOTSX9kzLi7mnG29NXvjN666hZPSYM6CuJw8sT1MkCTJ9WjJI1feQ+ypjb49jFCP98DhoRmqegcBrjxTYlbBUprH7diIX1rj6/ZZMEMaxd5GcQp3sDOp/SmggvQTqyMHBZUIcp19+cOaMCiBBwvDohw+1TkL1tLp9HRZDeauo3MZ/ZRRBJlfktKiOZUiqQCigk2nTUui0URxUUpASgKz5NoBb9E4hx6a63p3tzW+1yx9V7qoQFlYaJiCriaPEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-4px;"/> and <img width=25 alt="\sigma_2" height=14 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAVCAQAAABr7e8lAAABEElEQVR4nJ1UARWEIAxdBSpQwQpWsAIVrgIVVsEKVqDCVaACN6ZOQJDDvyfIYH8bDABq0DCTGLAiCBuLqq5vYCaDAF9uA3jqv/y3jwawsInhf0WxBPoiJnJh4fM/kSK/ITNYaWxHYjlhOYl0PzRHOY9TxV1ZC52r6LpQHEGZDrI2x8SnidQ3MFepLGtTo1VONBDhMNW1W3is0dT6VvJPVFrGPhnpYk4wVUO2xV7l7rZWsfiKl03KdIfJTJtUeEuxV1e+NauPc7kmn6sdi4gzmIPMEt3SIYr31TVneYGTdwAfUsNHNwJFFJUjTrCSI9Mn6juKRHu88Qq9powPkZPE8d27scNzGZ/ib1d9AKEQuR0/qQqdyXxIb/MAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-4px;"/> such that <img width=239 alt="\sigma_1 \models  \mathop{\!\,\scalebox{1.5}{\begin{math}\ast\end{math}}}_{\ell \in p} \exists v.\ \ell \mapsto v\ \ (*)" height=24 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-8px;"/>. Let the output store of running <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> with <img width=24 alt="\sigma_1" height=14 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAQAAACEL4QbAAAA8klEQVR4nM2UaxWEIBCFpwIVqGAFKljBClthKlDBClSwghW2Ag7Xx4ry0l97OSqMw8fAmYEoJU1G2kB8NEsOTSX9kzLi7mnG29NXvjN666hZPSYM6CuJw8sT1MkCTJ9WjJI1feQ+ypjb49jFCP98DhoRmqegcBrjxTYlbBUprH7diIX1rj6/ZZMEMaxd5GcQp3sDOp/SmggvQTqyMHBZUIcp19+cOaMCiBBwvDohw+1TkL1tLp9HRZDeauo3MZ/ZRRBJlfktKiOZUiqQCigk2nTUui0URxUUpASgKz5NoBb9E4hx6a63p3tzW+1yx9V7qoQFlYaJiCriaPEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-4px;"/> be <img width=24 alt="\sigma_1&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAhCAQAAAAbxMGgAAABIElEQVR4nO2VYRmEIAyGV4EKVLCCFahgBSusAhWsQAUrWMEK3ufwPE8QVHzu140fIg97gfFtEN03TXWB98YGmqgtx1TAPAJqgRlJlYN6gLgco+RguhzUAGPLMUTdM/shYNyZabPUamyf12bhODd/SwagrBhrTJ8gNifhHPEdpOf/vFncWcaMODTSV3B4h7TCArzKb1hmHJrCmt9q7e6phQO1atnh5eSco9HtxvrIWMa8WvcHsTJ6yeooiGW0egp0KUopUJgO5vg2fanaS5+DGM2q79NJMkZWd0Gee40nQTY4XExHLDOSIL3k1MfxWNmZ/G8WFANmkgmSLSRGAunjYBPXfqoiKQBy9e9kacvbH/QTEMt74h8GV/Jsu/VV2ST5C+MUn6VnyW1tAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>. Note that by the triple above, we have that <img width=253 alt="\sigma_1&39; \models  \mathop{\!\,\scalebox{1.5}{\begin{math}\ast\end{math}}}_{\ell \in p&39;} \exists v.\ \ell \mapsto v\ \ (*\!*)" height=24 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-8px;"/>.</p>
<p>We have by the frame rule that the output of running <img width=17 alt="P" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAr0lEQVR4nNWUQRXEIAxEx0ItYAELtVALqwULWKiFWqiFWlgLbCgp7e7LUA697OQE5ENeJg/g0IBgxAsjqDKyIe2xYpFYdZUQ5ZRiBfJ1Z1LwDcegZU/4vqZAcz+SXyrlkeIsBIqQRoRnEKcIkYUEbXw34qTBeW/qRbw6FRlwRQa5N1b3Gwp1SJK6HltTdiJlHEc+JFfNrXbast3/Z8TfJ/4iN048gGxiJP0cLHX4/QFd2XZ5DDt8wQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> with the full store <img width=18 alt="\sigma" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAARCAQAAACGRh+4AAAAvElEQVR4nJ1SCxXDIAyMBSxgAQtYqIVamAUsYKEWsDALtVAL2ZF2/S2kvF1eW0hyyVFCpMFThI2UdstUxJyaD0QEmWZ5My34zrJadw0MEh5l7dCD8VQElEv00kkO9fgSnLBPrR5fJBFy1u+le7Rp9RTTzfdWfDeJrEjK4jUQVVoSb/iPZpzOovk2LUhCUWkmFqVy2a+8ifwjs+ve/DZ7R1rXlBCmkbeOEfPZSaoYZC7Wec9P8q5wSDd+OdEHw9xhSunjNIYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> is <img width=121 alt="\sigma&39; = \sigma_1&39; \cup \sigma_2" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALYAAAAhCAQAAADempl0AAACmklEQVR4nOWZC5WDMBBFsRALsYAFLGChFmohFmIBC1jAAhZioTsTKC1QMgMJZNp9OWdL+aQ3L+Qzs0VxXLqoIp4+SzKpotUXj+KeG2IlmVSRKqFR8polkypad2iUK1RujIVkUkWrg2aZ3BAryaSKlPLDVefGWIimUkVL1tJKa9cNGmVzQ6xEU1VwB7Vboe+4WI3A95pD9ZVmPxjD8XrRVALNxsCggkFppmKhGViGdb7O0vspqFKZTbEwVcEDDwgNWr/YOPjs/dHwbZCFVf9apaJKYTaHhaXaP3LzxwrwnwtOCT9hpmChH++4Sumo4s3msTCkoGfm8VcTsW+tdpSrqGLNTshiVvGX9v14ZH7W09CiS3hZS0kVa3ZCFpx7msW57sO5a5WSKtbsZCxD/LUcEtafzae0VHFm81lKvzOx8BkAWVdl/NnNh05XWqo4s7ksDT1FhqrKF1OlpTrP7NczdrxHw1+3NcWEqsoXmu+jMsT27zyzXyzu7Zvecq/8+Nqbw3N2yy6h5BGPSvl4rie3YYo0uwpMTzyWeYe0W0zuQz/gzUfye/otlKVK+G3kUA3vnCPNxv1E+A4TjAI5LLfZL2yabVfD5PiONp04VNp3WcUwG83cXlg1XA3VsN8ht3X1GYi8LsZEkKnEp+KYjfviLbtLuNYFU0l7HbJFYF64jZUZqK4WYTWKS8UzW40Dfz4ZaD/30lm7PQ5hHiWYHKt9RDTMgFZMGp1HxTMbNSymmLnDNaMdv/HSa1yHLI8G13Z5/4ehqfhmo8opC93A0b4AiWZpoCuuzY1erH1mnyflrR7eeQzcf9J0GWZjGrabphebfTd3kmSY7fxC+yzuYEgoXjLM3pet/1rJMPsfCIdsN27nfvRdkqP50BWpP8l+MMqRJJgKAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> where <img width=231 alt="\text{dom}(\sigma_1&39;) \cap \text{dom}(\sigma_2) = \emptyset" height=23 src="data:image/png;base64,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" class=inline-math style="margin:0; vertical-align:-6px;"/>.</p>
<ul>
<li><strong>Leak freedom</strong> - For any arbitrary location <img width=12 alt="\ell" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAZCAQAAACWALYfAAAAyElEQVR4nH1SURXDIAyMBSzUQi1goRZqYRawgIVawEItYAEL7BJStrclHB/JezlyyQGRhUCRdrMykahRoY7o4oVyRMyIwaZs0mX0G2RTqqPXkzlz1VlikiPWZ+lS2T+coFTNm8qaE437B7LNJl0oZcmyRgOPhWyE0+dDKiu3q5AOun0KiQEHqMvH7XLOFYUg07HhEkFnWqKImOsPg+0r03EHvFH6emAXSU0YiPZ8UUi3fNsdazjftwqtynTO5+X7TWhtijqIvz3eKndTR9IfsMkAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, if <img width=51 alt="\ell \in p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAgCAQAAAD9aj2/AAAB10lEQVR4nM2WDbWEIBCFqUAFKliBClSwghWoQAUrWMEKVLCCbxjQXXcHGH/eWS7nrLqifAwzF4WgJIUWHXnnx7JiEZNY4diYBoDScHRwlL+GeZfCiAXZhNiMAtCwnzWVb34HCmgNSQHOBjSmheXIQGZOOK2t+acj3uNLo5a0sDUN0HMFMHtow9MlZHGQIANnqtpfJpOp9zxKIb56u9ZwbUrTGWEgh2cuHctgM0Ts7MJJtKV1Xx+N04ttgXXLaDPaYCH1SFhWr6MUADkAWBDFYDA8jPvCy0x1Q5sYO4G+6HtxMkMCmfZ3dAl3pB/ziGZgoepyJyr4WxoxjgGwCZdUDDKv8At5wUY7Rl0mNDJJ4i3OkN3NbYxCEynjyPfO+bUmX51vtcotoRGSKde4aD385lvZcvNonuoemet+FqcRsvK68mjE+A5rbmXX3cycxBk0T2dayA2bL94vBdu8vk9SaKoUGJvsY3u8nHeeWTJcNFf6QowPzBiNDoYuR6VjZ2ZuJPPxT9G2fNp4J5ZvhUUdT++jL7Rg22H6Cter4qfbTrYw669DL3TQ+xzgpy+OvC8YfdLne8T7bBzL7VkeeFPyEcttQs2j3dlP/k3U91ojahjNtIzmakXwB9RJFj3o6ApOAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> but <img width=59 alt="\ell \notin p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAhCAQAAAD3saS2AAACfElEQVR4nNVYwZGsIBAlBVIgBVMggL2YgimYAhlsmcDfKhPYgwnswaqNgBQ8bO3d3zSIqIgNTs3UPqrWmRXhdffjgcPYX4BgMt2BQ4fqxgScDbee30OzmbXntxWbYMIZrqUwI/Dip/eogEuCcAs3TQE6uJZOqm8EG2d0mgCB2TVQjng+GnhSlLKLYExVW/nkm09lOhygOo8DR0GcJkB7moZwCWRxZeIw9TpNgMBoLHonDQpqGHLAYJemH+YSfSq/DU5lMaWMJEALPWegq7C9w+dPuLYPc4k5lTjlb9ekhcOd/a09jaFdQ2BwIvgu4XsdCbJOC6z3eukIC4fD+p12pZ8uDY2jYc6+lhKDtm2CGm/RwRwJLNuFMbfr/KpDr+bSuwXQ7KDfhARrTJGGeVfS2wToQwhRwgPB+GNuoAl1sSG2jt7gx6hcEP3lCJsJZ9RSsgwO3WExyAznlkhumxblgsiALRPNko56yzFCS3hbIe4IZ+yS9oGkahyqw3SC+KRFjDBzSs7YdkayhmSwScTa3j1yCJPBnYaphBv4u7Q39sM+gu/ywi3OCeto/yhsfLSDC0e1r2gzT8DnhMkHpw7XfXIj3GDcDE0xtBBxwjpHwUZzKkNDTZBT2kYeIkZYZKTLQTljWwZN61n7BTrkThQl3OWfwO0wI2auAkJpVVZOcWKnZ/pM9e4/dFv00O5YMpDUZGTRs385KzugZw87JikCa1tAd93RJ2LOKvYNvb+gd4mG19bfOfDLrFccxX6R9L5RNo6G5NkPhn2l55tNo3TjeAJKX+lfRnjIO796HF3iKSh/pY+dh5+ArsDQLF5EWBT/JFW/hnA5zE8vRWL6D6EwUj/NhqErAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> then we must show that <img width=118 alt="\ell \notin \text{dom}(\sigma&39;)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAAgCAQAAAD3GlGoAAAElUlEQVR4nO1aybGkOBCVC3JBLsgFGTAXXMCFckEedOBATwQO9EEO9IGItgAXOHT0ndaK1gRJ1Gf+j5jHoQpK68tFmUkh9D+GG30JYsEdRrS2I5YdqxsX+4tb/Z8DQyuabvRf0Y5exx1Bi9w5vu7G0SYb7vKzF2qEiomC9kIvdo904uPBbs5I9Zpf0bNJ7uRi7y877SQ/W2gKsTaKR+ilPk0xbl5nCsVVrkxCXicgWoMVePeGR9mTNPbgWqTPUtxqazmWoq1f2AY/FF996/OnotO7PU3xPS+srGAHlGlF89m0jlhFcQ/6/duzFCs/eieWMNZaFhKHnSzR2zSYzz1KhEFO5Q4sc60dFvAsxa8bZ43BDDrEARbfqMkx2JKTEsJLttwlwVxf3+T3H/Lz1bH8Zyme5brvYQeVkMDxGD+6DVVHFrbBnW/JGxZOte4LKVhql5xTjGWbRf+yJbG2it2Z7a9gvqs7J1yig0ERrc9jubBSoscfrepwfSCbGcz4w6lCgPTPh3eZKo4CLJe5JQ5hqwyDSORWdjkSLVA8aAsJL78qdjzjOoHwbTZ5j61gfJsUsA4acSl7Fodw12B0AyV6GAv0q0s4VOh2rcM8azVW+jdiqdusfszFuJhar87t2KbVfPwqLAUiGGmxT1bdkh/BYKoK6CS1GnQPYxtY95/sjEy7QIPVtihDQMGCo1hU6GIpcqgNg2ZLRDjallG8BSeDAQ82Hz5ZA1G7NMa3GlGeg1GQYqznDVvPJ+KAAFK86sGGUxNwmDJDY5WRNIkMzoEnFLOMToUtEQ3P6GORrhvkroKBtHGUZmyk4yCeIIp3HWzUBVxbtv3aMI+D3jHciCiIAVmzj8daI3dVEk0LxWsmIJPFnSQTBYCRcWpiMGgmV1LZ05ly7utjilN9NUgJ5FkrVtC5eopxUfypYK8Blh/qpeXP8/KVHy8eAlhwTE3qrcN5PQXvpjgd38/SVk4AKMbWF9eAaV1ix/UP+o3+De7ZSWTxVSlu8ca8aKd263UxAUZxivhqqFp9VYpbqofFCs+kY4SzgDzGEgmjpWo1A2YXU7OeHHe+VS/FUNBGi6LlXb64MHjbUGOgt3Xpdjh9fjSOCTVTUXOWhPheiuHUYyvMK6qt22GGeDSbdw6AXfhlXxW9qPNnMAdiHHumqQcp6NOQubI7FJcP9ilr3RMXg6mHWd6iN08v30FRu12CWiuvUzAPQp7gWLenhFBTsYidRz/FUBmIoDSV78vuQKUz5Q5TALmWm3IWM/qepLk1cEWa5Six+DqFl79LhtWCXVXDrSoNGxUJ8RO1SZ48C0mAVj0eIzIp1h6CT88memylTi8p+iVb/5St297WOR11RCvtLRHBo1rbnCXY/RSfvdUZDhXY5Dp7athpTSQBa4wA/2ia06smUDfVsfCulB8S8Jc7uHoBpurRrWoTjv3G/5GYYiOO0o7z1OOz4O4rfhi8w3WCaH+h/3nwViIiLO8UnmisQH0m4Or3k20Yrv8PVI+7f1j6r0Grj/V6sK637yCmDzO1p0Cb06YzED3aW/8wSb6sHw7xvj3g0lh/AUHwPcWnN9S4AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>. As <img width=51 alt="\ell \in p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAgCAQAAAD9aj2/AAAB10lEQVR4nM2WDbWEIBCFqUAFKliBClSwghWoQAUrWMEKVLCCbxjQXXcHGH/eWS7nrLqifAwzF4WgJIUWHXnnx7JiEZNY4diYBoDScHRwlL+GeZfCiAXZhNiMAtCwnzWVb34HCmgNSQHOBjSmheXIQGZOOK2t+acj3uNLo5a0sDUN0HMFMHtow9MlZHGQIANnqtpfJpOp9zxKIb56u9ZwbUrTGWEgh2cuHctgM0Ts7MJJtKV1Xx+N04ttgXXLaDPaYCH1SFhWr6MUADkAWBDFYDA8jPvCy0x1Q5sYO4G+6HtxMkMCmfZ3dAl3pB/ziGZgoepyJyr4WxoxjgGwCZdUDDKv8At5wUY7Rl0mNDJJ4i3OkN3NbYxCEynjyPfO+bUmX51vtcotoRGSKde4aD385lvZcvNonuoemet+FqcRsvK68mjE+A5rbmXX3cycxBk0T2dayA2bL94vBdu8vk9SaKoUGJvsY3u8nHeeWTJcNFf6QowPzBiNDoYuR6VjZ2ZuJPPxT9G2fNp4J5ZvhUUdT++jL7Rg22H6Cter4qfbTrYw669DL3TQ+xzgpy+OvC8YfdLne8T7bBzL7VkeeFPyEcttQs2j3dlP/k3U91ojahjNtIzmakXwB9RJFj3o6ApOAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, we know from <img width=31 alt="(*)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAgCAQAAADHuoLMAAABb0lEQVR4nKWWAZHEIAxFsVALtYAFLGBhLdQCFmqhFrCAhVqohW5Iu527vfwEuM/czM4FHiENIc4hRWiRNDnfOjW43a1d8NkVl2mLBvRJf/1aySUDP9GUNICuyjRUJXe0HE+UeebeaH+v3rDR0959efJbidbDcy+asUFRc26jiP9HM8FhOhTje8/uZeBPTFBMrBpTXYUGhOs5bsMzmuEBfKbxFy5nNIQHAK8LFv4VKZOv7TLIi7UXHhi1UZIG/iaRcuogjJS0MNMR/LPBQdbCBSLB25BQCdDgl33nGdo1G4RX33ce6fnAMly0YviLfV54g/ownBRxeQOYrCgVN/p/4Ycs3JesIk7xaVNuggxPT5yXZ+l1BtkRCFfqse7XLXiJ7MKl1usbDgn5voFI0XzjlZfMPralT6EQNNpW/FyvtEfjjUVV0sNqmA0V3bWJyhKMmqFo91ye8CPtRS1rDe2otxuzL828ornTxXVP0iTNfwMj9JMYZs6yawAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> that <img width=119 alt="\ell \in \text{dom}(\sigma_1)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAEL0lEQVR4nO2a65mrIBCGbYEWaIEWaMEWbCEt0AIt2IIt2IIt2EIODCjXASSJz8nufv7YTUQuL8MwjBmGP41vrY0MrL0oby/81eLDNsi31kiHdVgUwarEsKuCT/X3LgnV3qZafKph3yn+oRalGk0F9MM2LdXfhjl5ixZAfDdmomB8ypQWdRVEwZK1xI2DnlRr8nbMetV+ypAq60TDfZz/3euf78b8bq8c1z6Xbh5wNeZ7dS9mplp7b4wRSuBOl8JQjeaydwk0Krs4NjFzbR0r4V7Mjw/vPSM+jRMAMtqt86jpoUo+FWQRXI+OIdyLeVb9/qQoHqsJAKal54JWqyI28KuXzInBGljU5BrLz2EmqswKd/TWzII7XF3meS3zv/50TDCFQHFB+rdWViuF+ifPdKRtodWAnlgLs7pltgXZsD0Q1dW9c5ukgYt5qppYBvMIK8W/XK/4+Z2AQ4Yrs6vPxE6OKxMLhTCYKdPrejknePNqb9WqrqyOQ4kO6+oWKppK5UQtvt3ayZyNm5n18gbRZEvN593FYli8mlb7zQYlxRkopuaAH79GeMKsEQLPS9siB3fYqgULIg7MS0PY/soJarYw/Nr2BPPu7RRGwgPgf7N5030cdVypCT6HeBiKmUC7fum5MCUloZg3qHDEjD2QvBCJhKLZxScizDxBqrVH0yMShDyweaPUbXAUnYC++f6Xdm7OEsP8hCCkLRjbEwStEqi39AezZP2gcQFhXVvgunLTcwXzlkzSAK6ocNhAhEbO8XLDxV5wGWZZp149xBzbrVEMUSSleMb22jGTrAnEk+taL7FC0xXts+b2+fxVikAWpNMhnth7++06DO/GHNfvWvFTDwRCva3isxHMpPpg2J0JIkvswqPLb8Uc7xt7A+ZMJGaG35ZOIUN/RuBbMTtkFNwF7t/dU4kkxA6loD3U2p3fmqMleCjEsxW2QFeqFzMW0LHs9IqsYXRhZmh1eU3d2do0+jX1hXhkdqNcI/i9mPHjyZ5pd8mu8hrmGWNpABzOgFf8dDGjWpTxbGFsGh9PaMauxsStvYI533uZlMbi5hpm9HhiurgCAFZ9n8WaPXks6bWjRc/cxZSUci2YDEfoSPoxY6kjOsTHfuwUWMeMOmCTIjFJk3pcrB3H3JXXOBI765mWcXkNZwPHwVl3+MiCHL2KQ0o94PAbPUgRfedDCA/y/qiOGrmaWvyoXcNceDvDzuG0xREMgElV+ips6Q1+BSvOwRBBjm5Ogqp+zKW3Q+NpBrvqJ2ZuNcxxHiV5/Nr5boqSjuZqObCbrJr/KXeqouidV1RLfekjSNl0yph5I4NLIheOJ/+LXv35QBmzQJ3SL9OrIMqY1xcn8ceINL/vTKU35dUGC7l4Yqz/7uj3iDVv9bGwjdWId73Z/8FitZ9hXRaFGv8gJ+p7n4mJ5Or7Byx9KhJ+vTO6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> and, as they are disjoint, <img width=119 alt="\ell \notin \text{dom}(\sigma_2)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAExklEQVR4nO1azbHkKAwmBVIgBVIggLk4BafQKZDBlBOYqXICeyCBPbhqInAKPkzNvQeEMb/CmPbrfa9qPx+6bcsCPgkhYRPyP4ZbtVHC20VFu3DxefXS8++DICuZbtXIyKJHT88FJdm04FP/9sJoaGgokFd6uE99iO42eyA+qMVJj+Zk/I+96Un/XqEqxHrRRAoofjfN9HI/26H0UQEDTzaQ3YMe9ZPs4hMSzPpemq/OuSs4mSeG3Mfxry++qs5o926a747Kqfa5dtORa2juQX+8ey/NXLd2b44RQ+JBl8FQLeZ6dIkwaL9wi5g91o6Z8F6aHy+sPS0YcDOOQJDFtgePMzy05FOTLOH4rv//o38fHUN4L82z7vdHguG5mgTCDIamZYzuiZ+XlBc6z2EOKG1c6/klmqmWWeDOluTiJrcX+/MG9r85cwZmkCiqqH8ey8lsZaB/3N1HwiJtW2h1oCfWwqxv2WVhalgeqO7qlgSHrTFFYlGIeWpNvEDzADMlPHyvxHFNQpHhZTZ9TnfjeJkUKAnEmszMa3UYeA20t2LRRxGuKDFp3bkvy0xqbIx3bKdv2/1kLubNfI/yctdtpebjrtppUIGmZb+ygqQ8EsXUHUil/BrgCTtHKDw/7S0KCIetUFgS4WhWDT5ZyihaU6R5JyPUtmU0b8FKYSEDAsIra2BuV+p4qRHOY3o4SjOFdkPpuWKSGlCaV1A4YM4eYcomnWjMtFlx8smEZpFRarAl5pEZhSLyeYs8bAiUOgl9C+ck61ycJ4zmJyQhbcnYllHQmgJKNFqGg1HFOGhDQKxrjUJXyTxXaF4zIxEIRZViAwGaOafTDQfP7Msan3TTOo/9Mc2p31qkJMpMShR8r51mWnSB1LgGYyWL8X0rzoF2q/l1vnzkS46HKnTaIKYnjd5hu56Gu2lO9ftWwoBIo8wGi9sIzXSPzS0Q4FPiOL6R3+RncC4qGcdXpdnrXLUbDSA9FZbX8KmCr9vht+UKlMSl5OPCbtdXpdlRZgLmcox2hLMSirtCE+QOtaQ9xhIZ5Mpu15xMQYfUY/Al0Ev10owldLxoXhk5RtpC2WkQmnmmro4x8N+20jxsPl8ux6TzU+RBDktCfi/NeHmyFdpVySyXUe8xzmaMS0uACwbiJE77HdWTdwUZ7CIZ56ZpecIKfjVkYe0VmsuL/ZRJ1/Nm4/9r8Q5antgu2rjDT99n8X3IjFzduZ2CdgjxJMc+PiWk2h2OOJD004xtHTGSlv31KnAtzEyLivPZRMVumpzXPSZwzOQHYs0a3MbOcmzL+H0N7wOucDYddrsgrldpSmmIiK+YQcrkWkgC1uvx0Ci0aesky8rdynrFj+G0+Scnv7T0v1r62ts/56uObOMPJTJktEc3Z8V4P821t0PD4Qab7ifmbnaHEucJS/SOAVyp3yX5A1SnR0vBbnfVwrPS9GPonVdw9jLN7GfXXMdUGUtFQ+sOTyPsRiWNSpN6efJZ8MrnAwxItmYYizFYdoRSFNc/Fvg86CdCQABz416LepY7vwFRHTtXnwW0+X1nDE7sGxV3lEq64fy7o3Z81MdR7wJvXupD5Ntmqd+Krjf7KKY7489/An65tDoDA423fqjJvmxcDnHvGGhJ318PFWNbek7LLAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>. Therefore, the only way for <img width=118 alt="\ell \in \text{dom}(\sigma&39;)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAAgCAQAAAD3GlGoAAAEK0lEQVR4nO1aa5muIBCmAhWoQAUqWMEKXwUqUMEKVrCCFazgAQaU2yDiHp+zZ/f1x67K9Z0LM+NHyC+GB30ZEcEdJby1I9Udmxt/awiyEvWg/0p28jnuGFnIrNm7hCSbbrjrv29B6vnMYvdIJ/4+xMMZuV3zJ3qm9E4uSP64aZX+2yCPL8Fsl/o2xVST8UyNDFdbxtKsrwqY1WAD+eKGRz2bep1iWaDnHpairV/YhjwU3/z3rj9+m+JnXthYgVkxK4481ab1xBqK38W7FBs/+iSWMLa3I0KSuJNldpuAqe5RIgx6Kn9gwbV2WMC7FH8enzUTosOGD1R8oyUHsCUnJYaPbrlrgmV0fTqW/y7Fk173M+yoEjI8HpNHtwGVUAjqgrvrliVwq/uzFixofIliqtss9o05hnn0RugL+hvA/+bOC5fZYHBG1rdcWCmz44+B2ig3A4w/VBUCpX86vItqOAqoXubWeSSyyK3seiReoHiwFhJe56rE8UzaBOJss+l76gRztkmB6yCIy9jzfAh3DUYHGNHjWLC3PuEwodu1ZsqmViUwR93m9GMqxsXceXWgZ3StpuPt7CiYg5EW92S1LeURDOaqgKdWg+0BtkFtf+VmFNYFAlbXoowZCxY8xXNDSP4kM5ocEeFoW0bxFpwMABlsPnyyBqL2aczZaiR5DsZRiqmdN2w9VcSBAaV4tYMNVRPwUDcijhgsMjgPmVAsMjoNtkQ0MqNPRLoOyF2FQGmTJM3YWMdBrDCKdxtstAVcW9VQapCodww3MhfEQJzZx2OtkbsqieYOxWsmIMjiKslEAWhknJoYDv7ATYAp5148pjjVV0BKoMxaiYLOtVNMi+JPBXsNtPzQLq3zPC9ftUhjRhYcU5N663Dek4Kvpjgd/5zlXjkBoZg6X9wCYXVJVC489fiuFN+xWlm0U7f1ttIIJf0Z/nel+E6AWqzwKBsj1ALyGEt3nWpCzC6mZq0cd2erXoqxoI0XRSu7fHFh8HtDjd3V1jy6hfFialRRc5aE+F6K8dRjK8w7N1u3x4TxCJv3DkBc+OVqVbQKOBDj2DNNPVhBn4bMlT2huLx6lbXuiYvR1AOWt9jN88tvUPy2bD1UMI8BO2oRY9bqnAEqFrHz6KcYKwMxkqbyfdkd6nCh3AEFkGu5GWcxddUpfJFmOUosZ53ilL9Phs2CfVXDryoNGw0J8ROzSZk8C0mIk/NwV35EocXaQ3D1iwo/ttIWL3BLltKt7xKtgo0vVntLRMio1jZlCXY/xbWvOsOhApteZ0+KldZEEoibg45J4RCulkAdqmPhXSmzZOibJ7gqY5l6dF8dEcb+8u+e9Ebq8a/g6Sd+HBJ1Qj8Mf4+I5cWf+fzToM3fJ+9huP490M8Bbz7W2yG6vr7/x+BXP4+6BWZH+yU4Q2/ckIOWxvoDL5AX4DlzDC4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> to be true is if <img width=119 alt="\ell \in \text{dom}(\sigma_1&39;)" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAhCAQAAAA4s1IwAAAEXElEQVR4nO1a6ZmkIBAlBVIgBVIgBVMwhU6BFEjBFEzBFEzBFFxO5SpAmPXbmZ3nj5m2S45XB1VlI/SLaeBZglh0ByPa+jCWDzcLf2swtCMx8PyOTvQJ7hC0oVUyWAVHhxQ85d+3wOV8asFnYht/F2xwRqrX/EnuC7mbCtEfO7WQfxt08iVY9XLfphlLMsZMSXF1ZFla5VUA0ZaswF/c9CxnE6/TzAGK2rGBPl/xE345gfrv3fj8Ns1jUVl5g1oxAUdfSlM7chXN7+JdmlVcHckxlA+eBUVxOOgSvVWDpRxdAkxyOneImWvv8IR3af4Mnz1LwZYVJ6AaZ02QwZE5QXP4SMlTksyD69OxhXdpXuS6x3AWDZHAuRq/Hp2KmnLANvGrS+ZAtQ+sUrnG8nM0Yymz6W/U0UyDb5i8zPMK5n/1ySmY6ERxBda3VbyV6PFnz3SEncGMP1WNAlTDckUb0XA8YLnUo/OYJEGIOeVINEPzpD3Fv+5Vsese10XGLXPIz9gq55aJUbJFps1nt4nmEQRE5wNK/WVskIQrSlRaV7dQ3iSVA7H0HdZOlmzeTG2UNxTNVmq5vl0tDas30mbv7FqSX4liag5w+TXpJ4yPYP28sDMyHQ4NdisBY4WSCEfz2pC2j1RQiyXDH+1IaD68k8KAewT4d3ZP3a7UuaVmlNZqFKQZ63l96aWgkhJAmnc94FR1BwXxIBMJQQLnc+ARzSyhVOGI1MMTCllg8wZp2GAgdRzFlR3pPJwFRPOpk5C2ZOyoOg0EDkZLfzNrRhXIhoBwrD0IXTn1PKF5T5Rkqr1CsQEAzJxjd4NBB0KGces0qoc0x3ZrEJPIEymWsb12mnHWBGLltgFsV7Rr7T7n81cpA1mBRYf0xNHbn/em4atpjse/Z3neegBoxjY2t4Bpm2KFCy5PvivNT72XZ33Wbr+tnYJRf0fgu9KcUsaLATbbFRI6dygXkD627v7WArhgSM9eOAJvqV6aoYSOZtXLI8PAuj6s+X6WZpoZroS5u1ubZr9mvJAekbWgLSK/l2a4PDky866RlzN7/pRpXiAuDQEuGLBKnC52VIswiwxz07g8IRm7mpKwNkJzfvUikU7zZqLDBZwUGoDliVnipgmg1fdZtDmSxxDePArk6l3MidQ9g+lwhIGkn2aodURQXPZDVWCdZjAAmxaJaZrUT1YVOJauvoZr7GxXW+bua9w24ApntWDXBXGrilNKteHwjtokj+75JISFvL8rNyKTqoVL7RrNhbcz9NpOWx5BNWFCSj8lW3ib37QV58jgQY9uSYrxfppLb4emywwOuU7I3Go05955B48/yxDnqOlorpZk3nTV/E+5BImA34yg1vpS2UTZdMo0s0YOHgE/KE/+FYz+fKBMMweD0n+GUSLKNG+DSvwxwM3vO/Mo0TzVf3f0/4A2H/U5wDSzrjf7Pxi09jOsAvI0Ez3iL8kJevJ+ReVmK4xQTbjz/egvMoCycQB/AD/pQC890E5VAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, but as <img width=134 alt="\text{dom}(\sigma_1&39;) = p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMkAAAAhCAQAAADZ2EdhAAAEQ0lEQVR4nN1ajbWrIAxmBVdgBVdgBVdwha7ACq7QFVjBFVzBFXz8Kj8hqLQ8ez/OPee2xRDyQUgihDwTQ8WzlLDom470Nco0QKrzo8DIQqaK5xeykVfwDSUzEZKY5yLVGYSQbZVdt+9r5IHJ8WpWTK81Tqc3yWk/lZSczgm2vbVDJw3HqyS8pL4raHy1xJ6JvM4RuGyiMSX8nGoIZqkvTGrt/vse8joDYI0pqTtF1C5T+tKs9HeV9O8A1zlBW0qUT62JtQgZpYQ8qVz++rzzBNc5QVtKXtUme6Prbaim/BvAdU7QlpK3PEnqsKFHOL3is5sB15koEoRuTDMHU0Ll74v+Rfl+n+FePsH32Iba/ycvVTvkp5gLyqmEismNzvc2WWlmbw3FA7w4/Q+Bau2o91nZZQB8QEHnweYhrk3az8WU8KCPCt+OiFp4gfMU9FIH6yuQn8ZWmMGYlr3YEdZ9UZhPBpMkFcdc7FGPbp/5oj8zzyqrtGgIVOdhF2RW4AzmJS/9jbCiXS9HCt9NJfSfWcmrJVipZGQv9psQebdidBu9KZtnza50oy/JhGOIr7thqj3HaOc86JNi0TvZWTMs7qA6GyG+UV4JJT1gSqFN7Q+0RZJYsGqcKlt0cvRZSjqtm5/dvm+eCmVK2IUGw7grZ7vDRffWwqcD8RHsHqeKPDG/o8k30JaYWyTrgyf7j2XNzBM3R/XT1xO/qUAJjZwy1vBTiSVWOVz+SQhwkvHxDrO8RAqmyohoj1yjZAFGna+st2DUNpkJA+zZWUpOhryxY/EFO6T7wYBHuyJVRiSr6jwlHTjqdGW9BaO2KapAlOQWfgbwVgwpgTajQmzez1ICj8oTV3gGz6DkJH6Tkqvm5efdRiXylKS+KIPfpCQ174BGYvyGs7uHPCWn61kriaOkQ7ADRY53n/t7lOSC4B5cLhClTB/6WCRUpkScbrhpYUqWKztbgKsuPkSVyDmKWbqEqHuU5FPFFdAtXW8m9MYpeRcooV6xptTwtBSihBa0A0WED7h8/sAIOBFjXF/B+5TAYe2UjArlJVz3wCf9/ezdAaJkuhqQxEUOR0i4Pk3WfWTSHHBmdynJlR1dAnfIzGfvJUpavew1lAzRN6WCTwS6FwXdRYjVq8yIvddiXcRRt5l30o7+bn/FRUpl1lwWLLLRyGj7cvn8gJZTcEpq31qeB7NWGrWbp9oOFwkhxBTdD1O99YGZGo4GNd41KM/XUYIdvsNeBlUj5o9InJJT90A+AhbN8n3/LhkNji7zCTIAy/5yH6ULC519i4MBL/BfTy7vwlAy2gLl814vn0btlSGcEn4+TasGHAT/IOqNhlEyN3zN+2co6YJo7g7ylAxN7zumEdfPQr3oqZlIjhJ107jlZe1c8ekn0VdlDxAlVEtse3v+T1GicKday22mZDIm3xhdo+qvj+GvUXIHYU70v69kD2j2hOAfc0Nmb2PKVYEAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-6px;"/> from <img width=38 alt="(*\!*)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAQAAAACyBhdAAABmklEQVR4nK1XwZGDMAxUC7TgFmjBLfh377RAC+7ghhZ434/HNeAWmOuAFoisEIa708oO8Xoyk1mB1rYsWRAhBGipR0d97aOeFhobSDpKNLNwheDGv1YYefoF0Y4fic0EM2YeJiKtNVvxAoq71iaKf31O2NjzjFqc1d+I7BXu3GAZLyNYC5k4ku3hWBIeyVQ4XY5u1ewZG/ZrmAQ5KrXsGYkHlLRz8qrkjJ7ogaTj8d/5h8rqGQglPZDMLwzyL3COPSaROZ3Vzub4qqQXVxOnj5dYBz7XK33Rt8KOapLBzESST9mVrUlKYtwd6KwuqW65JfmwL/JEV8E2kcwrWmTE4+AgVpNUrVjyJisZRCBfvBvHzAEWSapASTIxn6Sp8HupiHJedVZrPozM1SXjEanheNXTD30q7Kyuc7IkjZsNzvaN6lMu63p+mffhLgn9znsdQQhqx6azZxi9RnmLruFZGhW0bSjPXo0munVLmRHtcBXMl5DsZXRcnuG+X0Io9+s9i7ZrLHPRr/gY6stNfRWc+Kn++sK3Qj06zcsd60LDQVktH7oAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, we can conclude that <img width=118 alt="\ell \notin \text{dom}(\sigma&39;)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAAgCAQAAAD3GlGoAAAElUlEQVR4nO1aybGkOBCVC3JBLsgFGTAXXMCFckEedOBATwQO9EEO9IGItgAXOHT0ndaK1gRJ1Gf+j5jHoQpK68tFmUkh9D+GG30JYsEdRrS2I5YdqxsX+4tb/Z8DQyuabvRf0Y5exx1Bi9w5vu7G0SYb7vKzF2qEiomC9kIvdo904uPBbs5I9Zpf0bNJ7uRi7y877SQ/W2gKsTaKR+ilPk0xbl5nCsVVrkxCXicgWoMVePeGR9mTNPbgWqTPUtxqazmWoq1f2AY/FF996/OnotO7PU3xPS+srGAHlGlF89m0jlhFcQ/6/duzFCs/eieWMNZaFhKHnSzR2zSYzz1KhEFO5Q4sc60dFvAsxa8bZ43BDDrEARbfqMkx2JKTEsJLttwlwVxf3+T3H/Lz1bH8Zyme5brvYQeVkMDxGD+6DVVHFrbBnW/JGxZOte4LKVhql5xTjGWbRf+yJbG2it2Z7a9gvqs7J1yig0ERrc9jubBSoscfrepwfSCbGcz4w6lCgPTPh3eZKo4CLJe5JQ5hqwyDSORWdjkSLVA8aAsJL78qdjzjOoHwbTZ5j61gfJsUsA4acSl7Fodw12B0AyV6GAv0q0s4VOh2rcM8azVW+jdiqdusfszFuJhar87t2KbVfPwqLAUiGGmxT1bdkh/BYKoK6CS1GnQPYxtY95/sjEy7QIPVtihDQMGCo1hU6GIpcqgNg2ZLRDjallG8BSeDAQ82Hz5ZA1G7NMa3GlGeg1GQYqznDVvPJ+KAAFK86sGGUxNwmDJDY5WRNIkMzoEnFLOMToUtEQ3P6GORrhvkroKBtHGUZmyk4yCeIIp3HWzUBVxbtv3aMI+D3jHciCiIAVmzj8daI3dVEk0LxWsmIJPFnSQTBYCRcWpiMGgmV1LZ05ly7utjilN9NUgJ5FkrVtC5eopxUfypYK8Blh/qpeXP8/KVHy8eAlhwTE3qrcN5PQXvpjgd38/SVk4AKMbWF9eAaV1ix/UP+o3+De7ZSWTxVSlu8ca8aKd263UxAUZxivhqqFp9VYpbqofFCs+kY4SzgDzGEgmjpWo1A2YXU7OeHHe+VS/FUNBGi6LlXb64MHjbUGOgt3Xpdjh9fjSOCTVTUXOWhPheiuHUYyvMK6qt22GGeDSbdw6AXfhlXxW9qPNnMAdiHHumqQcp6NOQubI7FJcP9ilr3RMXg6mHWd6iN08v30FRu12CWiuvUzAPQp7gWLenhFBTsYidRz/FUBmIoDSV78vuQKUz5Q5TALmWm3IWM/qepLk1cEWa5Six+DqFl79LhtWCXVXDrSoNGxUJ8RO1SZ48C0mAVj0eIzIp1h6CT88memylTi8p+iVb/5St297WOR11RCvtLRHBo1rbnCXY/RSfvdUZDhXY5Dp7athpTSQBa4wA/2ia06smUDfVsfCulB8S8Jc7uHoBpurRrWoTjv3G/5GYYiOO0o7z1OOz4O4rfhi8w3WCaH+h/3nwViIiLO8UnmisQH0m4Or3k20Yrv8PVI+7f1j6r0Grj/V6sK637yCmDzO1p0Cb06YzED3aW/8wSb6sHw7xvj3g0lh/AUHwPcWnN9S4AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>.</li>
<li><strong>Fresh allocation</strong> - If <img width=51 alt="\ell \notin p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAgCAQAAAD9aj2/AAACQUlEQVR4nL1Yy23EIBClBVqgBbdAAbm4BbfgFuggcgOJ5Ab2QAM5WEoFtOBDlLszDOAvmDHrzUOK11k+j5k3D3sZi4EzyaroNzRwpp8an4RiI0w9wfWZGfiNjDxaICXh2sG1dHrzxLaSEBgxC+UpXkcDI8WdpBwsoXb+VKYXDRF/AcxMyFIrgSyO9ikETBsI9T6xFNQQJ43bCs3cXaENTuow+sTm0ELPCYgpbO/w+QHX9u4KVbiIRU2SMvcms/S0tpGHwG2I1b2E+/psOz0s5CTcEaTM2QBEtokbs7bB0ZamOT8St+faCHlLIBittZB8zNShV5P1QgGEOug3IpUag2Fg3YVeQqOBmiZYZqwSDSHWbjOtJ6LnOSpPt48PM0ithkTl0R0qWF5wQok0tgFQnm4ULsi0wj/q4ordOGrbqHNPLSol91VSiitUh4kFcWSaGvOKixr2kM51dOp021fuFWoRcK81KrUG/ob2xn7Y5+peZio1Tc3EujvOtKOZoyoXtBef0NLUIut3WHMTWcrDZhKKbeSpmbjSrDZUungPaFZxoh1rOWriLDDK20cYfq47M5eMvmAbaWrdmS+6AQNGo4Klz9VTeWWIne7o1Ordf07Nx/iDV5MeCG1Se/YRryoCNWvbdvsC85VxxXCSjcQ4VOwben9B7xKtLa2nHXHy0gO0Yr9Ib98oltuQPLAY7sWOb+y21HJvRemL3T9Q08Qzd49jhd6M8he72PParegKbMPh5dRE8Q8I9auplcO+VGek8Adm9zwiZ5c2zAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> but <img width=59 alt="\ell \in p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAhCAQAAAD3saS2AAACEElEQVR4nNWWC7WEIBCGqUAFKljBClSwghWoQAUrWMEKVLCCdxjQK7uAM+5er/6csy9Y+ObhDEI8QUq09QUSFjTXsJDkxCL68rQRsxhhibmOqKoGWCrAPUz6AFh4lxdileWJ5hKLQu96mQj+/5pq0Tab8/2nO+SxxIRQpWm3YXrgO6gDDluaVGhN0BBTgyINW45o7Drc16Iz1Pzb4VFBc62Q7NTDygVwTTL6rz2wS81xZpvWNbs2yVj+jlemUmiU2n1v4bvOGKnrj/6w5Yst580OdwLvckMvsWAuWyxbNDqMGWKcysIZFa3twhe3Y68Z0qpUCjAtYM0IqNFFDs79hU4d4N5MyAKPhC7XnqzTwcQ+4o3bHk00YuBs5hBY18MQZRlV5F0twqVuMdEIhkKYaCXpPd84CsBphGQEZqRZ+AMFpPmwceeARcxkxr4TOYfaXZPIjaPqUQMmS8YcpgJ38Foe9cZRBnbZ9VkF+47rr5fEbD+vMjDtfBFaxVhvhIkm+tYZ5YEdJ4N9zhlGDnXlSzVBOWDFcFeUiYVt3bSez45X5BPlgC3/Bh62mdBzDQDVPdhwMi57kn755URld/FaMpKyyafFwL5PrHjhsuOdojC2pxrR2tFnYg1osHZbWM3Dfq3jwycX/pbZwzqEfh2UxtGRavafSH6lcdxYDwX+pFderNx9+NZ6HLB+HrA998j9ACuXLFqL3OMeAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> then we must show that <img width=111 alt="\ell \notin \text{dom}(\sigma)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKYAAAAgCAQAAAAyaMs5AAAEZklEQVR4nO1ay83cIBCmBVqgBVqggFzcglvYFuggcgOJ5AZyoIEcLKUCt+BDlPuGp3kOYLza/L+Uz4ddewcYvhmGGbwI/cc00AYj2i/K+oWL7cWt9u8DQztaBtoRtMk54rYgR4cUfMrPUageOgYK5IWc1FNebHjMEbBbIy5S58YsH3aARX5eISTEftEQQhP5bjLxZT1TCHlVQLRXKvDhqc2yJbnYgmvjvZfMq+snR8OzFYWP89tY3BNDUQi9ncyxaJn2sdZ+dBQqMkcwHofeSyaVo43s4zE4HAyJnpDBWo8HESZpY7eFmGsf8Or3kvm4sSd4TLBJZk2DwWGXe1upQ7YS0kbq+iq//5CfjwFF30vmKvW+DwJnPVzTojB1bSLYplBekl9QkWp/FtKExotLZGIps+lfjiR3Vbkws+0VzHd158xIdMolIv08tsbKI7r/2ToJ11ukGSF2kyfUzyp/MkF56QjOWCp0JMv56Ew2SBQUnrInWiBz0l4fXl4rdj7jOvX2Moe8x9YEXiYFSAIyhlFrVJxm3IPeY2zyKsKl6ipBavslz6TmzjhELEmHtflazDOpjb7c9m2k1vNXYScrgp42+2TXkvxMuVKjo0pRMukWxt+xbr/YEZkOYDEEtFE7MkWHf5V27d5kY7VTDns7MjKPIIIb8GCa4ZM9MKorALzUrO9jEihIJtbjhtJrhfgKmbtuNkGOG2HJlgnrzExJcbnwhEyWEadwJEbgGVEs8l+DfKEzkCCudQvXF6lujQtE5lNv9H1pzZFNtDeZ4mAUC1UWBcKRXbRxX3sUbEpGuELmnpkC6eABJedgppkuEBg0sxXpbOkWYh6TYzJTHzRIqeKZFCv4UT+ZuGjo1IQhwLK7ZoEYfi8tX3nA9xCAajEJaVQNx/WTfTWZaf9+FCiEAWRiGzN7wLR/sPP6gn6j78E9q+zqn5XMctTkxVVmJ9m3H2MUl1GPCycwn5XMcrJYPMNY9P5cS2VjbBHtV05gVmDRxCTslQ3IS42SCaVGtGhE3oiZhW7qjVLMgS/2FZ+xaulmNSckLEVv2BKKR8mEk/ajMK6orNgVYsxM0y1f1oif/iyvceKcwWxRcS6XJu2k4CNTFojukFneapdMup5ngkm7UWTT06TNNxzUToygqyeDSzCOUdfV4HMm5akzlXq89MfJhA46CEoL21YFBDqSKehNid8+DlNLfUXfkqKvB+4YYjsPEXx97i3tSkOlsKvmnVZpcqamGz9Rk+TJs5AESOv57JFJA9aprO4W9FS6z9co+iWlf0rpa299nN85SpVHlqbMo3OjNSs3x8msvUmYTmMfUs+6U6VVfwJ26YiWoz+a0PTqKUnNSU94V6qhCPjLHbRer6jz0raD9J5HdMIckeEoYa8n7R8Fd1/0KvCBEAfi+mvdj4NXELG9wCAnRGct/xGBu99zQZja/+nox72/l/x70O6NtgQ29A4WxPLKiPFPQC8XHAZEt3vpn9PIp42XIUbmgEut/gL/JieoNls9egAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>. We have from <img width=38 alt="(*\!*)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAQAAAACyBhdAAABmklEQVR4nK1XwZGDMAxUC7TgFmjBLfh377RAC+7ghhZ434/HNeAWmOuAFoisEIa708oO8Xoyk1mB1rYsWRAhBGipR0d97aOeFhobSDpKNLNwheDGv1YYefoF0Y4fic0EM2YeJiKtNVvxAoq71iaKf31O2NjzjFqc1d+I7BXu3GAZLyNYC5k4ku3hWBIeyVQ4XY5u1ewZG/ZrmAQ5KrXsGYkHlLRz8qrkjJ7ogaTj8d/5h8rqGQglPZDMLwzyL3COPSaROZ3Vzub4qqQXVxOnj5dYBz7XK33Rt8KOapLBzESST9mVrUlKYtwd6KwuqW65JfmwL/JEV8E2kcwrWmTE4+AgVpNUrVjyJisZRCBfvBvHzAEWSapASTIxn6Sp8HupiHJedVZrPozM1SXjEanheNXTD30q7Kyuc7IkjZsNzvaN6lMu63p+mffhLgn9znsdQQhqx6azZxi9RnmLruFZGhW0bSjPXo0munVLmRHtcBXMl5DsZXRcnuG+X0Io9+s9i7ZrLHPRr/gY6stNfRWc+Kn++sK3Qj06zcsd60LDQVktH7oAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> that <img width=133 alt="p&39; = \text{dom}(\sigma_1&39;)" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAAAhCAQAAADHEXfSAAAEPElEQVR4nO1aa5msMAytBSzUAhZqAQtYGAu1gAUsYKEWsICF2T6hj6RAy8Ld73L4MwMlNDlpmgQIKQclrOLuv4eu6u7YWg1pq+QlmMmXfK4V+c+CSW2HKgmxtSgRZJKkXIRWir+fDi5VmPWT71yZrPp5sLUGqctFhHyk+OU6dg9i0mrdS0cjjcYrZWDWmuRxCYR8QO0kz6OXzxxupoNf4HaYterXnUajTULrBRXhXjpqd428tWYyVkonyku/1ZMsx510qKhfl1PlrcXlteqQPz64Nu6l43OBuXLW6i6gW4q4aAsqfPp9dIxy56hFzloU24OpPM09FlXhwiVzqW90NyearVzqKgfpbekE0dHIMUJfWeTINrjC5GHuVzC/1T+nGdUJ9BRo7yB2HI9q6b22nTkGK99J37MWQFZj85Wv3FrclF1KuVg1NijF7wK1dYY7hM3hQwU7OctvcGyxmq3nuC7nvp5mTGougvtiT815trHSbG21rDWR+eewZy0RX6c6e+itSp2OdbNm2AkPC/o5Iei3QO2cFut5I1h3tNaRjCl7O2pcrzpNJk+SsGdmPZKvCfQS6Yqn850ebyxh3Hmwz1NRZSv59qylZpWorfCxqk6rsq01R0kyxk4cGEY7H1/qktCxrKvagXum8s/MXjhyzraN6klcO7coHY1+qj92zFCXA0CHAQOWK7eTPgsaBY/cgYUDGi17f0YbHSwxvcISyeWJqRngaLH+DDUxJ3GdTYEgegRDno6482hM9kRay8FoHm/lE0AZsaEnlDUHWkA0HqdjBmKGKIojaOUB0eEW9RPN9AlxhHA+8TowiI3Nk1GQtkfpaEBHiV3gGDhm3RwdTwB7cjhLONzFgfdaOqCw7lbz2fcYBXTM0PBfx9+k42wc4dhWgNPxTH/qb9KRmpZmS0l+Zis3m1bJzjEdPjCyR2Txh7OcM1v5NqqMDizRbUEn4In7qBpkb0c5RQcFfW8f1Gsb7B1YmZRWDwp9NMsB9EkRkVRGB14GLsBT0zji6vUcHeMZOoaCzek6GGXC7D4uAyngqaZi9k1TTgecug7JWKju6HUfDC30NHbKwC46c1dDBIJRWnjNPteb6pNRm/FNBysMYKV0YC1EV+Zu9+NV+R4dSPRh1htNr5NqFZ4kQ8E1+MTaoNv6VpuSruGhVHNdLmco5o135k67Ajw6t0nGssp+lcdsnw9rkeTpQN82xhMfHwxTGwZvRkK7R2o080bbn3ncRCmlA91oiVqFzlkWOUs83cnTgX6P4ypZ09a7+yuRHMyW7/+DVi3NJgZl2Pu4QL1N2Wsg5ehQ8hGnhxPd/x31n/Xk6OB4if3SASFjsIPI0SFwstPM6oV5s1H3tSVOR5f7DhEu/V+ol3A1TorRoV4VZ5Kllw4MbdXnmxAdVEvMZq7dS0cGJS/g+rUSmiJCm315XTZ7fnEeWDWD4Adln2fUnzcH5wAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, and hence <img width=119 alt="\ell \in \text{dom}(\sigma_1&39;)" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAhCAQAAAA4s1IwAAAEXElEQVR4nO1a6ZmkIBAlBVIgBVIgBVMwhU6BFEjBFEzBFEzBFFxO5SpAmPXbmZ3nj5m2S45XB1VlI/SLaeBZglh0ByPa+jCWDzcLf2swtCMx8PyOTvQJ7hC0oVUyWAVHhxQ85d+3wOV8asFnYht/F2xwRqrX/EnuC7mbCtEfO7WQfxt08iVY9XLfphlLMsZMSXF1ZFla5VUA0ZaswF/c9CxnE6/TzAGK2rGBPl/xE345gfrv3fj8Ns1jUVl5g1oxAUdfSlM7chXN7+JdmlVcHckxlA+eBUVxOOgSvVWDpRxdAkxyOneImWvv8IR3af4Mnz1LwZYVJ6AaZ02QwZE5QXP4SMlTksyD69OxhXdpXuS6x3AWDZHAuRq/Hp2KmnLANvGrS+ZAtQ+sUrnG8nM0Yymz6W/U0UyDb5i8zPMK5n/1ySmY6ERxBda3VbyV6PFnz3SEncGMP1WNAlTDckUb0XA8YLnUo/OYJEGIOeVINEPzpD3Fv+5Vsese10XGLXPIz9gq55aJUbJFps1nt4nmEQRE5wNK/WVskIQrSlRaV7dQ3iSVA7H0HdZOlmzeTG2UNxTNVmq5vl0tDas30mbv7FqSX4liag5w+TXpJ4yPYP28sDMyHQ4NdisBY4WSCEfz2pC2j1RQiyXDH+1IaD68k8KAewT4d3ZP3a7UuaVmlNZqFKQZ63l96aWgkhJAmnc94FR1BwXxIBMJQQLnc+ARzSyhVOGI1MMTCllg8wZp2GAgdRzFlR3pPJwFRPOpk5C2ZOyoOg0EDkZLfzNrRhXIhoBwrD0IXTn1PKF5T5Rkqr1CsQEAzJxjd4NBB0KGces0qoc0x3ZrEJPIEymWsb12mnHWBGLltgFsV7Rr7T7n81cpA1mBRYf0xNHbn/em4atpjse/Z3neegBoxjY2t4Bpm2KFCy5PvivNT72XZ33Wbr+tnYJRf0fgu9KcUsaLATbbFRI6dygXkD627v7WArhgSM9eOAJvqV6aoYSOZtXLI8PAuj6s+X6WZpoZroS5u1ubZr9mvJAekbWgLSK/l2a4PDky866RlzN7/pRpXiAuDQEuGLBKnC52VIswiwxz07g8IRm7mpKwNkJzfvUikU7zZqLDBZwUGoDliVnipgmg1fdZtDmSxxDePArk6l3MidQ9g+lwhIGkn2aodURQXPZDVWCdZjAAmxaJaZrUT1YVOJauvoZr7GxXW+bua9w24ApntWDXBXGrilNKteHwjtokj+75JISFvL8rNyKTqoVL7RrNhbcz9NpOWx5BNWFCSj8lW3ib37QV58jgQY9uSYrxfppLb4emywwOuU7I3Go05955B48/yxDnqOlorpZk3nTV/E+5BImA34yg1vpS2UTZdMo0s0YOHgE/KE/+FYz+fKBMMweD0n+GUSLKNG+DSvwxwM3vO/Mo0TzVf3f0/4A2H/U5wDSzrjf7Pxi09jOsAvI0Ez3iL8kJevJ+ReVmK4xQTbjz/egvMoCycQB/AD/pQC890E5VAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>. As they are disjoint, <img width=119 alt="\ell \notin \text{dom}(\sigma_2)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAExklEQVR4nO1azbHkKAwmBVIgBVIggLk4BafQKZDBlBOYqXICeyCBPbhqInAKPkzNvQeEMb/CmPbrfa9qPx+6bcsCPgkhYRPyP4ZbtVHC20VFu3DxefXS8++DICuZbtXIyKJHT88FJdm04FP/9sJoaGgokFd6uE99iO42eyA+qMVJj+Zk/I+96Un/XqEqxHrRRAoofjfN9HI/26H0UQEDTzaQ3YMe9ZPs4hMSzPpemq/OuSs4mSeG3Mfxry++qs5o926a747Kqfa5dtORa2juQX+8ey/NXLd2b44RQ+JBl8FQLeZ6dIkwaL9wi5g91o6Z8F6aHy+sPS0YcDOOQJDFtgePMzy05FOTLOH4rv//o38fHUN4L82z7vdHguG5mgTCDIamZYzuiZ+XlBc6z2EOKG1c6/klmqmWWeDOluTiJrcX+/MG9r85cwZmkCiqqH8ey8lsZaB/3N1HwiJtW2h1oCfWwqxv2WVhalgeqO7qlgSHrTFFYlGIeWpNvEDzADMlPHyvxHFNQpHhZTZ9TnfjeJkUKAnEmszMa3UYeA20t2LRRxGuKDFp3bkvy0xqbIx3bKdv2/1kLubNfI/yctdtpebjrtppUIGmZb+ygqQ8EsXUHUil/BrgCTtHKDw/7S0KCIetUFgS4WhWDT5ZyihaU6R5JyPUtmU0b8FKYSEDAsIra2BuV+p4qRHOY3o4SjOFdkPpuWKSGlCaV1A4YM4eYcomnWjMtFlx8smEZpFRarAl5pEZhSLyeYs8bAiUOgl9C+ck61ycJ4zmJyQhbcnYllHQmgJKNFqGg1HFOGhDQKxrjUJXyTxXaF4zIxEIRZViAwGaOafTDQfP7Msan3TTOo/9Mc2p31qkJMpMShR8r51mWnSB1LgGYyWL8X0rzoF2q/l1vnzkS46HKnTaIKYnjd5hu56Gu2lO9ftWwoBIo8wGi9sIzXSPzS0Q4FPiOL6R3+RncC4qGcdXpdnrXLUbDSA9FZbX8KmCr9vht+UKlMSl5OPCbtdXpdlRZgLmcox2hLMSirtCE+QOtaQ9xhIZ5Mpu15xMQYfUY/Al0Ev10owldLxoXhk5RtpC2WkQmnmmro4x8N+20jxsPl8ux6TzU+RBDktCfi/NeHmyFdpVySyXUe8xzmaMS0uACwbiJE77HdWTdwUZ7CIZ56ZpecIKfjVkYe0VmsuL/ZRJ1/Nm4/9r8Q5antgu2rjDT99n8X3IjFzduZ2CdgjxJMc+PiWk2h2OOJD004xtHTGSlv31KnAtzEyLivPZRMVumpzXPSZwzOQHYs0a3MbOcmzL+H0N7wOucDYddrsgrldpSmmIiK+YQcrkWkgC1uvx0Ci0aesky8rdynrFj+G0+Scnv7T0v1r62ts/56uObOMPJTJktEc3Z8V4P821t0PD4Qab7ifmbnaHEucJS/SOAVyp3yX5A1SnR0vBbnfVwrPS9GPonVdw9jLN7GfXXMdUGUtFQ+sOTyPsRiWNSpN6efJZ8MrnAwxItmYYizFYdoRSFNc/Fvg86CdCQABz416LepY7vwFRHTtXnwW0+X1nDE7sGxV3lEq64fy7o3Z81MdR7wJvXupD5Ntmqd+Krjf7KKY7489/An65tDoDA423fqjJvmxcDnHvGGhJ318PFWNbek7LLAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> so the only way for <img width=111 alt="\ell \in \text{dom}(\sigma)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKYAAAAgCAQAAAAyaMs5AAAD+ElEQVR4nO1a67mzIAx2BVZgBVZgBVdwha7ACqzgCqzgCq7gCv3CReUWQOzjc/qd8/qjrXJJ3oSQYIfhD2NHHzKw9qa8vfFXgw/rIDv60WEZFPBUhRg2aPiGz6cgYL4VZnyDck+C35pRgswVOl9uAgmfDcx/BMoQ+TSZBMi45zAKrgKo8UoN8aBqE8wmHydTr8B77lLxbE3h6/j2bNx8msy+aBmPMZce7hRqMp/Fs2QymK1nHw8h8GBIjUIWczkeBBjBxvsWYq+1w6ufJfP1kT1hxE0yGRosNrfc60Jt0EuBjfzr1SHos2TOIPd9UDzrEYYWDc04rQ5FXApVb5kDM/6swITWi3NkEmizmCd6Y2TBEw6X7a9hv+tfuxmpSbkUIt9SWXnUjD95DiLdDKGbvLFxZnhkg7JsCM4EBNo6NykaBIU3jMQyZI7G6/3rlIof94RJvc82G/wmzgRnmxgoCYM1jF6j6jDj6o0eYoEriz1V1wlS3dtEU6scqCNpczafs3kmc9HXEjG5VvPxVDlllTfS4u6spqU4Uq7U6HhRMpoe1t+J6S/djNwEsBAK26h3MlVDMnunepidyv5oW0Lm5kVwC+Gp6d9ZPaPuBcDZajK/QxIYSiYx8/qt5wLxBTJX023EHDeAvLDbh6DZ5SIiMnlCnMYWGUEkRPHAfy3Shc5RgoSRzY+LtLg1SozMt9no29KaLVG0FQKNYr7IKkP44BZtONYaBJucEa6QuSamGEzwwJJzNNOMFwgOdmOR24WYRtuQzNgHLWKqRNKKZ/yonUySNXRsQh9o2V2yQIhzL81fpV1eIaKFJMRR1Z/3VPbTZMbjn7NgxTVCJnExswXc+AcvXHjS/q1k5leiyK4yp2Rb8U+G/sr2W8nMp4HZMwxp9udSKhti6T5zmZFFE5KwFjags1UvmVhqxLJGFJWYmRmm3CnG1H0amGaLdryQBJn1hiWiuJdMPGnfMvOqwoqdMcasmvvy5ZX4WTzLK8JuUWEuFyftNOMjYxKI7pCZl14mrct5Jpq0W0EWoyarvuFgzRE2hvTmseLuNfiUtDpnsJV6uPT7ycQOOugQF7a1CggNjLagtyV+PY/US33uqs/3Y4jlOEQ46/PT0ntpqAXeq/ldqjg50+qGd7SSIrrnkxCWqr5W+4gcDFimsnhezw6h2/ZqZmiR0PoqpdJTcTEemVNZBOdGc1Ju9pNZepMwHsbeQM6yU8VVfwR+sbaZouMue7WUpPakx/+Vq74o+uQOagc1+ry07iC8UdNLIBeS9p+Cuy96NQQaLH4ZPkHE8uBfNX40SPN7Lgxj/T8dvweseaPNgXe9g/2PwWp/cUFATb8/KhP05Mkk1+sfjeUBwwWASTAAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> to be true is if <img width=119 alt="\ell \in \text{dom}(\sigma_1)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAEL0lEQVR4nO2a65mrIBCGbYEWaIEWaMEWbCEt0AIt2IIt2IIt2EIODCjXASSJz8nufv7YTUQuL8MwjBmGP41vrY0MrL0oby/81eLDNsi31kiHdVgUwarEsKuCT/X3LgnV3qZafKph3yn+oRalGk0F9MM2LdXfhjl5ixZAfDdmomB8ypQWdRVEwZK1xI2DnlRr8nbMetV+ypAq60TDfZz/3euf78b8bq8c1z6Xbh5wNeZ7dS9mplp7b4wRSuBOl8JQjeaydwk0Krs4NjFzbR0r4V7Mjw/vPSM+jRMAMtqt86jpoUo+FWQRXI+OIdyLeVb9/qQoHqsJAKal54JWqyI28KuXzInBGljU5BrLz2EmqswKd/TWzII7XF3meS3zv/50TDCFQHFB+rdWViuF+ifPdKRtodWAnlgLs7pltgXZsD0Q1dW9c5ukgYt5qppYBvMIK8W/XK/4+Z2AQ4Yrs6vPxE6OKxMLhTCYKdPrejknePNqb9WqrqyOQ4kO6+oWKppK5UQtvt3ayZyNm5n18gbRZEvN593FYli8mlb7zQYlxRkopuaAH79GeMKsEQLPS9siB3fYqgULIg7MS0PY/soJarYw/Nr2BPPu7RRGwgPgf7N5030cdVypCT6HeBiKmUC7fum5MCUloZg3qHDEjD2QvBCJhKLZxScizDxBqrVH0yMShDyweaPUbXAUnYC++f6Xdm7OEsP8hCCkLRjbEwStEqi39AezZP2gcQFhXVvgunLTcwXzlkzSAK6ocNhAhEbO8XLDxV5wGWZZp149xBzbrVEMUSSleMb22jGTrAnEk+taL7FC0xXts+b2+fxVikAWpNMhnth7++06DO/GHNfvWvFTDwRCva3isxHMpPpg2J0JIkvswqPLb8Uc7xt7A+ZMJGaG35ZOIUN/RuBbMTtkFNwF7t/dU4kkxA6loD3U2p3fmqMleCjEsxW2QFeqFzMW0LHs9IqsYXRhZmh1eU3d2do0+jX1hXhkdqNcI/i9mPHjyZ5pd8mu8hrmGWNpABzOgFf8dDGjWpTxbGFsGh9PaMauxsStvYI533uZlMbi5hpm9HhiurgCAFZ9n8WaPXks6bWjRc/cxZSUci2YDEfoSPoxY6kjOsTHfuwUWMeMOmCTIjFJk3pcrB3H3JXXOBI765mWcXkNZwPHwVl3+MiCHL2KQ0o94PAbPUgRfedDCA/y/qiOGrmaWvyoXcNceDvDzuG0xREMgElV+ips6Q1+BSvOwRBBjm5Ogqp+zKW3Q+NpBrvqJ2ZuNcxxHiV5/Nr5boqSjuZqObCbrJr/KXeqouidV1RLfekjSNl0yph5I4NLIheOJ/+LXv35QBmzQJ3SL9OrIMqY1xcn8ceINL/vTKU35dUGC7l4Yqz/7uj3iDVv9bGwjdWId73Z/8FitZ9hXRaFGv8gJ+p7n4mJ5Or7Byx9KhJ+vTO6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>. But, as we know that <img width=127 alt="\text{dom}(\sigma_1) = p" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL4AAAAhCAQAAADNTdmAAAAD3klEQVR4nN2aDbW0IBCGqWAFKliBClawghWoYIWtQAUrWMEKXn4VmAF3XeCs9+V8536uAvowDMMoIb+poWhrHemLtvePxchK5qItUrIQIYfgQRKybGSXpaWY7I9VaHeWQ/og/PtR2qmTiHiltpUxPUZcFtEYPpdzrZZ91ppT1cQawy/t7ePWXxVbL6628HvZV9k4JxSX7T/I77eFP1WGM1Qe3MJqC/8lPX5NUfkstZbzImI6KhDyLyUp+FSeX/UZ5aOpd6aXNfgRV1D7/9nb5JztQy0X8QiVtRgZdShgymxbe3e+7I0iHqrvjnrHisuQu8/BxvWuzPJBIXweXLPLOtNxTnjh6RxcpZa6KWgfxjU5NEy3vdoetmP4zdG7WmSpre548lUfM4/KJomiGo4qxqoWNM6f9C/CNuKucvj5AUXof8Y6NzuUqnPT9mp/CZV2CubeRu/hTF0z06ZELShR3YlS7Q1G+8yDNDpjMucAoKkOc7n/+BOA3yPQhIbqN7lHLbHAEoxWYLF9En6n781H/Lrpva/hsw8KLuNsHLvTwfaWMBLujuiJeJPFAWg3ID4K6AoEGHMO5hRLAuXASVFd+/Mt03wBn0YuNVfyqwcDVE6HDSTQx4kXXHzk1uhWYLcisvvP4K9IrwtuQxdqF+kzhGdn4dP44tgt+E04QRs34pGlw24FsJT34XdorzNuQ9LL5twRvzVf7giDnzLxxEQK4WNTSSkGWRY+3isHjkx54eXCHfwGfKBnwvd7MSvNNXww6asoDR/6l4fCp8EvnFxtozjqqmooDR9JHW4E26yE8GlmwfXH8x78VKjZo4YB67u+v4Mv3i75/CsOf8XdnkDX4XhZU5WXKF7owJDcg5/eZG3IvSVs6AL+6wI+9VIXVyWxV7XC4NPU3THEvtye99SIuACD0b+V+/Dx4HEGvabj/Dz8+jtcJwz+TBL7WwK2/A59aHNmZ3ruNjniiu7CTyXW3NbnbDO9w72C3+pVooE/RL8kZws90l7u1fnmZSTEcdVq44ozX7Ecw3Ne7+ZMnIZTAFM7RYFFAlqjvZbL+kM2uZCHX/dNmS9mKY3aSVPNIeuoaADvpSNniIgG+cotSCp/Bz+3HA5Hok/1mI7V8/D3D5Jw34lFT/l659shGiwm5gh7VJY8c19Xr7g7+5Yhp3xaOulzi8vAH20K7hEvL7//cCQHnyfdWnnhoeZP63s8OfhLw5eID4TfBZHUZ+I2BDChAMQ8NP1mDUY7D5B65XDvlsPFPrZ/9QVoy89lU6mYH1dfPBqnusW2Xyo/FL5S2cxj1yiT6Wt4Lvzna8juRrT+AHGNOjUIGWHhAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> from <img width=31 alt="(*)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAgCAQAAADHuoLMAAABb0lEQVR4nKWWAZHEIAxFsVALtYAFLGBhLdQCFmqhFrCAhVqohW5Iu527vfwEuM/czM4FHiENIc4hRWiRNDnfOjW43a1d8NkVl2mLBvRJf/1aySUDP9GUNICuyjRUJXe0HE+UeebeaH+v3rDR0959efJbidbDcy+asUFRc26jiP9HM8FhOhTje8/uZeBPTFBMrBpTXYUGhOs5bsMzmuEBfKbxFy5nNIQHAK8LFv4VKZOv7TLIi7UXHhi1UZIG/iaRcuogjJS0MNMR/LPBQdbCBSLB25BQCdDgl33nGdo1G4RX33ce6fnAMly0YviLfV54g/ownBRxeQOYrCgVN/p/4Ycs3JesIk7xaVNuggxPT5yXZ+l1BtkRCFfqse7XLXiJ7MKl1usbDgn5voFI0XzjlZfMPralT6EQNNpW/FyvtEfjjUVV0sNqmA0V3bWJyhKMmqFo91ye8CPtRS1rDe2otxuzL828ornTxXVP0iTNfwMj9JMYZs6yawAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> and <img width=51 alt="\ell \notin p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAgCAQAAAD9aj2/AAACQUlEQVR4nL1Yy23EIBClBVqgBbdAAbm4BbfgFuggcgOJ5Ab2QAM5WEoFtOBDlLszDOAvmDHrzUOK11k+j5k3D3sZi4EzyaroNzRwpp8an4RiI0w9wfWZGfiNjDxaICXh2sG1dHrzxLaSEBgxC+UpXkcDI8WdpBwsoXb+VKYXDRF/AcxMyFIrgSyO9ikETBsI9T6xFNQQJ43bCs3cXaENTuow+sTm0ELPCYgpbO/w+QHX9u4KVbiIRU2SMvcms/S0tpGHwG2I1b2E+/psOz0s5CTcEaTM2QBEtokbs7bB0ZamOT8St+faCHlLIBittZB8zNShV5P1QgGEOug3IpUag2Fg3YVeQqOBmiZYZqwSDSHWbjOtJ6LnOSpPt48PM0ithkTl0R0qWF5wQok0tgFQnm4ULsi0wj/q4ordOGrbqHNPLSol91VSiitUh4kFcWSaGvOKixr2kM51dOp021fuFWoRcK81KrUG/ob2xn7Y5+peZio1Tc3EujvOtKOZoyoXtBef0NLUIut3WHMTWcrDZhKKbeSpmbjSrDZUungPaFZxoh1rOWriLDDK20cYfq47M5eMvmAbaWrdmS+6AQNGo4Klz9VTeWWIne7o1Ordf07Nx/iDV5MeCG1Se/YRryoCNWvbdvsC85VxxXCSjcQ4VOwben9B7xKtLa2nHXHy0gO0Yr9Ib98oltuQPLAY7sWOb+y21HJvRemL3T9Q08Qzd49jhd6M8he72PParegKbMPh5dRE8Q8I9auplcO+VGek8Adm9zwiZ5c2zAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, we can conclude that <img width=111 alt="\ell \notin \text{dom}(\sigma)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKYAAAAgCAQAAAAyaMs5AAAEZklEQVR4nO1ay83cIBCmBVqgBVqggFzcglvYFuggcgOJ5AZyoIEcLKUCt+BDlPuGp3kOYLza/L+Uz4ddewcYvhmGGbwI/cc00AYj2i/K+oWL7cWt9u8DQztaBtoRtMk54rYgR4cUfMrPUageOgYK5IWc1FNebHjMEbBbIy5S58YsH3aARX5eISTEftEQQhP5bjLxZT1TCHlVQLRXKvDhqc2yJbnYgmvjvZfMq+snR8OzFYWP89tY3BNDUQi9ncyxaJn2sdZ+dBQqMkcwHofeSyaVo43s4zE4HAyJnpDBWo8HESZpY7eFmGsf8Or3kvm4sSd4TLBJZk2DwWGXe1upQ7YS0kbq+iq//5CfjwFF30vmKvW+DwJnPVzTojB1bSLYplBekl9QkWp/FtKExotLZGIps+lfjiR3Vbkws+0VzHd158xIdMolIv08tsbKI7r/2ToJ11ukGSF2kyfUzyp/MkF56QjOWCp0JMv56Ew2SBQUnrInWiBz0l4fXl4rdj7jOvX2Moe8x9YEXiYFSAIyhlFrVJxm3IPeY2zyKsKl6ipBavslz6TmzjhELEmHtflazDOpjb7c9m2k1vNXYScrgp42+2TXkvxMuVKjo0pRMukWxt+xbr/YEZkOYDEEtFE7MkWHf5V27d5kY7VTDns7MjKPIIIb8GCa4ZM9MKorALzUrO9jEihIJtbjhtJrhfgKmbtuNkGOG2HJlgnrzExJcbnwhEyWEadwJEbgGVEs8l+DfKEzkCCudQvXF6lujQtE5lNv9H1pzZFNtDeZ4mAUC1UWBcKRXbRxX3sUbEpGuELmnpkC6eABJedgppkuEBg0sxXpbOkWYh6TYzJTHzRIqeKZFCv4UT+ZuGjo1IQhwLK7ZoEYfi8tX3nA9xCAajEJaVQNx/WTfTWZaf9+FCiEAWRiGzN7wLR/sPP6gn6j78E9q+zqn5XMctTkxVVmJ9m3H2MUl1GPCycwn5XMcrJYPMNY9P5cS2VjbBHtV05gVmDRxCTslQ3IS42SCaVGtGhE3oiZhW7qjVLMgS/2FZ+xaulmNSckLEVv2BKKR8mEk/ajMK6orNgVYsxM0y1f1oif/iyvceKcwWxRcS6XJu2k4CNTFojukFneapdMup5ngkm7UWTT06TNNxzUToygqyeDSzCOUdfV4HMm5akzlXq89MfJhA46CEoL21YFBDqSKehNid8+DlNLfUXfkqKvB+4YYjsPEXx97i3tSkOlsKvmnVZpcqamGz9Rk+TJs5AESOv57JFJA9aprO4W9FS6z9co+iWlf0rpa299nN85SpVHlqbMo3OjNSs3x8msvUmYTmMfUs+6U6VVfwJ26YiWoz+a0PTqKUnNSU94V6qhCPjLHbRer6jz0raD9J5HdMIckeEoYa8n7R8Fd1/0KvCBEAfi+mvdj4NXELG9wCAnRGct/xGBu99zQZja/+nox72/l/x70O6NtgQ29A4WxPLKiPFPQC8XHAZEt3vpn9PIp42XIUbmgEut/gL/JieoNls9egAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>.</li>
<li><strong>Inertia</strong> - If <img width=51 alt="\ell \notin p" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAgCAQAAAD9aj2/AAACQUlEQVR4nL1Yy23EIBClBVqgBbdAAbm4BbfgFuggcgOJ5Ab2QAM5WEoFtOBDlLszDOAvmDHrzUOK11k+j5k3D3sZi4EzyaroNzRwpp8an4RiI0w9wfWZGfiNjDxaICXh2sG1dHrzxLaSEBgxC+UpXkcDI8WdpBwsoXb+VKYXDRF/AcxMyFIrgSyO9ikETBsI9T6xFNQQJ43bCs3cXaENTuow+sTm0ELPCYgpbO/w+QHX9u4KVbiIRU2SMvcms/S0tpGHwG2I1b2E+/psOz0s5CTcEaTM2QBEtokbs7bB0ZamOT8St+faCHlLIBittZB8zNShV5P1QgGEOug3IpUag2Fg3YVeQqOBmiZYZqwSDSHWbjOtJ6LnOSpPt48PM0ithkTl0R0qWF5wQok0tgFQnm4ULsi0wj/q4ordOGrbqHNPLSol91VSiitUh4kFcWSaGvOKixr2kM51dOp021fuFWoRcK81KrUG/ob2xn7Y5+peZio1Tc3EujvOtKOZoyoXtBef0NLUIut3WHMTWcrDZhKKbeSpmbjSrDZUungPaFZxoh1rOWriLDDK20cYfq47M5eMvmAbaWrdmS+6AQNGo4Klz9VTeWWIne7o1Ordf07Nx/iDV5MeCG1Se/YRryoCNWvbdvsC85VxxXCSjcQ4VOwben9B7xKtLa2nHXHy0gO0Yr9Ib98oltuQPLAY7sWOb+y21HJvRemL3T9Q08Qzd49jhd6M8he72PParegKbMPh5dRE8Q8I9auplcO+VGek8Adm9zwiZ5c2zAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/> and <img width=59 alt="\ell \notin p&39;" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAhCAQAAAD3saS2AAACfElEQVR4nNVYwZGsIBAlBVIgBVMggL2YgimYAhlsmcDfKhPYgwnswaqNgBQ8bO3d3zSIqIgNTs3UPqrWmRXhdffjgcPYX4BgMt2BQ4fqxgScDbee30OzmbXntxWbYMIZrqUwI/Dip/eogEuCcAs3TQE6uJZOqm8EG2d0mgCB2TVQjng+GnhSlLKLYExVW/nkm09lOhygOo8DR0GcJkB7moZwCWRxZeIw9TpNgMBoLHonDQpqGHLAYJemH+YSfSq/DU5lMaWMJEALPWegq7C9w+dPuLYPc4k5lTjlb9ekhcOd/a09jaFdQ2BwIvgu4XsdCbJOC6z3eukIC4fD+p12pZ8uDY2jYc6+lhKDtm2CGm/RwRwJLNuFMbfr/KpDr+bSuwXQ7KDfhARrTJGGeVfS2wToQwhRwgPB+GNuoAl1sSG2jt7gx6hcEP3lCJsJZ9RSsgwO3WExyAznlkhumxblgsiALRPNko56yzFCS3hbIe4IZ+yS9oGkahyqw3SC+KRFjDBzSs7YdkayhmSwScTa3j1yCJPBnYaphBv4u7Q39sM+gu/ywi3OCeto/yhsfLSDC0e1r2gzT8DnhMkHpw7XfXIj3GDcDE0xtBBxwjpHwUZzKkNDTZBT2kYeIkZYZKTLQTljWwZN61n7BTrkThQl3OWfwO0wI2auAkJpVVZOcWKnZ/pM9e4/dFv00O5YMpDUZGTRs385KzugZw87JikCa1tAd93RJ2LOKvYNvb+gd4mG19bfOfDLrFccxX6R9L5RNo6G5NkPhn2l55tNo3TjeAJKX+lfRnjIO796HF3iKSh/pY+dh5+ArsDQLF5EWBT/JFW/hnA5zE8vRWL6D6EwUj/NhqErAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, then we can conclude from <img width=31 alt="(*)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAgCAQAAADHuoLMAAABb0lEQVR4nKWWAZHEIAxFsVALtYAFLGBhLdQCFmqhFrCAhVqohW5Iu527vfwEuM/czM4FHiENIc4hRWiRNDnfOjW43a1d8NkVl2mLBvRJf/1aySUDP9GUNICuyjRUJXe0HE+UeebeaH+v3rDR0959efJbidbDcy+asUFRc26jiP9HM8FhOhTje8/uZeBPTFBMrBpTXYUGhOs5bsMzmuEBfKbxFy5nNIQHAK8LFv4VKZOv7TLIi7UXHhi1UZIG/iaRcuogjJS0MNMR/LPBQdbCBSLB25BQCdDgl33nGdo1G4RX33ce6fnAMly0YviLfV54g/ownBRxeQOYrCgVN/p/4Ycs3JesIk7xaVNuggxPT5yXZ+l1BtkRCFfqse7XLXiJ7MKl1usbDgn5voFI0XzjlZfMPralT6EQNNpW/FyvtEfjjUVV0sNqmA0V3bWJyhKMmqFo91ye8CPtRS1rDe2otxuzL828ornTxXVP0iTNfwMj9JMYZs6yawAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> that <img width=119 alt="\ell \notin \text{dom}(\sigma_1)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAEnUlEQVR4nO1ay7HcKhAlBVIgBaVAAN4oBaUwKZCBSwnYVUrgLUjgLVTlCJSCFi7vx9Ag8W1AzFy9e6veYTEjqfmdbppuJEL+x/jW1igZ2kV5u3C2vnyp/n3gZCPzW1tkZFWzp3VBQXYl+FS/vdAtNHTkyUs13acqvLvPHvAP6nFWs6nM/2G7ntXvFap8bBdVJIHiu2mml8fZDqlKAQwsWUN0T3pSNdnFGgLUei/NV9fcFVTWiSb3cf7r86+y09vdTfO7vXLc+lJ6eJCrae5Bv7+7l+ZB9fbeGCOEwJ0ug6kaLGXvEmBUdnFsYqZsHSvhXpofL+w9LRhxNU5AkMFunUcNDyX5VCQLKN/V/3/U76NjCvfSvKhxfyQYHqsJIExjbNrGqA38nKS4MPgB1oBUyjWWn6OZKpkVnuxRLK5je27ra5j/+upQMINAUQbjc1grq5VB+5M1HwGbtOmh1YCeWA+LemS2hblhe6BqqHvkHPbGEIkFLuapWhoyNI+wUvziRsXPewKSDCezq2tqleNkYqAkEKMyva7lqeDNa70VqypZHEmJDuvqtiwSqanR3zFL327tZMnGzYP18sK2baSW86m0NEivpdXe2UBSnIFibA6kkH6NUMOsEQr1Z9sjB3fYCokFEQfNssEmcxFFa4i0WDL81vaE5t3bKQyER4B/Z/PUfaQ6TmqC65CeAaWZQr++9FJQSQkozRs0OGLGHmBOFh1vjLRZdvGJiGaeUKqxR+oRCYU8sHmD1G1wlDoBY/PXJOvcnGeM5icEIW3B2J5Q0BoCCtRb+pORWT9oXEDY1ha4rpx6rtC8JUoi4IoKyQYCNHKOlxuOIdEva6x5LOvU94c0x3ZrEJMoEimesb12mmnWBGLlut5LM0aPK9q15vb5fEm3HAeJDDqkJ/befr+OhnfTHLfvevEdIoVQb6v4bIRmWq0YDmeCyNKUb+Q3+eld80LE8VVpjveNvYHmTLxmpt8WK1ASppKPC6ddX5VmRxkDd4H7d1crwQyxQyloD7EGCrly2rVES/BASM9W2AKdVC/NWEA3ZNUrsobRRfOANpfH5NlvW2rud59ul1NEz5zdKNeI/F6a8fRkz/Qrs6u8RvOCcWkIOJwBr/hpd6JaeVeQwHi2MDaN0xOWsasxcWuv0Jzf7OdEGoubazSj6YkZ4goEDNX3WYOdMiNXT25nrx9CHMmhjc8RqeaEI3Qk/TRjR0eMxGk/lgXWaUaNzxyRmEOTet6jHcdCfkQpcQuOg531PJZx5xrOBo7EWQ/4OAU5RhWHlHrC4R09SRHd80nARj2dLXKlWjzVrtFc2K+Gczpt9jmQX0r6XyV97e3fYasH2dqKc2SI4IxuSYKqfppLb4fG0wx2NU7M3Go0x+coSfUr+bsgf4DquLQk7OZUzb/KZVUMffIKai/TdApSNp0yza0nPI0wB5U0SE3K6clnwaufD5RpFh2uFMX1jwU+D14lokzz+qISA8iOk6vPAtr8vjOF3pRXGyzk4omx/t1ROz7q46i7MDRv9TGwjdWAd73ZRzG/0//8Jxgup1Y1MGjxrR9qsi/rl328dw40195f0HxP92CP5wkAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> and from <img width=38 alt="(*\!*)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAgCAQAAAACyBhdAAABmklEQVR4nK1XwZGDMAxUC7TgFmjBLfh377RAC+7ghhZ434/HNeAWmOuAFoisEIa708oO8Xoyk1mB1rYsWRAhBGipR0d97aOeFhobSDpKNLNwheDGv1YYefoF0Y4fic0EM2YeJiKtNVvxAoq71iaKf31O2NjzjFqc1d+I7BXu3GAZLyNYC5k4ku3hWBIeyVQ4XY5u1ewZG/ZrmAQ5KrXsGYkHlLRz8qrkjJ7ogaTj8d/5h8rqGQglPZDMLwzyL3COPSaROZ3Vzub4qqQXVxOnj5dYBz7XK33Rt8KOapLBzESST9mVrUlKYtwd6KwuqW65JfmwL/JEV8E2kcwrWmTE4+AgVpNUrVjyJisZRCBfvBvHzAEWSapASTIxn6Sp8HupiHJedVZrPozM1SXjEanheNXTD30q7Kyuc7IkjZsNzvaN6lMu63p+mffhLgn9znsdQQhqx6azZxi9RnmLruFZGhW0bSjPXo0munVLmRHtcBXMl5DsZXRcnuG+X0Io9+s9i7ZrLHPRr/gY6stNfRWc+Kn++sK3Qj06zcsd60LDQVktH7oAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> that <img width=119 alt="\ell \notin \text{dom}(\sigma_1&39;)" height=22 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAhCAQAAAA4s1IwAAAEyElEQVR4nO1ay9GbMBBWC2pBLdCCCsiFFmjBLaiDDA0kMzSQAw3kwEwqoAUOmdwdPdFz9cIh/jP5ONjGq9e3q9XuAkL/MV5oSxAN7mA01DbGvHG1cLL9eqn9faBoR/OF9jt6ood3h6CNrx6XmzJ0cMEn/+yF6KFiIEd+lRN+RrbxZ0EvjjjIOT+i+zNfTWH9Dz30zD9bqHKxN6poldO9m2bcPM8Qgqu0Qa38yoBISxZg3YueeEvS2IJJtd5Lc+uei7GBe76wT9i5CcS3Pv+6dnq7u2m+5pXFbnhmDGpHS25oQ66guQf9/u5emoVfvRJjqF0LK4rBTpfIpSosee/iYeTDmUNMXXvHTriX5seFs0dhyTrHEVbjJAlSOBInaAoPLvnkJDN5febfv/HPR8cS7qV54fO+hmfWEAkcq7Gz6Vh1jGEd+FlJ1jD5Qe6BlSt30NOOacZcZpP/HEEsLmJ7qtsLqO/il1EwkYHi6s3PYivsViL7n7T5MHlIqxFU/2PRKEA1LKe3mSuOB8ynegTO4agMkYjnYp68pyFB8yh3invZWdHzHpNJhpU5+G+slWNlQuRskUrz2XWgeXgO0ZiRUH8eGyRhkhIR1pVtmUVSU6W/I5q+Q9vJkoybB+3lme5bSS3nv6umYXV62vSdXUqyM1AMzQFl0q9RtlB7BMv2sx6RSneosGsJGCsURBia1wqbTEUUtSHSoslwezsimg/npFBgDgHund1Rt0l1rNSE4lxtAGnGclxXesmoJAeQ5l12OBa3g8AcbTpaGWkTb/MZsIBmGlEqcATqYRGF1LN5hdhtUJA6hsLMjnQezjNE81MGIXXB2BFRUBsCMtBbuotZE6pA2gX4fe2e60qpp4XmPVKSyvYyyQYAMHIOtxuMIdIvqWxptnXs+32aQ7tVCElkkRRN2F49zThpAqFy6wCWK+q1Zs/59BUfORYrMGmfntB7u+NaGl5Nc9i/HaW99ADQjLVvrgGVNkXP6xP6ib46v2km4vioNLd6Z5bcs3r5dbECRn4q+Wiodn1UmmPKWNZNJqtCs4wd8gmki81TSEu1awG2oE/PnjkCrVQvzVBANyTVywLDwDI/LO39JM1DorscJsd+61Jzd/j4uJwCeuakBW0B+b00w+nJkRh3DXY51edPnuYF4lIRYJwBLfhpW1EtPCuIoCbpx6ZhekISdjVGbu0KzenDfo6k47iZSHcBB4UKYHqiprhJAobi86xBL5mg1srt7Iyjpm1qF1MkZUlVFQ7fkfTTDJWOCArTfigLLNMMGp8qkaiiSflkFY5jQV+ClLgGprCznWUZW9ewNmASZzFhUwUxswpDSrFg/45YJAvuuSRAs57OHilXLZxql2jOnFfDuZw6+xzQDy79nUu3Pf0ztmrIFlacIoN5NbolSsb7ac49HRpPMzj4PCFzK9GceubtNW+JEBn6JakOr5pgXlXV3F+pAImA/1xB6WGaiCbyppOnubbCUwlVqMReapJPT94FV18fyNPMOlwpiPaXBd4HV4nI07xdVKKHtaNy9S7A1c8708jRPJbfO2ob6N7XsV6LofqoTwGmmXY92Qcxv9L//BUMzamVRZpmInt86Yua5MP6ZRc9axBUbjrD8NWE/wlO3gRQNA7gNws1ZhQPGfKxAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>. If <img width=119 alt="\ell \in \text{dom}(\sigma_2)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAEWElEQVR4nO1a7dmrIAx1BVZgBVZgBVdwha7ACqzgCq7gCq7gCr1ARPlIgNLW533vvYcfrZoGOISQxA7Df4wf1cYG0S4q24V/NeSwDfqjGvmwDothsAo17EbwaT7vgjL9babHp5n2nZBf6lGb2VSIfhxda/PZsCYfweIovptmZsj4liktphXAnSVbqBsnPZne9O002137LUOq7BNL7uP8dq9/vpvmT3vlVPtceujJtTTfi3tpFqa3z8YYMRTtdLmbKmAue5cIo7ELf4hB2zp2wr00P7589oz0Mk6OIMB+OI8aHkbyaUhWUXt0TOFemmcz7m+C07GacoRZ2LXgVVXsCPzqkhiE2wOLWVywfIxmZmRW98QezSJ6Ik2D31vAd3vlF5i7QHEhxrdWdit3+qfAdPTRQ6sBPakeZvMIjgXdcDwwM9S985jkkYt5Gk0CoXl0OyVs16jkeU+5JOOS2c01OxbnkklBkjDAktl9vZwLvAXaW7GahsInJTasq1uoapLCwA/69sNOZjRuFoeXB4qmQ2o+ny4HDUugaT3ubE5SnYFibg50+jW6X8AeYe73+uhROnfYioUKIjzNS0PY/k4GNR9khNr2jOY9OCkAKiAgvLMFy+1TnUtqctcxPYKkmbl+Q+m5sCQlkDRvTuFIGXsE/UIkEoOjm08lNMuMUos9WR6VUSgjmwfkbkOS1Ck3ttD/8s7DWVM0P10Q0haM7RkFrVCktwwns6B+EFxArGuLXBe2PK/QvGWLNDhXVEg2CJCRc7rdaIg3XAZs69yrxzSndgtISVSZlERsr51mhppAurgWUyGKucaGctS+atc5j7dSBLIgg7aI6Um9d9jvRcOnaU71X72EpQcWRTaU3yZoZodvboF0NiULjY4ufyvNl87NmNHopDVyvIa/Qmwdpt9WTmFDf0Xgt9LsKbMOcz3NaHJXGNCqkHaxQyloj7F217fmZAt6pBZDH4GXVC/NVEAn0OVVkWGkPeBGQ9AsMnVlTN3V2jz6BX3x4HVkQR5rQn4vzXR6siP9LskuV9HoKc5miksgwDsDWfHTxYpqEXBIxrFpmp5wxK7GzK29QzM+ep1Jl+Nma/8b+oRMT2CI4HdE9X2WaPbkKXTQjwU/axdTJnX1ABWO2JH000yVjviQpv3lLHBDdiag8KIKAhUomtTjYus45q66hi/srGdZ5qprXDbgE2c7YF8F8aNKQ0pLRHzHTlIl90IScBv07gtKUmOFZFV4Wng7I87ptMURwhGmjfSrZOtg8quzB4wMFdXo5iwZ76e59HZoPM1gN+OkzA0qlDRPVKB3TuC1/G5Kio7QWhJ2qKqFV9j24+STd1Arfdl6dsl0bJaxFjTIRg5eAnshPfkpeOfvA9yRDMswoT5YkU7pH0M/EdI5MG/rG6pnvfHvRD8arPl9ZwwxwBsV37CUbqz/7+jfgWg+6kPkZbPUbmXXm/2/GKL2N6yXwZ3G/yRn6HufSYFh+v4Aawc9dpLYeq4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>, then <img width=192 alt="\sigma(l) = \sigma_2(l) = \sigma&39;(l)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASAAAAAgCAQAAAAY/W2/AAADmklEQVR4nN2c/4GzIAyGWcEVWMEVWMEVXKErsIIrdAVXcAVXcIVewNprIcH4A0Fe/rjv85DkQYQQ9YQ4qoZRpxL1YTtpVQalFIr4TSI+JUbRMepJMYgeHLinyqEcxUs8vKPJ+BS4o5wjChzU4gnGXHXgZs6dS6kcyhpI/AGUjK+CpvTPkd46OBdsquyh3E0lUT7A48m5/An5tOeMkbTTJG7aH+v5qyTKATzTzrGEfNS6OY9gfJobYVq8l8qhrKzH7qKUjM+sp3jkrq1pXJp0Kk+VRNmCV+5gScj3IBsJmW5Ih/NUSZRPZP5JyPeEtRNXyLREVuGcVRLlCwl+o/FJu5VrodpSOht9/2cBBjIWD5nGMeJqnYXWXSjXGRs09I3Cp2wANb7DqAl+jp9t3cRoog+aHqBcJx4LrTtQ8hg71KMIfI09sbX/rsDsEnjV4Kj+SkLRk1gfHJ99wK2zxWWhlT8ll3F81/nV6XwVjNnfXOUTNVJH7Fq1oYTEZaGVP+Uxxgh8Wri5SokmlNRu091K18rP9LtewnEGl4VW/pTHGCPwmdXTTRINyLH9pq/LkXBZaOVPeYzxdL45V+k22SHh1DHTVyT6+Syt3a1o5MFh7pR8Rlyn8ynUoXlDV3s1c+5aLkv1tWPxa+dOyb9e9PmXDSD3gf8R0/69fr54LCNEEI2tPd+3D6+NnCn514s+/1S+kEPSq7nf9BXisJhdyPBZy1v7P7eNnCn514s+/1S+Go36sZzk/g3getf27BJ6i47Dopx71eXMnZJ/vejzT+abkNFrmvIh9pp+rsDJr3T8WsFSY9tYftvwOz53Sv71wnU6X+dNilRegd4qGtNLCr32HLwuR8tnmWXux9E5ljvlVkZXp/MtCa5/B6jMJv0Yrn9DmVT65N0/173wyWeZZfZjrre5U25ldBWBrxWvz6lNwJ3eu1sXaUFvjOk34GKIy2Kk0d/mT7mF0VcUvsbmMudnuR05GdJhonyvzP64NcI+K4knHksFtSb0Fak7UPIYcUXjq8CR8EYw9Gp1ZR8BYql8c9bVH9+tsZhk4kCw3IVy/XrhSsrnfg7CkSanzFSSdvjMnd8iK3sZlLQS8u1pZtjhbkwpuw9Z7t0RISqBMqSEfOZdlG0rfZPZV5u1mN/gWwqW+bg/ZVhJ+Woi9MRlvsDO648PqK+dBrXfuD/lmpLy1cyMh7T17tWx/yqdMjEfJ/qvLnkCH1OlU+7m+wMG6dv5TObN+QAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, thanks to the frame rule as shown above. If <img width=119 alt="\ell \notin \text{dom}(\sigma_2)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAAgCAQAAADz74GVAAAExklEQVR4nO1azbHkKAwmBVIgBVIggLk4BafQKZDBlBOYqXICeyCBPbhqInAKPkzNvQeEMb/CmPbrfa9qPx+6bcsCPgkhYRPyP4ZbtVHC20VFu3DxefXS8++DICuZbtXIyKJHT88FJdm04FP/9sJoaGgokFd6uE99iO42eyA+qMVJj+Zk/I+96Un/XqEqxHrRRAoofjfN9HI/26H0UQEDTzaQ3YMe9ZPs4hMSzPpemq/OuSs4mSeG3Mfxry++qs5o926a747Kqfa5dtORa2juQX+8ey/NXLd2b44RQ+JBl8FQLeZ6dIkwaL9wi5g91o6Z8F6aHy+sPS0YcDOOQJDFtgePMzy05FOTLOH4rv//o38fHUN4L82z7vdHguG5mgTCDIamZYzuiZ+XlBc6z2EOKG1c6/klmqmWWeDOluTiJrcX+/MG9r85cwZmkCiqqH8ey8lsZaB/3N1HwiJtW2h1oCfWwqxv2WVhalgeqO7qlgSHrTFFYlGIeWpNvEDzADMlPHyvxHFNQpHhZTZ9TnfjeJkUKAnEmszMa3UYeA20t2LRRxGuKDFp3bkvy0xqbIx3bKdv2/1kLubNfI/yctdtpebjrtppUIGmZb+ygqQ8EsXUHUil/BrgCTtHKDw/7S0KCIetUFgS4WhWDT5ZyihaU6R5JyPUtmU0b8FKYSEDAsIra2BuV+p4qRHOY3o4SjOFdkPpuWKSGlCaV1A4YM4eYcomnWjMtFlx8smEZpFRarAl5pEZhSLyeYs8bAiUOgl9C+ck61ycJ4zmJyQhbcnYllHQmgJKNFqGg1HFOGhDQKxrjUJXyTxXaF4zIxEIRZViAwGaOafTDQfP7Msan3TTOo/9Mc2p31qkJMpMShR8r51mWnSB1LgGYyWL8X0rzoF2q/l1vnzkS46HKnTaIKYnjd5hu56Gu2lO9ftWwoBIo8wGi9sIzXSPzS0Q4FPiOL6R3+RncC4qGcdXpdnrXLUbDSA9FZbX8KmCr9vht+UKlMSl5OPCbtdXpdlRZgLmcox2hLMSirtCE+QOtaQ9xhIZ5Mpu15xMQYfUY/Al0Ev10owldLxoXhk5RtpC2WkQmnmmro4x8N+20jxsPl8ux6TzU+RBDktCfi/NeHmyFdpVySyXUe8xzmaMS0uACwbiJE77HdWTdwUZ7CIZ56ZpecIKfjVkYe0VmsuL/ZRJ1/Nm4/9r8Q5antgu2rjDT99n8X3IjFzduZ2CdgjxJMc+PiWk2h2OOJD004xtHTGSlv31KnAtzEyLivPZRMVumpzXPSZwzOQHYs0a3MbOcmzL+H0N7wOucDYddrsgrldpSmmIiK+YQcrkWkgC1uvx0Ci0aesky8rdynrFj+G0+Scnv7T0v1r62ts/56uObOMPJTJktEc3Z8V4P821t0PD4Qab7ifmbnaHEucJS/SOAVyp3yX5A1SnR0vBbnfVwrPS9GPonVdw9jLN7GfXXMdUGUtFQ+sOTyPsRiWNSpN6efJZ8MrnAwxItmYYizFYdoRSFNc/Fvg86CdCQABz416LepY7vwFRHTtXnwW0+X1nDE7sGxV3lEq64fy7o3Z81MdR7wJvXupD5Ntmqd+Krjf7KKY7489/An65tDoDA423fqjJvmxcDnHvGGhJ318PFWNbek7LLAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, then <img width=111 alt="\ell \notin \text{dom}(\sigma)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKYAAAAgCAQAAAAyaMs5AAAEZklEQVR4nO1ay83cIBCmBVqgBVqggFzcglvYFuggcgOJ5AZyoIEcLKUCt+BDlPuGp3kOYLza/L+Uz4ddewcYvhmGGbwI/cc00AYj2i/K+oWL7cWt9u8DQztaBtoRtMk54rYgR4cUfMrPUageOgYK5IWc1FNebHjMEbBbIy5S58YsH3aARX5eISTEftEQQhP5bjLxZT1TCHlVQLRXKvDhqc2yJbnYgmvjvZfMq+snR8OzFYWP89tY3BNDUQi9ncyxaJn2sdZ+dBQqMkcwHofeSyaVo43s4zE4HAyJnpDBWo8HESZpY7eFmGsf8Or3kvm4sSd4TLBJZk2DwWGXe1upQ7YS0kbq+iq//5CfjwFF30vmKvW+DwJnPVzTojB1bSLYplBekl9QkWp/FtKExotLZGIps+lfjiR3Vbkws+0VzHd158xIdMolIv08tsbKI7r/2ToJ11ukGSF2kyfUzyp/MkF56QjOWCp0JMv56Ew2SBQUnrInWiBz0l4fXl4rdj7jOvX2Moe8x9YEXiYFSAIyhlFrVJxm3IPeY2zyKsKl6ipBavslz6TmzjhELEmHtflazDOpjb7c9m2k1vNXYScrgp42+2TXkvxMuVKjo0pRMukWxt+xbr/YEZkOYDEEtFE7MkWHf5V27d5kY7VTDns7MjKPIIIb8GCa4ZM9MKorALzUrO9jEihIJtbjhtJrhfgKmbtuNkGOG2HJlgnrzExJcbnwhEyWEadwJEbgGVEs8l+DfKEzkCCudQvXF6lujQtE5lNv9H1pzZFNtDeZ4mAUC1UWBcKRXbRxX3sUbEpGuELmnpkC6eABJedgppkuEBg0sxXpbOkWYh6TYzJTHzRIqeKZFCv4UT+ZuGjo1IQhwLK7ZoEYfi8tX3nA9xCAajEJaVQNx/WTfTWZaf9+FCiEAWRiGzN7wLR/sPP6gn6j78E9q+zqn5XMctTkxVVmJ9m3H2MUl1GPCycwn5XMcrJYPMNY9P5cS2VjbBHtV05gVmDRxCTslQ3IS42SCaVGtGhE3oiZhW7qjVLMgS/2FZ+xaulmNSckLEVv2BKKR8mEk/ajMK6orNgVYsxM0y1f1oif/iyvceKcwWxRcS6XJu2k4CNTFojukFneapdMup5ngkm7UWTT06TNNxzUToygqyeDSzCOUdfV4HMm5akzlXq89MfJhA46CEoL21YFBDqSKehNid8+DlNLfUXfkqKvB+4YYjsPEXx97i3tSkOlsKvmnVZpcqamGz9Rk+TJs5AESOv57JFJA9aprO4W9FS6z9co+iWlf0rpa299nN85SpVHlqbMo3OjNSs3x8msvUmYTmMfUs+6U6VVfwJ26YiWoz+a0PTqKUnNSU94V6qhCPjLHbRer6jz0raD9J5HdMIckeEoYa8n7R8Fd1/0KvCBEAfi+mvdj4NXELG9wCAnRGct/xGBu99zQZja/+nox72/l/x70O6NtgQ29A4WxPLKiPFPQC8XHAZEt3vpn9PIp42XIUbmgEut/gL/JieoNls9egAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> and <img width=118 alt="\ell \notin \text{dom}(\sigma&39;)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAAgCAQAAAD3GlGoAAAElUlEQVR4nO1aybGkOBCVC3JBLsgFGTAXXMCFckEedOBATwQO9EEO9IGItgAXOHT0ndaK1gRJ1Gf+j5jHoQpK68tFmUkh9D+GG30JYsEdRrS2I5YdqxsX+4tb/Z8DQyuabvRf0Y5exx1Bi9w5vu7G0SYb7vKzF2qEiomC9kIvdo904uPBbs5I9Zpf0bNJ7uRi7y877SQ/W2gKsTaKR+ilPk0xbl5nCsVVrkxCXicgWoMVePeGR9mTNPbgWqTPUtxqazmWoq1f2AY/FF996/OnotO7PU3xPS+srGAHlGlF89m0jlhFcQ/6/duzFCs/eieWMNZaFhKHnSzR2zSYzz1KhEFO5Q4sc60dFvAsxa8bZ43BDDrEARbfqMkx2JKTEsJLttwlwVxf3+T3H/Lz1bH8Zyme5brvYQeVkMDxGD+6DVVHFrbBnW/JGxZOte4LKVhql5xTjGWbRf+yJbG2it2Z7a9gvqs7J1yig0ERrc9jubBSoscfrepwfSCbGcz4w6lCgPTPh3eZKo4CLJe5JQ5hqwyDSORWdjkSLVA8aAsJL78qdjzjOoHwbTZ5j61gfJsUsA4acSl7Fodw12B0AyV6GAv0q0s4VOh2rcM8azVW+jdiqdusfszFuJhar87t2KbVfPwqLAUiGGmxT1bdkh/BYKoK6CS1GnQPYxtY95/sjEy7QIPVtihDQMGCo1hU6GIpcqgNg2ZLRDjallG8BSeDAQ82Hz5ZA1G7NMa3GlGeg1GQYqznDVvPJ+KAAFK86sGGUxNwmDJDY5WRNIkMzoEnFLOMToUtEQ3P6GORrhvkroKBtHGUZmyk4yCeIIp3HWzUBVxbtv3aMI+D3jHciCiIAVmzj8daI3dVEk0LxWsmIJPFnSQTBYCRcWpiMGgmV1LZ05ly7utjilN9NUgJ5FkrVtC5eopxUfypYK8Blh/qpeXP8/KVHy8eAlhwTE3qrcN5PQXvpjgd38/SVk4AKMbWF9eAaV1ix/UP+o3+De7ZSWTxVSlu8ca8aKd263UxAUZxivhqqFp9VYpbqofFCs+kY4SzgDzGEgmjpWo1A2YXU7OeHHe+VS/FUNBGi6LlXb64MHjbUGOgt3Xpdjh9fjSOCTVTUXOWhPheiuHUYyvMK6qt22GGeDSbdw6AXfhlXxW9qPNnMAdiHHumqQcp6NOQubI7FJcP9ilr3RMXg6mHWd6iN08v30FRu12CWiuvUzAPQp7gWLenhFBTsYidRz/FUBmIoDSV78vuQKUz5Q5TALmWm3IWM/qepLk1cEWa5Six+DqFl79LhtWCXVXDrSoNGxUJ8RO1SZ48C0mAVj0eIzIp1h6CT88memylTi8p+iVb/5St297WOR11RCvtLRHBo1rbnCXY/RSfvdUZDhXY5Dp7athpTSQBa4wA/2ia06smUDfVsfCulB8S8Jc7uHoBpurRrWoTjv3G/5GYYiOO0o7z1OOz4O4rfhi8w3WCaH+h/3nwViIiLO8UnmisQH0m4Or3k20Yrv8PVI+7f1j6r0Grj/V6sK637yCmDzO1p0Cb06YzED3aW/8wSb6sHw7xvj3g0lh/AUHwPcWnN9S4AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> and therefore we can say that <img width=117 alt="\sigma(\ell) = \sigma&39;(\ell)" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAAgCAQAAAAY2DqWAAAC/UlEQVR4nNWajZWrIBCFacEWbIEWaMEW0kJaoAVasAVbsAVasAUfP65JdC7M24C413M2rmGZ+RCGAVaIbzWwSnVCfm2prnqh4HfNGJWwwgBj6sNcL2Yxuaf3lRWreBLPGzIq5xL91rVYnKnVfb7LOFfv2sTSeUs1cEPGzlWlyW+em1PGfX4am9x1T3mfl1PTNGXUhENefXizscTx7eP+0FrzqS96NWVEkUnvQ83fHcO+FWMJ44XVhQDRn543ZPQxi55b7W7SG6dcu18cfjivzk3ZlPEJKulDX4gaiWg0QKdbaiT7b1PG0UUhSr4v2O1+IWblnox1rbWSE1NFRp90K1eR3i8TZsdXljeDuVLvzg5kr0Aw9ZRnGcC0VIlRhezOhp9rmC1tuIu/5aoY92hmwAQxu+sq8VgM8KgK4xCMP8J9F7K8WIV0zuq34YAGwU/q7RMZ6t3GEteIy2K3MkdVYOzcn3yuZ0bSjMwan2AUyjew+o8Li8uCVIVRn9YzccY8giho3IZvhkQYMJkG7vdBnL9S0ZzLglSF0f/pMUmeiWfY+BpSFJvYV7oqE+ayIFVgjOuZY6XmLevjGV9BTHsZr79c5rMgVWBUpFM6PJWnkrTxfB+5poH5LKkaCjOmnDpvaFDGuy0+5YzTc29J8VlSNRRmTDnVn0pSJmK+SeeG7/XVF58lVUNhRknOzJqIW3QKY8IaKbdSyzfwxL4wJp8lVUNxxoV4wxP5vujsmIMwZtM0zb5SEw2fBakCozkNLJQ7ojCvtyQmShEuXrWS47MgVWD8SfJfTqDVD9oIibFvDlmgJM+nrjo24rMgVWF8bG5pV82QcGnaN+yOitspcYOF6i3olKC8uCxIlRiHkOfF/SYDBxSequQW/Raw6UwfjtcRjwWpIqM/8U8nM+mjPbwNo9iJfinlWZAaM6ID7bQ0HHZ3VFPG31Uz3/DACKspY0eeR6U13Ph/eyg1ZpQwyNNSyS2+e6oxo2RntX0o+dea16s5I2+G7i7YQaunLxj/Af1Ydy4WF4kNAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> as they’re both undefined.</li>
</ul>
<p>I think this is a much cleaner and easier way to state the frame conditions.</p>
<p>My next item to investigate is how I might integrate this into a seamless language and verification framework. My current thinking is to take a lambda calculus with linear types and refinement types, and augment it with an imperative embedded language, which allows several of the guarantees of the linear type system to be suspended. The imperative embedded language might resemble the Hoare-state monad <span class="citation" data-cites="Swierstra">[Swierstra 2009]</span>, only using Separation Logic rather than Hoare Logic, but I am still figuring out all the details.</p>
<p>References</p>
<div id="refs" class="references">
<div id="ref-Hoare">
<p><span class="smallcaps">Hoare, C.A.R.</span>, 1969. An axiomatic basis for computer programming. <em>Communications of the ACM</em>, 12(10), pp.576–580.</p>
</div>
<div id="ref-Reynolds">
<p><span class="smallcaps">Reynolds, J.C.</span>, 2002. Separation logic: A logic for shared mutable data structures. In <em>Proceedings of the 17th Annual Ieee Symposium on Logic in Computer Science</em>. LICS ’02. Washington, DC, USA: IEEE Computer Society, pp. 55–74.</p>
</div>
<div id="ref-Swierstra">
<p><span class="smallcaps">Swierstra, W.</span>, 2009. A hoare logic for the state monad. In <em>Theorem Proving in Higher Order Logics</em>. Lecture Notes in Computer Science. Springer Berlin Heidelberg, pp. 440–451.</p>
</div>
</div>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>The real formalisation is a bit more complicated, allowing nonlinear <em>read-only</em> pointers as well as linear, writable ones.<a href="#fnref1" class="footnote-back">↩</a></p></li>
</ol>
</section>

<div class="tags"><a href="/tags/verification.html">verification</a>, <a href="/tags/types.html">types</a>, <a href="/tags/semantics.html">semantics</a>, <a href="/tags/linear-types.html">linear-types</a>, <a href="/tags/cogent.html">cogent</a>, <a href="/tags/separation-logic.html">separation-logic</a>, <a href="/tags/imperative.html">imperative</a>, <a href="/tags/functional.html">functional</a></div>
]]></description>
    <pubDate>Mon, 09 Nov 2015 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2015-11-09-seplogics-behind-it-all.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>The Trouble with Typing Type as Type</title>
    <link>http://liamoc.net/posts/2015-09-10-girards-paradox.html</link>
    <description><![CDATA[<div class="hidden">
<pre class="Agda"
><code
  ><a name="20"
    ></a
    ><a name="33" class="Symbol"
    >{-#</a
    ><a name="36"
    >  </a
    ><a name="38" class="Keyword"
    >OPTIONS</a
    ><a name="45"
    > </a
    ><a name="46" class="Option"
    >--type-in-type</a
    ><a name="60"
    > </a
    ><a name="61" class="Symbol"
    >#-}</a
    ><a name="64"
    >
</a
    ><a name="65" class="Keyword"
    >module</a
    ><a name="71"
    > </a
    ><a name="72" href="#1" class="Module"
    >2015-09-10-girards-paradox</a
    ><a name="98"
    > </a
    ><a name="99" class="Keyword"
    >where</a
    ><a name="104"
    >
</a
    ><a name="105" class="Keyword"
    >open</a
    ><a name="109"
    > </a
    ><a name="110" class="Keyword"
    >import</a
    ><a name="116"
    > </a
    ><a name="117" href="http://agda.github.io/agda-stdlib/Data.Empty.html#1" class="Module"
    >Data.Empty</a
    ><a name="127"
    >
</a
    ><a name="128" class="Keyword"
    >open</a
    ><a name="132"
    > </a
    ><a name="133" class="Keyword"
    >import</a
    ><a name="139"
    > </a
    ><a name="140" href="http://agda.github.io/agda-stdlib/Data.Unit.html#1" class="Module"
    >Data.Unit</a
    ><a name="149"
    >
</a
    ><a name="150" class="Keyword"
    >open</a
    ><a name="154"
    > </a
    ><a name="155" class="Keyword"
    >import</a
    ><a name="161"
    > </a
    ><a name="162" href="http://agda.github.io/agda-stdlib/Data.Bool.html#1" class="Module"
    >Data.Bool</a
    ><a name="171"
    >
</a
    ><a name="172" class="Keyword"
    >open</a
    ><a name="176"
    > </a
    ><a name="177" class="Keyword"
    >import</a
    ><a name="183"
    > </a
    ><a name="184" href="http://agda.github.io/agda-stdlib/Relation.Binary.PropositionalEquality.html#1" class="Module"
    >Relation.Binary.PropositionalEquality</a
    ><a name="221"
    >
</a
    ><a name="222" class="Keyword"
    >open</a
    ><a name="226"
    > </a
    ><a name="227" class="Keyword"
    >import</a
    ><a name="233"
    > </a
    ><a name="234" href="http://agda.github.io/agda-stdlib/Data.Product.html#1" class="Module"
    >Data.Product</a
    ></code
  ></pre
>
</div>
<p>Axiomatic set theories such as that of Zermelo and Fraenkel, in their attempt to provide a comprehensive foundation for mathematics, involve several intricate tricks to avoid becoming inconsistent. A suitably naïve set theory is already inconsistent due to the infamous paradoxical set of <span class="citation" data-cites="Russell">Russell [1938]</span>.</p>
<p><img width=145 alt=" \Delta = \{ x\ |\ x \notin x \} " height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANkAAAAgCAQAAAA1KhUsAAAD8klEQVR4nOVb3Y2kMAxOC2khLdACBdwLLdACLdDBigbuJBrYhzRwD0hXAS3wsLp3Lk5ghsyQxA4hLLovmv3TjJ34cxzbYRn7vihYqV7HwFnFRJLZ5AVXa4fBr54IFgUb2MQk61l9UFLJZvXKD65mf8TdBGvVGNTsW+pHazZe4KWjIiyNf11FWZtoBZ2af0P5QK0+QPxIAogY33LgKsrGRCsAW0iaYqBsSKIcDzDz0YC4lZWfMnD1VLGJRFmjCZsTqsehTmjmayiTKqClwoinjKtoDGNOGKZwaG9OWVqdEk8ZGK7SX2fFdE7ckbJK7Su5HCTzYrOjBYoBmjKuk2xz/M2ZPfVulDU6FkmdlrfsQ/38qb43iXJeNGVgNuMlvaYsXWzG6X43c7VTWIqgWXCUxckGQP0FB8fztIf0HgOsTiRlYkNSteyzfHX4011WVI/cdTuLQhknlM2GKYuXDYRByW/PdUKc/BSdEucCnZUlGvGp0u4wgDL790G9zCz6x1+5LrirgKwQZUdkmx1lZ9M1wrlpOrsXa+zitZRt0dVZSRi+JdnpTrEsabBO1Xf/3p+Rn7LUskfEEULT2WAo61+aLWsKElrE+j7M8MXnzhFahD7mh+U9GKPi048Y2d3bKkqElag6RVhmuVOH5UxBuKer2S4hukYalZIx0mVPb4dFT2suIXV2m/C5C7nT0MyVgkCS7O+AwwkwoY1KS/Jpsos3ySLixMfpNKefYx17e2wVfX4XxFw4+NrQ1EY1hTKa7DIQ+nHUY3QWuslcu2LP3h4D5OuC8ECuRpsHrZSmyDbN62c69YN9sV9WgoWLSSGd3H8rUDt30ppa5Ej1pSc7bYklB4UymmzOZsu1mqgbsrDOwK2A72qxQ/igRA9fKvNalz0BJSjXi6TsBRxldNmDtQpMeh+j01uXufcYYI3d7qAlli4bZvg82dVjXENmTThXsZTFyK43Dl7598IBndJNJw9e34/BiioNXJQ9u22DVSf6TIWlLEY2WGRNvwlXJESdHslt0Ltqlqerv09Zs/HjcsnJSvUXfy2EoyxOtkn0IRwKb/Q5ptND2aQjqu/8GRbKAoXdYexRBp2C7VnRP5LpwRsZMJTFygZAcOzZT3IujdfpocxP17bVdMUua5jdtlk7dF3AqBjKYmUbFOyPeu9v4vOSeJ0xITc7XPdlNrjy8ONt4SOyV7Tsr6btdfglYHXegrImYf2X41balLrr873UUjqE6Q6UuZpmsbLOpSzlA3B7yPtEQCQKlu7ZyfMpk6emY1WwA/lNYJ6nSBFYzqbsXPmVvvi8xb9ScH19KBMU7kIFrjOX3J3UKi+WTL09Nej+lxD5TfoPEumq9GyQc4wAAAAASUVORK5CYII=" class=display-math style="margin:0; vertical-align:-5px;"/></p>
<p>Here we have used <em>set comprehension</em> to define <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> as the set of all sets <img width=15 alt="x" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAARCAQAAACcev82AAAAu0lEQVR4nI2SWxHFIAxEYwELWMACFq6FWqgFLGChFmoBC7WAhXbDoxcmzDSbj07DSSawIRr1I0+GZlmRaehFNyJNx44yMkIBydAKjjdrkMloJOTacSoFvmUTYLca5T9pLgOx4hdcx+L+G0IBs/gGWQsT+nL/XQezGL+0cH/QTQOzXaYUKPqbZkudP3zhJ6KqGtZfx67gHUA/8AXP+FqsxSlhdjQO/0cpkGs39B6t6RsU1ytMYvcMrjx5+wCUhUrYrBXPkwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> that do not contain themselves. This leads to the question, <em>does <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> contain <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/></em>? If <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> is an element of <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, then it is not, as <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> only contains sets that do not contain themselves. If <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> is not an element of <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, then it is, as <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> does not contain itself — We have a paradox!</p>
<p>To address this, different foundations take different approaches. Most axiomatic set theories eliminate or restrict the <em>rule of comprehension</em>, that is, they don’t allow sets to be constructed from arbitrary predicates. Instead, set comprehension can only be used to describe subsets of already constructed sets. This prevents comprehension from being used above, but it also prevents a lot of other useful constructions, like products or unions! Thus a handful of other axioms to construct sets are added, such as pairing, union, powerset and so on (all nicely explained in <span class="citation" data-cites="Halmos">Halmos [1960]</span>).</p>
<p>Another axiom, that of <em>regularity</em>, says<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a> that there is no infinite sequence <img width=29 alt="a_n" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAWCAQAAADzsK04AAABBUlEQVR4nN2UYRHDIAyFYwELWMACFrCAhVrAQi3MAhawgIVa6B5pupWu13YH+7PHFQIHXwkJEB1Lk6NAHm2RQmmWpUgzTagT2kgDbNsK9Yz00nOwZ5RGrP2AhB7YzG5vtWCbztYzwldjC7ZJIyN0b2w+QHTAzn+JdQjrmhsGyWfPM2XBmlOsRQQmTkOF+5dlzXSGjTxlPMC+dzPA1jwWZc/+6sJ4+fcgfSXQNZffqVf/Kl3dwySYspfIdRAnI75QYWuPTrFKDmIBOx6ZpLdd+CW2yMBlt3FYo292c+og3cLeUf0g/Qj7eAW16aVTwKQdNuHgRlgNKo/9FuA4hHn3pHaQroP6BGzEm0O66uClAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> such that, for any <img width=17 alt="k" height=16 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAQAAAClvJ5NAAAAuklEQVR4nNXTUQ3EIAwG4N9CLcwCFmbhLGBhFrAwC1g4C1g4C1jgSnfc1mQH5fFKliyEj3RtB5zhsCLwcjBG+a7VSoAFaZaAD08T/BOpRYkgO3HIvJN6vdKkgozNnpiX+5c+uJIKwuj4lWyckLeARnYGU8P54iePv+EIEuIFpV4vzmhjeXQjzhDgIW/7DAEX2IT0/xIVcvdF14SkDLUQgWHhZIekDWX51PFnYk/VES+oMwl00wvii9TuG+DrakEZPtl8AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, <img width=99 alt="a_k \in a_{k+1}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJQAAAAZCAQAAAB9G89ZAAACOUlEQVR4nOWZgZGEIAxF0wIt2IIt2IIt0MK2QAu2sC3YwrVgC7TgxYDnoqsmAdeduc/M3ujs4uOTBPAA7lALHfQwwPjXBqhvIfliPcCjMT24pD3A3A2mU4Wz7sDi30mm0DAMGjRiv9XXkanU0HA8fv7Q3E8x0BTo12B/PivFriJTyRKKjVctJcpYBMdhXzmxdB2ZQs3m4a4QTpPZy3VkKg0U0q8KOPmVoFv1K9V1ZApZerRN7gWcraSAftWvTBIyOZtYHT06rSNrHIfz6mntkqjOTBIOmZbtvaqjDBjezNEWx8BTDNO8bC7ftbPVkEemY1urRtpuN1pJIxPHqoyy+LnfjtOFSyZhG3bu93HqChjViI0y+ItW9AsdmYRtzwhLW+L+CqMco1D/YDjrpTdqn+3ACACOUWm1ODPKUAE9n0OL39KvRlwyCVuGUSE705l/t1tZYGrM9I5pwICFVisumYQtwygbZ+4Rr02EmXcw8/I8w7SYUPxFv94MlS8umYQtwyigw2ZoPX21j0A+CeIA4zBCZMk0pd9Ted7jkUnYsowyMcgDUEt3fLxa5mdCHFTxUdOAO+xZaheP7IitIYuXNq6u06J/YlQYjE0GUuH1toyGTZkmlexLdCyN8/rlnEzClhVRPAUYUFs1RYNsw3kF2weNAjowzCvLba/QEvHZPmqUoTTyCDRkvR0oJz7b/s68j4frULuyYJZD7IyTc0ApKT7bnlFuVT0ztK4n3/SvJj5bgdT6HxId638BIgPHra4OAhwAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/>. This implies that no set can contain itself, and allows us to build the universe of set theory by <em>stages</em>, called <em>ranks</em>. At rank zero, no sets exist; at rank one, there is just the empty set; at rank two, there is also the set containing the empty set; and at each following rank, the added sets all contain the sets that are defined at earlier ranks, as shown in the following figure:</p>
<center>
<img src='/images/vnu.png' alt='Von Neumann Universes' width='100%' />
</center>
<p>The entire universe of set theory can be thought of as the union of the universe at each rank, <img width=69 alt="\bigcup_\alpha V_\alpha" height=23 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAAAjCAQAAAAjgdwIAAACO0lEQVR4nM1Yi5GEIAxNC7RgC7ZAC7ZgC7ZgC7RgC7ZgC7ZgC1z46Mktnygc7HNmZ5xFkkceIQHAjw0fGgaQMBPHNkKPLkr8pWDGkes/+5MJrulw0tj3dHr8bteWJByRcQxtrNERCdShw2ACYelI6KIWJIyvbGjUoXO3FXaXYVwkLBkWqtIB/FpZE5H5DySVgbp0Rm3Nn0lNbIas+SvTYZHdUyRv1qUDuDNCu2ePJgkiatOZArtnLHNE16bTBc6eNTcJGNSmo4qqzzqkL1U+1adjjkrXeVEmNi3o9B/JuitX2tanA/p8uWexuVRs2tAx1dt0vR/l2o4WdNzaYCxx3pxoQcetDfZgDfcCLeicpaiS2EC2TkIbOqY22EERi7X2HJ/fE6pLJ4w2dDortyXS/QxX/2oSBcP3ZMpoQwdurbZ/xUekyrR/Z9swYxyT0WEP6IiCdGZLx58G+hvNSWdBRYt0QSPJTdPmPb0f61tjsHT8C7k4NA8dReINwhppd+9gHuKv9H1zMhRrd9nmJzcIE7FD/+zkX+r7+jokHv6HzvSEjunRU2tqRt2jmKHvBFw6HGdWGiBXdenbLab3jRubDH0nwOyZpMBRkOxpr7pFCTHv/xn6Jvmz4pzCildp40BqA9ogZOHT4cVTDI62oHfJZOk7id7aFJcehPWPKDlm6yj1yaSTr1qL2WauTxll6pvgD3dmU9fCD/fleKVd91k9McvWdx2o5HtcRDZ0MNSLZOr725Ct729DAX2/xw9e4JUT9v35GQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-7px;"/>, a presentation originally due to <span class="citation" data-cites="VonNeumann">Zermelo [1930]</span>, but commonly attributed to John von Neumann.</p>
<h2 id="moving-to-type-theory">Moving to Type Theory</h2>
<p>This stratification bears remarkable similarity to Russell’s theory of <em>types</em> (see <span class="citation" data-cites="Russell">Russell [1938]</span>), his own solution to the the paradoxical set <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>, and the distant ancestor of modern type theory.</p>
<p>Indeed, in the intuitionistic type theory of <span class="citation" data-cites="MartinLof">Martin-Löf [1984]</span>, the approximate foundation of the Agda proof assistant, we have a heirarchy of types that very much resembles that of von Neumann or Zermelo<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a>:</p>
<p><img width=241 alt=" \mathsf{Set} : \mathsf{Set}_1 : \mathsf{Set}_2 : \mathsf{Set}_3 : \dots " height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWkAAAAeCAQAAABEIicIAAADw0lEQVR4nO2c7aGrIAyGWcEVXMEVXMEVWMEVWMEVuoIruIIruEIvn0WoiKcQTG95/XMEbR9ogiHgIcTXQBiZ+cH40b3VlhUmlrAqJWL1ZCVP51gJrSwnqpSoRXVzH9KTGVn0+a+zhFUpUauTzVxIuyvr5aPqt1nCqpTINfOGb6R5K+9/nCWsSolajfRllvgpovvSvR8TS1iVErl62fRUz83TdEwsYVVK5OoQeTMmlrAqJXptgZjrSA33+/agPFfTMbGEVSmRi+mZcewh1csGqtzm+Cqlcg6tum/WRzihr7oo3M0lWcKqlOUoQdS88pUL74Yh8PUmxznr5P2ky5mXyj+L4HpdPwbqS7KEVSlLUgLJNt6k5n34QTe30aDCe9UqVMvPenn/Iv8SR8gnuwtdU4olrEpZlhJMo7d0Ojm1q+wQK+F96+78asw18KviC7JlWColHkowtfzLJ+mpbuPFw8mfaAj/tROK/NMITCyV8utFdfMHff6QDeudY9rVQzY9J0sL9vPkomz5VbO8EzOlWVifvmlnn9kfoORGZPawWU9Ib87B0ukfC27LTg7KcXfl1fRbecrGCWVSM98FpQxAdetTNoy9HXYsgX1ApbPM2kwgd6GlUtJXCZNGs6GkVI43y+BEbV0dyJdIjRiqcUvUG2FNOp2F8ntaWQOnVEoRBtiJ1Oqc5VN6X4pP2Kf6vmacVvlKFSs9iD9T9gVr0rlYYE06ldItYUA9mqMv2WsCKcb84jnnTzXtHn1HM2NX8IFHDhZYk06l7HemAmfSOX/XXt6PborYeZvETek+3dO85S/VNVZXTbrhkdfRXoIyLFdN+l5KpUf0kX4nJdWrjVs0kj6nFGpl7iRjLdXzVvfdB7W2b8vcVSYByni9nUawnb8PwWY2b59bluWaSd9Nab5jJWe6l9Isl88Rc41RCm2Om2WoHV4p+EW/o6ZSO5uXG6W6VOQjzRWdV7tq3w0BmBX/0OgDzXLNpO+mFGPPFjEDDJQq4+F/3t8ohYxzZKxtdNJofywHEZLdsSWaPXldbnOc4QR83GdhWfKM0tCUozQw7JRKHbFZ7s8ozZMgdEVCbcer1coVO/G7Vq8xHSlcs7+fRkYfSJarsfSdlGNkTLufsnW+9Rnp02uUVR8KNuORQ2LUMUmxGWXGt/NCk5hJV4EKu0mLLfdmeYVeHq3LqpOxtRl3h5M4twpU9h0N9X4GRj1kXGreIBFRMM5/TzBLTirz6E/yRUst/5f8dzQwavYYcVKq3YJ2OonxSVJV9YFEWhDZf9f7B1VOcpCAxdGgAAAAAElFTkSuQmCC" class=display-math style="margin:0; vertical-align:-5px;"/></p>
<p>The rule of <em>cumulativity</em>, which is not present in Agda<a href="#fn3" class="footnote-ref" id="fnref3"><sup>3</sup></a>, but exists in some type theories and languages such as Idris, makes this resemblance even stronger:</p>
<p><img width=104 alt=" \dfrac{A : \mathsf{Set}_n}{A : \mathsf{Set}_{n+1}} " height=51 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAABNCAQAAAD508VMAAAEAklEQVR4nO1b68GrIAx1BVdwBVdgBVdwBVdgBVdwBVdgha7QFXoRggUUFZvPxt6c/OlLlGPIA3uKgjaaQhajNqmt/vbF4KEyE3JWIY8uikfxCuxRtMjn+BIm4oZCwbQa1LFbGHWA2+LO8kMoYUoScczajKgCLxZm0f4QJBCnEMcc9XhPfUtiCMRzfBmlnqBbSMuJnh3zcw+eqCftn9J4hkSNcsKM9pl3ESfO+puLSVhRDmM04sTJORI9TbmAhWcixq2h1L65LIVIE1d5ftEbLzlay9lppYmRkG72lqswI9kar4PPWpN9LfUjGLHiufeosnXXsQJVwGS75C/KuW5TmsQmQbGr9UYolXvzqcvyvpHKxvV8qRNKKFePHrk3nTd1rhCOf90AWZZUYXxsunGVfi3M0cq8mgwr36NgjJamMovjGBp99L53dlHT1QffPqIbJYIoSzbG2csUng1mctjRpNIE98abQuralfShvFtJlri4AXeG2Xj5aIE8VysOhhgRWO99T5S4drFwbE2H23iFcP2rhdq5cSSJsxQtQ/uA2ngt0Xvj22wqF+auiiRxMnFROSXJGXReLlY7YYEgcVWylKgySpIzaL30M6wECx8p4ho9ilsT9bWlyrBxL1VW/5CL3it41rKqjzXipj3lJ/Qs71LnaAn1IcTmcpQHM2up73ya3jrawnSf+gVJuajj7G8c1ojr9FEVREfrd+11fcWj2GrmXTO1Xc2V0EmmqGuB/nD/Nz4m7BwKs7n1nEmQnkc2wYZXmMDUNcR1u+H/Ce4/bvQGjt6UZzZzwavgmYOCUcMptt653C/q4LsH9LF+NAyfXMgriCvNhWwvRNdij5rklEfteZz1nrjEVit+/N4dmcbrFy2g6zf8I79A3DEcyVRTI7WfQmo9rR6eq6YnV0HfsH4ly8/DdECIOOoIkwYTdxghccMcs0ltPdFDGfXTg3nf6JDwd4X7T0BE1V9T/NSfK65ERe2JBIPBYDAYDEY2lo8+2GJb7WvXH7ix+ba6qSbYdu2vnqcwGAwGg8H4ElgdeAKsDjwFVgeeAqsDT4LVgSfHxPBggv+59EFVHUicOLrqQOLE0VUHkiaOpjrwBvpAmupA8vpAqupA8vpA2upAsjGOujqQLHHU1YFXEdfkzZi+OvDviXNxNOMcd1AH4hGXqk5fJlhkneMO6kA84lJbWdKcP+Mc91AH4ukDt/cAM4i7hzoQTx+IRNxd1IF4+kAk4u6iDsTTB6IQdx91IJ4+EIG4e6kDz+oDxbyjYu0VvQ/dAbFWPNJSX6MOxNEHomXV+yNPH8jEzcjTBzJxgFx9YLpzGOEx5rgb+X8CufrAFHHvtPT6n/zOx7Y+8Kf+dnElTi3Cf13jADbfXuDwAAAAAElFTkSuQmCC" class=display-math style="margin:0; vertical-align:-21px;"/></p>
<p>This rule implies that like the von Neumann rank <img width=29 alt="V_n" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAdCAQAAAB7q0aCAAABRUlEQVR4nLVWa5mFIBCdClawghWoQAUrWIEKVrACFaxgBSt458EuwjpeBPf4w08HzhznJQCCATxscPC1g44OHK68W/FnwwRzID6gV9c5to/lxAITiLWNHWo9YHlKS/BMPCtWx4HqaohHJl4vbaLX1tDSZj3KpNfX0RIWNcrbbVq/YlKiTEFy9bSAmq5r2demLWJl6iF5N7TqJUgTpDRzu15Rl5Zc/4Zewp6VnHtDL0GmxnRy9IrevP/Gtvo9I+2/TZ0dFfC/lWHxbt4jlv7b2MXVSLIYoJ90DujYlCa3D8FYLuaGQYc7DyT6PZT8dxLEDbmWCd+IYx90S7ILA+YCsZY4skWXazmxDcTacrKlMopTvN8O9gbiMZtwOfE5XY+I75F+zb8Rx7JsHFZdNlgXfrZYQ1WnjgiTHVxs6NTHZ6Tv6NNUfwAoBqjxZpNTCAAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, a type <img width=45 alt="\mathsf{Set}_n" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAAAeCAQAAADd02vRAAAB50lEQVR4nM1XbaHDIAzEAhawgAUsYAELtYAFLNRCLWChFmZhD0IYpNCuWz/eLn9WKOUSkgtjrIVmlk3BbDDZmb8Bis3sSWxm5m4SBrceIRKWeXy+FRK29ExUYwqO51ZMgcSD8WZc3UmCQyzsoW9ERw7GTgGNY56fQEP+RjRYyIt+bvTAQ9xEM3oKDYuV8u5gFGyXNGXAMQMVlRyZ0L6UPv7SCR8o6ZW4ZG2ZUOhc5QK1r/OsEMkytvyUxq0TRQX+R5UV4beC1R5+Rdt3vCsYFnLuyOwM5AoUHE3GKblRIIKHDjylREwniWMEcrKeTKNsm6hofB5hG0XMVfMX0Sh9JoFmTrGsNpfRYODtEw8iVYhtLCfyhTSGqvj8G529kEbSiSRFY1M5+2jo8JWc2PK7YnZQHYXSltz3aMT73APGeSUGj+56YOk7XUKSkuWNbqR3tmgMYZXArEoxMVsaazDn6d0rdYkyRlU0ErNhPn/SVtHSrzKOKGke4ddp6JdcebyLegwfXWBwNDav/IYkczP2mzqL6I3WbnWc6NnyXu47fbJ02EjBkfgVZXFk5Qc0EmR4yeH/lPVXBWpoi/44TcodNK4BTd0foTHi9YAduwx8Cl71pUzDh6JwTfFfCrVQG83+6W/pEoJW4B9Jwkk9hX5eKwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> is inhabited by every type <img width=49 alt="\mathsf{Set}_m" height=20 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAAAeCAQAAAAhxkAbAAACAElEQVR4nM2Xf8GEIAyGqUAFK1CBClSwghWoQAUrUIEKVrDCfTCGMOE8vzt/bf8ccOrDYO+AsdoU08x6195FY/xyk2xiL+IT6+9F6hFkhChp5rB9owkAcKwr+iQs5I1mPdLMeNUvb2BB4xAn/dM7wrQOjasEqN+icjiUeGKkmN9P7T3VMu5j2lW9J0BpzL5PSyjh41HDBuzrIUvjtCz6IcLLF11yHlC9iVnSMosya4oJUT8oazNWEtH1ixWCRGAJsQmK3/nfEp528Cv4vo2wy4ZVoTFkdALUbBIWMdkJeypb52dvIAoUq2+kQohO2vKnQmWICKawPcJHJXFTjF8ClethNLrjsid1uwiKQSReuGQx63TlKR0ugxqK9HYfNP8yqKhLUQjHKhv3QYXEkUWrTJWv1MxAxmXArULUguKLsAqPozF1NLzNrfZkZWJ1vEu9pSjwSqfif7agJIwbSBfj81TihrAQPQnRn9kb65GZnjtjNct9VNFjHOZlCXQRSbUIRRrJ8bBFEeJbB261iKXDM3oM7rxa9R57Q8lN/xBkbMK6WO4+CqVJZdy8BYRZr+8yrlHr8ykhABkS26xkhjz5NVQ04R8xeO97nxkd6nlt7f6AMZDWv6DOMYrxSCj7HKi8fDXUAKX9txvCF1Bzcf0P2UnVLeSsaj14pnUbLU6KkLc/OoxherlZ2u4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> where <img width=68 alt="m &lt; n" height=13 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAAAUCAQAAADVPIAjAAAByklEQVR4nM1Xa9WEIBClAhWsQAUrWIEKVKCCFbYCFaxABSu4M7x8DCrCfsfvevYH7DzuHWRAxt4FZ5J1L3P4CTjTbIZn+KvwChLI3UwPvy0EzLTXsmMjW0CIPkSnGMBGbayE46juOCgIvrind2PJpjDWiUC0+DQI6cF7YXZXtDxEYjAGRjaMsRAXcgw8yqVB8gO4zTBjE3msJNpEOfdUchggAsYp8VZu5WTIh4wsjLVjspY4C6+TB0MTVoeBi6+DDEvNHZ3LUCfwdV0j30GEjCYwUOkfvVmtS8wu4QpOqIvHYvxWx/Q1u81TF4STOfVIMMTMEOpPxHShZ+nqtuHF7DH9TsxUKEYU96wr5MRQlllQ6iUzZ5Fq9tYR/0KMP0tsah21aBBjC6jPxRX3Z1PbizbWi6GvRlsDWK8tdb3M558yc6+IQeBFyVY25xzxJjEfYlNwZBE8PTbX/DkxcbX4eYGoGHpALW5j4y7oIOSzi82TC42Hce2dzvmDVLpLzglKxaCcsq5G0TvPkqsmwpw0gPiorFcgevzCwLR7h3jVa/kWiY37vs+ZTO2HdIcUWZ8A+j5T8/jd03Z+xMZ9tz75LB0wvRTyBloLssEX6LUxqkUANBMAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-2px;"/>.</p>
<p>The differences between the two theories start to emerge when one examines <em>why</em> this stratification exists in type theory. In axiomatic set theory, eliminating the axiom of regularity and thus the stratification it implies makes it rather difficult to do induction, but it does not make the theory inconsistent — there have been several <em>non-well-founded set theories</em> proposed, such the hyperset theory of <span class="citation" data-cites="Aczel">Aczel [1988]</span>, which do exactly this.</p>
<p>Removing unrestricted set comprehension is enough to avoid Russell’s paradox, as it allows us to distinguish between <em>formulae</em> (or predicates) and <em>sets</em>. Unlike informal set theory, we cannot construct a set for any given formula. For example, <img width=91 alt="\forall x.\ x \notin x" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIkAAAAfCAQAAAB5EiYcAAACpUlEQVR4nOVZy22EMBB1C26BFmjBBeRCC7RAC+4gooFEooEcaCAHpFRACxyi3MnYYLDBxr9B2myeD7th0Rszns+bQMhzgZKelDhUE2GeOwZS4Zi6FRyehOJQdbCuUJGZFDimbsUITkFCDY985d0WouTxUeMe3EQa528UTNV4pm5DD0eHCH4RBzVeht4IBgfnq4hRKIHQVasHXO8jooKd9VBB5m2NWB1HwPXgJbb3kdBA7M7gEC7XK3z/gM8GM56FCRs4eH5HBe45Gi0St5HOJfTHDDvbiyl37D7LJtXCz1yqsVVriA4GRQmbie9HOVwU7pkOCTIFtN8Em60kNle3NTZRgPlKuqsYClemaBmXxyUiwmy2PhGRbNMmyHYRV64UgyRV1eV8XiHI4bJ1ljGgASTaPKq/wqJIClnWllBrkxySxyV6jAl20S2zbZql1FVyufRzLfVKbsuL55pOh9SdnIRoU0SFnleugBQZOSE4JJ7rLAlskYxqUxfF7oCspZ/dI0AM4riYsy8uK+wxo2zqtftq2FuUIg5iuJiMCbatF/JN3rW/z6oj2ybdcpVejIKqmWEMg3Fc9JDaTdL8Fbl/FRvuXi8kD5Wk+XESz2UOHiHtN9umqiCumYeu0qY2lG0aUrj0uTzlX1tJ+x/l9DA7NF2/tbxF9Khyps8bfeCg6Oey70/Jxz6y/Sbb5FLY24Oq0c6FrTWewZVdGzTrVT/8XHaIRtySs2QIQaLNwhlSQvnp6dRtzW8fpfh6xYcQLhdE8nTkLbqWZdjsiD1Hm4NSURNDqxEWsnD5czSEy42SfMG9nxAlMbUkw2blfKRjoFI4sVQNm8fFyY90y3FdM2Du/+GwjKjUkGnhUu0JgfyC4hnQe17G/Tugv6D4+2jRRs6nQXFfHfkFpn2q5stbGjYAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-5px;"/> is a valid formula, but <img width=100 alt="\{ x\ |\ x \notin x \}" height=21 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAgCAQAAABam0kBAAADGElEQVR4nN1ZwbHbIBClBVqgBbWgAnJRC2pBLaiDjBpIZtRADjSQg2ZSgVrQIZO7swuWLSSZ3QVsj/9jPIk9+m/hActbpNQZKlXDJw9aNcpkcrwDGsaOTdOPVmpSi7JqVG1m0Fpd4PN6aOh9zkQb1UOboPc99egMUjE0ZeBdYvWFRjBA/7vYA4ajJxPvEmsuNALUwsYewAHmbr8t1+vFaiFqqUxJiNUWHOB7xLKwfUphjovVf7hYZWParydWA2vJwiq43NqcbXs8vphYHZx8mFl6177D/3/Bv12h8zxJrObEohmyQzyx0rgR6Kfw7L6nczQNHHBjMsQKl3BzXeBTQFZBtyaiS7RY6dwoFZrnsK8LwzRIYtq4+ChW+H2Cj6cfNx1F69oQ3aLEyuH2qyi0CHiSUytSFnPYqXEgm4Pv1ZVscvTr0I9zegZKrNLcM8M0yGJ2cbGGBwvZuEQ6XZ/hDIef4FO4h0M2qQ8JJD+miXHicnzkfns3Fy003nAkp6GceznUGWM8GSfGHDabNfjjnqjWcacv7OHIrIOMuzowm4QyjRfTZ7l6/yP+HKuyWzcX0To8gEQsGXe9MaBnjSc6J2blyvL2bL9p4hzy7pgLmSmVcPtyv761b+qv+rn5zrq4Y8TU8RsMG3E465HLXe4SsWTcGp7cTmqXdINFxyRuMPY+6w40c9rRS+afJ5acewpsAsc0pMQkfdb5ANcN6vc573KNK1YKd7tZS03CDRYvpo1P3iOx7lWSt3NrAo11kitWCjeupvVQJyq4jJhJhXS3mbv6et7U8Evc2/DESuP29gE3n9nlLw64MRPEQre7zQnj7YieommVI1YqNwK34qh+CM5nacwEsbqd6V8rq4EYDkesVG6PSv2BZ38L30/yYybeZ4XQMKv5hXQO94pe/XOC7VucgRuTEKtLKBse4RU3pd40ru+QpaaUwkK/Cvuc94YlX3ud4RL3b5W6MG4peXi+WPb8TqAQGrpa9ffaJZbxs8V6Ln/jrgQJHbS7WEPJ5FYvhIFtUiZ3nGMQmwYeKjd+G7wK+XiY1w/mP0is6+l/n0nEAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> is <em>not</em> a set.</p>
<p>Type theories are not set theories — they do not have a separate logical formula language, like that of Frege, to serve as a basis for the theory. So, one cannot achieve consistency in type theory by restricting how a set may be constructed from a logical formula. Instead, type theory places restrictions on the kinds of formulae that can be expressed. Rather that rule out paradoxical <em>sets</em> representing self-referential propositions, type theory rules out <em>the propositions themselves</em>. In such a theory, it is not even well-formed to ask if a set contains itself<a href="#fn4" class="footnote-ref" id="fnref4"><sup>4</sup></a>.</p>
<p>This restriction is a consequence of the <img width=33 alt="\mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABg0lEQVR4nLVWYaGEIAxeBSpYgQpUoAIVrEAFKljBClSwwlW4B2McTPB4T3nbHx24bxv7JgCtaLCwB7VBZWf9oSg44M30ADMTwJDbDTOw4Ol9mkh052GpbApLNk32APAC0djVLACBOdhHPmKQX3JWCPEs4gGE/P8sIJxD/yx6IkK+S2MdQljqqFGxFLpKnFnJZrDzUpA7aYe24sMDH+D0RT6ZOzuR1FXhce2GWkAyBc/bNLkVlE+MO7J/Cc8Kv/b4FPWy5OtphDi2eiBwXbRYrizDsyiyhMgcRshBTKchYuT54P8AUVwmGE3vG7pQTF21fgOizK0ScU8zm25BAEb5puKkTrKN5qa4CbFWDegH/L8JkXiQaLQ1HTYFwmEXFbhvI2Y4Bn1n6kjWtqLhRdrzSwhDvcH/eWnqFBtndwS1YT0ft62y1J9Wrj7OVPP0704t+joNEUPWOOjyDsnWDppfnVOLEZ3vH74zL8ukje4dy7swx11fkGQAcnSPuh7rC3G7lcb+A0iVFYLQLjf6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> hierarchy mentioned earlier — remove this from type theory, by saying instead that <img width=79 alt="\mathsf{Set} : \mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHcAAAAZCAQAAAChznkrAAAB9klEQVR4nM1YYbWFIAymAhWsYAUqUIEKtwIVqGAFK1DBClZ4D8YQEdF7zoXp9keZbt8GbAPGSpJMs9mxdjyeyCmpMxbBFvaX8cJUezPvwKJQ7QTR1Mzi+xPUHcsI6iwbdmMClhI9EWCZnYGV8WJctDPxHiwc4ql/0uFBtog/ARYBJn6LXit3CbCML5pdEixrZb+cEXexH4rRVu6SYNGYDe8WkQBVoQ5+cExB1gwgZ+R6WxCgXDlDgIVvtc06c7ICJ9bDGZsAs4OXcw2qQPmnIifDkozEEn/8TKJajsB9DH2nM7hnAX9bePJcm73xJhyUWFzM89bNZNIFDCcSsIwifbt3pfvqm3aQAgvz8VFO9VoYUScJxEcxJop2qeoRLArNSHyfQIXI2OzkPdwlxRJ710D5bkocK2RPd4mwGFASFk3IgrrgmET6ukuC5bPLopZd9zq93SXAEmpbKNNTkR2bmHgTFgMZMJm7au0oFnMjLOPhMB1H9+mfF7UufPOliY24y5+lLVIsCvNafn8QOs80lncy3qh28pge9C7icisJR+KF1gewyK2UW7wfCql+PTRvCkd94x2/GDPZgj1sbWfFnrmeaEiw+Ogc7/7syVkinUK8epPNQaqGpnoiup9dOixOoJ043O3Wm/gB+5iSauP53+rS2W5Y/gFYUUFC7oeMFQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, and the result is more or less equivalent to <a href="http://inutile.club/estatis/falso/">Falso</a><a href="#fn5" class="footnote-ref" id="fnref5"><sup>5</sup></a>. We can show that type theory is inconsistent with this change using Girard’s paradox, which is a generalised encoding of Russell’s paradox for pure type systems. The contradiction derived from this paradox is rather involved, so much so that Martin-Löf himself didn’t realise that it applied to the first version of his type theory. <span class="citation" data-cites="Hurkens">Hurkens [1995]</span> provided a simplification, which is encoded in Agda <a href="http://code.haskell.org/Agda/test/succeed/Hurkens.agda">here</a>.</p>
<p>With inductive types, however, we can use Russell’s paradox directly, by formalising a naïve notion of sets as comprehensions, and using this to derive a contradiction.</p>
<h2 id="russells-paradox-in-agda">Russell’s Paradox in Agda</h2>
<p>For these (interactive) Agda snippets, I have enabled <code>--type-in-type</code>, which removes the predicative heirarchy from the type theory, instead stating that <img width=79 alt="\mathsf{Set} : \mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHcAAAAZCAQAAAChznkrAAAB9klEQVR4nM1YYbWFIAymAhWsYAUqUIEKtwIVqGAFK1DBClZ4D8YQEdF7zoXp9keZbt8GbAPGSpJMs9mxdjyeyCmpMxbBFvaX8cJUezPvwKJQ7QTR1Mzi+xPUHcsI6iwbdmMClhI9EWCZnYGV8WJctDPxHiwc4ql/0uFBtog/ARYBJn6LXit3CbCML5pdEixrZb+cEXexH4rRVu6SYNGYDe8WkQBVoQ5+cExB1gwgZ+R6WxCgXDlDgIVvtc06c7ICJ9bDGZsAs4OXcw2qQPmnIifDkozEEn/8TKJajsB9DH2nM7hnAX9bePJcm73xJhyUWFzM89bNZNIFDCcSsIwifbt3pfvqm3aQAgvz8VFO9VoYUScJxEcxJop2qeoRLArNSHyfQIXI2OzkPdwlxRJ710D5bkocK2RPd4mwGFASFk3IgrrgmET6ukuC5bPLopZd9zq93SXAEmpbKNNTkR2bmHgTFgMZMJm7au0oFnMjLOPhMB1H9+mfF7UufPOliY24y5+lLVIsCvNafn8QOs80lncy3qh28pge9C7icisJR+KF1gewyK2UW7wfCql+PTRvCkd94x2/GDPZgj1sbWfFnrmeaEiw+Ogc7/7syVkinUK8epPNQaqGpnoiup9dOixOoJ043O3Wm/gB+5iSauP53+rS2W5Y/gFYUUFC7oeMFQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>.</p>
<pre class="Agda"
><code
  ><a name="5760"
    ></a
    ><a name="5773" class="Keyword"
    >data</a
    ><a name="5777"
    > </a
    ><a name="5778" href="#5778" class="Datatype"
    >SET</a
    ><a name="5781"
    > </a
    ><a name="5782" class="Symbol"
    >:</a
    ><a name="5783"
    > </a
    ><a name="5784" class="PrimitiveType"
    >Set</a
    ><a name="5787"
    > </a
    ><a name="5788" class="Keyword"
    >where</a
    ><a name="5793"
    >
  </a
    ><a name="5796" href="#5796" class="InductiveConstructor"
    >set</a
    ><a name="5799"
    > </a
    ><a name="5800" class="Symbol"
    >:</a
    ><a name="5801"
    > </a
    ><a name="5802" class="Symbol"
    >(</a
    ><a name="5803" href="#5803" class="Bound"
    >X</a
    ><a name="5804"
    > </a
    ><a name="5805" class="Symbol"
    >:</a
    ><a name="5806"
    > </a
    ><a name="5807" class="PrimitiveType"
    >Set</a
    ><a name="5810" class="Symbol"
    >)</a
    ><a name="5811"
    > </a
    ><a name="5812" class="Symbol"
    >&#8594;</a
    ><a name="5813"
    > </a
    ><a name="5814" class="Symbol"
    >(</a
    ><a name="5815" href="#5803" class="Bound"
    >X</a
    ><a name="5816"
    > </a
    ><a name="5817" class="Symbol"
    >&#8594;</a
    ><a name="5818"
    > </a
    ><a name="5819" href="#5778" class="Datatype"
    >SET</a
    ><a name="5822" class="Symbol"
    >)</a
    ><a name="5823"
    > </a
    ><a name="5824" class="Symbol"
    >&#8594;</a
    ><a name="5825"
    > </a
    ><a name="5826" href="#5778" class="Datatype"
    >SET</a
    ></code
  ></pre
>
<p>This defines a set (written <code>set X f</code>) as a comprehension over an <em>carrier type</em> <code>X</code> and a function <code>f</code>, where the element for a given index value <code>x : X</code> is given by <code>f x</code>. This definition is already using the fact that <img width=79 alt="\mathsf{Set} : \mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHcAAAAZCAQAAAChznkrAAAB9klEQVR4nM1YYbWFIAymAhWsYAUqUIEKtwIVqGAFK1DBClZ4D8YQEdF7zoXp9keZbt8GbAPGSpJMs9mxdjyeyCmpMxbBFvaX8cJUezPvwKJQ7QTR1Mzi+xPUHcsI6iwbdmMClhI9EWCZnYGV8WJctDPxHiwc4ql/0uFBtog/ARYBJn6LXit3CbCML5pdEixrZb+cEXexH4rRVu6SYNGYDe8WkQBVoQ5+cExB1gwgZ+R6WxCgXDlDgIVvtc06c7ICJ9bDGZsAs4OXcw2qQPmnIifDkozEEn/8TKJajsB9DH2nM7hnAX9bePJcm73xJhyUWFzM89bNZNIFDCcSsIwifbt3pfvqm3aQAgvz8VFO9VoYUScJxEcxJop2qeoRLArNSHyfQIXI2OzkPdwlxRJ710D5bkocK2RPd4mwGFASFk3IgrrgmET6ukuC5bPLopZd9zq93SXAEmpbKNNTkR2bmHgTFgMZMJm7au0oFnMjLOPhMB1H9+mfF7UufPOliY24y5+lLVIsCvNafn8QOs80lncy3qh28pge9C7icisJR+KF1gewyK2UW7wfCql+PTRvCkd94x2/GDPZgj1sbWfFnrmeaEiw+Ogc7/7syVkinUK8epPNQaqGpnoiup9dOixOoJ043O3Wm/gB+5iSauP53+rS2W5Y/gFYUUFC7oeMFQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> — normally, a type (of type <img width=33 alt="\mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABg0lEQVR4nLVWYaGEIAxeBSpYgQpUoAIVrEAFKljBClSwwlW4B2McTPB4T3nbHx24bxv7JgCtaLCwB7VBZWf9oSg44M30ADMTwJDbDTOw4Ol9mkh052GpbApLNk32APAC0djVLACBOdhHPmKQX3JWCPEs4gGE/P8sIJxD/yx6IkK+S2MdQljqqFGxFLpKnFnJZrDzUpA7aYe24sMDH+D0RT6ZOzuR1FXhce2GWkAyBc/bNLkVlE+MO7J/Cc8Kv/b4FPWy5OtphDi2eiBwXbRYrizDsyiyhMgcRshBTKchYuT54P8AUVwmGE3vG7pQTF21fgOizK0ScU8zm25BAEb5puKkTrKN5qa4CbFWDegH/L8JkXiQaLQ1HTYFwmEXFbhvI2Y4Bn1n6kjWtqLhRdrzSwhDvcH/eWnqFBtndwS1YT0ft62y1J9Wrj7OVPP0704t+joNEUPWOOjyDsnWDppfnVOLEZ3vH74zL8ukje4dy7swx11fkGQAcnSPuh7rC3G7lcb+A0iVFYLQLjf6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>) would not be permitted as a parameter to <code>set</code>, which constructs a type of the same size <img width=33 alt="\mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABg0lEQVR4nLVWYaGEIAxeBSpYgQpUoAIVrEAFKljBClSwwlW4B2McTPB4T3nbHx24bxv7JgCtaLCwB7VBZWf9oSg44M30ADMTwJDbDTOw4Ol9mkh052GpbApLNk32APAC0djVLACBOdhHPmKQX3JWCPEs4gGE/P8sIJxD/yx6IkK+S2MdQljqqFGxFLpKnFnJZrDzUpA7aYe24sMDH+D0RT6ZOzuR1FXhce2GWkAyBc/bNLkVlE+MO7J/Cc8Kv/b4FPWy5OtphDi2eiBwXbRYrizDsyiyhMgcRshBTKchYuT54P8AUVwmGE3vG7pQTF21fgOizK0ScU8zm25BAEb5puKkTrKN5qa4CbFWDegH/L8JkXiQaLQ1HTYFwmEXFbhvI2Y4Bn1n6kjWtqLhRdrzSwhDvcH/eWnqFBtndwS1YT0ft62y1J9Wrj7OVPP0704t+joNEUPWOOjyDsnWDppfnVOLEZ3vH74zL8ukje4dy7swx11fkGQAcnSPuh7rC3G7lcb+A0iVFYLQLjf6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>.</p>
<p>The empty set, having no elements, uses the empty type as its carrier :</p>
<pre class="Agda"
><code
  ><a name="6317"
    ></a
    ><a name="6330" href="#6330" class="Function"
    >&#8709;</a
    ><a name="6331"
    > </a
    ><a name="6332" class="Symbol"
    >:</a
    ><a name="6333"
    > </a
    ><a name="6334" href="#5778" class="Datatype"
    >SET</a
    ><a name="6337"
    >
</a
    ><a name="6338" href="#6330" class="Function"
    >&#8709;</a
    ><a name="6339"
    > </a
    ><a name="6340" class="Symbol"
    >=</a
    ><a name="6341"
    > </a
    ><a name="6342" href="#5796" class="InductiveConstructor"
    >set</a
    ><a name="6345"
    > </a
    ><a name="6346" href="http://agda.github.io/agda-stdlib/Data.Empty.html#243" class="Datatype"
    >&#8869;</a
    ><a name="6347"
    > </a
    ><a name="6348" href="http://agda.github.io/agda-stdlib/Data.Empty.html#360" class="Function"
    >&#8869;-elim</a
    ></code
  ></pre
>
<p>The set containing the empty set, having one element, uses the unit type as its carrier:</p>
<pre class="Agda"
><code
  ><a name="6457"
    ></a
    ><a name="6470" href="#6470" class="Function"
    >&#10216;&#8709;&#10217;</a
    ><a name="6473"
    > </a
    ><a name="6474" class="Symbol"
    >:</a
    ><a name="6475"
    > </a
    ><a name="6476" href="#5778" class="Datatype"
    >SET</a
    ><a name="6479"
    >
</a
    ><a name="6480" href="#6470" class="Function"
    >&#10216;&#8709;&#10217;</a
    ><a name="6483"
    > </a
    ><a name="6484" class="Symbol"
    >=</a
    ><a name="6485"
    > </a
    ><a name="6486" href="#5796" class="InductiveConstructor"
    >set</a
    ><a name="6489"
    > </a
    ><a name="6490" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Unit.html#69" class="Record"
    >&#8868;</a
    ><a name="6491"
    > </a
    ><a name="6492" class="Symbol"
    >(&#955;</a
    ><a name="6494"
    > </a
    ><a name="6495" href="#6495" class="Bound"
    >_</a
    ><a name="6496"
    > </a
    ><a name="6497" class="Symbol"
    >&#8594;</a
    ><a name="6498"
    > </a
    ><a name="6499" href="#6330" class="Function"
    >&#8709;</a
    ><a name="6500" class="Symbol"
    >)</a
    ></code
  ></pre
>
<p>The next rank, <img width=25 alt="V_2" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAcCAQAAACn1QXuAAABOUlEQVR4nKVUURXDIAyMhVnAQi3UQi1gAQtYqAUsYGEWsICFLglsK6xAyo6PvtemxxHuApCwgIcAB68IbTzAYmWvgosM7JnsANWss/xd98kS1kzWKn6gpgOchIrgmWzv6IpIKYRmsmdH1yaloh/aXSNdXk5FcM2uhe7VXMI0ukYNsPeoAPe+9pq/0/ovnky3FO+WGV2EZMzy131OV1JR2kPN6iLEyh52VhchpdScyGtdCms8rnVMVuZA//jLfEaCIF5lDkLlOv1JgmUjDwbSO/B0uA2f5WFckZAwHknpIIFp69j7IqOCxKp8UHex74oE55sWxD8IG+wkHrSZrDUoE3RuxgBbJus5SaHuKBtLcdANgxXiYamryVFT/ZHXEvYUN/8fKQ3Kt2GmJvAXjnPr8wqDSxrqOqqV8QIcVbHoflFk3AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/>, has two elements, and thus can use <code>Bool</code> as its carrier:</p>
<pre class="Agda"
><code
  ><a name="6595"
    ></a
    ><a name="6608" href="#6608" class="Function"
    >&#10216;&#8709;,&#10216;&#8709;&#10217;&#10217;</a
    ><a name="6615"
    > </a
    ><a name="6616" class="Symbol"
    >:</a
    ><a name="6617"
    > </a
    ><a name="6618" href="#5778" class="Datatype"
    >SET</a
    ><a name="6621"
    >
</a
    ><a name="6622" href="#6608" class="Function"
    >&#10216;&#8709;,&#10216;&#8709;&#10217;&#10217;</a
    ><a name="6629"
    > </a
    ><a name="6630" class="Symbol"
    >=</a
    ><a name="6631"
    > </a
    ><a name="6632" href="#5796" class="InductiveConstructor"
    >set</a
    ><a name="6635"
    > </a
    ><a name="6636" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Bool.html#67" class="Datatype"
    >Bool</a
    ><a name="6640"
    > </a
    ><a name="6641" class="Symbol"
    >(&#955;</a
    ><a name="6643"
    > </a
    ><a name="6644" href="#6644" class="Bound"
    >x</a
    ><a name="6645"
    > </a
    ><a name="6646" class="Symbol"
    >&#8594;</a
    ><a name="6647"
    > </a
    ><a name="6648" href="http://agda.github.io/agda-stdlib/Data.Bool.Base.html#904" class="Function Operator"
    >if</a
    ><a name="6650"
    > </a
    ><a name="6651" href="#6644" class="Bound"
    >x</a
    ><a name="6652"
    > </a
    ><a name="6653" href="http://agda.github.io/agda-stdlib/Data.Bool.Base.html#904" class="Function Operator"
    >then</a
    ><a name="6657"
    > </a
    ><a name="6658" href="#6330" class="Function"
    >&#8709;</a
    ><a name="6659"
    > </a
    ><a name="6660" href="http://agda.github.io/agda-stdlib/Data.Bool.Base.html#904" class="Function Operator"
    >else</a
    ><a name="6664"
    > </a
    ><a name="6665" href="#6470" class="Function"
    >&#10216;&#8709;&#10217;</a
    ><a name="6668" class="Symbol"
    >)</a
    ></code
  ></pre
>
<p>More sets could be defined using similar techniques, so I will forgo any further definitions.</p>
<p>We can also define the membership operators for our <code>SET</code> type:</p>
<pre class="Agda"
><code
  ><a name="6842"
    ></a
    ><a name="6855" href="#6855" class="Function Operator"
    >_&#8712;_</a
    ><a name="6858"
    > </a
    ><a name="6859" class="Symbol"
    >:</a
    ><a name="6860"
    > </a
    ><a name="6861" href="#5778" class="Datatype"
    >SET</a
    ><a name="6864"
    > </a
    ><a name="6865" class="Symbol"
    >&#8594;</a
    ><a name="6866"
    > </a
    ><a name="6867" href="#5778" class="Datatype"
    >SET</a
    ><a name="6870"
    > </a
    ><a name="6871" class="Symbol"
    >&#8594;</a
    ><a name="6872"
    > </a
    ><a name="6873" class="PrimitiveType"
    >Set</a
    ><a name="6876"
    >
</a
    ><a name="6877" href="#6877" class="Bound"
    >a</a
    ><a name="6878"
    > </a
    ><a name="6879" href="#6855" class="Function Operator"
    >&#8712;</a
    ><a name="6880"
    > </a
    ><a name="6881" href="#5796" class="InductiveConstructor"
    >set</a
    ><a name="6884"
    > </a
    ><a name="6885" href="#6885" class="Bound"
    >X</a
    ><a name="6886"
    > </a
    ><a name="6887" href="#6887" class="Bound"
    >f</a
    ><a name="6888"
    > </a
    ><a name="6889" class="Symbol"
    >=</a
    ><a name="6890"
    > </a
    ><a name="6891" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#69" class="Record"
    >&#931;</a
    ><a name="6892"
    > </a
    ><a name="6893" href="#6885" class="Bound"
    >X</a
    ><a name="6894"
    > </a
    ><a name="6895" class="Symbol"
    >(&#955;</a
    ><a name="6897"
    > </a
    ><a name="6898" href="#6898" class="Bound"
    >x</a
    ><a name="6899"
    > </a
    ><a name="6900" class="Symbol"
    >&#8594;</a
    ><a name="6901"
    > </a
    ><a name="6902" href="#6877" class="Bound"
    >a</a
    ><a name="6903"
    > </a
    ><a name="6904" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#83" class="Datatype Operator"
    >&#8801;</a
    ><a name="6905"
    > </a
    ><a name="6906" href="#6887" class="Bound"
    >f</a
    ><a name="6907"
    > </a
    ><a name="6908" href="#6898" class="Bound"
    >x</a
    ><a name="6909" class="Symbol"
    >)</a
    ><a name="6910"
    >

</a
    ><a name="6912" href="#6912" class="Function Operator"
    >_&#8713;_</a
    ><a name="6915"
    > </a
    ><a name="6916" class="Symbol"
    >:</a
    ><a name="6917"
    > </a
    ><a name="6918" href="#5778" class="Datatype"
    >SET</a
    ><a name="6921"
    > </a
    ><a name="6922" class="Symbol"
    >&#8594;</a
    ><a name="6923"
    > </a
    ><a name="6924" href="#5778" class="Datatype"
    >SET</a
    ><a name="6927"
    > </a
    ><a name="6928" class="Symbol"
    >&#8594;</a
    ><a name="6929"
    > </a
    ><a name="6930" class="PrimitiveType"
    >Set</a
    ><a name="6933"
    >
</a
    ><a name="6934" href="#6934" class="Bound"
    >a</a
    ><a name="6935"
    > </a
    ><a name="6936" href="#6912" class="Function Operator"
    >&#8713;</a
    ><a name="6937"
    > </a
    ><a name="6938" href="#6938" class="Bound"
    >b</a
    ><a name="6939"
    > </a
    ><a name="6940" class="Symbol"
    >=</a
    ><a name="6941"
    > </a
    ><a name="6942" class="Symbol"
    >(</a
    ><a name="6943" href="#6934" class="Bound"
    >a</a
    ><a name="6944"
    > </a
    ><a name="6945" href="#6855" class="Function Operator"
    >&#8712;</a
    ><a name="6946"
    > </a
    ><a name="6947" href="#6938" class="Bound"
    >b</a
    ><a name="6948" class="Symbol"
    >)</a
    ><a name="6949"
    > </a
    ><a name="6950" class="Symbol"
    >&#8594;</a
    ><a name="6951"
    > </a
    ><a name="6952" href="http://agda.github.io/agda-stdlib/Data.Empty.html#243" class="Datatype"
    >&#8869;</a
    ></code
  ></pre
>
<p>A value of type <code>a ∈ set X f</code> can be thought of as a proof that there exists a value <code>x : X</code> for which the element function <code>f</code> gives <code>a</code>.</p>
<p>Using these operators, we can define Russell’s paradoxical set <img width=19 alt="\Delta" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAXCAQAAABdAYziAAAAzElEQVR4nJ2TDRGEIBCFqUAFKliBClSgghWoQAUqUMEKVLACx65wwx0sP76dUWfw861vgbGxNAtMTN4hwJjqfIMGRK998EQQarNlzm4sQM0eahKi8BpT45uePt1FblnueR745BC1q6CoXlbZl6+h9ifVZ0R61bPO1KxP16WI6vZKVMcMlJ05Lkbl/zxBS1H1PEFhvqt6nqDprtLkl0tU5IgC4QmyI1/aEySzr2qX+NDz6QlQ3y6Y6bnU1Cm68U/8oK6MuradERa/5YvrB5ogh73L5XRzAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> as follows:</p>
<pre class="Agda"
><code
  ><a name="7191"
    ></a
    ><a name="7204" href="#7204" class="Function"
    >&#916;</a
    ><a name="7205"
    > </a
    ><a name="7206" class="Symbol"
    >:</a
    ><a name="7207"
    > </a
    ><a name="7208" href="#5778" class="Datatype"
    >SET</a
    ><a name="7211"
    >
</a
    ><a name="7212" href="#7204" class="Function"
    >&#916;</a
    ><a name="7213"
    > </a
    ><a name="7214" class="Symbol"
    >=</a
    ><a name="7215"
    > </a
    ><a name="7216" href="#5796" class="InductiveConstructor"
    >set</a
    ><a name="7219"
    > </a
    ><a name="7220" class="Symbol"
    >(</a
    ><a name="7221" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#69" class="Record"
    >&#931;</a
    ><a name="7222"
    > </a
    ><a name="7223" href="#5778" class="Datatype"
    >SET</a
    ><a name="7226"
    > </a
    ><a name="7227" class="Symbol"
    >(&#955;</a
    ><a name="7229"
    > </a
    ><a name="7230" href="#7230" class="Bound"
    >s</a
    ><a name="7231"
    > </a
    ><a name="7232" class="Symbol"
    >&#8594;</a
    ><a name="7233"
    > </a
    ><a name="7234" href="#7230" class="Bound"
    >s</a
    ><a name="7235"
    > </a
    ><a name="7236" href="#6912" class="Function Operator"
    >&#8713;</a
    ><a name="7237"
    > </a
    ><a name="7238" href="#7230" class="Bound"
    >s</a
    ><a name="7239" class="Symbol"
    >))</a
    ><a name="7241"
    > </a
    ><a name="7242" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#155" class="Field"
    >proj&#8321;</a
    ></code
  ></pre
>
<p>This is a set which, for its carrier type, uses <em>pairs</em> containing a set <code>s</code> and a proof that <code>s</code> does not contain itself. The element function just discards the proof, leaving us with the <code>SET</code> of all <code>SET</code>s that do not contain themselves.</p>
<p>Indeed, we can prove that every set which is in <code>Δ</code> does not contain itself:</p>
<pre class="Agda"
><code
  ><a name="7580"
    ></a
    ><a name="7593" href="#7593" class="Function"
    >x&#8712;&#916;&#8594;x&#8713;x</a
    ><a name="7600"
    > </a
    ><a name="7601" class="Symbol"
    >:</a
    ><a name="7602"
    > </a
    ><a name="7603" class="Symbol"
    >&#8704;</a
    ><a name="7604"
    > </a
    ><a name="7605" class="Symbol"
    >{</a
    ><a name="7606" href="#7606" class="Bound"
    >X</a
    ><a name="7607" class="Symbol"
    >}</a
    ><a name="7608"
    > </a
    ><a name="7609" class="Symbol"
    >&#8594;</a
    ><a name="7610"
    > </a
    ><a name="7611" href="#7606" class="Bound"
    >X</a
    ><a name="7612"
    > </a
    ><a name="7613" href="#6855" class="Function Operator"
    >&#8712;</a
    ><a name="7614"
    > </a
    ><a name="7615" href="#7204" class="Function"
    >&#916;</a
    ><a name="7616"
    > </a
    ><a name="7617" class="Symbol"
    >&#8594;</a
    ><a name="7618"
    > </a
    ><a name="7619" href="#7606" class="Bound"
    >X</a
    ><a name="7620"
    > </a
    ><a name="7621" href="#6912" class="Function Operator"
    >&#8713;</a
    ><a name="7622"
    > </a
    ><a name="7623" href="#7606" class="Bound"
    >X</a
    ><a name="7624"
    >
</a
    ><a name="7625" href="#7593" class="Function"
    >x&#8712;&#916;&#8594;x&#8713;x</a
    ><a name="7632"
    > </a
    ><a name="7633" class="Symbol"
    >((</a
    ><a name="7635" href="#7635" class="Bound"
    >Y</a
    ><a name="7636"
    > </a
    ><a name="7637" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="7638"
    > </a
    ><a name="7639" href="#7639" class="Bound"
    >Y&#8713;Y</a
    ><a name="7642" class="Symbol"
    >)</a
    ><a name="7643"
    > </a
    ><a name="7644" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="7645"
    > </a
    ><a name="7646" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="7650" class="Symbol"
    >)</a
    ><a name="7651"
    > </a
    ><a name="7652" class="Symbol"
    >=</a
    ><a name="7653"
    > </a
    ><a name="7654" href="#7639" class="Bound"
    >Y&#8713;Y</a
    ></code
  ></pre
>
<p>A corollary of this is that <code>Δ</code> itself does not contain itself:</p>
<pre class="Agda"
><code
  ><a name="7734"
    ></a
    ><a name="7747" href="#7747" class="Function"
    >&#916;&#8713;&#916;</a
    ><a name="7750"
    > </a
    ><a name="7751" class="Symbol"
    >:</a
    ><a name="7752"
    > </a
    ><a name="7753" href="#7204" class="Function"
    >&#916;</a
    ><a name="7754"
    > </a
    ><a name="7755" href="#6912" class="Function Operator"
    >&#8713;</a
    ><a name="7756"
    > </a
    ><a name="7757" href="#7204" class="Function"
    >&#916;</a
    ><a name="7758"
    >
</a
    ><a name="7759" href="#7747" class="Function"
    >&#916;&#8713;&#916;</a
    ><a name="7762"
    > </a
    ><a name="7763" href="#7763" class="Bound"
    >&#916;&#8712;&#916;</a
    ><a name="7766"
    > </a
    ><a name="7767" class="Symbol"
    >=</a
    ><a name="7768"
    > </a
    ><a name="7769" href="#7593" class="Function"
    >x&#8712;&#916;&#8594;x&#8713;x</a
    ><a name="7776"
    > </a
    ><a name="7777" href="#7763" class="Bound"
    >&#916;&#8712;&#916;</a
    ><a name="7780"
    > </a
    ><a name="7781" href="#7763" class="Bound"
    >&#916;&#8712;&#916;</a
    ></code
  ></pre
>
<p>But we know that every set which does not contain itself is in <code>Δ</code>:</p>
<pre class="Agda"
><code
  ><a name="7866"
    ></a
    ><a name="7879" href="#7879" class="Function"
    >x&#8713;x&#8594;x&#8712;&#916;</a
    ><a name="7886"
    > </a
    ><a name="7887" class="Symbol"
    >:</a
    ><a name="7888"
    > </a
    ><a name="7889" class="Symbol"
    >&#8704;</a
    ><a name="7890"
    > </a
    ><a name="7891" class="Symbol"
    >{</a
    ><a name="7892" href="#7892" class="Bound"
    >X</a
    ><a name="7893" class="Symbol"
    >}</a
    ><a name="7894"
    > </a
    ><a name="7895" class="Symbol"
    >&#8594;</a
    ><a name="7896"
    >  </a
    ><a name="7898" href="#7892" class="Bound"
    >X</a
    ><a name="7899"
    > </a
    ><a name="7900" href="#6912" class="Function Operator"
    >&#8713;</a
    ><a name="7901"
    > </a
    ><a name="7902" href="#7892" class="Bound"
    >X</a
    ><a name="7903"
    > </a
    ><a name="7904" class="Symbol"
    >&#8594;</a
    ><a name="7905"
    > </a
    ><a name="7906" href="#7892" class="Bound"
    >X</a
    ><a name="7907"
    > </a
    ><a name="7908" href="#6855" class="Function Operator"
    >&#8712;</a
    ><a name="7909"
    > </a
    ><a name="7910" href="#7204" class="Function"
    >&#916;</a
    ><a name="7911"
    >
</a
    ><a name="7912" href="#7879" class="Function"
    >x&#8713;x&#8594;x&#8712;&#916;</a
    ><a name="7919"
    > </a
    ><a name="7920" class="Symbol"
    >{</a
    ><a name="7921" href="#7921" class="Bound"
    >X</a
    ><a name="7922" class="Symbol"
    >}</a
    ><a name="7923"
    > </a
    ><a name="7924" href="#7924" class="Bound"
    >X&#8713;X</a
    ><a name="7927"
    > </a
    ><a name="7928" class="Symbol"
    >=</a
    ><a name="7929"
    > </a
    ><a name="7930" class="Symbol"
    >(</a
    ><a name="7931" href="#7921" class="Bound"
    >X</a
    ><a name="7932"
    > </a
    ><a name="7933" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="7934"
    > </a
    ><a name="7935" href="#7924" class="Bound"
    >X&#8713;X</a
    ><a name="7938" class="Symbol"
    >)</a
    ><a name="7939"
    > </a
    ><a name="7940" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="7941"
    > </a
    ><a name="7942" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ></code
  ></pre
>
<p>And from this we can derive a contradiction:</p>
<pre class="Agda"
><code
  ><a name="8005"
    ></a
    ><a name="8018" href="#8018" class="Function"
    >falso</a
    ><a name="8023"
    > </a
    ><a name="8024" class="Symbol"
    >:</a
    ><a name="8025"
    > </a
    ><a name="8026" href="http://agda.github.io/agda-stdlib/Data.Empty.html#243" class="Datatype"
    >&#8869;</a
    ><a name="8027"
    >
</a
    ><a name="8028" href="#8018" class="Function"
    >falso</a
    ><a name="8033"
    > </a
    ><a name="8034" class="Symbol"
    >=</a
    ><a name="8035"
    > </a
    ><a name="8036" href="#7747" class="Function"
    >&#916;&#8713;&#916;</a
    ><a name="8039"
    > </a
    ><a name="8040" class="Symbol"
    >(</a
    ><a name="8041" href="#7879" class="Function"
    >x&#8713;x&#8594;x&#8712;&#916;</a
    ><a name="8048"
    > </a
    ><a name="8049" href="#7747" class="Function"
    >&#916;&#8713;&#916;</a
    ><a name="8052" class="Symbol"
    >)</a
    ></code
  ></pre
>
<h2 id="musings-and-speculation">Musings and Speculation</h2>
<p>I find it very curious that two very different approaches to formalising mathematics end up with much the same stratified character, and for different reasons. Perhaps this Russell-style heirarchy is, kind of like the Church-Turing thesis, a fundamental characteristic of any sufficiently expressive foundation. Something <em>discovered</em> rather than <em>invented</em>. In the words of <span class="citation" data-cites="DanaScott">Scott [1974]</span>:</p>
<blockquote>
<p>The truth is that there is only one satisfactory way of avoiding the paradoxes: namely, the use of some form of the <em>theory of types</em>. That was at the basis of both Russell’s and Zermelo’s intuitions. Indeed the best way to regard Zermelo’s theory is as a simplification and extension of Russell’s. (We mean Russell’s <em>simple</em> theory of types, of course.) The simplification was to make the types <em>cumulative</em>. Thus mixing of types is easier and annoying repetitions are avoided. Once the later types are allowed to accumulate the earlier ones, we can then easily imagine <em>extending</em> the types into the transfinite — just how far we want to go must necessarily be left open. Now Russell made his types <em>explicit</em> in his notation and Zermelo left them <em>implicit</em>. [emphasis in original]</p>
</blockquote>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>The Agda development in this post is taken from one of Thorsten Altenkirch’s lectures, the code of which is available <a href="http://www.cs.nott.ac.uk/~txa/g53cfr/l20.html/l20.html">here</a>. The original proof is, as far as I can tell, due to Chad E Brown, who formulated the same thing in Coq.</p>
<h4 id="references" class="unnumbered">References</h4>
<div id="refs" class="references">
<div id="ref-Aczel">
<p><span class="smallcaps">Aczel, P.</span>, 1988. <em>Non-well-founded sets</em>, Center for the Study of Language; Information, Stanford University.</p>
</div>
<div id="ref-Halmos">
<p><span class="smallcaps">Halmos, P.</span>, 1960. <em>Naïve Set Theory</em>, Van Nostrand.</p>
</div>
<div id="ref-Hurkens">
<p><span class="smallcaps">Hurkens, A.J.C.</span>, 1995. A simplification of Girard’s Paradox. In M. Dezani-Ciancaglini &amp; G. Plotkin, eds. <em>Typed Lambda Calculi and Applications: Proceedings of the 2nd International Conference on Typed Lambda Calculi and Applications (Tlca-95)</em>. Berlin, Heidelberg: Springer, pp. 266–278.</p>
</div>
<div id="ref-MartinLof">
<p><span class="smallcaps">Martin-Löf, P.</span>, 1984. <em>Intuitionistic Type Theory</em>, Bibliopolis.</p>
</div>
<div id="ref-Russell">
<p><span class="smallcaps">Russell, B.</span>, 1938. <em>Principles of Mathematics</em> 2nd ed., W.W. Norton.</p>
</div>
<div id="ref-DanaScott">
<p><span class="smallcaps">Scott, D.</span>, 1974. Axiomatizing set theory. In <em>Axiomatic Set Theory (Proceedings of the Symposium on Pure Mathematics, Vol. XIII, Part II, University of California, Los Angeles, California, 1967)</em>. American Mathematics Society, Providence, R.I., pp. 207–214.</p>
</div>
<div id="ref-VonNeumann">
<p><span class="smallcaps">Zermelo, E.</span>, 1930. Über grenzzahlen und mengenbereiche: Neue untersuchungen über die grundlagen der mengenlehre. <em>Fundamenta Mathematicae</em>, 16, pp.29–47.</p>
</div>
</div>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>This presentation is not the normal one found in textbooks, which is that every non-empty set contains an element that is disjoint from itself, but that presentation is more brain-bending, and is implied by the statement presented here if you include the axiom of dependent choice.<a href="#fnref1" class="footnote-back">↩</a></p></li>
<li id="fn2"><p>Here, <img width=33 alt="\mathsf{Set}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABg0lEQVR4nLVWYaGEIAxeBSpYgQpUoAIVrEAFKljBClSwwlW4B2McTPB4T3nbHx24bxv7JgCtaLCwB7VBZWf9oSg44M30ADMTwJDbDTOw4Ol9mkh052GpbApLNk32APAC0djVLACBOdhHPmKQX3JWCPEs4gGE/P8sIJxD/yx6IkK+S2MdQljqqFGxFLpKnFnJZrDzUpA7aYe24sMDH+D0RT6ZOzuR1FXhce2GWkAyBc/bNLkVlE+MO7J/Cc8Kv/b4FPWy5OtphDi2eiBwXbRYrizDsyiyhMgcRshBTKchYuT54P8AUVwmGE3vG7pQTF21fgOizK0ScU8zm25BAEb5puKkTrKN5qa4CbFWDegH/L8JkXiQaLQ1HTYFwmEXFbhvI2Y4Bn1n6kjWtqLhRdrzSwhDvcH/eWnqFBtndwS1YT0ft62y1J9Wrj7OVPP0704t+joNEUPWOOjyDsnWDppfnVOLEZ3vH74zL8ukje4dy7swx11fkGQAcnSPuh7rC3G7lcb+A0iVFYLQLjf6AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> is the type given to types, similar to the <em>kind</em> <code>*</code> in Haskell, and is not a reference to the sets of axiomatic set theory.<a href="#fnref2" class="footnote-back">↩</a></p></li>
<li id="fn3"><p>Agda makes use of explicit <em>universe polymorphism</em> instead, and I’m still undecided which version of type theory I like better.<a href="#fnref3" class="footnote-back">↩</a></p></li>
<li id="fn4"><p>In set theory, it’s a valid question to ask, just the answer is always “no”.<a href="#fnref4" class="footnote-back">↩</a></p></li>
<li id="fn5"><p><em>Falso</em> is a registered trademark of Estatis, Inc. All Rights Reserved.<a href="#fnref5" class="footnote-back">↩</a></p></li>
</ol>
</section>

<div class="tags"><a href="/tags/agda.html">agda</a>, <a href="/tags/types.html">types</a>, <a href="/tags/theorem-proving.html">theorem-proving</a>, <a href="/tags/type-theory.html">type-theory</a>, <a href="/tags/foundations.html">foundations</a>, <a href="/tags/paradox.html">paradox</a></div>
]]></description>
    <pubDate>Thu, 10 Sep 2015 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2015-09-10-girards-paradox.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>Write Your Compiler by Proving It Correct</title>
    <link>http://liamoc.net/posts/2015-08-23-verified-compiler.html</link>
    <description><![CDATA[<div class="hidden">
<pre class="Agda"
><code
  ><a name="20"
    ></a
    ><a name="33" class="Keyword"
    >module</a
    ><a name="39"
    > </a
    ><a name="40" href="#1" class="Module"
    >2015-08-23-verified-compiler</a
    ><a name="68"
    > </a
    ><a name="69" class="Keyword"
    >where</a
    ><a name="74"
    >

</a
    ><a name="76" class="Keyword"
    >open</a
    ><a name="80"
    > </a
    ><a name="81" class="Keyword"
    >import</a
    ><a name="87"
    > </a
    ><a name="88" href="http://agda.github.io/agda-stdlib/Data.Fin.html#1" class="Module"
    >Data.Fin</a
    ><a name="96"
    > </a
    ><a name="97" class="Keyword"
    >hiding</a
    ><a name="103"
    > </a
    ><a name="104" class="Symbol"
    >(</a
    ><a name="105" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#4259" class="Function Operator"
    >_+_</a
    ><a name="108" class="Symbol"
    >;</a
    ><a name="109"
    > </a
    ><a name="110" href="http://agda.github.io/agda-stdlib/Data.Fin.Properties.html#1694" class="Function Operator"
    >_&#8799;_</a
    ><a name="113" class="Symbol"
    >)</a
    ><a name="114"
    > </a
    ><a name="115" class="Keyword"
    >renaming</a
    ><a name="123"
    > </a
    ><a name="124" class="Symbol"
    >(</a
    ><a name="125" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#2156" class="Function Operator"
    >#_</a
    ><a name="127"
    > </a
    ><a name="128" class="Symbol"
    >to</a
    ><a name="130"
    > </a
    ><a name="131" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#2156" class="Function Operator"
    >i</a
    ><a name="132" class="Symbol"
    >)</a
    ><a name="133"
    >
</a
    ><a name="134" class="Keyword"
    >open</a
    ><a name="138"
    > </a
    ><a name="139" class="Keyword"
    >import</a
    ><a name="145"
    > </a
    ><a name="146" href="http://agda.github.io/agda-stdlib/Data.Nat.html#1" class="Module"
    >Data.Nat</a
    ><a name="154"
    > </a
    ><a name="155" class="Keyword"
    >hiding</a
    ><a name="161"
    > </a
    ><a name="162" class="Symbol"
    >(</a
    ><a name="163" href="http://agda.github.io/agda-stdlib/Data.Nat.Properties.html#1319" class="Function Operator"
    >_&#8799;_</a
    ><a name="166" class="Symbol"
    >)</a
    ><a name="167"
    >
</a
    ><a name="168" class="Keyword"
    >open</a
    ><a name="172"
    > </a
    ><a name="173" class="Keyword"
    >import</a
    ><a name="179"
    > </a
    ><a name="180" href="http://agda.github.io/agda-stdlib/Data.Vec.html#1" class="Module"
    >Data.Vec</a
    ><a name="188"
    > </a
    ><a name="189" class="Keyword"
    >hiding</a
    ><a name="195"
    > </a
    ><a name="196" class="Symbol"
    >(</a
    ><a name="197" href="http://agda.github.io/agda-stdlib/Data.Vec.html#3820" class="Function Operator"
    >_&gt;&gt;=_</a
    ><a name="202" class="Symbol"
    >;</a
    ><a name="203"
    > </a
    ><a name="204" href="http://agda.github.io/agda-stdlib/Data.Vec.html#3639" class="Function Operator"
    >_&#8859;_</a
    ><a name="207" class="Symbol"
    >)</a
    ></code
  ></pre
>
</div>
<p>Recently my research has been centered around the development of a self-certifying compiler for a functional language with linear types called Cogent (see <span class="citation" data-cites="Cogent">O’Connor et al. [2016]</span>). The compiler works by emitting, along with generated low-level code, a proof in Isabelle/HOL (see <span class="citation" data-cites="Nipkow">Nipkow et al. [2002]</span>) that the generated code is a refinement of the original program, expressed via a simple functional semantics in HOL.</p>
<p>As dependent types unify for us the language of code and proof, my current endeavour has been to explore how such a compiler would look if it were implemented and verified in a dependently typed programming language instead. In this post, I implement and verify a toy compiler for a language of arithmetic expressions and variables to an idealised assembly language for a virtual stack machine, and explain some of the useful features that dependent types give us for writing verified compilers.</p>
<p><em>The Agda snippets in this post are interactive! Click on a symbol to see its definition.</em></p>
<h2 id="wellformedness">Wellformedness</h2>
<p>One of the immediate advantages that dependent types give us is that we can encode the notion of <em>term wellformedness</em> in the type given to terms, rather than as a separate proposition that must be assumed by every theorem.</p>
<p>Even in our language of arithmetic expressions and variables, which does not have much of a static semantics, we can still ensure that each variable used in the program is bound somewhere. We will use indices instead of variable names in the style of <span class="citation" data-cites="deBruijn">de Bruijn [1972]</span>, and index terms by the <em>number of available variables</em>, a trick I first noticed in <span class="citation" data-cites="McBride">McBride [2003]</span>. The <code>Fin</code> type, used to represent variables, only contains natural numbers up to its index, which makes it impossible to use variables that are not available.</p>
<pre class="Agda"
><code
  ><a name="1966"
    ></a
    ><a name="1979" class="Keyword"
    >data</a
    ><a name="1983"
    > </a
    ><a name="1984" href="#1984" class="Datatype"
    >Term</a
    ><a name="1988"
    > </a
    ><a name="1989" class="Symbol"
    >(</a
    ><a name="1990" href="#1990" class="Bound"
    >n</a
    ><a name="1991"
    > </a
    ><a name="1992" class="Symbol"
    >:</a
    ><a name="1993"
    > </a
    ><a name="1994" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="1995" class="Symbol"
    >)</a
    ><a name="1996"
    > </a
    ><a name="1997" class="Symbol"
    >:</a
    ><a name="1998"
    > </a
    ><a name="1999" class="PrimitiveType"
    >Set</a
    ><a name="2002"
    > </a
    ><a name="2003" class="Keyword"
    >where</a
    ><a name="2008"
    >
  </a
    ><a name="2011" href="#2011" class="InductiveConstructor"
    >Lit</a
    ><a name="2014"
    > </a
    ><a name="2015" class="Symbol"
    >:</a
    ><a name="2016"
    > </a
    ><a name="2017" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="2018"
    > </a
    ><a name="2019" class="Symbol"
    >&#8594;</a
    ><a name="2020"
    > </a
    ><a name="2021" href="#1984" class="Datatype"
    >Term</a
    ><a name="2025"
    > </a
    ><a name="2026" href="#1990" class="Bound"
    >n</a
    ><a name="2027"
    >
  </a
    ><a name="2030" href="#2030" class="InductiveConstructor Operator"
    >_&#8864;_</a
    ><a name="2033"
    > </a
    ><a name="2034" class="Symbol"
    >:</a
    ><a name="2035"
    > </a
    ><a name="2036" href="#1984" class="Datatype"
    >Term</a
    ><a name="2040"
    > </a
    ><a name="2041" href="#1990" class="Bound"
    >n</a
    ><a name="2042"
    > </a
    ><a name="2043" class="Symbol"
    >&#8594;</a
    ><a name="2044"
    > </a
    ><a name="2045" href="#1984" class="Datatype"
    >Term</a
    ><a name="2049"
    > </a
    ><a name="2050" href="#1990" class="Bound"
    >n</a
    ><a name="2051"
    > </a
    ><a name="2052" class="Symbol"
    >&#8594;</a
    ><a name="2053"
    > </a
    ><a name="2054" href="#1984" class="Datatype"
    >Term</a
    ><a name="2058"
    > </a
    ><a name="2059" href="#1990" class="Bound"
    >n</a
    ><a name="2060"
    >
  </a
    ><a name="2063" href="#2063" class="InductiveConstructor Operator"
    >_&#8862;_</a
    ><a name="2066"
    > </a
    ><a name="2067" class="Symbol"
    >:</a
    ><a name="2068"
    > </a
    ><a name="2069" href="#1984" class="Datatype"
    >Term</a
    ><a name="2073"
    > </a
    ><a name="2074" href="#1990" class="Bound"
    >n</a
    ><a name="2075"
    > </a
    ><a name="2076" class="Symbol"
    >&#8594;</a
    ><a name="2077"
    > </a
    ><a name="2078" href="#1984" class="Datatype"
    >Term</a
    ><a name="2082"
    > </a
    ><a name="2083" href="#1990" class="Bound"
    >n</a
    ><a name="2084"
    > </a
    ><a name="2085" class="Symbol"
    >&#8594;</a
    ><a name="2086"
    > </a
    ><a name="2087" href="#1984" class="Datatype"
    >Term</a
    ><a name="2091"
    > </a
    ><a name="2092" href="#1990" class="Bound"
    >n</a
    ><a name="2093"
    >
  </a
    ><a name="2096" href="#2096" class="InductiveConstructor Operator"
    >Let_In_</a
    ><a name="2103"
    > </a
    ><a name="2104" class="Symbol"
    >:</a
    ><a name="2105"
    > </a
    ><a name="2106" href="#1984" class="Datatype"
    >Term</a
    ><a name="2110"
    > </a
    ><a name="2111" href="#1990" class="Bound"
    >n</a
    ><a name="2112"
    > </a
    ><a name="2113" class="Symbol"
    >&#8594;</a
    ><a name="2114"
    > </a
    ><a name="2115" href="#1984" class="Datatype"
    >Term</a
    ><a name="2119"
    > </a
    ><a name="2120" class="Symbol"
    >(</a
    ><a name="2121" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="2124"
    > </a
    ><a name="2125" href="#1990" class="Bound"
    >n</a
    ><a name="2126" class="Symbol"
    >)</a
    ><a name="2127"
    > </a
    ><a name="2128" class="Symbol"
    >&#8594;</a
    ><a name="2129"
    > </a
    ><a name="2130" href="#1984" class="Datatype"
    >Term</a
    ><a name="2134"
    > </a
    ><a name="2135" href="#1990" class="Bound"
    >n</a
    ><a name="2136"
    >
  </a
    ><a name="2139" href="#2139" class="InductiveConstructor"
    >Var</a
    ><a name="2142"
    > </a
    ><a name="2143" class="Symbol"
    >:</a
    ><a name="2144"
    > </a
    ><a name="2145" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#915" class="Datatype"
    >Fin</a
    ><a name="2148"
    > </a
    ><a name="2149" href="#1990" class="Bound"
    >n</a
    ><a name="2150"
    > </a
    ><a name="2151" class="Symbol"
    >&#8594;</a
    ><a name="2152"
    > </a
    ><a name="2153" href="#1984" class="Datatype"
    >Term</a
    ><a name="2157"
    > </a
    ><a name="2158" href="#1990" class="Bound"
    >n</a
    ></code
  ></pre
>
<p>This allows us to express in the <em>type</em> of our big-step semantics relation that the environment <code>E</code> (here we used the length-indexed <code>Vec</code> type from the Agda standard library) should have a value for every available variable in the term. In any Isabelle specification of the same, we would have to add such length constraints as explicit assumptions, either in the semantics themselves or in theorems about them. In Agda, the dynamic semantics are extremely clean, unencumbered by irritating details of the encoding:</p>
<pre class="Agda"
><code
  ><a name="2690"
    ></a
    ><a name="2703" class="Keyword"
    >infixl</a
    ><a name="2709"
    > </a
    ><a name="2710" class="Number"
    >5</a
    ><a name="2711"
    > </a
    ><a name="2712" href="#2724" class="Datatype Operator"
    >_&#8866;_&#8659;_</a
    ><a name="2717"
    >

</a
    ><a name="2719" class="Keyword"
    >data</a
    ><a name="2723"
    > </a
    ><a name="2724" href="#2724" class="Datatype Operator"
    >_&#8866;_&#8659;_</a
    ><a name="2729"
    > </a
    ><a name="2730" class="Symbol"
    >{</a
    ><a name="2731" href="#2731" class="Bound"
    >n</a
    ><a name="2732"
    > </a
    ><a name="2733" class="Symbol"
    >:</a
    ><a name="2734"
    > </a
    ><a name="2735" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="2736" class="Symbol"
    >}</a
    ><a name="2737"
    > </a
    ><a name="2738" class="Symbol"
    >(</a
    ><a name="2739"
    > </a
    ><a name="2740" href="#2740" class="Bound"
    >E</a
    ><a name="2741"
    > </a
    ><a name="2742" class="Symbol"
    >:</a
    ><a name="2743"
    > </a
    ><a name="2744" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="2747"
    > </a
    ><a name="2748" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="2749"
    > </a
    ><a name="2750" href="#2731" class="Bound"
    >n</a
    ><a name="2751" class="Symbol"
    >)</a
    ><a name="2752"
    > </a
    ><a name="2753" class="Symbol"
    >:</a
    ><a name="2754"
    > </a
    ><a name="2755" href="#1984" class="Datatype"
    >Term</a
    ><a name="2759"
    > </a
    ><a name="2760" href="#2731" class="Bound"
    >n</a
    ><a name="2761"
    > </a
    ><a name="2762" class="Symbol"
    >&#8594;</a
    ><a name="2763"
    > </a
    ><a name="2764" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="2765"
    > </a
    ><a name="2766" class="Symbol"
    >&#8594;</a
    ><a name="2767"
    > </a
    ><a name="2768" class="PrimitiveType"
    >Set</a
    ><a name="2771"
    > </a
    ><a name="2772" class="Keyword"
    >where</a
    ><a name="2777"
    >
  </a
    ><a name="2780" href="#2780" class="InductiveConstructor"
    >lit-e</a
    ><a name="2785"
    >   </a
    ><a name="2788" class="Symbol"
    >:</a
    ><a name="2789"
    > </a
    ><a name="2790" class="Symbol"
    >&#8704;{</a
    ><a name="2792" href="#2792" class="Bound"
    >n</a
    ><a name="2793" class="Symbol"
    >}</a
    ><a name="2794"
    >

            </a
    ><a name="2808" class="Comment"
    >-------------</a
    ><a name="2821"
    >
          </a
    ><a name="2832" class="Symbol"
    >&#8594;</a
    ><a name="2833"
    > </a
    ><a name="2834" href="#2740" class="Bound"
    >E</a
    ><a name="2835"
    > </a
    ><a name="2836" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="2837"
    > </a
    ><a name="2838" href="#2011" class="InductiveConstructor"
    >Lit</a
    ><a name="2841"
    > </a
    ><a name="2842" href="#2792" class="Bound"
    >n</a
    ><a name="2843"
    > </a
    ><a name="2844" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="2845"
    > </a
    ><a name="2846" href="#2792" class="Bound"
    >n</a
    ><a name="2847"
    >

  </a
    ><a name="2851" href="#2851" class="InductiveConstructor"
    >times-e</a
    ><a name="2858"
    > </a
    ><a name="2859" class="Symbol"
    >:</a
    ><a name="2860"
    > </a
    ><a name="2861" class="Symbol"
    >&#8704;{</a
    ><a name="2863" href="#2863" class="Bound"
    >e&#8321;</a
    ><a name="2865"
    > </a
    ><a name="2866" href="#2866" class="Bound"
    >e&#8322;</a
    ><a name="2868" class="Symbol"
    >}{</a
    ><a name="2870" href="#2870" class="Bound"
    >v&#8321;</a
    ><a name="2872"
    > </a
    ><a name="2873" href="#2873" class="Bound"
    >v&#8322;</a
    ><a name="2875" class="Symbol"
    >}</a
    ><a name="2876"
    >

          </a
    ><a name="2888" class="Symbol"
    >&#8594;</a
    ><a name="2889"
    > </a
    ><a name="2890" href="#2740" class="Bound"
    >E</a
    ><a name="2891"
    > </a
    ><a name="2892" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="2893"
    > </a
    ><a name="2894" href="#2863" class="Bound"
    >e&#8321;</a
    ><a name="2896"
    > </a
    ><a name="2897" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="2898"
    > </a
    ><a name="2899" href="#2870" class="Bound"
    >v&#8321;</a
    ><a name="2901"
    >
          </a
    ><a name="2912" class="Symbol"
    >&#8594;</a
    ><a name="2913"
    > </a
    ><a name="2914" href="#2740" class="Bound"
    >E</a
    ><a name="2915"
    > </a
    ><a name="2916" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="2917"
    > </a
    ><a name="2918" href="#2866" class="Bound"
    >e&#8322;</a
    ><a name="2920"
    > </a
    ><a name="2921" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="2922"
    > </a
    ><a name="2923" href="#2873" class="Bound"
    >v&#8322;</a
    ><a name="2925"
    >
            </a
    ><a name="2938" class="Comment"
    >---------------------</a
    ><a name="2959"
    >
          </a
    ><a name="2970" class="Symbol"
    >&#8594;</a
    ><a name="2971"
    > </a
    ><a name="2972" href="#2740" class="Bound"
    >E</a
    ><a name="2973"
    > </a
    ><a name="2974" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="2975"
    > </a
    ><a name="2976" href="#2863" class="Bound"
    >e&#8321;</a
    ><a name="2978"
    > </a
    ><a name="2979" href="#2030" class="InductiveConstructor Operator"
    >&#8864;</a
    ><a name="2980"
    > </a
    ><a name="2981" href="#2866" class="Bound"
    >e&#8322;</a
    ><a name="2983"
    > </a
    ><a name="2984" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="2985"
    > </a
    ><a name="2986" href="#2870" class="Bound"
    >v&#8321;</a
    ><a name="2988"
    > </a
    ><a name="2989" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#433" class="Primitive Operator"
    >*</a
    ><a name="2990"
    > </a
    ><a name="2991" href="#2873" class="Bound"
    >v&#8322;</a
    ><a name="2993"
    >

  </a
    ><a name="2997" href="#2997" class="InductiveConstructor"
    >plus-e</a
    ><a name="3003"
    >  </a
    ><a name="3005" class="Symbol"
    >:</a
    ><a name="3006"
    > </a
    ><a name="3007" class="Symbol"
    >&#8704;{</a
    ><a name="3009" href="#3009" class="Bound"
    >e&#8321;</a
    ><a name="3011"
    > </a
    ><a name="3012" href="#3012" class="Bound"
    >e&#8322;</a
    ><a name="3014" class="Symbol"
    >}{</a
    ><a name="3016" href="#3016" class="Bound"
    >v&#8321;</a
    ><a name="3018"
    > </a
    ><a name="3019" href="#3019" class="Bound"
    >v&#8322;</a
    ><a name="3021" class="Symbol"
    >}</a
    ><a name="3022"
    >

          </a
    ><a name="3034" class="Symbol"
    >&#8594;</a
    ><a name="3035"
    > </a
    ><a name="3036" href="#2740" class="Bound"
    >E</a
    ><a name="3037"
    > </a
    ><a name="3038" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3039"
    > </a
    ><a name="3040" href="#3009" class="Bound"
    >e&#8321;</a
    ><a name="3042"
    > </a
    ><a name="3043" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3044"
    > </a
    ><a name="3045" href="#3016" class="Bound"
    >v&#8321;</a
    ><a name="3047"
    >
          </a
    ><a name="3058" class="Symbol"
    >&#8594;</a
    ><a name="3059"
    > </a
    ><a name="3060" href="#2740" class="Bound"
    >E</a
    ><a name="3061"
    > </a
    ><a name="3062" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3063"
    > </a
    ><a name="3064" href="#3012" class="Bound"
    >e&#8322;</a
    ><a name="3066"
    > </a
    ><a name="3067" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3068"
    > </a
    ><a name="3069" href="#3019" class="Bound"
    >v&#8322;</a
    ><a name="3071"
    >
            </a
    ><a name="3084" class="Comment"
    >---------------------</a
    ><a name="3105"
    >
          </a
    ><a name="3116" class="Symbol"
    >&#8594;</a
    ><a name="3117"
    > </a
    ><a name="3118" href="#2740" class="Bound"
    >E</a
    ><a name="3119"
    > </a
    ><a name="3120" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3121"
    > </a
    ><a name="3122" href="#3009" class="Bound"
    >e&#8321;</a
    ><a name="3124"
    > </a
    ><a name="3125" href="#2063" class="InductiveConstructor Operator"
    >&#8862;</a
    ><a name="3126"
    > </a
    ><a name="3127" href="#3012" class="Bound"
    >e&#8322;</a
    ><a name="3129"
    > </a
    ><a name="3130" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3131"
    > </a
    ><a name="3132" href="#3016" class="Bound"
    >v&#8321;</a
    ><a name="3134"
    > </a
    ><a name="3135" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#230" class="Primitive Operator"
    >+</a
    ><a name="3136"
    > </a
    ><a name="3137" href="#3019" class="Bound"
    >v&#8322;</a
    ><a name="3139"
    >

  </a
    ><a name="3143" href="#3143" class="InductiveConstructor"
    >var-e</a
    ><a name="3148"
    >   </a
    ><a name="3151" class="Symbol"
    >:</a
    ><a name="3152"
    > </a
    ><a name="3153" class="Symbol"
    >&#8704;{</a
    ><a name="3155" href="#3155" class="Bound"
    >n</a
    ><a name="3156" class="Symbol"
    >}{</a
    ><a name="3158" href="#3158" class="Bound"
    >x</a
    ><a name="3159" class="Symbol"
    >}</a
    ><a name="3160"
    >

          </a
    ><a name="3172" class="Symbol"
    >&#8594;</a
    ><a name="3173"
    > </a
    ><a name="3174" href="#2740" class="Bound"
    >E</a
    ><a name="3175"
    > </a
    ><a name="3176" href="http://agda.github.io/agda-stdlib/Data.Vec.html#869" class="Datatype Operator"
    >[</a
    ><a name="3177"
    > </a
    ><a name="3178" href="#3158" class="Bound"
    >x</a
    ><a name="3179"
    > </a
    ><a name="3180" href="http://agda.github.io/agda-stdlib/Data.Vec.html#869" class="Datatype Operator"
    >]=</a
    ><a name="3182"
    > </a
    ><a name="3183" href="#3155" class="Bound"
    >n</a
    ><a name="3184"
    >
            </a
    ><a name="3197" class="Comment"
    >-------------</a
    ><a name="3210"
    >
          </a
    ><a name="3221" class="Symbol"
    >&#8594;</a
    ><a name="3222"
    > </a
    ><a name="3223" href="#2740" class="Bound"
    >E</a
    ><a name="3224"
    > </a
    ><a name="3225" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3226"
    > </a
    ><a name="3227" href="#2139" class="InductiveConstructor"
    >Var</a
    ><a name="3230"
    > </a
    ><a name="3231" href="#3158" class="Bound"
    >x</a
    ><a name="3232"
    > </a
    ><a name="3233" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3234"
    > </a
    ><a name="3235" href="#3155" class="Bound"
    >n</a
    ><a name="3236"
    >

  </a
    ><a name="3240" href="#3240" class="InductiveConstructor"
    >let-e</a
    ><a name="3245"
    >   </a
    ><a name="3248" class="Symbol"
    >:</a
    ><a name="3249"
    > </a
    ><a name="3250" class="Symbol"
    >&#8704;{</a
    ><a name="3252" href="#3252" class="Bound"
    >e&#8321;</a
    ><a name="3254" class="Symbol"
    >}{</a
    ><a name="3256" href="#3256" class="Bound"
    >e&#8322;</a
    ><a name="3258" class="Symbol"
    >}{</a
    ><a name="3260" href="#3260" class="Bound"
    >v&#8321;</a
    ><a name="3262"
    > </a
    ><a name="3263" href="#3263" class="Bound"
    >v&#8322;</a
    ><a name="3265" class="Symbol"
    >}</a
    ><a name="3266"
    >

          </a
    ><a name="3278" class="Symbol"
    >&#8594;</a
    ><a name="3279"
    > </a
    ><a name="3280" href="#2740" class="Bound"
    >E</a
    ><a name="3281"
    >        </a
    ><a name="3289" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3290"
    > </a
    ><a name="3291" href="#3252" class="Bound"
    >e&#8321;</a
    ><a name="3293"
    > </a
    ><a name="3294" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3295"
    > </a
    ><a name="3296" href="#3260" class="Bound"
    >v&#8321;</a
    ><a name="3298"
    >
          </a
    ><a name="3309" class="Symbol"
    >&#8594;</a
    ><a name="3310"
    > </a
    ><a name="3311" class="Symbol"
    >(</a
    ><a name="3312" href="#3260" class="Bound"
    >v&#8321;</a
    ><a name="3314"
    > </a
    ><a name="3315" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="3316"
    > </a
    ><a name="3317" href="#2740" class="Bound"
    >E</a
    ><a name="3318" class="Symbol"
    >)</a
    ><a name="3319"
    > </a
    ><a name="3320" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3321"
    > </a
    ><a name="3322" href="#3256" class="Bound"
    >e&#8322;</a
    ><a name="3324"
    > </a
    ><a name="3325" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3326"
    > </a
    ><a name="3327" href="#3263" class="Bound"
    >v&#8322;</a
    ><a name="3329"
    >
            </a
    ><a name="3342" class="Comment"
    >---------------------</a
    ><a name="3363"
    >
          </a
    ><a name="3374" class="Symbol"
    >&#8594;</a
    ><a name="3375"
    > </a
    ><a name="3376" href="#2740" class="Bound"
    >E</a
    ><a name="3377"
    > </a
    ><a name="3378" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="3379"
    > </a
    ><a name="3380" href="#2096" class="InductiveConstructor Operator"
    >Let</a
    ><a name="3383"
    > </a
    ><a name="3384" href="#3252" class="Bound"
    >e&#8321;</a
    ><a name="3386"
    > </a
    ><a name="3387" href="#2096" class="InductiveConstructor Operator"
    >In</a
    ><a name="3389"
    > </a
    ><a name="3390" href="#3256" class="Bound"
    >e&#8322;</a
    ><a name="3392"
    > </a
    ><a name="3393" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="3394"
    > </a
    ><a name="3395" href="#3263" class="Bound"
    >v&#8322;</a
    ></code
  ></pre
>
<p>By using appropriate type indices, it is possible to extend this technique to work even for languages with elaborate static semantics. For example, linear type systems (see <span class="citation" data-cites="ATAPL">Walker [2005]</span>) can be encoded by indexing terms by type contexts (in a style similar to <a href="http://okmij.org/ftp/tagless-final/course/LinearLC.hs">Oleg</a>). Therefore, the boundary between being <em>wellformed</em> and being <em>well-typed</em> is entirely arbitrary. It’s possible to use relatively simple terms and encode static semantics as a separate judgement, or to put the entire static semantics inside the term structure, or to use a mixture of both. In this simple example, our static semantics only ensure variables are in scope, so it makes sense to encode the entire static semantics in the terms themselves.</p>
<p>Similar tricks can be employed when encoding our target language, the stack machine <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>. This machine consists of two stacks of numbers, the <em>working</em> stack <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and the <em>storage</em> stack <img width=15 alt="\mathsf{S}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAZCAQAAABwKX1bAAAA00lEQVR4nJVUURXDIAw8C1ioBSzMAhawUAtYwMIs1AIWagELXQphGxAe9PgqzR1JuAD0MHA4aDlaWvj/hxdOXNU6YUfBlkPeSdkh8LcInX4FbNVpd1oiDgqOUEKCAlTSduOyWo07XFSSoJ+pg/KWcx/AcWcWE1LfPgeimvk5P0K5rulJe2MDP09rIzv4VPoiIcMyxawSio+W4RNh+Tb2Z+bIMzCZqjqZ2G/rZjDK7qCVlh1Zz1K2XS9DvS3XEnhWsyHiqExFIe07EGZFaiJ5fmc63Q8Z3HqXVGvRLQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>, and a program to evaluate. A program is a list of <em>instructions</em>.</p>
<p>There are six instructions in total, each of which manipulate these two stacks in various ways. When encoding these instructions in Agda, we index the <code>Inst</code> type by the size of both stacks before and after execution of the instruction:</p>
<pre class="Agda"
><code
  ><a name="4704"
    ></a
    ><a name="4717" class="Keyword"
    >data</a
    ><a name="4721"
    > </a
    ><a name="4722" href="#4722" class="Datatype"
    >Inst</a
    ><a name="4726"
    >  </a
    ><a name="4728" class="Symbol"
    >:</a
    ><a name="4729"
    > </a
    ><a name="4730" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="4731"
    > </a
    ><a name="4732" class="Symbol"
    >&#8594;</a
    ><a name="4733"
    > </a
    ><a name="4734" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="4735"
    > </a
    ><a name="4736" class="Symbol"
    >&#8594;</a
    ><a name="4737"
    > </a
    ><a name="4738" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="4739"
    > </a
    ><a name="4740" class="Symbol"
    >&#8594;</a
    ><a name="4741"
    > </a
    ><a name="4742" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="4743"
    > </a
    ><a name="4744" class="Symbol"
    >&#8594;</a
    ><a name="4745"
    > </a
    ><a name="4746" class="PrimitiveType"
    >Set</a
    ><a name="4749"
    > </a
    ><a name="4750" class="Keyword"
    >where</a
    ><a name="4755"
    >
  </a
    ><a name="4758" href="#4758" class="InductiveConstructor"
    >num</a
    ><a name="4761"
    >   </a
    ><a name="4764" class="Symbol"
    >:</a
    ><a name="4765"
    > </a
    ><a name="4766" class="Symbol"
    >&#8704;{</a
    ><a name="4768" href="#4768" class="Bound"
    >w</a
    ><a name="4769"
    > </a
    ><a name="4770" href="#4770" class="Bound"
    >s</a
    ><a name="4771" class="Symbol"
    >}</a
    ><a name="4772"
    > </a
    ><a name="4773" class="Symbol"
    >&#8594;</a
    ><a name="4774"
    > </a
    ><a name="4775" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="4776"
    > </a
    ><a name="4777" class="Symbol"
    >&#8594;</a
    ><a name="4778"
    > </a
    ><a name="4779" href="#4722" class="Datatype"
    >Inst</a
    ><a name="4783"
    > </a
    ><a name="4784" href="#4768" class="Bound"
    >w</a
    ><a name="4785"
    > </a
    ><a name="4786" href="#4770" class="Bound"
    >s</a
    ><a name="4787"
    > </a
    ><a name="4788" class="Symbol"
    >(</a
    ><a name="4789" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4792"
    > </a
    ><a name="4793" href="#4768" class="Bound"
    >w</a
    ><a name="4794" class="Symbol"
    >)</a
    ><a name="4795"
    > </a
    ><a name="4796" href="#4770" class="Bound"
    >s</a
    ><a name="4797"
    >
  </a
    ><a name="4800" href="#4800" class="InductiveConstructor"
    >plus</a
    ><a name="4804"
    >  </a
    ><a name="4806" class="Symbol"
    >:</a
    ><a name="4807"
    > </a
    ><a name="4808" class="Symbol"
    >&#8704;{</a
    ><a name="4810" href="#4810" class="Bound"
    >w</a
    ><a name="4811"
    > </a
    ><a name="4812" href="#4812" class="Bound"
    >s</a
    ><a name="4813" class="Symbol"
    >}</a
    ><a name="4814"
    > </a
    ><a name="4815" class="Symbol"
    >&#8594;</a
    ><a name="4816"
    > </a
    ><a name="4817" href="#4722" class="Datatype"
    >Inst</a
    ><a name="4821"
    > </a
    ><a name="4822" class="Symbol"
    >(</a
    ><a name="4823" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4826"
    > </a
    ><a name="4827" class="Symbol"
    >(</a
    ><a name="4828" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4831"
    > </a
    ><a name="4832" href="#4810" class="Bound"
    >w</a
    ><a name="4833" class="Symbol"
    >))</a
    ><a name="4835"
    > </a
    ><a name="4836" href="#4812" class="Bound"
    >s</a
    ><a name="4837"
    > </a
    ><a name="4838" class="Symbol"
    >(</a
    ><a name="4839" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4842"
    > </a
    ><a name="4843" href="#4810" class="Bound"
    >w</a
    ><a name="4844" class="Symbol"
    >)</a
    ><a name="4845"
    > </a
    ><a name="4846" href="#4812" class="Bound"
    >s</a
    ><a name="4847"
    >
  </a
    ><a name="4850" href="#4850" class="InductiveConstructor"
    >times</a
    ><a name="4855"
    > </a
    ><a name="4856" class="Symbol"
    >:</a
    ><a name="4857"
    > </a
    ><a name="4858" class="Symbol"
    >&#8704;{</a
    ><a name="4860" href="#4860" class="Bound"
    >w</a
    ><a name="4861"
    > </a
    ><a name="4862" href="#4862" class="Bound"
    >s</a
    ><a name="4863" class="Symbol"
    >}</a
    ><a name="4864"
    > </a
    ><a name="4865" class="Symbol"
    >&#8594;</a
    ><a name="4866"
    > </a
    ><a name="4867" href="#4722" class="Datatype"
    >Inst</a
    ><a name="4871"
    > </a
    ><a name="4872" class="Symbol"
    >(</a
    ><a name="4873" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4876"
    > </a
    ><a name="4877" class="Symbol"
    >(</a
    ><a name="4878" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4881"
    > </a
    ><a name="4882" href="#4860" class="Bound"
    >w</a
    ><a name="4883" class="Symbol"
    >))</a
    ><a name="4885"
    > </a
    ><a name="4886" href="#4862" class="Bound"
    >s</a
    ><a name="4887"
    > </a
    ><a name="4888" class="Symbol"
    >(</a
    ><a name="4889" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4892"
    > </a
    ><a name="4893" href="#4860" class="Bound"
    >w</a
    ><a name="4894" class="Symbol"
    >)</a
    ><a name="4895"
    > </a
    ><a name="4896" href="#4862" class="Bound"
    >s</a
    ><a name="4897"
    >
  </a
    ><a name="4900" href="#4900" class="InductiveConstructor"
    >push</a
    ><a name="4904"
    >  </a
    ><a name="4906" class="Symbol"
    >:</a
    ><a name="4907"
    > </a
    ><a name="4908" class="Symbol"
    >&#8704;{</a
    ><a name="4910" href="#4910" class="Bound"
    >w</a
    ><a name="4911"
    > </a
    ><a name="4912" href="#4912" class="Bound"
    >s</a
    ><a name="4913" class="Symbol"
    >}</a
    ><a name="4914"
    > </a
    ><a name="4915" class="Symbol"
    >&#8594;</a
    ><a name="4916"
    > </a
    ><a name="4917" href="#4722" class="Datatype"
    >Inst</a
    ><a name="4921"
    > </a
    ><a name="4922" class="Symbol"
    >(</a
    ><a name="4923" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4926"
    > </a
    ><a name="4927" href="#4910" class="Bound"
    >w</a
    ><a name="4928" class="Symbol"
    >)</a
    ><a name="4929"
    > </a
    ><a name="4930" href="#4912" class="Bound"
    >s</a
    ><a name="4931"
    > </a
    ><a name="4932" href="#4910" class="Bound"
    >w</a
    ><a name="4933"
    > </a
    ><a name="4934" class="Symbol"
    >(</a
    ><a name="4935" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4938"
    > </a
    ><a name="4939" href="#4912" class="Bound"
    >s</a
    ><a name="4940" class="Symbol"
    >)</a
    ><a name="4941"
    >
  </a
    ><a name="4944" href="#4944" class="InductiveConstructor"
    >pick</a
    ><a name="4948"
    >  </a
    ><a name="4950" class="Symbol"
    >:</a
    ><a name="4951"
    > </a
    ><a name="4952" class="Symbol"
    >&#8704;{</a
    ><a name="4954" href="#4954" class="Bound"
    >w</a
    ><a name="4955"
    > </a
    ><a name="4956" href="#4956" class="Bound"
    >s</a
    ><a name="4957" class="Symbol"
    >}</a
    ><a name="4958"
    > </a
    ><a name="4959" class="Symbol"
    >&#8594;</a
    ><a name="4960"
    > </a
    ><a name="4961" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#915" class="Datatype"
    >Fin</a
    ><a name="4964"
    > </a
    ><a name="4965" href="#4956" class="Bound"
    >s</a
    ><a name="4966"
    > </a
    ><a name="4967" class="Symbol"
    >&#8594;</a
    ><a name="4968"
    > </a
    ><a name="4969" href="#4722" class="Datatype"
    >Inst</a
    ><a name="4973"
    > </a
    ><a name="4974" href="#4954" class="Bound"
    >w</a
    ><a name="4975"
    > </a
    ><a name="4976" href="#4956" class="Bound"
    >s</a
    ><a name="4977"
    > </a
    ><a name="4978" class="Symbol"
    >(</a
    ><a name="4979" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="4982"
    > </a
    ><a name="4983" href="#4954" class="Bound"
    >w</a
    ><a name="4984" class="Symbol"
    >)</a
    ><a name="4985"
    > </a
    ><a name="4986" href="#4956" class="Bound"
    >s</a
    ><a name="4987"
    >
  </a
    ><a name="4990" href="#4990" class="InductiveConstructor"
    >pop</a
    ><a name="4993"
    >   </a
    ><a name="4996" class="Symbol"
    >:</a
    ><a name="4997"
    > </a
    ><a name="4998" class="Symbol"
    >&#8704;{</a
    ><a name="5000" href="#5000" class="Bound"
    >w</a
    ><a name="5001"
    > </a
    ><a name="5002" href="#5002" class="Bound"
    >s</a
    ><a name="5003" class="Symbol"
    >}</a
    ><a name="5004"
    > </a
    ><a name="5005" class="Symbol"
    >&#8594;</a
    ><a name="5006"
    > </a
    ><a name="5007" href="#4722" class="Datatype"
    >Inst</a
    ><a name="5011"
    > </a
    ><a name="5012" href="#5000" class="Bound"
    >w</a
    ><a name="5013"
    > </a
    ><a name="5014" class="Symbol"
    >(</a
    ><a name="5015" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="5018"
    > </a
    ><a name="5019" href="#5002" class="Bound"
    >s</a
    ><a name="5020" class="Symbol"
    >)</a
    ><a name="5021"
    > </a
    ><a name="5022" href="#5000" class="Bound"
    >w</a
    ><a name="5023"
    > </a
    ><a name="5024" href="#5002" class="Bound"
    >s</a
    ></code
  ></pre
>
<p>Then, we can define a simple type for <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> programs, essentially a list of instructions where the stack sizes of consecutive instructions must match. This makes it impossible to construct a <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> program with an underflow error:</p>
<pre class="Agda"
><code
  ><a name="5285"
    ></a
    ><a name="5298" class="Keyword"
    >data</a
    ><a name="5302"
    > </a
    ><a name="5303" href="#5303" class="Datatype"
    >SM</a
    ><a name="5305"
    > </a
    ><a name="5306" class="Symbol"
    >(</a
    ><a name="5307" href="#5307" class="Bound"
    >w</a
    ><a name="5308"
    > </a
    ><a name="5309" href="#5309" class="Bound"
    >s</a
    ><a name="5310"
    > </a
    ><a name="5311" class="Symbol"
    >:</a
    ><a name="5312"
    > </a
    ><a name="5313" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="5314" class="Symbol"
    >)</a
    ><a name="5315"
    > </a
    ><a name="5316" class="Symbol"
    >:</a
    ><a name="5317"
    > </a
    ><a name="5318" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="5319"
    > </a
    ><a name="5320" class="Symbol"
    >&#8594;</a
    ><a name="5321"
    > </a
    ><a name="5322" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="5323"
    > </a
    ><a name="5324" class="Symbol"
    >&#8594;</a
    ><a name="5325"
    > </a
    ><a name="5326" class="PrimitiveType"
    >Set</a
    ><a name="5329"
    > </a
    ><a name="5330" class="Keyword"
    >where</a
    ><a name="5335"
    >
  </a
    ><a name="5338" href="#5338" class="InductiveConstructor"
    >halt</a
    ><a name="5342"
    > </a
    ><a name="5343" class="Symbol"
    >:</a
    ><a name="5344"
    > </a
    ><a name="5345" href="#5303" class="Datatype"
    >SM</a
    ><a name="5347"
    > </a
    ><a name="5348" href="#5307" class="Bound"
    >w</a
    ><a name="5349"
    > </a
    ><a name="5350" href="#5309" class="Bound"
    >s</a
    ><a name="5351"
    > </a
    ><a name="5352" href="#5307" class="Bound"
    >w</a
    ><a name="5353"
    > </a
    ><a name="5354" href="#5309" class="Bound"
    >s</a
    ><a name="5355"
    >
  </a
    ><a name="5358" href="#5358" class="InductiveConstructor Operator"
    >_&#8759;_</a
    ><a name="5361"
    >  </a
    ><a name="5363" class="Symbol"
    >:</a
    ><a name="5364"
    > </a
    ><a name="5365" class="Symbol"
    >&#8704;{</a
    ><a name="5367" href="#5367" class="Bound"
    >w&#8242;</a
    ><a name="5369"
    > </a
    ><a name="5370" href="#5370" class="Bound"
    >s&#8242;</a
    ><a name="5372"
    > </a
    ><a name="5373" href="#5373" class="Bound"
    >w&#8243;</a
    ><a name="5375"
    > </a
    ><a name="5376" href="#5376" class="Bound"
    >s&#8243;</a
    ><a name="5378" class="Symbol"
    >}</a
    ><a name="5379"
    > </a
    ><a name="5380" class="Symbol"
    >&#8594;</a
    ><a name="5381"
    > </a
    ><a name="5382" href="#4722" class="Datatype"
    >Inst</a
    ><a name="5386"
    > </a
    ><a name="5387" href="#5307" class="Bound"
    >w</a
    ><a name="5388"
    > </a
    ><a name="5389" href="#5309" class="Bound"
    >s</a
    ><a name="5390"
    > </a
    ><a name="5391" href="#5367" class="Bound"
    >w&#8242;</a
    ><a name="5393"
    > </a
    ><a name="5394" href="#5370" class="Bound"
    >s&#8242;</a
    ><a name="5396"
    > </a
    ><a name="5397" class="Symbol"
    >&#8594;</a
    ><a name="5398"
    > </a
    ><a name="5399" href="#5303" class="Datatype"
    >SM</a
    ><a name="5401"
    > </a
    ><a name="5402" href="#5367" class="Bound"
    >w&#8242;</a
    ><a name="5404"
    > </a
    ><a name="5405" href="#5370" class="Bound"
    >s&#8242;</a
    ><a name="5407"
    > </a
    ><a name="5408" href="#5373" class="Bound"
    >w&#8243;</a
    ><a name="5410"
    > </a
    ><a name="5411" href="#5376" class="Bound"
    >s&#8243;</a
    ><a name="5413"
    > </a
    ><a name="5414" class="Symbol"
    >&#8594;</a
    ><a name="5415"
    > </a
    ><a name="5416" href="#5303" class="Datatype"
    >SM</a
    ><a name="5418"
    > </a
    ><a name="5419" href="#5307" class="Bound"
    >w</a
    ><a name="5420"
    > </a
    ><a name="5421" href="#5309" class="Bound"
    >s</a
    ><a name="5422"
    > </a
    ><a name="5423" href="#5373" class="Bound"
    >w&#8243;</a
    ><a name="5425"
    > </a
    ><a name="5426" href="#5376" class="Bound"
    >s&#8243;</a
    ></code
  ></pre
>
<p>We also define a simple sequential composition operator, equivalent to list append (<code>++</code>):</p>
<pre class="Agda"
><code
  ><a name="5533"
    ></a
    ><a name="5546" class="Keyword"
    >infixr</a
    ><a name="5552"
    > </a
    ><a name="5553" class="Number"
    >5</a
    ><a name="5554"
    > </a
    ><a name="5555" href="#5559" class="Function Operator"
    >_&#8853;_</a
    ><a name="5558"
    >
</a
    ><a name="5559" href="#5559" class="Function Operator"
    >_&#8853;_</a
    ><a name="5562"
    > </a
    ><a name="5563" class="Symbol"
    >:</a
    ><a name="5564"
    > </a
    ><a name="5565" class="Symbol"
    >&#8704;{</a
    ><a name="5567" href="#5567" class="Bound"
    >w</a
    ><a name="5568"
    > </a
    ><a name="5569" href="#5569" class="Bound"
    >s</a
    ><a name="5570"
    > </a
    ><a name="5571" href="#5571" class="Bound"
    >w&#8242;</a
    ><a name="5573"
    > </a
    ><a name="5574" href="#5574" class="Bound"
    >s&#8242;</a
    ><a name="5576"
    > </a
    ><a name="5577" href="#5577" class="Bound"
    >w&#8243;</a
    ><a name="5579"
    > </a
    ><a name="5580" href="#5580" class="Bound"
    >s&#8243;</a
    ><a name="5582" class="Symbol"
    >}</a
    ><a name="5583"
    > </a
    ><a name="5584" class="Symbol"
    >&#8594;</a
    ><a name="5585"
    > </a
    ><a name="5586" href="#5303" class="Datatype"
    >SM</a
    ><a name="5588"
    > </a
    ><a name="5589" href="#5567" class="Bound"
    >w</a
    ><a name="5590"
    > </a
    ><a name="5591" href="#5569" class="Bound"
    >s</a
    ><a name="5592"
    > </a
    ><a name="5593" href="#5571" class="Bound"
    >w&#8242;</a
    ><a name="5595"
    > </a
    ><a name="5596" href="#5574" class="Bound"
    >s&#8242;</a
    ><a name="5598"
    > </a
    ><a name="5599" class="Symbol"
    >&#8594;</a
    ><a name="5600"
    > </a
    ><a name="5601" href="#5303" class="Datatype"
    >SM</a
    ><a name="5603"
    > </a
    ><a name="5604" href="#5571" class="Bound"
    >w&#8242;</a
    ><a name="5606"
    > </a
    ><a name="5607" href="#5574" class="Bound"
    >s&#8242;</a
    ><a name="5609"
    > </a
    ><a name="5610" href="#5577" class="Bound"
    >w&#8243;</a
    ><a name="5612"
    > </a
    ><a name="5613" href="#5580" class="Bound"
    >s&#8243;</a
    ><a name="5615"
    > </a
    ><a name="5616" class="Symbol"
    >&#8594;</a
    ><a name="5617"
    > </a
    ><a name="5618" href="#5303" class="Datatype"
    >SM</a
    ><a name="5620"
    > </a
    ><a name="5621" href="#5567" class="Bound"
    >w</a
    ><a name="5622"
    > </a
    ><a name="5623" href="#5569" class="Bound"
    >s</a
    ><a name="5624"
    > </a
    ><a name="5625" href="#5577" class="Bound"
    >w&#8243;</a
    ><a name="5627"
    > </a
    ><a name="5628" href="#5580" class="Bound"
    >s&#8243;</a
    ><a name="5630"
    >
</a
    ><a name="5631" href="#5338" class="InductiveConstructor"
    >halt</a
    ><a name="5635"
    >    </a
    ><a name="5639" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="5640"
    > </a
    ><a name="5641" href="#5641" class="Bound"
    >q</a
    ><a name="5642"
    > </a
    ><a name="5643" class="Symbol"
    >=</a
    ><a name="5644"
    > </a
    ><a name="5645" href="#5641" class="Bound"
    >q</a
    ><a name="5646"
    >
</a
    ><a name="5647" class="Symbol"
    >(</a
    ><a name="5648" href="#5648" class="Bound"
    >x</a
    ><a name="5649"
    > </a
    ><a name="5650" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="5651"
    > </a
    ><a name="5652" href="#5652" class="Bound"
    >p</a
    ><a name="5653" class="Symbol"
    >)</a
    ><a name="5654"
    > </a
    ><a name="5655" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="5656"
    > </a
    ><a name="5657" href="#5657" class="Bound"
    >q</a
    ><a name="5658"
    > </a
    ><a name="5659" class="Symbol"
    >=</a
    ><a name="5660"
    > </a
    ><a name="5661" href="#5648" class="Bound"
    >x</a
    ><a name="5662"
    > </a
    ><a name="5663" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="5664"
    > </a
    ><a name="5665" class="Symbol"
    >(</a
    ><a name="5666" href="#5652" class="Bound"
    >p</a
    ><a name="5667"
    > </a
    ><a name="5668" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="5669"
    > </a
    ><a name="5670" href="#5657" class="Bound"
    >q</a
    ><a name="5671" class="Symbol"
    >)</a
    ></code
  ></pre
>
<p>The semantics of each instruction are given by the following relation, which takes the two stacks and an instruction as input, returning the two updated stacks as output. Note the size of each stack is proscribed by the type of the instruction, just as the size of the environment was proscribed by the type of the term in the source language, which eliminates the need to add tedious wellformedness assumptions to theorems or rules.</p>
<pre class="Agda"
><code
  ><a name="6121"
    ></a
    ><a name="6134" class="Keyword"
    >infixl</a
    ><a name="6140"
    > </a
    ><a name="6141" class="Number"
    >5</a
    ><a name="6142"
    > </a
    ><a name="6143" href="#6159" class="Datatype Operator"
    >_&#8739;_&#8739;_&#8614;_&#8739;_</a
    ><a name="6152"
    >

</a
    ><a name="6154" class="Keyword"
    >data</a
    ><a name="6158"
    > </a
    ><a name="6159" href="#6159" class="Datatype Operator"
    >_&#8739;_&#8739;_&#8614;_&#8739;_</a
    ><a name="6168"
    > </a
    ><a name="6169" class="Symbol"
    >:</a
    ><a name="6170"
    > </a
    ><a name="6171" class="Symbol"
    >&#8704;{</a
    ><a name="6173" href="#6173" class="Bound"
    >w</a
    ><a name="6174"
    > </a
    ><a name="6175" href="#6175" class="Bound"
    >s</a
    ><a name="6176"
    > </a
    ><a name="6177" href="#6177" class="Bound"
    >w&#8242;</a
    ><a name="6179"
    > </a
    ><a name="6180" href="#6180" class="Bound"
    >s&#8242;</a
    ><a name="6182" class="Symbol"
    >}</a
    ><a name="6183"
    >
   </a
    ><a name="6187" class="Symbol"
    >&#8594;</a
    ><a name="6188"
    > </a
    ><a name="6189" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="6192"
    > </a
    ><a name="6193" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="6194"
    > </a
    ><a name="6195" href="#6173" class="Bound"
    >w</a
    ><a name="6196"
    > </a
    ><a name="6197" class="Symbol"
    >&#8594;</a
    ><a name="6198"
    > </a
    ><a name="6199" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="6202"
    > </a
    ><a name="6203" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="6204"
    > </a
    ><a name="6205" href="#6175" class="Bound"
    >s</a
    ><a name="6206"
    >
   </a
    ><a name="6210" class="Symbol"
    >&#8594;</a
    ><a name="6211"
    > </a
    ><a name="6212" href="#4722" class="Datatype"
    >Inst</a
    ><a name="6216"
    > </a
    ><a name="6217" href="#6173" class="Bound"
    >w</a
    ><a name="6218"
    > </a
    ><a name="6219" href="#6175" class="Bound"
    >s</a
    ><a name="6220"
    > </a
    ><a name="6221" href="#6177" class="Bound"
    >w&#8242;</a
    ><a name="6223"
    > </a
    ><a name="6224" href="#6180" class="Bound"
    >s&#8242;</a
    ><a name="6226"
    >
   </a
    ><a name="6230" class="Symbol"
    >&#8594;</a
    ><a name="6231"
    > </a
    ><a name="6232" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="6235"
    > </a
    ><a name="6236" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="6237"
    > </a
    ><a name="6238" href="#6177" class="Bound"
    >w&#8242;</a
    ><a name="6240"
    > </a
    ><a name="6241" class="Symbol"
    >&#8594;</a
    ><a name="6242"
    > </a
    ><a name="6243" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="6246"
    > </a
    ><a name="6247" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="6248"
    > </a
    ><a name="6249" href="#6180" class="Bound"
    >s&#8242;</a
    ><a name="6251"
    >
   </a
    ><a name="6255" class="Symbol"
    >&#8594;</a
    ><a name="6256"
    > </a
    ><a name="6257" class="PrimitiveType"
    >Set</a
    ><a name="6260"
    > </a
    ><a name="6261" class="Keyword"
    >where</a
    ></code
  ></pre
>
<p>The semantics of each instruction are as follows:</p>
<ul>
<li><img width=60 alt="\mathtt{num}\ n" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAARCAQAAAD3PnMmAAABj0lEQVR4nOWW67WDIAyAWYEVXMEVWIEVXMEVWMEVXCEruAIrsIINrxgqqMfae+49N/xok+bxkaJEiN8iWhgxCkl6j5q3dEdBKi0vUgyVAO7hpUt6V+gSlwfok208KxwAF7GGNQV9EDbpq3Dt6JGcFBZcaY1Vjygu6ZD0qM1UcMB1Wjhkdlgz+2qMt6gb3EC0mPZeJyzuQoE1JMlBauehqBiEDgHpW78MyzRTB1u146GAtMGtUYZ1vykxbKGTNe1CgEF7UQw6arkzQFuW+GmPCzPEnllk8U8eQDv2MOhdyBVoSQhzsvsDcxW6lOUaND9B6gZ01gzLBbeh4Rr08CF0Pk6GeX4duo10DTp3959AT38RGsKb6wegh4eh3wEfg9bNpN+Bzt2X9Xv1HHpmb1+ZHp0noV3FFi+cIVzuhWiaJDIGMN1Rd+P1YfHX7dLPHjnCohdQpo5mkeYMUQDWbO9zEEGvbPk/ZCksmnlaAvWznCOPLULRd8s8TmYIBNz1kriguN5viR9CP06yE1m1Vmq9AK4Niev3hTV7AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> (where <img width=62 alt="n \in \mathbb{N}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAAAZCAQAAAD5seoyAAACCklEQVR4nM2XC7HDIBBFsYCFWMACFmIBC7EQC1ioBSzEQizEQt4un4QQPlsyr+1lppMSKAe47FLGfkMzM1F5saHydij8xpc0Ms12tgAklhc8Xd8i/A5FwxP/EmNFI6BJ+8TtJFKtyYR+SBLQN7+mAp7G5D2a5UeF6KdVJoC/uvpD6OhdA1u8H2WFlawL0Tm0C1Z5JagfQMf12mGY+VKm5vFCdLTK7q0STwNVRR+TIQR8wxp6OOI2EsxdAcyhx1YRx8FFFdEFuGz3AQilou1OXVcGX6BtyxgtdJY4PixlAR2bzIDrUEfAXu02a19zD1U5zeRJ1tHzji+gCz8341d5inDOnWgPLdvNqv1Pnu3m+MYxdaDxlnNbQznb+mEEiNHRsGEHpScioV+1ENE3GO6JZDKyhpG5p1ptAHgb3ZDQxUO73NHx0AejGuv5f0KXUfrJlXbkSdGd45WfxtaieIau4LNcaCnpKnVMWbYodDc6P7Jgr3LoV8dXKYy9Nd/rKMd0IYXQsvLop+MJ6GkDKrqKMl+P8uin4zvRw07warZcIQ70q4SOdyt0PAF9y9S5pKCSu1wqQcy7eakkGcaa7f+mJnrumIYyZXvFw2+3P8UUCVhzl/pkAR8vdg30+7qOHtuQ7oTuBqqhF30CQ5IDcj2HFnr+mA3FtchLHRfouPRehoPkw+BLFn87Jb2pP2gTN3HyTdo4AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-2px;"/>), pushes <img width=19 alt="n" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAARCAQAAABkmgTBAAAApUlEQVR4nM2SURHEIAxE1wIWagELZwELtYCFWKiWWMBCLZyFXprQDqXQueF+bvnKsi9kmAClAggR7qy9VLsz4UEeCZueResZa643vPtolEuSsAWDQKvUJE3Mof57NiDnF+J5Q8UUD7KYLxynDn8HXpVGQf5PcBkF91AaBevQT+AxhestH+ve3D1bilkXsQu2Puc4sUlp6N4zZIgvq1jJNd0Jrxr6AAYmZxGAKjAIAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> to <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>.</li>
</ul>
<p><img width=323 alt=" \newcommand{\blktriangle}{\scriptstyle \blacktriangle} \def\g#1{\save [].[ddddddrrr]!C=&quot;g#1&quot;*[F]\frm{}\restore}% \xymatrix@R=0.01em@C=0.4em{ \g1 &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp; \g2 &amp;              &amp;               &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp; 7             &amp;               &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp; \blktriangle  &amp;               &amp; &amp;\\ &amp; 3            &amp; 5              &amp; &amp; &amp; &amp; &amp; &amp;    &amp; 3             &amp; 5             &amp; &amp;\\ &amp; {}^\bullet     &amp; {}^\bullet       &amp; &amp; &amp; &amp; &amp; &amp;    &amp; {}^\bullet &amp; {}^\bullet &amp; &amp;\\ &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}} &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}} &amp; &amp; &amp; &amp; &amp; &amp;    &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}}  &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}}  &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp; \ar^*{\mathtt{num}\ 7} &quot;g1&quot;;&quot;g2&quot; } " height=155 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<pre class="Agda"
><code
  ><a name="7260"
    >  </a
    ><a name="7275" href="#7275" class="InductiveConstructor"
    >num-e</a
    ><a name="7280"
    >   </a
    ><a name="7283" class="Symbol"
    >:</a
    ><a name="7284"
    > </a
    ><a name="7285" class="Symbol"
    >&#8704;{</a
    ><a name="7287" href="#7287" class="Bound"
    >w</a
    ><a name="7288"
    > </a
    ><a name="7289" href="#7289" class="Bound"
    >s</a
    ><a name="7290" class="Symbol"
    >}{</a
    ><a name="7292" href="#7292" class="Bound"
    >n</a
    ><a name="7293" class="Symbol"
    >}{</a
    ><a name="7295" href="#7295" class="Bound"
    >W</a
    ><a name="7296"
    > </a
    ><a name="7297" class="Symbol"
    >:</a
    ><a name="7298"
    > </a
    ><a name="7299" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="7302"
    > </a
    ><a name="7303" class="Symbol"
    >_</a
    ><a name="7304"
    > </a
    ><a name="7305" href="#7287" class="Bound"
    >w</a
    ><a name="7306" class="Symbol"
    >}{</a
    ><a name="7308" href="#7308" class="Bound"
    >S</a
    ><a name="7309"
    > </a
    ><a name="7310" class="Symbol"
    >:</a
    ><a name="7311"
    > </a
    ><a name="7312" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="7315"
    > </a
    ><a name="7316" class="Symbol"
    >_</a
    ><a name="7317"
    > </a
    ><a name="7318" href="#7289" class="Bound"
    >s</a
    ><a name="7319" class="Symbol"
    >}</a
    ><a name="7320"
    >

            </a
    ><a name="7334" class="Comment"
    >-------------------------</a
    ><a name="7359"
    >
          </a
    ><a name="7370" class="Symbol"
    >&#8594;</a
    ><a name="7371"
    > </a
    ><a name="7372" href="#7295" class="Bound"
    >W</a
    ><a name="7373"
    > </a
    ><a name="7374" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="7375"
    > </a
    ><a name="7376" href="#7308" class="Bound"
    >S</a
    ><a name="7377"
    > </a
    ><a name="7378" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="7379"
    > </a
    ><a name="7380" href="#4758" class="InductiveConstructor"
    >num</a
    ><a name="7383"
    > </a
    ><a name="7384" href="#7292" class="Bound"
    >n</a
    ><a name="7385"
    > </a
    ><a name="7386" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="7387"
    > </a
    ><a name="7388" href="#7292" class="Bound"
    >n</a
    ><a name="7389"
    > </a
    ><a name="7390" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="7391"
    > </a
    ><a name="7392" href="#7295" class="Bound"
    >W</a
    ><a name="7393"
    > </a
    ><a name="7394" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="7395"
    > </a
    ><a name="7396" href="#7308" class="Bound"
    >S</a
    ></code
  ></pre
>
<ul>
<li><img width=48 alt="\mathtt{plus}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAAAdCAQAAACjp+KIAAAByElEQVR4nO2X7bWDIAyGWYEVXIEVXMEVWMEVWIEVugIruAIrdAWLASWEqLXeq/3RcDw9fCVPIS+iEEesES0qX2BejKiYu3GE6IVLxX8HUDbzA9qxC4CwdhqhQzgdfo8BUf3Nqqz9qJCPBooWMjwdHdAv2ukgWFaSfBso+5iRnqnuCMxQqPUJT0Vsw7Rn6vbAbmH4wCJxQNnHDDSpciBAzRJBh3Em9EUs1mKnXRAUTOZyZT2HHAKarCVABiJQXxtAvmhpYXCdA58DWUgLGqPasuysJ20D03YGSMOfLpH6Oql5Z3Poxx8CiZSbU6sJKJvvRA5IVw7PAk0+H4XK1rTMAvX/ABRNwRHjNrQMnZoJbauRnwN1oaaKGQ3kaR0jOSs7JAifQh4BolvumJxsYI1WnI0Fv60OgneAOlKnQGO1RivbGgf7NFwmPXCSXAd6oBWQ6dCrgTxaxRa2jPXmYOmii/lIx9uFtYELDtimgA69iqKWOgQUE3m+6m0mdRsm+iWQqvq5Uu5/nj8JWi1IEchCDIOuw379IpMTUp28xE8XD8X2yKW92f9U4M6hW+0HtGdfBKTgjujhpDbMdeNyM0TIt5ssvtp5wV5iL1zPabYfrhnNAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, pops two numbers from <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and pushes their sum back to <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>.</li>
</ul>
<p><img width=323 alt=" \newcommand{\blktriangle}{\scriptstyle \blacktriangle} \def\g#1{\save [].[ddddddrrr]!C=&quot;g#1&quot;*[F]\frm{}\restore}% \xymatrix@R=0.01em@C=0.4em{ \g1 &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp; \g2 &amp;              &amp;               &amp; &amp;\\ &amp; 7            &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp;\\ &amp; \blktriangle &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp;\\ &amp; 3            &amp; 5              &amp; &amp; &amp; &amp; &amp; &amp;    &amp; 10            &amp; 5             &amp; &amp;\\ &amp; {}^\bullet     &amp; {}^\bullet       &amp; &amp; &amp; &amp; &amp; &amp;    &amp; {}^\bullet &amp; {}^\bullet &amp; &amp;\\ &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}} &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}} &amp; &amp; &amp; &amp; &amp; &amp;    &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}}  &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}}  &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp; \ar^*{\mathtt{plus}} &quot;g1&quot;;&quot;g2&quot; } " height=155 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeUAAADpCAQAAACwjOcmAAASHElEQVR4nO2dPY7jyhVGuQVtQVvQFrgAJ4rsWDswlDtS5tDQCgbo5CUGDEOA03Eg2JEDB8Jz5sTQFtosXlL8K0nVZN1bbPIcYoAZTbMv9fEeir+lLBNOTArTIYOa1OtimdOgw37NPpkUpl+zCzqX/Jp8XSxzuhTJdjrsM/uR5UzRp98WyZ5S2TMr6DCdadfvMBpOC5IVyEELVDaCZAVy0AKVjSBZgRy0QGUjSFYgBy1Q2QiSFchBC1Q2gmQFctAClY0gWYEctEBlI0hWIActUNkIkhXIQQtUNoJkBXLQApWNIFmBHLRAZSNIViAHLVDZCJIVyEELVDaCZAVy0AKVjSBZgRy0QGUjSFYgBy3MVd5mefFnfdDCAjloYa7yqahxfTIOwpKhhQVy0MJc5fOL0YmWDC0skIMW5io/H2jsQ7lyWmhhgRy0MFZ5U1S4D3al98Wrt4UfQdPCAjloYaxy7tmR3pSfyUsfWpYWFshBC2OVj0WFc++12ypW7xreYwjkoIX5p/Kp+NNGzmgve+faQQsL5KBF4ltEcu+x8xKhhQVy0CKpypty5/poWDEdtLBADlokVfm4+EtQDbSwQA5aJFR5HWeua2hhgRy0SKjycQVXkxtoYYEctEio8ueqVuua3usryEGLZCrnq9q9poVryEGLZCofV3MZSqCFBXLQIpnK58U/C9WFFhbIQYtkKi//scYutLBADlokUlkuRPXvxl4ytLBADlokUjlf2flrWriGHLRAZSPW9W6fQw5aoLIR63q3zyEHLRKpvCtVXseDFAItLJCDFglvEVnP7SEOWlggBy0Y0t4IkhXIQQtUNoJkBXLQApWNIFmBHLRAZSNIViAHLVDZCJIVyEELVDaCZAVy0AKVjSBZgRy0QGUjSFYgBy1Q2QiSFchBC1Q2gmQFctAClY0gWYEctEBlI0hWIActUNkIkhXIQQtUNoJkBXLQApWNIFmBHLRAZSNIViAHLVDZCJIVyEELVDaCZAVy0AKVjSBZgRy0SKbyJrsUf9YDLSyQgxZJv/6NETfXBzlokUzlW+a+KH090MICOWiRSOVDOQ4236+8PshBi0QqXyqVrybV5gAtLJCDFklUziuR3ZQb1JsDtLBADlokUfmjpfJavmOZFhbIQYsEKm9bIrtpq15xDtDCAjlokUDlc0/ldXxhOi0skIMW5ipveiKv5XOZFhbIQQtzlU8eldewctfxLt9DDloYq7zJ7h6V7yu4hZMWFshBC2OVDx6R1/Gl6bSwQA5aGKucF7/fN+1Vq84BWlggBy14yNEIkhXIQQtUNoJkBXLQApWNIFmBHLRAZSNskt1meWuaI3SYFqhshE2yt9lfr5/nUi0BVDbCJtljdqmm20zX5TyXagmgshHWyZ5mui7nuVRLAJWNQGVhnku1BFDZCFQW5rlUSwCVjZiebPu89DY7FL/v8OKZMr/K/XPb9Rnv4e/ZFcfdcifeIdsUf2Ldj0eHaYHKRkxN9vg4L73vPF12evIoik/l5nfUMtcPt3THctll197jLu5PHOgwLRKp7O7FdudZz0XbWOI+y7qfQNviFYtlmJrsrsjqUknlhh12n5cyiMPVK7NP5eZ31Cq7M97XnsrbR4VDtZ5E6Djodtj5xW/fVj3X74DYXAZX9HMTqxKonPeuft4Mb2Y4VZ8ycsGm/uyxqB8nWdHq/JB3V2rn+83Pj5UvvXec91Q+Zf2RXU7fQuXdYKPUsOntZ3woPlZbjyUrPXb37PVo1TVWOa+izKt/3Uq1rGQeDnxwK9rWYhSTeCp3vwhA8hy+g/Eqn8ud+H6NOe9gN8r4pdlUHx6Xcl/mWv1dS+bhI7wXk/HezVW+lSI37DLL+5JOZbD1dDLcH4incv/Z7qvntSkqH8rNRVfm46xPe9Ub5dsTlY/lpqh5B/tM8xl52W+SDvswPDNgrrKEvu29YjWEbrpLNPFU7m9+Tr2NY/PqOJWbgRTdxu4YeXOnkf+p2ihfvJ20yYaDQV6enmOYTryDka/WNVb5YxArKofjU/ngzW+Kyu53tscqvz89T/51NPP3qyyfwd1dXBnNRmfAi9Wo3Gfn2WbqsUSVjwoqC7vywtcle36e/OvYqyznR7qp5YqHdatV+ezZZuqxBJX7WQ3PONevjlN5X/yre3luWx6Px9nc2qt89r6KylHZVFtMu0HtpcHd3UvWV7XjqdxNS8YwHW4Kw1Xu76BfPMfe2yzWV/XZq+w/gNM7rBOVd9Wpr4PZaLKJVK4fw5MLU3ZD2ssZ7BRXtWNeV25vgM6Z/3uqX6u87/27r/Ln4HM5VuOvQ+Vuj9l8VCVSuX1KxXK0zfq68rV1t9T9W9ztJVyqzY8s8aZ6B74En6v80frUrfeLhiq3N3F5uYMdpzPWobLrqo+yx25mMidSuR4095zpXq4f1vVdYRxeyolPPJXrWxzqLX9757p93rl7k0JDXqla31hR31xR59J8olxbe0/f97RXmk/lhqtnL0enbuLTXltTmffltdI20rj6O9kxz2DvHwcn/RNU3R27Zuoe5zbz38s70GuZReVzWePUur32FrErlq/yR/F724eMuWKtNslVrq/xpfp+CqvqsS9G7SZuftzjjf5Pis3j9a3CYH/LV3mI3JyszQxU3prt5PrQvMLYRu+68vdijSrLvpI2xipvvI+528W6HVRHZVvS3CLSP7Wpeef/cP0sUuWbJ1Y7lY+e6qhsy9Lv9nLnHfrnqxep8qcn1p3ZDrZvpfpe0wCVBXuVfdrqrXXfx9IiT3v57iQ6mZ32OmT9iyqb6gyt/k0q00cRqa9Snsvnlb4r9irLvmB7vW8UPzxcre69d6c0+33aJffV22pilTPIV5M7vvoXvupH0i3EmJpsf9CE70oKlQ+d9V6vdZ37/vs37ch4avrnrxOcwd5n9bXK5vaD/oPu+tXdzQ/1EDFW97dNq7PpfBuU7YhoMdEZReT1TTH1rTP31o01emv92qp1r/6eYJwam7G92tHfjQbkqdl2RnkaDqmmBSNNCmlUznq3vOjuh50eN93ITTg2JLuuXI+xnIJtVd1yE4LKQsoc8qweb0Sfg3l/z+AWkXVAsgI5aIHKRqwp2d1jRNUha8rBFlQ2Yk3JbsqjRf95iDXlYAsqG7G2ZDfliSZ3gql7RmJtOdiBykZ8Zj8fT2mvZ/ol+2fxzv9bvPdfsj+Wr9BhWqCyEf7niNc4/S31qlgoqGzEZ/ajc5PHeqbfZH/I/pz9u0jgf9l/UFkNVDZincnuy/us3Cgk++q2yXXmYAEqG7G2ZOW0lww41GZtOdiBykasKdn6YpTvXqc15WALKhuxpmS5RSQFqGwEyQrkoAUqG0GyAjlogcpGkKxADlqgshEkK5CDFslUdkOyWz4vnLo6LSzQYVokUXn39ItSLEhTHZUFOkyLBCrvOnfk2nyPYvrqqCzQYVokUPnWeat2X/eRtjoqC3SYFuYq73pv1E1WX8masjoqC3SYFuYq5563avd9C+mqo7JAh2nBpzKfyqbQYVokOFa+9t6o7ZFMquqoLNBhWiQ5g31vvVGbkfvTV0dlgQ7TItF15ctji5Xiql+K6qgs0GFaJLvba5vlhkcw6aujskCHacE92EaQrEAOWqCyESQrkIMWqGwEyQrkoAUqG0GyAjlogcpGkKxADlqgshEkK5CDFqhsBMkK5KAFKhtBsgI5aIHKRpCsQA5aoLIRJCuQgxaobATJCuSgBSobQbICOWiBykaQrEAOWqCyESQrkIMWqGwEyQrkoAUqG0GyAjlogcpGkKxADlqgshEkK5CDFqhsBMkK5KAFKhtBsgI5aIHKRpCsQA5aoLIRJCuQgxYRVT6pT/Ot/h5aWJiWAz32nGgqn7JP9cm92WdfpZW2+ntQWZiSw0+Dtfzz6TpOW/090VT+zP5aLIbutHuxfJ/Zj4TVQ/JBZce0DLXXcZ60w15VD0knmsoWrfoqaP36qDyduWe4mA5D5XHVdeddEnPPcDEdNm+V62PWNPVfVQ+ZG5Ud81f52VpO3eHv50XlCNVD5kZlByqPqx4yLypHqB4yNyo7UHlc9ZB5UTlC9ZC5UdmByuOqh8yLyhGqh8yNyg5UHlc9ZF5UjlA9ZG5UdqDyuOoh86JyhOohc6OyA5XHVQ+ZF5UjVA+ZG5UdqDyuesi8qByhesjcqOxA5XHVQ+Zdocr74mcvxeQekNhFqR4yNyo71qKyfY+pqnwoF+zo+em8/J+b9zedi/+5PqkxXeW8qNp9GuVWLGcIqByD2Crb9Vj4kqfpMVWVt+WCfXh+un4kcuv5v9sLXaeqfKh+x0cmz4deq3+HgMoxiK2yXY+FLnmqHlPewXZv4/7kdRfncFu1K9+M/6nNqSrL7752Vm5e7gaFgMoxiL+DbdVjYUuerseUVT55Q9uU4X94t6bHJytGakxT+VL+7s3g9bDHvVE5BvFVtuqxsCVP12PKKufeRdsXr12eBOoPv64xReXNJBVROQ7xVbbqsZAlT9lj6mewZXejy7n86dy7Nf307hI1/zdeZX+9cFA5BhpnsG16LGTJU/aYusof5cJ1dzhu1dsdLvY+e3aiIsumqrzjU3kGaKhs02PhZ2MW+ql8HGwD5e06PgZb05Nn+9quMe1Y+f7kOCYMVI6Bhso2PRa25Ol6TF1luVhwbr1yfBypHAdb0+vLJZiq8qnaFRu3A4TKMdBQ2abHwpY8XY+pqyy7Ou0L9W47KZf0Zdu5f/zP9s2RxlSVN49rfNfip/df3Haicgw0VLbpsbAlT9djBirLdmrX+snmSOXe2ZoesucXCeo5p90i0gRdX8YP33qicgx0VLbosdAlT9VjBirLaYZj61/N9vM8+NeziwRSY6rKjmPvtrrz+1neVg+ZG5UdOipb9NhXljxFjxmonFXbJuE02EZ2t5++u2nbv2e6yo5tUflc1gsPGpVjoKOyRY99dcmte8xEZblYILidj+bIZdPamu46kftrxFK55lBFvX//o6gcBS2V9Xts7JJb9ZiJynIW0R0xSKz984nNuUb/cyxNjdgqN/fMvgeVY6Clsn6PjV9ymx4zUbm5cL4fvKXTY2t6eVtdQ2U5eurfYPDV6u9BZUFLZf0em7LkFj1morJcLHDPhpwGP9fc6vZ+J0RH5WZ7/hpUjoGWyvo9NmXJLXrMSOVztV10uzr9MRVk4fPHlvNVDQ2V5bTI+5EeUDkGeipr99iUJbfoMSOV99VW6dlzKpdyW/rqIoHU0NrBfnWlMaR6yNyo7NBTWbvHpu5ga/eYkcpyKuLV06PuKObVRQKpMUXlXe+B8PrV0EsFqBwDPZW1eyxkyVP2mJHK9SPZvofL5FY6d6Tz6iKB1Jii8qGauzu+g9z+/q7yu+ohc6OyQ09l7R4LWfKUPWam8rFazGcjLb27SCA1pqi8f1yuv1bjLskNdndGETFEU2XdHgtZ8pQ9Zqby7kWU58AdkKnHypviZ/pjIV6DhzZF5RhoqqzbY2FLnq7HzFSOQZzTXrviJ8/VGMVfeRQNlWOgqXIM4pz2StFjK1RZo3rI3KjsWIfK8auHzIvKEaqHzI3KDlQeVz1kXlSOUD1kblR2oPK46iHzonKE6iFzo7IDlcdVD5kXlSNUD5kblR2oPK56yLyoHKF6yNyo7EDlcdVD5kXlCNVD5kZlByqPqx4yLypHqB4yNyo7UHlc9ZB5UTlC9ZC5UdmByuOqh8yLyhGqh8yNyg5UHlc9ZF5UjlA9ZG5UdqDyuOoh86JyhOohc6OyA5XHVQ+ZN5LKefaPzD3U9VNxkjf601v/X9mfElZ/DyoLU3L4ob6Of76QKW31Lyc7bZtpNc2vekg6qOyYksPObB37ljFt9S8nOyXovJws3ur8qr8HlYVpOVitY/8ypq3+xWSnN5zFW51r9de5oLLje3TY82VMW/11LpFVzhWn35fT72Zb/RWoLMy7w+q1/HwcrrTVXxFdZfBDsgI5aIHKRpCsQA5aoLIRJCuQgxaobATJCuSgBSobQbICOWiBykaQrEAOWqCyESQrkIMWqGwEyQrkoAUqG0GyAjlogcpGkKxADlqgshEkK5CDFqhsBMkK5KAFKhtBsgI5aIHKRpCsQA5aoLIRJCuQgxaobATJCuSgRS9ZGYqMKfb0lywf+UD50qDDdKZDkWynw+yGIlvX9PdU5swOOkxnuhTJ9tAd8GSt0yDmFZN6XSxzanXY/wGnWri8pAns5gAAAABJRU5ErkJggg==" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<pre class="Agda"
><code
  ><a name="8359"
    >  </a
    ><a name="8374" href="#8374" class="InductiveConstructor"
    >plus-e</a
    ><a name="8380"
    >  </a
    ><a name="8382" class="Symbol"
    >:</a
    ><a name="8383"
    > </a
    ><a name="8384" class="Symbol"
    >&#8704;{</a
    ><a name="8386" href="#8386" class="Bound"
    >w</a
    ><a name="8387"
    > </a
    ><a name="8388" href="#8388" class="Bound"
    >s</a
    ><a name="8389" class="Symbol"
    >}{</a
    ><a name="8391" href="#8391" class="Bound"
    >n</a
    ><a name="8392"
    > </a
    ><a name="8393" href="#8393" class="Bound"
    >m</a
    ><a name="8394" class="Symbol"
    >}{</a
    ><a name="8396" href="#8396" class="Bound"
    >W</a
    ><a name="8397"
    > </a
    ><a name="8398" class="Symbol"
    >:</a
    ><a name="8399"
    > </a
    ><a name="8400" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="8403"
    > </a
    ><a name="8404" class="Symbol"
    >_</a
    ><a name="8405"
    > </a
    ><a name="8406" href="#8386" class="Bound"
    >w</a
    ><a name="8407" class="Symbol"
    >}{</a
    ><a name="8409" href="#8409" class="Bound"
    >S</a
    ><a name="8410"
    > </a
    ><a name="8411" class="Symbol"
    >:</a
    ><a name="8412"
    > </a
    ><a name="8413" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="8416"
    > </a
    ><a name="8417" class="Symbol"
    >_</a
    ><a name="8418"
    > </a
    ><a name="8419" href="#8388" class="Bound"
    >s</a
    ><a name="8420" class="Symbol"
    >}</a
    ><a name="8421"
    >

            </a
    ><a name="8435" class="Comment"
    >----------------------------------------</a
    ><a name="8475"
    >
          </a
    ><a name="8486" class="Symbol"
    >&#8594;</a
    ><a name="8487"
    > </a
    ><a name="8488" class="Symbol"
    >(</a
    ><a name="8489" href="#8391" class="Bound"
    >n</a
    ><a name="8490"
    > </a
    ><a name="8491" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="8492"
    > </a
    ><a name="8493" href="#8393" class="Bound"
    >m</a
    ><a name="8494"
    > </a
    ><a name="8495" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="8496"
    > </a
    ><a name="8497" href="#8396" class="Bound"
    >W</a
    ><a name="8498" class="Symbol"
    >)</a
    ><a name="8499"
    > </a
    ><a name="8500" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="8501"
    > </a
    ><a name="8502" href="#8409" class="Bound"
    >S</a
    ><a name="8503"
    > </a
    ><a name="8504" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="8505"
    > </a
    ><a name="8506" href="#4800" class="InductiveConstructor"
    >plus</a
    ><a name="8510"
    > </a
    ><a name="8511" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="8512"
    > </a
    ><a name="8513" class="Symbol"
    >(</a
    ><a name="8514" href="#8393" class="Bound"
    >m</a
    ><a name="8515"
    > </a
    ><a name="8516" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#230" class="Primitive Operator"
    >+</a
    ><a name="8517"
    > </a
    ><a name="8518" href="#8391" class="Bound"
    >n</a
    ><a name="8519"
    > </a
    ><a name="8520" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="8521"
    > </a
    ><a name="8522" href="#8396" class="Bound"
    >W</a
    ><a name="8523" class="Symbol"
    >)</a
    ><a name="8524"
    > </a
    ><a name="8525" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="8526"
    > </a
    ><a name="8527" href="#8409" class="Bound"
    >S</a
    ></code
  ></pre
>
<ul>
<li><img width=59 alt="\mathtt{times}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAAAWCAQAAAABDPidAAACD0lEQVR4nNWWUZnDIAyAsYAFLNQCFrCAhVrAAhZmAQu1UAuzsAMCNEmh3XXb7bvkZSsh+YEQIsRV0UJenvsVCeIhlm9DVJminss9It8/zvKkJBh1amXiPps/oHlKHlH1tyF+J/8IeYqgSRPyXH4npUmihiN1TEY1wpUboaKvuZtoacRFtYPKM5VxsLD7NJwyak8DsbujEX794OtNrOWXjVotKbSMVtjPvKNZCMPgsrsIF3LxSuUrNKWrm8tXcCnYWA3ko7cayGU8j+xUGzFxjs8z3G58zfurM9ejE43t1Xku664TjcKH5klmgE2WvClbOsBZbKXVsSXCl48iyxbmVr6vyNbmHab56wlk+kfPVh+/Aq8i19x36LgDsl1YGiQxBMnmU+EJefAKvIpcd8shPxiZV6Sklnnz7eq7bHsiryLXHewjjysT9WZZTXFHTdhnkWXZvb3yZIEFmlYxljE0RZaD9V1Fhsp+3J2k/oW2ZirfAD+wZ8j4Er0H2Qv+PCWx6DkJqNZs0AfNLkX2b0dWAl5GLBPxFlidrrP2Cy2Cj0APM/s6cipY8ODINutOgAB5RXF1tzQ2MWVCfZTpU1v7B6oGhYJg9XdAc7aQc/mSGoN1d7lC8wuNw96iA7224HRlirRFm0Iebq2Mbr/XeMB1Dl781GovRME4PntwaHs4R1dUp7l8v0zdKLLlMbSzTH4AhvO4mvoOeg4AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, pops two numbers from <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and pushes their product back to <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>.</li>
</ul>
<p><img width=323 alt=" \newcommand{\blktriangle}{\scriptstyle \blacktriangle} \def\g#1{\save [].[ddddddrrr]!C=&quot;g#1&quot;*[F]\frm{}\restore}% \xymatrix@R=0.01em@C=0.4em{ \g1 &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp; \g2 &amp;              &amp;               &amp; &amp;\\ &amp; 7            &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp;\\ &amp; \blktriangle &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp;\\ &amp; 3            &amp; 5              &amp; &amp; &amp; &amp; &amp; &amp;    &amp; 21            &amp; 5             &amp; &amp;\\ &amp; {}^\bullet     &amp; {}^\bullet       &amp; &amp; &amp; &amp; &amp; &amp;    &amp; {}^\bullet &amp; {}^\bullet &amp; &amp;\\ &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}} &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}} &amp; &amp; &amp; &amp; &amp; &amp;    &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}}  &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}}  &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp; \ar^*{\mathtt{times}} &quot;g1&quot;;&quot;g2&quot; } " height=155 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<pre class="Agda"
><code
  ><a name="9496"
    >  </a
    ><a name="9511" href="#9511" class="InductiveConstructor"
    >times-e</a
    ><a name="9518"
    > </a
    ><a name="9519" class="Symbol"
    >:</a
    ><a name="9520"
    > </a
    ><a name="9521" class="Symbol"
    >&#8704;{</a
    ><a name="9523" href="#9523" class="Bound"
    >w</a
    ><a name="9524"
    > </a
    ><a name="9525" href="#9525" class="Bound"
    >s</a
    ><a name="9526" class="Symbol"
    >}{</a
    ><a name="9528" href="#9528" class="Bound"
    >n</a
    ><a name="9529"
    > </a
    ><a name="9530" href="#9530" class="Bound"
    >m</a
    ><a name="9531" class="Symbol"
    >}{</a
    ><a name="9533" href="#9533" class="Bound"
    >W</a
    ><a name="9534"
    > </a
    ><a name="9535" class="Symbol"
    >:</a
    ><a name="9536"
    > </a
    ><a name="9537" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="9540"
    > </a
    ><a name="9541" class="Symbol"
    >_</a
    ><a name="9542"
    > </a
    ><a name="9543" href="#9523" class="Bound"
    >w</a
    ><a name="9544" class="Symbol"
    >}{</a
    ><a name="9546" href="#9546" class="Bound"
    >S</a
    ><a name="9547"
    > </a
    ><a name="9548" class="Symbol"
    >:</a
    ><a name="9549"
    > </a
    ><a name="9550" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="9553"
    > </a
    ><a name="9554" class="Symbol"
    >_</a
    ><a name="9555"
    > </a
    ><a name="9556" href="#9525" class="Bound"
    >s</a
    ><a name="9557" class="Symbol"
    >}</a
    ><a name="9558"
    >

            </a
    ><a name="9572" class="Comment"
    >-----------------------------------------</a
    ><a name="9613"
    >
          </a
    ><a name="9624" class="Symbol"
    >&#8594;</a
    ><a name="9625"
    > </a
    ><a name="9626" class="Symbol"
    >(</a
    ><a name="9627" href="#9528" class="Bound"
    >n</a
    ><a name="9628"
    > </a
    ><a name="9629" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="9630"
    > </a
    ><a name="9631" href="#9530" class="Bound"
    >m</a
    ><a name="9632"
    > </a
    ><a name="9633" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="9634"
    > </a
    ><a name="9635" href="#9533" class="Bound"
    >W</a
    ><a name="9636" class="Symbol"
    >)</a
    ><a name="9637"
    > </a
    ><a name="9638" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="9639"
    > </a
    ><a name="9640" href="#9546" class="Bound"
    >S</a
    ><a name="9641"
    > </a
    ><a name="9642" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="9643"
    > </a
    ><a name="9644" href="#4850" class="InductiveConstructor"
    >times</a
    ><a name="9649"
    > </a
    ><a name="9650" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="9651"
    > </a
    ><a name="9652" class="Symbol"
    >(</a
    ><a name="9653" href="#9530" class="Bound"
    >m</a
    ><a name="9654"
    > </a
    ><a name="9655" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#433" class="Primitive Operator"
    >*</a
    ><a name="9656"
    > </a
    ><a name="9657" href="#9528" class="Bound"
    >n</a
    ><a name="9658"
    > </a
    ><a name="9659" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="9660"
    > </a
    ><a name="9661" href="#9533" class="Bound"
    >W</a
    ><a name="9662" class="Symbol"
    >)</a
    ><a name="9663"
    > </a
    ><a name="9664" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="9665"
    > </a
    ><a name="9666" href="#9546" class="Bound"
    >S</a
    ></code
  ></pre
>
<ul>
<li><img width=49 alt="\mathtt{push}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAAAdCAQAAACnUjK1AAAB9klEQVR4nO2X7dGDIAyAs4IruAIruAIrsIIrsIIruAIruAIruIKFgEAC1dre+fa9azh/wOXjARJAgHtlwCZujnooI2yxDX+NkkXADAbW74IKYn5QL8oFqCE2Lz0o0O7rn2oErdCnWl6ES2mNTUHnPtmE6jDK2LCPkutCOsUtNe1MucaOtca+YUBLYb+h1tqAKqOMbSgBU6wL/1mc5YQGS8TKGjvU6PoLg+qTvcLAJoblUCFSjnKwncHFlFZHoLGuZpllYFAa7YGN1FB5soBY1KZSt2RkQAc90TiCmjABuId6+9aEBE6fp0Clzvd3IWNnUAqnRbHGRqKXq899NKD47vrln1+GgpgjftRXVitXvA/1GZQiJudQ3mIm1aeLrXrVxwnUeBkqiMDDhSf1m1CKjdF6OnMoXY8+THrMyrK63oCixdnhoaCIRulQMYeGZOCO5dfqI6iNzHRih4RhJW8aUFu1VrXOZSgbnXaxkkqIuViJLh6MNZQtgg64fVcO4AbUEgPtFwTNsSEGNcWlFGpMFlAhub2OJYkuk/4+GQNlnUoOlOcgo6utStrg2EIudpHCBIcThMvWplC2WCVZIIQ8o5f3AZQXcfji6Z8+/rs03pNnzgfy39+E98kP6lwEvgItnuj62fP0btGkNLdzgzukS/8qX/Cv/wCZ6IuU0rsHswAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-6px;"/>, pops a number from <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and pushes it to <img width=15 alt="\mathsf{S}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAZCAQAAABwKX1bAAAA00lEQVR4nJVUURXDIAw8C1ioBSzMAhawUAtYwMIs1AIWagELXQphGxAe9PgqzR1JuAD0MHA4aDlaWvj/hxdOXNU6YUfBlkPeSdkh8LcInX4FbNVpd1oiDgqOUEKCAlTSduOyWo07XFSSoJ+pg/KWcx/AcWcWE1LfPgeimvk5P0K5rulJe2MDP09rIzv4VPoiIcMyxawSio+W4RNh+Tb2Z+bIMzCZqjqZ2G/rZjDK7qCVlh1Zz1K2XS9DvS3XEnhWsyHiqExFIe07EGZFaiJ5fmc63Q8Z3HqXVGvRLQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>.</li>
</ul>
<p><img width=323 alt=" \newcommand{\blktriangle}{\scriptstyle \blacktriangle} \def\g#1{\save [].[ddddddrrr]!C=&quot;g#1&quot;*[F]\frm{}\restore}% \xymatrix@R=0.01em@C=0.4em{ \g1 &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp; \g2 &amp;              &amp;               &amp; &amp;\\ &amp;                  &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp; 21            &amp; &amp;\\ &amp;                  &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp; \blktriangle              &amp; &amp;\\ &amp; 21               &amp; 5              &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp; 5             &amp; &amp;\\ &amp; {}^\bullet       &amp; {}^\bullet       &amp; &amp; &amp; &amp; &amp; &amp;    &amp; {}^\bullet &amp; {}^\bullet &amp; &amp;\\ &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}} &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}} &amp; &amp; &amp; &amp; &amp; &amp;    &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}}  &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}}  &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp; \ar^*{\mathtt{push}} &quot;g1&quot;;&quot;g2&quot; } " height=155 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<pre class="Agda"
><code
  ><a name="10640"
    >  </a
    ><a name="10655" href="#10655" class="InductiveConstructor"
    >push-e</a
    ><a name="10661"
    >  </a
    ><a name="10663" class="Symbol"
    >:</a
    ><a name="10664"
    > </a
    ><a name="10665" class="Symbol"
    >&#8704;{</a
    ><a name="10667" href="#10667" class="Bound"
    >w</a
    ><a name="10668"
    > </a
    ><a name="10669" href="#10669" class="Bound"
    >s</a
    ><a name="10670" class="Symbol"
    >}{</a
    ><a name="10672" href="#10672" class="Bound"
    >n</a
    ><a name="10673" class="Symbol"
    >}{</a
    ><a name="10675" href="#10675" class="Bound"
    >W</a
    ><a name="10676"
    > </a
    ><a name="10677" class="Symbol"
    >:</a
    ><a name="10678"
    > </a
    ><a name="10679" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="10682"
    > </a
    ><a name="10683" class="Symbol"
    >_</a
    ><a name="10684"
    > </a
    ><a name="10685" href="#10667" class="Bound"
    >w</a
    ><a name="10686" class="Symbol"
    >}{</a
    ><a name="10688" href="#10688" class="Bound"
    >S</a
    ><a name="10689"
    > </a
    ><a name="10690" class="Symbol"
    >:</a
    ><a name="10691"
    > </a
    ><a name="10692" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="10695"
    > </a
    ><a name="10696" class="Symbol"
    >_</a
    ><a name="10697"
    > </a
    ><a name="10698" href="#10669" class="Bound"
    >s</a
    ><a name="10699" class="Symbol"
    >}</a
    ><a name="10700"
    >

            </a
    ><a name="10714" class="Comment"
    >--------------------------------</a
    ><a name="10746"
    >
          </a
    ><a name="10757" class="Symbol"
    >&#8594;</a
    ><a name="10758"
    > </a
    ><a name="10759" class="Symbol"
    >(</a
    ><a name="10760" href="#10672" class="Bound"
    >n</a
    ><a name="10761"
    > </a
    ><a name="10762" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="10763"
    > </a
    ><a name="10764" href="#10675" class="Bound"
    >W</a
    ><a name="10765" class="Symbol"
    >)</a
    ><a name="10766"
    > </a
    ><a name="10767" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="10768"
    > </a
    ><a name="10769" href="#10688" class="Bound"
    >S</a
    ><a name="10770"
    > </a
    ><a name="10771" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="10772"
    > </a
    ><a name="10773" href="#4900" class="InductiveConstructor"
    >push</a
    ><a name="10777"
    > </a
    ><a name="10778" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="10779"
    > </a
    ><a name="10780" href="#10675" class="Bound"
    >W</a
    ><a name="10781"
    > </a
    ><a name="10782" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="10783"
    > </a
    ><a name="10784" class="Symbol"
    >(</a
    ><a name="10785" href="#10672" class="Bound"
    >n</a
    ><a name="10786"
    > </a
    ><a name="10787" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="10788"
    > </a
    ><a name="10789" href="#10688" class="Bound"
    >S</a
    ><a name="10790" class="Symbol"
    >)</a
    ></code
  ></pre
>
<ul>
<li><img width=71 alt="\mathtt{pick}\ n" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAAAdCAQAAAAHzVpbAAACcElEQVR4nO1Yi9GDIAx2BVZgBVZgBVdwBVdgBVdwBVZwBVZwBf/IS15B8bd3ba8f196pScgXSIh23V3wjtzQYqDH4f9NIbutW5q1GGiZMbzApwewgmtrsxbpJgiIAl3xAp8eQA/u9Td1xfvS+g9+tCL0oDUGhYrB1X6H1pS4HTsopLSAX65AvRyvm4Pnwo4hqZkHLRJYq1dWBgXKFJtJXw86Q81YcU9GL9Trad0QyWRr8AwvGTyY1EiGeXjQmiOpGbU3goU9PM5DBWMP2OS9RKOx1yhT37ZIaYmIjSC1DxO7Msz0u43eB0kWafVARdlZ5koJYtYHaYM0RrbcCqKQVsgRYZpkKRYcpcWz+M3JdZhbZoYTtyLNLTrMSRa0AqSOcu5kvndxWrK6nZxzhhYeNlwznXW5RmtM7i2FezgthoQhdU5oG2tjv1GiJa/R4gVTefQxWuP5JJbWUE92VPMhWkNRDaMlLmSK0CXitDgjmg/RKse/RqueWc65TZ+NbQ3zdJ9WutfL8cdoDVnRySGCk0w2bcTSe8NFWjEFgqQ1RssU3HwjhxbCAm/sX22aSxQu0orPhQmJPl7gjUZ4hNNENu4JeUOGYbTcCpKyHWn7A2aFJtus5MBpEd03KL9iNDtZ0lb3eobJLm/ZjqUYdGeDqC323JY+sQ/QpNc7+sgQzEopb8U1YLG+0rGd/PV6uhklUjLcyM9XL8J1K7lZcvFXBxq1urg5AlFT3lmRNGNx570Ed85p5evRI75mtIwDadq3g56+vLSi/OpCzz76lM6tL8CP1ifh62gx/T6sdJchsEL5eRBJyf4SxN+A3vYb+VX8AQc9zclRdsmBAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/> (where <strong><em>Error:</em>LaTeX failed:<br />
<code>This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) (preloaded format=latex)
 restricted \write18 enabled.
entering extended mode
(./working.tex
LaTeX2e &lt;2016/03/31&gt;
Babel &lt;3.9r&gt; and hyphenation patterns for 83 language(s) loaded.

(/usr/local/texlive/2016/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2016/texmf-dist/tex/latex/base/size12.clo))
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsmath.sty
For additional information on amsmath, use the `?' option.
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amstext.sty
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsgen.sty))
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsbsy.sty)
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsopn.sty))
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/amssymb.sty
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/amsfonts.sty))
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xy.sty
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xy.tex Bootstrap'ing:
catcodes, docmode,
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyrecat.tex)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyidioms.tex)

 Xy-pic version 3.8.9 &lt;2013/10/06&gt;
 Copyright (c) 1991-2013 by Kristoffer H. Rose &lt;krisrose@tug.org&gt; and others
 Xy-pic is free software: see the User's Guide for details.

Loading kernel: messages; fonts; allocations: state, direction,
utility macros; pictures: \xy, positions, objects, decorations;
kernel objects: directionals, circles, text; options; algorithms: directions,
edges, connections;  Xy-pic loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/ifpdf.sty)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyall.tex
 Xy-pic option: All features v.3.8
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xycurve.tex
 Xy-pic option: Curve and Spline extension v.3.12 curve, circles, loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyframe.tex
 Xy-pic option: Frame and Bracket extension v.3.14 loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xycmtip.tex
 Xy-pic option: Computer Modern tip extension v.3.7
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xytips.tex
 Xy-pic option: More Tips extension v.3.11 loaded) loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyline.tex
 Xy-pic option: Line styles extension v.3.10 loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyrotate.tex
 Xy-pic option: Rotate and Scale extension v.3.8 loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xycolor.tex
 Xy-pic option: Colour extension v.3.11 loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xymatrix.tex
 Xy-pic option: Matrix feature v.3.14 loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xyarrow.tex
 Xy-pic option: Arrow and Path feature v.3.9 path, \ar, loaded)
(/usr/local/texlive/2016/texmf-dist/tex/generic/xypic/xygraph.tex
 Xy-pic option: Graph feature v.3.11 loaded) loaded))
(/usr/local/texlive/2016/texmf-dist/tex/latex/xcolor/xcolor.sty
(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics-cfg/color.cfg)
(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/dvips.def)
(/usr/local/texlive/2016/texmf-dist/tex/latex/colortbl/colortbl.sty
(/usr/local/texlive/2016/texmf-dist/tex/latex/tools/array.sty))
(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/dvipsnam.def)
(/usr/local/texlive/2016/texmf-dist/tex/latex/xcolor/svgnam.def))
(/usr/local/texlive/2016/texmf-dist/tex/latex/stmaryrd/stmaryrd.sty)
(/usr/local/texlive/2016/texmf-dist/tex/latex/ccfonts/ccfonts.sty)
(/usr/local/texlive/2016/texmf-dist/tex/latex/eulervm/eulervm.sty)
No file working.aux.
(/usr/local/texlive/2016/texmf-dist/tex/latex/concmath/ot1ccr.fd)
(/usr/local/texlive/2016/texmf-dist/tex/latex/eulervm/uzeur.fd)
(/usr/local/texlive/2016/texmf-dist/tex/latex/eulervm/uzeus.fd)
(/usr/local/texlive/2016/texmf-dist/tex/latex/eulervm/uzeuex.fd)
(/usr/local/texlive/2016/texmf-dist/tex/latex/stmaryrd/Ustmry.fd)

! LaTeX Error: \begin{math} on input line 5 ended by \end{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H &lt;return&gt;  for immediate help.
 ...                                              
                                                  
l.7 \end{document}
                  
! Missing $ inserted.
&lt;inserted text&gt; 
                $
l.7 \end{document}
                  
[1] (./working.aux) )
(\end occurred inside a group at level 1)

### semi simple group (level 1) entered at line 5 (\begingroup)
### bottom level
(see the transcript file for additional information)
Output written on working.dvi (1 page, 488 bytes).
Transcript written on working.log.

</code></strong> ), pushes the number at position <img width=19 alt="n" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAARCAQAAABkmgTBAAAApUlEQVR4nM2SURHEIAxE1wIWagELZwELtYCFWKiWWMBCLZyFXprQDqXQueF+bvnKsi9kmAClAggR7qy9VLsz4UEeCZueResZa643vPtolEuSsAWDQKvUJE3Mof57NiDnF+J5Q8UUD7KYLxynDn8HXpVGQf5PcBkF91AaBevQT+AxhestH+ve3D1bilkXsQu2Puc4sUlp6N4zZIgvq1jJNd0Jrxr6AAYmZxGAKjAIAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> from the top of <img width=15 alt="\mathsf{S}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAZCAQAAABwKX1bAAAA00lEQVR4nJVUURXDIAw8C1ioBSzMAhawUAtYwMIs1AIWagELXQphGxAe9PgqzR1JuAD0MHA4aDlaWvj/hxdOXNU6YUfBlkPeSdkh8LcInX4FbNVpd1oiDgqOUEKCAlTSduOyWo07XFSSoJ+pg/KWcx/AcWcWE1LfPgeimvk5P0K5rulJe2MDP09rIzv4VPoiIcMyxawSio+W4RNh+Tb2Z+bIMzCZqjqZ2G/rZjDK7qCVlh1Zz1K2XS9DvS3XEnhWsyHiqExFIe07EGZFaiJ5fmc63Q8Z3HqXVGvRLQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> onto <img width=24 alt="\mathsf{W}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAQAAADJ5yUQAAABOElEQVR4nIVVURXDIAzEQi3MQi3UAhZmoRawUAtYwAIWamEWWF4SaAKh3L4WAnfkQuoc4esK/E434sCV21hx7oKVrEMfTI9GcsCVAhkjboiHPpgh+DOSM+opoLnHjgSHzdyHNzw+mmpPm5pq0Qv1EEuTLfbxgDKWDssZmKRXW8wLM0OBy0jcfMCo1k8twAtoDipnJdFqg6GfQS1wdUdHQSLVZst6eRHZerE1KWnzHelgvZRbYFOFrMJPqf1Ouo7h1UPxSt81/DOtlxpqQhg0aH3Wy2yIzScq51OVTajd59ZXnK2Im+nT46E9Dxr21nre7BxSm96sr7jxddE2nfw8FN0KE1zMm1UjEIp4eUt45p2994RaX60nbNwC8wmUVtZXJEy3RsSH5/fCesn7NqWX1lfsi++GnhCMP10l0wtFP8UJAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/>.</li>
</ul>
<p><img width=323 alt=" \newcommand{\blktriangle}{\scriptstyle \blacktriangle} \def\g#1{\save [].[ddddddrrr]!C=&quot;g#1&quot;*[F]\frm{}\restore}% \xymatrix@R=0.01em@C=0.4em{ \g1 &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp; \g2 &amp;              &amp;               &amp; &amp;\\ &amp;                  &amp; 21             &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp; 21            &amp; &amp;\\ &amp;                  &amp; \blktriangle   &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp; \blktriangle              &amp; &amp;\\ &amp;                  &amp; 5              &amp; &amp; &amp; &amp; &amp; &amp;    &amp;  5            &amp; 5             &amp; &amp;\\ &amp; {}^\bullet       &amp; {}^\bullet       &amp; &amp; &amp; &amp; &amp; &amp;    &amp; {}^\bullet &amp; {}^\bullet &amp; &amp;\\ &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}} &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}} &amp; &amp; &amp; &amp; &amp; &amp;    &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}}  &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}}  &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp; \ar^*{\mathtt{pick}\ 1} &quot;g1&quot;;&quot;g2&quot; } " height=155 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<pre class="Agda"
><code
  ><a name="11825"
    >  </a
    ><a name="11840" href="#11840" class="InductiveConstructor"
    >pick-e</a
    ><a name="11846"
    >  </a
    ><a name="11848" class="Symbol"
    >:</a
    ><a name="11849"
    > </a
    ><a name="11850" class="Symbol"
    >&#8704;{</a
    ><a name="11852" href="#11852" class="Bound"
    >w</a
    ><a name="11853"
    > </a
    ><a name="11854" href="#11854" class="Bound"
    >s</a
    ><a name="11855" class="Symbol"
    >}{</a
    ><a name="11857" href="#11857" class="Bound"
    >x</a
    ><a name="11858" class="Symbol"
    >}{</a
    ><a name="11860" href="#11860" class="Bound"
    >n</a
    ><a name="11861" class="Symbol"
    >}{</a
    ><a name="11863" href="#11863" class="Bound"
    >W</a
    ><a name="11864"
    > </a
    ><a name="11865" class="Symbol"
    >:</a
    ><a name="11866"
    > </a
    ><a name="11867" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="11870"
    > </a
    ><a name="11871" class="Symbol"
    >_</a
    ><a name="11872"
    > </a
    ><a name="11873" href="#11852" class="Bound"
    >w</a
    ><a name="11874" class="Symbol"
    >}{</a
    ><a name="11876" href="#11876" class="Bound"
    >S</a
    ><a name="11877"
    > </a
    ><a name="11878" class="Symbol"
    >:</a
    ><a name="11879"
    > </a
    ><a name="11880" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="11883"
    > </a
    ><a name="11884" class="Symbol"
    >_</a
    ><a name="11885"
    > </a
    ><a name="11886" href="#11854" class="Bound"
    >s</a
    ><a name="11887" class="Symbol"
    >}</a
    ><a name="11888"
    >

          </a
    ><a name="11900" class="Symbol"
    >&#8594;</a
    ><a name="11901"
    > </a
    ><a name="11902" href="#11876" class="Bound"
    >S</a
    ><a name="11903"
    > </a
    ><a name="11904" href="http://agda.github.io/agda-stdlib/Data.Vec.html#869" class="Datatype Operator"
    >[</a
    ><a name="11905"
    > </a
    ><a name="11906" href="#11857" class="Bound"
    >x</a
    ><a name="11907"
    > </a
    ><a name="11908" href="http://agda.github.io/agda-stdlib/Data.Vec.html#869" class="Datatype Operator"
    >]=</a
    ><a name="11910"
    > </a
    ><a name="11911" href="#11860" class="Bound"
    >n</a
    ><a name="11912"
    >
            </a
    ><a name="11925" class="Comment"
    >----------------------------</a
    ><a name="11953"
    >
          </a
    ><a name="11964" class="Symbol"
    >&#8594;</a
    ><a name="11965"
    > </a
    ><a name="11966" href="#11863" class="Bound"
    >W</a
    ><a name="11967"
    > </a
    ><a name="11968" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="11969"
    > </a
    ><a name="11970" href="#11876" class="Bound"
    >S</a
    ><a name="11971"
    > </a
    ><a name="11972" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="11973"
    > </a
    ><a name="11974" href="#4944" class="InductiveConstructor"
    >pick</a
    ><a name="11978"
    > </a
    ><a name="11979" href="#11857" class="Bound"
    >x</a
    ><a name="11980"
    > </a
    ><a name="11981" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="11982"
    > </a
    ><a name="11983" class="Symbol"
    >(</a
    ><a name="11984" href="#11860" class="Bound"
    >n</a
    ><a name="11985"
    > </a
    ><a name="11986" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="11987"
    > </a
    ><a name="11988" href="#11863" class="Bound"
    >W</a
    ><a name="11989" class="Symbol"
    >)</a
    ><a name="11990"
    > </a
    ><a name="11991" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="11992"
    > </a
    ><a name="11993" href="#11876" class="Bound"
    >S</a
    ></code
  ></pre
>
<ul>
<li><img width=37 alt="\mathtt{pop}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAXCAQAAAD0dUR2AAABX0lEQVR4nO1WbQ0DIQytBSxgAQtYOAtYOAtYwMIsnAUsYGEWNugBgdIMyPZzJZdc+sp7BcoHQDGdWzIJBmz8JPCmIpqaIv4NjhNeuR0x7FWbBUEiJVwNfjWE6xyYs4udnxFOX8D8HYb7LlxWXMcvYLza5Gjszt1VWGFX20R4HFXBBRL6TQ4SHDqPxu5l2gzibbYCR2k2OAbBk/h843swuMExr3MMgpr40vI/8n/KlFamQu86x1SwHUFPDax3xjEVPIkgXQuxIHh+EjTEZ7Hmbnsy+IHbYJ1jEOwB0Yk4JlNH+sw4BsG+LFxX5DqfI0A87RTOOBjBkMNFPidaAYsTWEr8wNzdJgcJ9vmMLCcmnQqXCS/c8uParHB0wTpmE+rRTHddMlPxwFCtcXTBydRQ2r3JiPMXzzoH8Hto17Y4/oI/5LhfKQHL3PJXyW852jcIfyfMbYtD1BdXah92zrccb5QHMN7x5xpvAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>, removes the top number from <img width=15 alt="\mathsf{S}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAZCAQAAABwKX1bAAAA00lEQVR4nJVUURXDIAw8C1ioBSzMAhawUAtYwMIs1AIWagELXQphGxAe9PgqzR1JuAD0MHA4aDlaWvj/hxdOXNU6YUfBlkPeSdkh8LcInX4FbNVpd1oiDgqOUEKCAlTSduOyWo07XFSSoJ+pg/KWcx/AcWcWE1LfPgeimvk5P0K5rulJe2MDP09rIzv4VPoiIcMyxawSio+W4RNh+Tb2Z+bIMzCZqjqZ2G/rZjDK7qCVlh1Zz1K2XS9DvS3XEnhWsyHiqExFIe07EGZFaiJ5fmc63Q8Z3HqXVGvRLQAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/>.</li>
</ul>
<p><img width=323 alt=" \newcommand{\blktriangle}{\scriptstyle \blacktriangle} \def\g#1{\save [].[ddddddrrr]!C=&quot;g#1&quot;*[F]\frm{}\restore}% \xymatrix@R=0.01em@C=0.4em{ \g1 &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp; \g2 &amp;              &amp;               &amp; &amp;\\ &amp;                  &amp; 21             &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp;\\ &amp;                  &amp; \blktriangle   &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;                           &amp; &amp;\\ &amp; 5                &amp; 5              &amp; &amp; &amp; &amp; &amp; &amp;    &amp;  5            &amp; 5             &amp; &amp;\\ &amp; {}^\bullet       &amp; {}^\bullet       &amp; &amp; &amp; &amp; &amp; &amp;    &amp; {}^\bullet &amp; {}^\bullet &amp; &amp;\\ &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}} &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}} &amp; &amp; &amp; &amp; &amp; &amp;    &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{W}}  &amp; *+=&lt;18pt,18pt&gt;[F-,]{\mathsf{S}}  &amp; &amp;\\ &amp;              &amp;                &amp; &amp; &amp; &amp; &amp; &amp;    &amp;               &amp;               &amp; &amp; \ar^*{\mathtt{pop}} &quot;g1&quot;;&quot;g2&quot; } " height=155 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-147px;"/></p>
<pre class="Agda"
><code
  ><a name="12944"
    >  </a
    ><a name="12959" href="#12959" class="InductiveConstructor"
    >pop-e</a
    ><a name="12964"
    >   </a
    ><a name="12967" class="Symbol"
    >:</a
    ><a name="12968"
    > </a
    ><a name="12969" class="Symbol"
    >&#8704;{</a
    ><a name="12971" href="#12971" class="Bound"
    >w</a
    ><a name="12972"
    > </a
    ><a name="12973" href="#12973" class="Bound"
    >s</a
    ><a name="12974" class="Symbol"
    >}{</a
    ><a name="12976" href="#12976" class="Bound"
    >n</a
    ><a name="12977" class="Symbol"
    >}{</a
    ><a name="12979" href="#12979" class="Bound"
    >W</a
    ><a name="12980"
    > </a
    ><a name="12981" class="Symbol"
    >:</a
    ><a name="12982"
    > </a
    ><a name="12983" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="12986"
    > </a
    ><a name="12987" class="Symbol"
    >_</a
    ><a name="12988"
    > </a
    ><a name="12989" href="#12971" class="Bound"
    >w</a
    ><a name="12990" class="Symbol"
    >}{</a
    ><a name="12992" href="#12992" class="Bound"
    >S</a
    ><a name="12993"
    > </a
    ><a name="12994" class="Symbol"
    >:</a
    ><a name="12995"
    > </a
    ><a name="12996" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="12999"
    > </a
    ><a name="13000" class="Symbol"
    >_</a
    ><a name="13001"
    > </a
    ><a name="13002" href="#12973" class="Bound"
    >s</a
    ><a name="13003" class="Symbol"
    >}</a
    ><a name="13004"
    >

            </a
    ><a name="13018" class="Comment"
    >-------------------------</a
    ><a name="13043"
    >
          </a
    ><a name="13054" class="Symbol"
    >&#8594;</a
    ><a name="13055"
    > </a
    ><a name="13056" href="#12979" class="Bound"
    >W</a
    ><a name="13057"
    > </a
    ><a name="13058" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="13059"
    > </a
    ><a name="13060" class="Symbol"
    >(</a
    ><a name="13061" href="#12976" class="Bound"
    >n</a
    ><a name="13062"
    > </a
    ><a name="13063" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="13064"
    > </a
    ><a name="13065" href="#12992" class="Bound"
    >S</a
    ><a name="13066" class="Symbol"
    >)</a
    ><a name="13067"
    > </a
    ><a name="13068" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="13069"
    > </a
    ><a name="13070" href="#4990" class="InductiveConstructor"
    >pop</a
    ><a name="13073"
    > </a
    ><a name="13074" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="13075"
    > </a
    ><a name="13076" href="#12979" class="Bound"
    >W</a
    ><a name="13077"
    > </a
    ><a name="13078" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="13079"
    > </a
    ><a name="13080" href="#12992" class="Bound"
    >S</a
    ></code
  ></pre
>
<p>As programs are lists of instructions, the evaluation of programs is naturally specified as a list of evaluations of instructions:</p>
<pre class="Agda"
><code
  ><a name="13226"
    ></a
    ><a name="13239" class="Keyword"
    >infixl</a
    ><a name="13245"
    > </a
    ><a name="13246" class="Number"
    >5</a
    ><a name="13247"
    > </a
    ><a name="13248" href="#13264" class="Datatype Operator"
    >_&#8739;_&#8739;_&#8659;_&#8739;_</a
    ><a name="13257"
    >

</a
    ><a name="13259" class="Keyword"
    >data</a
    ><a name="13263"
    > </a
    ><a name="13264" href="#13264" class="Datatype Operator"
    >_&#8739;_&#8739;_&#8659;_&#8739;_</a
    ><a name="13273"
    > </a
    ><a name="13274" class="Symbol"
    >{</a
    ><a name="13275" href="#13275" class="Bound"
    >w</a
    ><a name="13276"
    > </a
    ><a name="13277" href="#13277" class="Bound"
    >s</a
    ><a name="13278"
    > </a
    ><a name="13279" class="Symbol"
    >:</a
    ><a name="13280"
    > </a
    ><a name="13281" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13282" class="Symbol"
    >}(</a
    ><a name="13284" href="#13284" class="Bound"
    >W</a
    ><a name="13285"
    > </a
    ><a name="13286" class="Symbol"
    >:</a
    ><a name="13287"
    > </a
    ><a name="13288" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13291"
    > </a
    ><a name="13292" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13293"
    > </a
    ><a name="13294" href="#13275" class="Bound"
    >w</a
    ><a name="13295" class="Symbol"
    >)(</a
    ><a name="13297" href="#13297" class="Bound"
    >S</a
    ><a name="13298"
    > </a
    ><a name="13299" class="Symbol"
    >:</a
    ><a name="13300"
    > </a
    ><a name="13301" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13304"
    > </a
    ><a name="13305" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13306"
    > </a
    ><a name="13307" href="#13277" class="Bound"
    >s</a
    ><a name="13308" class="Symbol"
    >)</a
    ><a name="13309"
    > </a
    ><a name="13310" class="Symbol"
    >:</a
    ><a name="13311"
    > </a
    ><a name="13312" class="Symbol"
    >&#8704;{</a
    ><a name="13314" href="#13314" class="Bound"
    >w&#8242;</a
    ><a name="13316"
    > </a
    ><a name="13317" href="#13317" class="Bound"
    >s&#8242;</a
    ><a name="13319" class="Symbol"
    >}</a
    ><a name="13320"
    >
   </a
    ><a name="13324" class="Symbol"
    >&#8594;</a
    ><a name="13325"
    > </a
    ><a name="13326" href="#5303" class="Datatype"
    >SM</a
    ><a name="13328"
    > </a
    ><a name="13329" href="#13275" class="Bound"
    >w</a
    ><a name="13330"
    > </a
    ><a name="13331" href="#13277" class="Bound"
    >s</a
    ><a name="13332"
    > </a
    ><a name="13333" href="#13314" class="Bound"
    >w&#8242;</a
    ><a name="13335"
    > </a
    ><a name="13336" href="#13317" class="Bound"
    >s&#8242;</a
    ><a name="13338"
    >
   </a
    ><a name="13342" class="Symbol"
    >&#8594;</a
    ><a name="13343"
    > </a
    ><a name="13344" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13347"
    > </a
    ><a name="13348" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13349"
    > </a
    ><a name="13350" href="#13314" class="Bound"
    >w&#8242;</a
    ><a name="13352"
    > </a
    ><a name="13353" class="Symbol"
    >&#8594;</a
    ><a name="13354"
    > </a
    ><a name="13355" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13358"
    > </a
    ><a name="13359" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13360"
    > </a
    ><a name="13361" href="#13317" class="Bound"
    >s&#8242;</a
    ><a name="13363"
    >
   </a
    ><a name="13367" class="Symbol"
    >&#8594;</a
    ><a name="13368"
    > </a
    ><a name="13369" class="PrimitiveType"
    >Set</a
    ><a name="13372"
    > </a
    ><a name="13373" class="Keyword"
    >where</a
    ><a name="13378"
    >

  </a
    ><a name="13382" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="13388"
    > </a
    ><a name="13389" class="Symbol"
    >:</a
    ><a name="13390"
    > </a
    ><a name="13391" href="#13284" class="Bound"
    >W</a
    ><a name="13392"
    > </a
    ><a name="13393" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13394"
    > </a
    ><a name="13395" href="#13297" class="Bound"
    >S</a
    ><a name="13396"
    > </a
    ><a name="13397" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13398"
    > </a
    ><a name="13399" href="#5338" class="InductiveConstructor"
    >halt</a
    ><a name="13403"
    > </a
    ><a name="13404" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="13405"
    > </a
    ><a name="13406" href="#13284" class="Bound"
    >W</a
    ><a name="13407"
    > </a
    ><a name="13408" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13409"
    > </a
    ><a name="13410" href="#13297" class="Bound"
    >S</a
    ><a name="13411"
    >

  </a
    ><a name="13415" href="#13415" class="InductiveConstructor Operator"
    >_&#8759;_</a
    ><a name="13418"
    > </a
    ><a name="13419" class="Symbol"
    >:</a
    ><a name="13420"
    > </a
    ><a name="13421" class="Symbol"
    >&#8704;{</a
    ><a name="13423" href="#13423" class="Bound"
    >w&#8242;</a
    ><a name="13425"
    > </a
    ><a name="13426" href="#13426" class="Bound"
    >s&#8242;</a
    ><a name="13428"
    > </a
    ><a name="13429" href="#13429" class="Bound"
    >w&#8243;</a
    ><a name="13431"
    > </a
    ><a name="13432" href="#13432" class="Bound"
    >s&#8243;</a
    ><a name="13434" class="Symbol"
    >}{</a
    ><a name="13436" href="#13436" class="Bound"
    >i</a
    ><a name="13437" class="Symbol"
    >}{</a
    ><a name="13439" href="#13439" class="Bound"
    >is</a
    ><a name="13441" class="Symbol"
    >}</a
    ><a name="13442"
    >
      </a
    ><a name="13449" class="Symbol"
    >&#8594;</a
    ><a name="13450"
    > </a
    ><a name="13451" class="Symbol"
    >{</a
    ><a name="13452" href="#13452" class="Bound"
    >W&#8242;</a
    ><a name="13454"
    > </a
    ><a name="13455" class="Symbol"
    >:</a
    ><a name="13456"
    > </a
    ><a name="13457" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13460"
    > </a
    ><a name="13461" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13462"
    > </a
    ><a name="13463" href="#13423" class="Bound"
    >w&#8242;</a
    ><a name="13465" class="Symbol"
    >}{</a
    ><a name="13467" href="#13467" class="Bound"
    >S&#8242;</a
    ><a name="13469"
    > </a
    ><a name="13470" class="Symbol"
    >:</a
    ><a name="13471"
    > </a
    ><a name="13472" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13475"
    > </a
    ><a name="13476" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13477"
    > </a
    ><a name="13478" href="#13426" class="Bound"
    >s&#8242;</a
    ><a name="13480" class="Symbol"
    >}</a
    ><a name="13481"
    >
      </a
    ><a name="13488" class="Symbol"
    >&#8594;</a
    ><a name="13489"
    > </a
    ><a name="13490" class="Symbol"
    >{</a
    ><a name="13491" href="#13491" class="Bound"
    >W&#8243;</a
    ><a name="13493"
    > </a
    ><a name="13494" class="Symbol"
    >:</a
    ><a name="13495"
    > </a
    ><a name="13496" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13499"
    > </a
    ><a name="13500" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13501"
    > </a
    ><a name="13502" href="#13429" class="Bound"
    >w&#8243;</a
    ><a name="13504" class="Symbol"
    >}{</a
    ><a name="13506" href="#13506" class="Bound"
    >S&#8243;</a
    ><a name="13508"
    > </a
    ><a name="13509" class="Symbol"
    >:</a
    ><a name="13510"
    > </a
    ><a name="13511" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13514"
    > </a
    ><a name="13515" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13516"
    > </a
    ><a name="13517" href="#13432" class="Bound"
    >s&#8243;</a
    ><a name="13519" class="Symbol"
    >}</a
    ><a name="13520"
    >

      </a
    ><a name="13528" class="Symbol"
    >&#8594;</a
    ><a name="13529"
    > </a
    ><a name="13530" href="#13284" class="Bound"
    >W</a
    ><a name="13531"
    > </a
    ><a name="13532" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="13533"
    > </a
    ><a name="13534" href="#13297" class="Bound"
    >S</a
    ><a name="13535"
    > </a
    ><a name="13536" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="13537"
    > </a
    ><a name="13538" href="#13436" class="Bound"
    >i</a
    ><a name="13539"
    > </a
    ><a name="13540" href="#6159" class="Datatype Operator"
    >&#8614;</a
    ><a name="13541"
    > </a
    ><a name="13542" href="#13452" class="Bound"
    >W&#8242;</a
    ><a name="13544"
    > </a
    ><a name="13545" href="#6159" class="Datatype Operator"
    >&#8739;</a
    ><a name="13546"
    > </a
    ><a name="13547" href="#13467" class="Bound"
    >S&#8242;</a
    ><a name="13549"
    >
      </a
    ><a name="13556" class="Symbol"
    >&#8594;</a
    ><a name="13557"
    > </a
    ><a name="13558" href="#13452" class="Bound"
    >W&#8242;</a
    ><a name="13560"
    > </a
    ><a name="13561" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13562"
    > </a
    ><a name="13563" href="#13467" class="Bound"
    >S&#8242;</a
    ><a name="13565"
    > </a
    ><a name="13566" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13567"
    > </a
    ><a name="13568" href="#13439" class="Bound"
    >is</a
    ><a name="13570"
    > </a
    ><a name="13571" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="13572"
    > </a
    ><a name="13573" href="#13491" class="Bound"
    >W&#8243;</a
    ><a name="13575"
    > </a
    ><a name="13576" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13577"
    > </a
    ><a name="13578" href="#13506" class="Bound"
    >S&#8243;</a
    ><a name="13580"
    >
        </a
    ><a name="13589" class="Comment"
    >--------------------------</a
    ><a name="13615"
    >
      </a
    ><a name="13622" class="Symbol"
    >&#8594;</a
    ><a name="13623"
    > </a
    ><a name="13624" href="#13284" class="Bound"
    >W</a
    ><a name="13625"
    > </a
    ><a name="13626" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13627"
    > </a
    ><a name="13628" href="#13297" class="Bound"
    >S</a
    ><a name="13629"
    > </a
    ><a name="13630" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13631"
    > </a
    ><a name="13632" class="Symbol"
    >(</a
    ><a name="13633" href="#13436" class="Bound"
    >i</a
    ><a name="13634"
    > </a
    ><a name="13635" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="13636"
    > </a
    ><a name="13637" href="#13439" class="Bound"
    >is</a
    ><a name="13639" class="Symbol"
    >)</a
    ><a name="13640"
    > </a
    ><a name="13641" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="13642"
    > </a
    ><a name="13643" href="#13491" class="Bound"
    >W&#8243;</a
    ><a name="13645"
    > </a
    ><a name="13646" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13647"
    > </a
    ><a name="13648" href="#13506" class="Bound"
    >S&#8243;</a
    ></code
  ></pre
>
<p>The semantics of sequential composition is predictably given by appending these lists:</p>
<pre class="Agda"
><code
  ><a name="13752"
    ></a
    ><a name="13765" class="Keyword"
    >infixl</a
    ><a name="13771"
    > </a
    ><a name="13772" class="Number"
    >4</a
    ><a name="13773"
    > </a
    ><a name="13774" href="#13780" class="Function Operator"
    >_&#10214;&#8853;&#10215;_</a
    ><a name="13779"
    >
</a
    ><a name="13780" href="#13780" class="Function Operator"
    >_&#10214;&#8853;&#10215;_</a
    ><a name="13785"
    > </a
    ><a name="13786" class="Symbol"
    >:</a
    ><a name="13787"
    > </a
    ><a name="13788" class="Symbol"
    >&#8704;{</a
    ><a name="13790" href="#13790" class="Bound"
    >w</a
    ><a name="13791"
    > </a
    ><a name="13792" href="#13792" class="Bound"
    >w&#8242;</a
    ><a name="13794"
    > </a
    ><a name="13795" href="#13795" class="Bound"
    >w&#8243;</a
    ><a name="13797"
    > </a
    ><a name="13798" href="#13798" class="Bound"
    >s</a
    ><a name="13799"
    > </a
    ><a name="13800" href="#13800" class="Bound"
    >s&#8242;</a
    ><a name="13802"
    > </a
    ><a name="13803" href="#13803" class="Bound"
    >s&#8243;</a
    ><a name="13805" class="Symbol"
    >}{</a
    ><a name="13807" href="#13807" class="Bound"
    >P</a
    ><a name="13808" class="Symbol"
    >}{</a
    ><a name="13810" href="#13810" class="Bound"
    >Q</a
    ><a name="13811" class="Symbol"
    >}</a
    ><a name="13812"
    >
      </a
    ><a name="13819" class="Symbol"
    >&#8594;</a
    ><a name="13820"
    > </a
    ><a name="13821" class="Symbol"
    >{</a
    ><a name="13822" href="#13822" class="Bound"
    >W</a
    ><a name="13823"
    > </a
    ><a name="13824" class="Symbol"
    >:</a
    ><a name="13825"
    > </a
    ><a name="13826" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13829"
    > </a
    ><a name="13830" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13831"
    > </a
    ><a name="13832" href="#13790" class="Bound"
    >w</a
    ><a name="13833" class="Symbol"
    >}{</a
    ><a name="13835" href="#13835" class="Bound"
    >S</a
    ><a name="13836"
    > </a
    ><a name="13837" class="Symbol"
    >:</a
    ><a name="13838"
    > </a
    ><a name="13839" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13842"
    > </a
    ><a name="13843" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13844"
    > </a
    ><a name="13845" href="#13798" class="Bound"
    >s</a
    ><a name="13846" class="Symbol"
    >}</a
    ><a name="13847"
    >
      </a
    ><a name="13854" class="Symbol"
    >&#8594;</a
    ><a name="13855"
    > </a
    ><a name="13856" class="Symbol"
    >{</a
    ><a name="13857" href="#13857" class="Bound"
    >W&#8242;</a
    ><a name="13859"
    > </a
    ><a name="13860" class="Symbol"
    >:</a
    ><a name="13861"
    > </a
    ><a name="13862" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13865"
    > </a
    ><a name="13866" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13867"
    > </a
    ><a name="13868" href="#13792" class="Bound"
    >w&#8242;</a
    ><a name="13870" class="Symbol"
    >}{</a
    ><a name="13872" href="#13872" class="Bound"
    >S&#8242;</a
    ><a name="13874"
    > </a
    ><a name="13875" class="Symbol"
    >:</a
    ><a name="13876"
    > </a
    ><a name="13877" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13880"
    > </a
    ><a name="13881" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13882"
    > </a
    ><a name="13883" href="#13800" class="Bound"
    >s&#8242;</a
    ><a name="13885" class="Symbol"
    >}</a
    ><a name="13886"
    >
      </a
    ><a name="13893" class="Symbol"
    >&#8594;</a
    ><a name="13894"
    > </a
    ><a name="13895" class="Symbol"
    >{</a
    ><a name="13896" href="#13896" class="Bound"
    >W&#8243;</a
    ><a name="13898"
    > </a
    ><a name="13899" class="Symbol"
    >:</a
    ><a name="13900"
    > </a
    ><a name="13901" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13904"
    > </a
    ><a name="13905" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13906"
    > </a
    ><a name="13907" href="#13795" class="Bound"
    >w&#8243;</a
    ><a name="13909" class="Symbol"
    >}{</a
    ><a name="13911" href="#13911" class="Bound"
    >S&#8243;</a
    ><a name="13913"
    > </a
    ><a name="13914" class="Symbol"
    >:</a
    ><a name="13915"
    > </a
    ><a name="13916" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="13919"
    > </a
    ><a name="13920" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="13921"
    > </a
    ><a name="13922" href="#13803" class="Bound"
    >s&#8243;</a
    ><a name="13924" class="Symbol"
    >}</a
    ><a name="13925"
    >

      </a
    ><a name="13933" class="Symbol"
    >&#8594;</a
    ><a name="13934"
    > </a
    ><a name="13935" href="#13822" class="Bound"
    >W</a
    ><a name="13936"
    > </a
    ><a name="13937" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13938"
    > </a
    ><a name="13939" href="#13835" class="Bound"
    >S</a
    ><a name="13940"
    > </a
    ><a name="13941" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13942"
    > </a
    ><a name="13943" href="#13807" class="Bound"
    >P</a
    ><a name="13944"
    > </a
    ><a name="13945" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="13946"
    > </a
    ><a name="13947" href="#13857" class="Bound"
    >W&#8242;</a
    ><a name="13949"
    > </a
    ><a name="13950" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13951"
    > </a
    ><a name="13952" href="#13872" class="Bound"
    >S&#8242;</a
    ><a name="13954"
    >
      </a
    ><a name="13961" class="Symbol"
    >&#8594;</a
    ><a name="13962"
    > </a
    ><a name="13963" href="#13857" class="Bound"
    >W&#8242;</a
    ><a name="13965"
    > </a
    ><a name="13966" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13967"
    > </a
    ><a name="13968" href="#13872" class="Bound"
    >S&#8242;</a
    ><a name="13970"
    > </a
    ><a name="13971" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13972"
    > </a
    ><a name="13973" href="#13810" class="Bound"
    >Q</a
    ><a name="13974"
    > </a
    ><a name="13975" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="13976"
    > </a
    ><a name="13977" href="#13896" class="Bound"
    >W&#8243;</a
    ><a name="13979"
    > </a
    ><a name="13980" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="13981"
    > </a
    ><a name="13982" href="#13911" class="Bound"
    >S&#8243;</a
    ><a name="13984"
    >
        </a
    ><a name="13993" class="Comment"
    >-------------------------</a
    ><a name="14018"
    >
      </a
    ><a name="14025" class="Symbol"
    >&#8594;</a
    ><a name="14026"
    > </a
    ><a name="14027" href="#13822" class="Bound"
    >W</a
    ><a name="14028"
    > </a
    ><a name="14029" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="14030"
    > </a
    ><a name="14031" href="#13835" class="Bound"
    >S</a
    ><a name="14032"
    > </a
    ><a name="14033" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="14034"
    > </a
    ><a name="14035" href="#13807" class="Bound"
    >P</a
    ><a name="14036"
    > </a
    ><a name="14037" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="14038"
    > </a
    ><a name="14039" href="#13810" class="Bound"
    >Q</a
    ><a name="14040"
    > </a
    ><a name="14041" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="14042"
    > </a
    ><a name="14043" href="#13896" class="Bound"
    >W&#8243;</a
    ><a name="14045"
    > </a
    ><a name="14046" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="14047"
    > </a
    ><a name="14048" href="#13911" class="Bound"
    >S&#8243;</a
    ><a name="14050"
    >
</a
    ><a name="14051" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="14057"
    > </a
    ><a name="14058" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="14061"
    > </a
    ><a name="14062" href="#14062" class="Bound"
    >ys</a
    ><a name="14064"
    > </a
    ><a name="14065" class="Symbol"
    >=</a
    ><a name="14066"
    > </a
    ><a name="14067" href="#14062" class="Bound"
    >ys</a
    ><a name="14069"
    >
</a
    ><a name="14070" href="#14070" class="Bound"
    >x</a
    ><a name="14071"
    > </a
    ><a name="14072" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="14073"
    > </a
    ><a name="14074" href="#14074" class="Bound"
    >xs</a
    ><a name="14076"
    > </a
    ><a name="14077" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="14080"
    > </a
    ><a name="14081" href="#14081" class="Bound"
    >ys</a
    ><a name="14083"
    > </a
    ><a name="14084" class="Symbol"
    >=</a
    ><a name="14085"
    > </a
    ><a name="14086" href="#14070" class="Bound"
    >x</a
    ><a name="14087"
    > </a
    ><a name="14088" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="14089"
    > </a
    ><a name="14090" class="Symbol"
    >(</a
    ><a name="14091" href="#14074" class="Bound"
    >xs</a
    ><a name="14093"
    > </a
    ><a name="14094" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="14097"
    > </a
    ><a name="14098" href="#14081" class="Bound"
    >ys</a
    ><a name="14100" class="Symbol"
    >)</a
    ></code
  ></pre
>
<h2 id="writing-by-proving">Writing by proving</h2>
<p>Having formally defined our source and target languages, we can now prove our compiler correct — even though we haven’t written a compiler yet!</p>
<p>One of the other significant advantages dependent types bring to compiler verification is the elimination of repetition. In my larger Isabelle formalisation, the proof of the compiler’s correctness largely duplicates the structure of the compiler itself, and this tight coupling means that proofs must be rewritten along with the program — a highly tedious exercise. As dependently typed languages unify the language of code and proof, we can merely provide the correctness proof: in almost all cases, the correctness proof is so specific, that the program of which it demonstrates correctness can be <em>derived automatically</em>.</p>
<div class="hidden">
<pre class="Agda"
><code
  ><a name="14932"
    ></a
    ><a name="14945" class="Keyword"
    >open</a
    ><a name="14949"
    > </a
    ><a name="14950" class="Keyword"
    >import</a
    ><a name="14956"
    > </a
    ><a name="14957" href="http://agda.github.io/agda-stdlib/Data.Product.html#1" class="Module"
    >Data.Product</a
    ><a name="14969"
    >
</a
    ><a name="14970" class="Keyword"
    >open</a
    ><a name="14974"
    > </a
    ><a name="14975" class="Keyword"
    >import</a
    ><a name="14981"
    > </a
    ><a name="14982" href="http://agda.github.io/agda-stdlib/Function.html#1" class="Module"
    >Function</a
    ><a name="14990"
    >
</a
    ><a name="14991" class="Keyword"
    >open</a
    ><a name="14995"
    > </a
    ><a name="14996" class="Keyword"
    >import</a
    ><a name="15002"
    > </a
    ><a name="15003" href="http://agda.github.io/agda-stdlib/Data.String.html#1" class="Module"
    >Data.String</a
    ><a name="15014"
    >
</a
    ><a name="15015" class="Keyword"
    >open</a
    ><a name="15019"
    > </a
    ><a name="15020" class="Keyword"
    >import</a
    ><a name="15026"
    > </a
    ><a name="15027" href="http://agda.github.io/agda-stdlib/Data.String.Unsafe.html#1" class="Module"
    >Data.String.Unsafe</a
    ></code
  ></pre
>
</div>
<p>We define a compiler’s correctness to be the commutativity of the following diagram, as per <span class="citation" data-cites="Hutton">Hutton and Wright [2004]</span>.</p>
<p><img width=168 alt="   \xymatrix{      \text{Term}\ar@{=&gt;}[d] \ar^{\mathtt{compile}}[r] &amp; \mathsf{SM} \ar@{=&gt;}[d] \\      \mathbb{N}\ar_{::\ []}[r] &amp; \text{Stack} \\ } " height=107 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-84px;"/></p>
<p>As we have not proven determinism for our semantics<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a>, such a correctness condition must be shown by the conjunction of a <em>soundness</em> and <em>completeness</em> condition, similar to <span class="citation" data-cites="Bahr">Bahr [2015]</span>.</p>
<p><strong>Soundness</strong> is a proof that the compiler output is a <em>refinement</em> of the input, that is, every evaluation in the output is matched by the input. The output does not do anything that the input doesn’t do.</p>
<pre class="Agda"
><code
  ><a name="15713"
    ></a
    ><a name="15726" class="Comment"
    >-- Sound t u means that u is a sound translation of t</a
    ><a name="15779"
    >
</a
    ><a name="15780" href="#15780" class="Function"
    >Sound</a
    ><a name="15785"
    > </a
    ><a name="15786" class="Symbol"
    >:</a
    ><a name="15787"
    > </a
    ><a name="15788" class="Symbol"
    >&#8704;{</a
    ><a name="15790" href="#15790" class="Bound"
    >w</a
    ><a name="15791"
    > </a
    ><a name="15792" href="#15792" class="Bound"
    >s</a
    ><a name="15793" class="Symbol"
    >}</a
    ><a name="15794"
    > </a
    ><a name="15795" class="Symbol"
    >&#8594;</a
    ><a name="15796"
    > </a
    ><a name="15797" href="#1984" class="Datatype"
    >Term</a
    ><a name="15801"
    > </a
    ><a name="15802" href="#15792" class="Bound"
    >s</a
    ><a name="15803"
    > </a
    ><a name="15804" class="Symbol"
    >&#8594;</a
    ><a name="15805"
    > </a
    ><a name="15806" href="#5303" class="Datatype"
    >SM</a
    ><a name="15808"
    > </a
    ><a name="15809" href="#15790" class="Bound"
    >w</a
    ><a name="15810"
    > </a
    ><a name="15811" href="#15792" class="Bound"
    >s</a
    ><a name="15812"
    > </a
    ><a name="15813" class="Symbol"
    >(</a
    ><a name="15814" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="15817"
    > </a
    ><a name="15818" href="#15790" class="Bound"
    >w</a
    ><a name="15819" class="Symbol"
    >)</a
    ><a name="15820"
    > </a
    ><a name="15821" href="#15792" class="Bound"
    >s</a
    ><a name="15822"
    > </a
    ><a name="15823" class="Symbol"
    >&#8594;</a
    ><a name="15824"
    > </a
    ><a name="15825" class="PrimitiveType"
    >Set</a
    ><a name="15828"
    >
</a
    ><a name="15829" href="#15780" class="Function"
    >Sound</a
    ><a name="15834"
    > </a
    ><a name="15835" class="Symbol"
    >{</a
    ><a name="15836" href="#15836" class="Bound"
    >w</a
    ><a name="15837" class="Symbol"
    >}</a
    ><a name="15838"
    > </a
    ><a name="15839" href="#15839" class="Bound"
    >t</a
    ><a name="15840"
    > </a
    ><a name="15841" href="#15841" class="Bound"
    >u</a
    ><a name="15842"
    > </a
    ><a name="15843" class="Symbol"
    >=</a
    ><a name="15844"
    > </a
    ><a name="15845" class="Symbol"
    >&#8704;{</a
    ><a name="15847" href="#15847" class="Bound"
    >v</a
    ><a name="15848" class="Symbol"
    >}{</a
    ><a name="15850" href="#15850" class="Bound"
    >E</a
    ><a name="15851" class="Symbol"
    >}{</a
    ><a name="15853" href="#15853" class="Bound"
    >W</a
    ><a name="15854"
    > </a
    ><a name="15855" class="Symbol"
    >:</a
    ><a name="15856"
    > </a
    ><a name="15857" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="15860"
    > </a
    ><a name="15861" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="15862"
    > </a
    ><a name="15863" href="#15836" class="Bound"
    >w</a
    ><a name="15864" class="Symbol"
    >}</a
    ><a name="15865"
    >

              </a
    ><a name="15881" class="Symbol"
    >&#8594;</a
    ><a name="15882"
    > </a
    ><a name="15883" href="#15853" class="Bound"
    >W</a
    ><a name="15884"
    > </a
    ><a name="15885" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="15886"
    > </a
    ><a name="15887" href="#15850" class="Bound"
    >E</a
    ><a name="15888"
    > </a
    ><a name="15889" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="15890"
    > </a
    ><a name="15891" href="#15841" class="Bound"
    >u</a
    ><a name="15892"
    > </a
    ><a name="15893" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="15894"
    > </a
    ><a name="15895" class="Symbol"
    >(</a
    ><a name="15896" href="#15847" class="Bound"
    >v</a
    ><a name="15897"
    > </a
    ><a name="15898" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="15899"
    > </a
    ><a name="15900" href="#15853" class="Bound"
    >W</a
    ><a name="15901" class="Symbol"
    >)</a
    ><a name="15902"
    > </a
    ><a name="15903" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="15904"
    > </a
    ><a name="15905" href="#15850" class="Bound"
    >E</a
    ><a name="15906"
    >
                </a
    ><a name="15923" class="Comment"
    >-----------------------</a
    ><a name="15946"
    >
              </a
    ><a name="15961" class="Symbol"
    >&#8594;</a
    ><a name="15962"
    > </a
    ><a name="15963" href="#15850" class="Bound"
    >E</a
    ><a name="15964"
    > </a
    ><a name="15965" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="15966"
    > </a
    ><a name="15967" href="#15839" class="Bound"
    >t</a
    ><a name="15968"
    > </a
    ><a name="15969" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="15970"
    > </a
    ><a name="15971" href="#15847" class="Bound"
    >v</a
    ></code
  ></pre
>
<p>Note that we generalise the evaluation statements used here slightly to use arbitrary environments and stacks. This is to allow our induction to proceed smoothly.</p>
<p><strong>Completeness</strong> is a proof that the compiler output is an <em>abstraction</em> of the input, that is, every evaluation in the input is matched by the output. The output does everything that the input does.</p>
<pre class="Agda"
><code
  ><a name="16350"
    ></a
    ><a name="16363" href="#16363" class="Function"
    >Complete</a
    ><a name="16371"
    > </a
    ><a name="16372" class="Symbol"
    >:</a
    ><a name="16373"
    > </a
    ><a name="16374" class="Symbol"
    >&#8704;{</a
    ><a name="16376" href="#16376" class="Bound"
    >w</a
    ><a name="16377"
    > </a
    ><a name="16378" href="#16378" class="Bound"
    >s</a
    ><a name="16379" class="Symbol"
    >}</a
    ><a name="16380"
    > </a
    ><a name="16381" class="Symbol"
    >&#8594;</a
    ><a name="16382"
    > </a
    ><a name="16383" href="#1984" class="Datatype"
    >Term</a
    ><a name="16387"
    > </a
    ><a name="16388" href="#16378" class="Bound"
    >s</a
    ><a name="16389"
    > </a
    ><a name="16390" class="Symbol"
    >&#8594;</a
    ><a name="16391"
    > </a
    ><a name="16392" href="#5303" class="Datatype"
    >SM</a
    ><a name="16394"
    > </a
    ><a name="16395" href="#16376" class="Bound"
    >w</a
    ><a name="16396"
    > </a
    ><a name="16397" href="#16378" class="Bound"
    >s</a
    ><a name="16398"
    > </a
    ><a name="16399" class="Symbol"
    >(</a
    ><a name="16400" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="16403"
    > </a
    ><a name="16404" href="#16376" class="Bound"
    >w</a
    ><a name="16405" class="Symbol"
    >)</a
    ><a name="16406"
    > </a
    ><a name="16407" href="#16378" class="Bound"
    >s</a
    ><a name="16408"
    > </a
    ><a name="16409" class="Symbol"
    >&#8594;</a
    ><a name="16410"
    > </a
    ><a name="16411" class="PrimitiveType"
    >Set</a
    ><a name="16414"
    >
</a
    ><a name="16415" href="#16363" class="Function"
    >Complete</a
    ><a name="16423"
    > </a
    ><a name="16424" class="Symbol"
    >{</a
    ><a name="16425" href="#16425" class="Bound"
    >w</a
    ><a name="16426" class="Symbol"
    >}</a
    ><a name="16427"
    > </a
    ><a name="16428" href="#16428" class="Bound"
    >t</a
    ><a name="16429"
    > </a
    ><a name="16430" href="#16430" class="Bound"
    >u</a
    ><a name="16431"
    > </a
    ><a name="16432" class="Symbol"
    >=</a
    ><a name="16433"
    > </a
    ><a name="16434" class="Symbol"
    >&#8704;{</a
    ><a name="16436" href="#16436" class="Bound"
    >v</a
    ><a name="16437" class="Symbol"
    >}{</a
    ><a name="16439" href="#16439" class="Bound"
    >E</a
    ><a name="16440" class="Symbol"
    >}{</a
    ><a name="16442" href="#16442" class="Bound"
    >W</a
    ><a name="16443"
    > </a
    ><a name="16444" class="Symbol"
    >:</a
    ><a name="16445"
    > </a
    ><a name="16446" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="16449"
    > </a
    ><a name="16450" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="16451"
    > </a
    ><a name="16452" href="#16425" class="Bound"
    >w</a
    ><a name="16453" class="Symbol"
    >}</a
    ><a name="16454"
    >

                 </a
    ><a name="16473" class="Symbol"
    >&#8594;</a
    ><a name="16474"
    > </a
    ><a name="16475" href="#16439" class="Bound"
    >E</a
    ><a name="16476"
    > </a
    ><a name="16477" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="16478"
    > </a
    ><a name="16479" href="#16428" class="Bound"
    >t</a
    ><a name="16480"
    > </a
    ><a name="16481" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="16482"
    > </a
    ><a name="16483" href="#16436" class="Bound"
    >v</a
    ><a name="16484"
    >
                   </a
    ><a name="16504" class="Comment"
    >-----------------------</a
    ><a name="16527"
    >
                 </a
    ><a name="16545" class="Symbol"
    >&#8594;</a
    ><a name="16546"
    > </a
    ><a name="16547" href="#16442" class="Bound"
    >W</a
    ><a name="16548"
    > </a
    ><a name="16549" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="16550"
    > </a
    ><a name="16551" href="#16439" class="Bound"
    >E</a
    ><a name="16552"
    > </a
    ><a name="16553" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="16554"
    > </a
    ><a name="16555" href="#16430" class="Bound"
    >u</a
    ><a name="16556"
    > </a
    ><a name="16557" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="16558"
    > </a
    ><a name="16559" class="Symbol"
    >(</a
    ><a name="16560" href="#16436" class="Bound"
    >v</a
    ><a name="16561"
    > </a
    ><a name="16562" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="16563"
    > </a
    ><a name="16564" href="#16442" class="Bound"
    >W</a
    ><a name="16565" class="Symbol"
    >)</a
    ><a name="16566"
    > </a
    ><a name="16567" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="16568"
    > </a
    ><a name="16569" href="#16439" class="Bound"
    >E</a
    ></code
  ></pre
>
<p>It is this <em>completeness</em> condition that will allow us to automatically derive our code generator. Given a term <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, our generator will return a Σ-type, or <em>dependent pair</em>, containing a <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> program called <img width=19 alt="u" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAARCAQAAABkmgTBAAAAqElEQVR4nGNgQAahDB0MLgyYQImhHIsoFLgw3GX4D4boWmcCxd7h0tYBlJrJsBussQNNDiS2G5fGNAZBICkIVrSKFI0wsBuLooHROJNcjegBNpQ1vgMqOkOuxv/gxAADSijRYYw1LUOdigh8JSDrHTQFpwG1gBJmGnaNHVBld4FGnAEbIQimYaLGuJwqCLXzPzjRK4HFQqEiHShewAJA/kD1iRKQj6YJAJxFZ+5FqHW8AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> and a proof that <img width=19 alt="u" height=11 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAARCAQAAABkmgTBAAAAqElEQVR4nGNgQAahDB0MLgyYQImhHIsoFLgw3GX4D4boWmcCxd7h0tYBlJrJsBussQNNDiS2G5fGNAZBICkIVrSKFI0wsBuLooHROJNcjegBNpQ1vgMqOkOuxv/gxAADSijRYYw1LUOdigh8JSDrHTQFpwG1gBJmGnaNHVBld4FGnAEbIQimYaLGuJwqCLXzPzjRK4HFQqEiHShewAJA/kD1iRKQj6YJAJxFZ+5FqHW8AAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-1px;"/> is a complete translation of <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>:</p>
<pre class="Agda"
><code
  ><a name="16859"
    ></a
    ><a name="16872" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="16880"
    >  </a
    ><a name="16882" class="Symbol"
    >:</a
    ><a name="16883"
    > </a
    ><a name="16884" class="Symbol"
    >&#8704;{</a
    ><a name="16886" href="#16886" class="Bound"
    >w</a
    ><a name="16887"
    > </a
    ><a name="16888" href="#16888" class="Bound"
    >s</a
    ><a name="16889" class="Symbol"
    >}</a
    ><a name="16890"
    >
          </a
    ><a name="16901" class="Symbol"
    >&#8594;</a
    ><a name="16902"
    > </a
    ><a name="16903" class="Symbol"
    >(</a
    ><a name="16904" href="#16904" class="Bound"
    >t</a
    ><a name="16905"
    > </a
    ><a name="16906" class="Symbol"
    >:</a
    ><a name="16907"
    > </a
    ><a name="16908" href="#1984" class="Datatype"
    >Term</a
    ><a name="16912"
    > </a
    ><a name="16913" href="#16888" class="Bound"
    >s</a
    ><a name="16914" class="Symbol"
    >)</a
    ><a name="16915"
    >
          </a
    ><a name="16926" class="Symbol"
    >&#8594;</a
    ><a name="16927"
    > </a
    ><a name="16928" href="http://agda.github.io/agda-stdlib/Data.Product.html#764" class="Function"
    >&#931;[</a
    ><a name="16930"
    > </a
    ><a name="16931" href="#16931" class="Bound"
    >u</a
    ><a name="16932"
    > </a
    ><a name="16933" href="http://agda.github.io/agda-stdlib/Data.Product.html#764" class="Function"
    >&#8712;</a
    ><a name="16934"
    > </a
    ><a name="16935" href="#5303" class="Datatype"
    >SM</a
    ><a name="16937"
    > </a
    ><a name="16938" href="#16886" class="Bound"
    >w</a
    ><a name="16939"
    > </a
    ><a name="16940" href="#16888" class="Bound"
    >s</a
    ><a name="16941"
    > </a
    ><a name="16942" class="Symbol"
    >(</a
    ><a name="16943" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="16946"
    > </a
    ><a name="16947" href="#16886" class="Bound"
    >w</a
    ><a name="16948" class="Symbol"
    >)</a
    ><a name="16949"
    > </a
    ><a name="16950" href="#16888" class="Bound"
    >s</a
    ><a name="16951"
    > </a
    ><a name="16952" href="http://agda.github.io/agda-stdlib/Data.Product.html#764" class="Function"
    >]</a
    ><a name="16953"
    > </a
    ><a name="16954" href="#16363" class="Function"
    >Complete</a
    ><a name="16962"
    > </a
    ><a name="16963" href="#16904" class="Bound"
    >t</a
    ><a name="16964"
    > </a
    ><a name="16965" href="#16931" class="Bound"
    >u</a
    ></code
  ></pre
>
<p>For literals, we simply push the number of the literal onto the working stack:</p>
<pre class="Agda"
><code
  ><a name="17059"
    ></a
    ><a name="17072" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="17080"
    > </a
    ><a name="17081" class="Symbol"
    >(</a
    ><a name="17082" href="#2011" class="InductiveConstructor"
    >Lit</a
    ><a name="17085"
    > </a
    ><a name="17086" href="#17086" class="Bound"
    >x</a
    ><a name="17087"
    > </a
    ><a name="17088" class="Symbol"
    >)</a
    ><a name="17089"
    > </a
    ><a name="17090" class="Symbol"
    >=</a
    ><a name="17091"
    > </a
    ><a name="17092" class="Symbol"
    >_</a
    ><a name="17093"
    > </a
    ><a name="17094" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="17095"
    > </a
    ><a name="17096" href="#17114" class="Function"
    >proof</a
    ><a name="17101"
    >
  </a
    ><a name="17104" class="Keyword"
    >where</a
    ><a name="17109"
    >
    </a
    ><a name="17114" href="#17114" class="Function"
    >proof</a
    ><a name="17119"
    > </a
    ><a name="17120" class="Symbol"
    >:</a
    ><a name="17121"
    > </a
    ><a name="17122" href="#16363" class="Function"
    >Complete</a
    ><a name="17130"
    > </a
    ><a name="17131" class="Symbol"
    >_</a
    ><a name="17132"
    > </a
    ><a name="17133" class="Symbol"
    >_</a
    ><a name="17134"
    >
    </a
    ><a name="17139" href="#17114" class="Function"
    >proof</a
    ><a name="17144"
    > </a
    ><a name="17145" href="#2780" class="InductiveConstructor"
    >lit-e</a
    ><a name="17150"
    > </a
    ><a name="17151" class="Symbol"
    >=</a
    ><a name="17152"
    > </a
    ><a name="17153" href="#7275" class="InductiveConstructor"
    >num-e</a
    ><a name="17158"
    > </a
    ><a name="17159" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="17160"
    > </a
    ><a name="17161" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ></code
  ></pre
>
<p>The code above never explicitly states what <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> program to produce! Instead, it merely provides the completeness proof, and the rest can be inferred by unification. Similar elision can be used for variables, which pick the correct index from the storage stack:</p>
<pre class="Agda"
><code
  ><a name="17452"
    ></a
    ><a name="17465" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="17473"
    > </a
    ><a name="17474" class="Symbol"
    >(</a
    ><a name="17475" href="#2139" class="InductiveConstructor"
    >Var</a
    ><a name="17478"
    > </a
    ><a name="17479" href="#17479" class="Bound"
    >x</a
    ><a name="17480" class="Symbol"
    >)</a
    ><a name="17481"
    > </a
    ><a name="17482" class="Symbol"
    >=</a
    ><a name="17483"
    > </a
    ><a name="17484" class="Symbol"
    >_</a
    ><a name="17485"
    > </a
    ><a name="17486" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="17487"
    > </a
    ><a name="17488" href="#17506" class="Function"
    >proof</a
    ><a name="17493"
    >
  </a
    ><a name="17496" class="Keyword"
    >where</a
    ><a name="17501"
    >
    </a
    ><a name="17506" href="#17506" class="Function"
    >proof</a
    ><a name="17511"
    > </a
    ><a name="17512" class="Symbol"
    >:</a
    ><a name="17513"
    > </a
    ><a name="17514" href="#16363" class="Function"
    >Complete</a
    ><a name="17522"
    > </a
    ><a name="17523" class="Symbol"
    >_</a
    ><a name="17524"
    > </a
    ><a name="17525" class="Symbol"
    >_</a
    ><a name="17526"
    >
    </a
    ><a name="17531" href="#17506" class="Function"
    >proof</a
    ><a name="17536"
    > </a
    ><a name="17537" class="Symbol"
    >(</a
    ><a name="17538" href="#3143" class="InductiveConstructor"
    >var-e</a
    ><a name="17543"
    > </a
    ><a name="17544" href="#17544" class="Bound"
    >x</a
    ><a name="17545" class="Symbol"
    >)</a
    ><a name="17546"
    > </a
    ><a name="17547" class="Symbol"
    >=</a
    ><a name="17548"
    > </a
    ><a name="17549" href="#11840" class="InductiveConstructor"
    >pick-e</a
    ><a name="17555"
    > </a
    ><a name="17556" href="#17544" class="Bound"
    >x</a
    ><a name="17557"
    > </a
    ><a name="17558" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="17559"
    > </a
    ><a name="17560" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ></code
  ></pre
>
<p>The two binary operations are essentially the standard translation for an infix-to-postfix tree traversal, but once again the program is not explicitly emitted, but is inferred from the completeness proof used.</p>
<pre class="Agda"
><code
  ><a name="17791"
    ></a
    ><a name="17804" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="17812"
    > </a
    ><a name="17813" class="Symbol"
    >(</a
    ><a name="17814" href="#17814" class="Bound"
    >t&#8321;</a
    ><a name="17816"
    > </a
    ><a name="17817" href="#2063" class="InductiveConstructor Operator"
    >&#8862;</a
    ><a name="17818"
    > </a
    ><a name="17819" href="#17819" class="Bound"
    >t&#8322;</a
    ><a name="17821" class="Symbol"
    >)</a
    ><a name="17822"
    > </a
    ><a name="17823" class="Symbol"
    >=</a
    ><a name="17824"
    > </a
    ><a name="17825" class="Symbol"
    >_</a
    ><a name="17826"
    > </a
    ><a name="17827" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="17828"
    > </a
    ><a name="17829" href="#17891" class="Function"
    >proof</a
    ><a name="17834"
    > </a
    ><a name="17835" class="Symbol"
    >(</a
    ><a name="17836" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#167" class="Field"
    >proj&#8322;</a
    ><a name="17841"
    > </a
    ><a name="17842" class="Symbol"
    >(</a
    ><a name="17843" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="17851"
    > </a
    ><a name="17852" href="#17814" class="Bound"
    >t&#8321;</a
    ><a name="17854" class="Symbol"
    >))</a
    ><a name="17856"
    > </a
    ><a name="17857" class="Symbol"
    >(</a
    ><a name="17858" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#167" class="Field"
    >proj&#8322;</a
    ><a name="17863"
    > </a
    ><a name="17864" class="Symbol"
    >(</a
    ><a name="17865" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="17873"
    > </a
    ><a name="17874" href="#17819" class="Bound"
    >t&#8322;</a
    ><a name="17876" class="Symbol"
    >))</a
    ><a name="17878"
    >
  </a
    ><a name="17881" class="Keyword"
    >where</a
    ><a name="17886"
    >
    </a
    ><a name="17891" href="#17891" class="Function"
    >proof</a
    ><a name="17896"
    > </a
    ><a name="17897" class="Symbol"
    >:</a
    ><a name="17898"
    > </a
    ><a name="17899" class="Symbol"
    >&#8704;</a
    ><a name="17900"
    > </a
    ><a name="17901" class="Symbol"
    >{</a
    ><a name="17902" href="#17902" class="Bound"
    >u&#8321;</a
    ><a name="17904" class="Symbol"
    >}{</a
    ><a name="17906" href="#17906" class="Bound"
    >u&#8322;</a
    ><a name="17908" class="Symbol"
    >}</a
    ><a name="17909"
    > </a
    ><a name="17910" class="Symbol"
    >&#8594;</a
    ><a name="17911"
    > </a
    ><a name="17912" href="#16363" class="Function"
    >Complete</a
    ><a name="17920"
    > </a
    ><a name="17921" href="#17814" class="Bound"
    >t&#8321;</a
    ><a name="17923"
    > </a
    ><a name="17924" href="#17902" class="Bound"
    >u&#8321;</a
    ><a name="17926"
    >  </a
    ><a name="17928" class="Symbol"
    >&#8594;</a
    ><a name="17929"
    > </a
    ><a name="17930" href="#16363" class="Function"
    >Complete</a
    ><a name="17938"
    > </a
    ><a name="17939" href="#17819" class="Bound"
    >t&#8322;</a
    ><a name="17941"
    > </a
    ><a name="17942" href="#17906" class="Bound"
    >u&#8322;</a
    ><a name="17944"
    > </a
    ><a name="17945" class="Symbol"
    >&#8594;</a
    ><a name="17946"
    > </a
    ><a name="17947" href="#16363" class="Function"
    >Complete</a
    ><a name="17955"
    > </a
    ><a name="17956" class="Symbol"
    >_</a
    ><a name="17957"
    > </a
    ><a name="17958" class="Symbol"
    >_</a
    ><a name="17959"
    >
    </a
    ><a name="17964" href="#17891" class="Function"
    >proof</a
    ><a name="17969"
    > </a
    ><a name="17970" href="#17970" class="Bound"
    >p&#8321;</a
    ><a name="17972"
    > </a
    ><a name="17973" href="#17973" class="Bound"
    >p&#8322;</a
    ><a name="17975"
    > </a
    ><a name="17976" class="Symbol"
    >(</a
    ><a name="17977" href="#2997" class="InductiveConstructor"
    >plus-e</a
    ><a name="17983"
    > </a
    ><a name="17984" href="#17984" class="Bound"
    >t&#8321;</a
    ><a name="17986"
    > </a
    ><a name="17987" href="#17987" class="Bound"
    >t&#8322;</a
    ><a name="17989" class="Symbol"
    >)</a
    ><a name="17990"
    > </a
    ><a name="17991" class="Symbol"
    >=</a
    ><a name="17992"
    > </a
    ><a name="17993" href="#17970" class="Bound"
    >p&#8321;</a
    ><a name="17995"
    > </a
    ><a name="17996" href="#17984" class="Bound"
    >t&#8321;</a
    ><a name="17998"
    > </a
    ><a name="17999" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="18002"
    > </a
    ><a name="18003" href="#17973" class="Bound"
    >p&#8322;</a
    ><a name="18005"
    > </a
    ><a name="18006" href="#17987" class="Bound"
    >t&#8322;</a
    ><a name="18008"
    > </a
    ><a name="18009" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="18012"
    > </a
    ><a name="18013" href="#8374" class="InductiveConstructor"
    >plus-e</a
    ><a name="18019"
    > </a
    ><a name="18020" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="18021"
    > </a
    ><a name="18022" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="18028"
    >

</a
    ><a name="18030" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18038"
    > </a
    ><a name="18039" class="Symbol"
    >(</a
    ><a name="18040" href="#18040" class="Bound"
    >t&#8321;</a
    ><a name="18042"
    > </a
    ><a name="18043" href="#2030" class="InductiveConstructor Operator"
    >&#8864;</a
    ><a name="18044"
    > </a
    ><a name="18045" href="#18045" class="Bound"
    >t&#8322;</a
    ><a name="18047" class="Symbol"
    >)</a
    ><a name="18048"
    > </a
    ><a name="18049" class="Symbol"
    >=</a
    ><a name="18050"
    > </a
    ><a name="18051" class="Symbol"
    >_</a
    ><a name="18052"
    > </a
    ><a name="18053" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="18054"
    > </a
    ><a name="18055" href="#18117" class="Function"
    >proof</a
    ><a name="18060"
    > </a
    ><a name="18061" class="Symbol"
    >(</a
    ><a name="18062" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#167" class="Field"
    >proj&#8322;</a
    ><a name="18067"
    > </a
    ><a name="18068" class="Symbol"
    >(</a
    ><a name="18069" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18077"
    > </a
    ><a name="18078" href="#18040" class="Bound"
    >t&#8321;</a
    ><a name="18080" class="Symbol"
    >))</a
    ><a name="18082"
    > </a
    ><a name="18083" class="Symbol"
    >(</a
    ><a name="18084" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#167" class="Field"
    >proj&#8322;</a
    ><a name="18089"
    > </a
    ><a name="18090" class="Symbol"
    >(</a
    ><a name="18091" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18099"
    > </a
    ><a name="18100" href="#18045" class="Bound"
    >t&#8322;</a
    ><a name="18102" class="Symbol"
    >))</a
    ><a name="18104"
    >
  </a
    ><a name="18107" class="Keyword"
    >where</a
    ><a name="18112"
    >
    </a
    ><a name="18117" href="#18117" class="Function"
    >proof</a
    ><a name="18122"
    > </a
    ><a name="18123" class="Symbol"
    >:</a
    ><a name="18124"
    > </a
    ><a name="18125" class="Symbol"
    >&#8704;</a
    ><a name="18126"
    > </a
    ><a name="18127" class="Symbol"
    >{</a
    ><a name="18128" href="#18128" class="Bound"
    >u&#8321;</a
    ><a name="18130" class="Symbol"
    >}{</a
    ><a name="18132" href="#18132" class="Bound"
    >u&#8322;</a
    ><a name="18134" class="Symbol"
    >}</a
    ><a name="18135"
    > </a
    ><a name="18136" class="Symbol"
    >&#8594;</a
    ><a name="18137"
    > </a
    ><a name="18138" href="#16363" class="Function"
    >Complete</a
    ><a name="18146"
    > </a
    ><a name="18147" href="#18040" class="Bound"
    >t&#8321;</a
    ><a name="18149"
    > </a
    ><a name="18150" href="#18128" class="Bound"
    >u&#8321;</a
    ><a name="18152"
    >  </a
    ><a name="18154" class="Symbol"
    >&#8594;</a
    ><a name="18155"
    > </a
    ><a name="18156" href="#16363" class="Function"
    >Complete</a
    ><a name="18164"
    > </a
    ><a name="18165" href="#18045" class="Bound"
    >t&#8322;</a
    ><a name="18167"
    > </a
    ><a name="18168" href="#18132" class="Bound"
    >u&#8322;</a
    ><a name="18170"
    > </a
    ><a name="18171" class="Symbol"
    >&#8594;</a
    ><a name="18172"
    > </a
    ><a name="18173" href="#16363" class="Function"
    >Complete</a
    ><a name="18181"
    > </a
    ><a name="18182" class="Symbol"
    >_</a
    ><a name="18183"
    > </a
    ><a name="18184" class="Symbol"
    >_</a
    ><a name="18185"
    >
    </a
    ><a name="18190" href="#18117" class="Function"
    >proof</a
    ><a name="18195"
    > </a
    ><a name="18196" href="#18196" class="Bound"
    >p&#8321;</a
    ><a name="18198"
    > </a
    ><a name="18199" href="#18199" class="Bound"
    >p&#8322;</a
    ><a name="18201"
    > </a
    ><a name="18202" class="Symbol"
    >(</a
    ><a name="18203" href="#2851" class="InductiveConstructor"
    >times-e</a
    ><a name="18210"
    > </a
    ><a name="18211" href="#18211" class="Bound"
    >t&#8321;</a
    ><a name="18213"
    > </a
    ><a name="18214" href="#18214" class="Bound"
    >t&#8322;</a
    ><a name="18216" class="Symbol"
    >)</a
    ><a name="18217"
    > </a
    ><a name="18218" class="Symbol"
    >=</a
    ><a name="18219"
    > </a
    ><a name="18220" href="#18196" class="Bound"
    >p&#8321;</a
    ><a name="18222"
    > </a
    ><a name="18223" href="#18211" class="Bound"
    >t&#8321;</a
    ><a name="18225"
    > </a
    ><a name="18226" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="18229"
    > </a
    ><a name="18230" href="#18199" class="Bound"
    >p&#8322;</a
    ><a name="18232"
    > </a
    ><a name="18233" href="#18214" class="Bound"
    >t&#8322;</a
    ><a name="18235"
    > </a
    ><a name="18236" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="18239"
    > </a
    ><a name="18240" href="#9511" class="InductiveConstructor"
    >times-e</a
    ><a name="18247"
    > </a
    ><a name="18248" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="18249"
    > </a
    ><a name="18250" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ></code
  ></pre
>
<p>The variable-binding form <img width=37 alt="\mathtt{let}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAWCAQAAADOIsxeAAABJUlEQVR4nM2WbRHDIAyGsYAFLGChFrCAhVrAAhZmAQtYwEItdCGwFhiU6we7kT+9LM0zkpdQQvbFyJTY8OXImpgajZuJieZu4jjYiaVu4hZ4n/0O55txovt/hmPQZwUmCc38PKra4+ZE5Z3CHuEoeSX6XSDtDlsbZq7iGMpggV8FgHRxZFRUtvfaTecGYi/iLCbaSygxdSn7h3oncWd5v/wO9RicrfgF/oUhuFJx3kI5B+DayhuCo1HU31bGPlRMfwg6oq7gKOSiB9FNnK4eWZkc9RquOxJbAQwTyczHu73TV3H+Tgxz5FOcCQtc7tgmZ3FqdTKdhe2JN0evjddwPmXCEuh3EGHxqRwDuEwDZ4s4HmdlSFmXgdg+RdwznyG8e7Gw74g3dpXy65Z8rYUAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> pushes the variable to the storage stack and cleans up after evaluation exits the scope with <img width=37 alt="\mathtt{pop}" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAXCAQAAAD0dUR2AAABX0lEQVR4nO1WbQ0DIQytBSxgAQtYOAtYOAtYwMIsnAUsYGEWNugBgdIMyPZzJZdc+sp7BcoHQDGdWzIJBmz8JPCmIpqaIv4NjhNeuR0x7FWbBUEiJVwNfjWE6xyYs4udnxFOX8D8HYb7LlxWXMcvYLza5Gjszt1VWGFX20R4HFXBBRL6TQ4SHDqPxu5l2gzibbYCR2k2OAbBk/h843swuMExr3MMgpr40vI/8n/KlFamQu86x1SwHUFPDax3xjEVPIkgXQuxIHh+EjTEZ7Hmbnsy+IHbYJ1jEOwB0Yk4JlNH+sw4BsG+LFxX5DqfI0A87RTOOBjBkMNFPidaAYsTWEr8wNzdJgcJ9vmMLCcmnQqXCS/c8uParHB0wTpmE+rRTHddMlPxwFCtcXTBydRQ2r3JiPMXzzoH8Hto17Y4/oI/5LhfKQHL3PJXyW852jcIfyfMbYtD1BdXah92zrccb5QHMN7x5xpvAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-6px;"/>.</p>
<pre class="Agda"
><code
  ><a name="18420"
    ></a
    ><a name="18433" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18441"
    > </a
    ><a name="18442" class="Symbol"
    >(</a
    ><a name="18443" href="#2096" class="InductiveConstructor Operator"
    >Let</a
    ><a name="18446"
    > </a
    ><a name="18447" href="#18447" class="Bound"
    >t&#8321;</a
    ><a name="18449"
    > </a
    ><a name="18450" href="#2096" class="InductiveConstructor Operator"
    >In</a
    ><a name="18452"
    > </a
    ><a name="18453" href="#18453" class="Bound"
    >t&#8322;</a
    ><a name="18455" class="Symbol"
    >)</a
    ><a name="18456"
    >
    </a
    ><a name="18461" class="Symbol"
    >=</a
    ><a name="18462"
    > </a
    ><a name="18463" class="Symbol"
    >_</a
    ><a name="18464"
    > </a
    ><a name="18465" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="18466"
    > </a
    ><a name="18467" href="#18529" class="Function"
    >proof</a
    ><a name="18472"
    > </a
    ><a name="18473" class="Symbol"
    >(</a
    ><a name="18474" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#167" class="Field"
    >proj&#8322;</a
    ><a name="18479"
    > </a
    ><a name="18480" class="Symbol"
    >(</a
    ><a name="18481" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18489"
    > </a
    ><a name="18490" href="#18447" class="Bound"
    >t&#8321;</a
    ><a name="18492" class="Symbol"
    >))</a
    ><a name="18494"
    > </a
    ><a name="18495" class="Symbol"
    >(</a
    ><a name="18496" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#167" class="Field"
    >proj&#8322;</a
    ><a name="18501"
    > </a
    ><a name="18502" class="Symbol"
    >(</a
    ><a name="18503" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18511"
    > </a
    ><a name="18512" href="#18453" class="Bound"
    >t&#8322;</a
    ><a name="18514" class="Symbol"
    >))</a
    ><a name="18516"
    >
  </a
    ><a name="18519" class="Keyword"
    >where</a
    ><a name="18524"
    >
    </a
    ><a name="18529" href="#18529" class="Function"
    >proof</a
    ><a name="18534"
    > </a
    ><a name="18535" class="Symbol"
    >:</a
    ><a name="18536"
    > </a
    ><a name="18537" class="Symbol"
    >&#8704;</a
    ><a name="18538"
    > </a
    ><a name="18539" class="Symbol"
    >{</a
    ><a name="18540" href="#18540" class="Bound"
    >u&#8321;</a
    ><a name="18542" class="Symbol"
    >}{</a
    ><a name="18544" href="#18544" class="Bound"
    >u&#8322;</a
    ><a name="18546" class="Symbol"
    >}</a
    ><a name="18547"
    > </a
    ><a name="18548" class="Symbol"
    >&#8594;</a
    ><a name="18549"
    > </a
    ><a name="18550" href="#16363" class="Function"
    >Complete</a
    ><a name="18558"
    > </a
    ><a name="18559" href="#18447" class="Bound"
    >t&#8321;</a
    ><a name="18561"
    > </a
    ><a name="18562" href="#18540" class="Bound"
    >u&#8321;</a
    ><a name="18564"
    >  </a
    ><a name="18566" class="Symbol"
    >&#8594;</a
    ><a name="18567"
    > </a
    ><a name="18568" href="#16363" class="Function"
    >Complete</a
    ><a name="18576"
    > </a
    ><a name="18577" href="#18453" class="Bound"
    >t&#8322;</a
    ><a name="18579"
    > </a
    ><a name="18580" href="#18544" class="Bound"
    >u&#8322;</a
    ><a name="18582"
    > </a
    ><a name="18583" class="Symbol"
    >&#8594;</a
    ><a name="18584"
    > </a
    ><a name="18585" href="#16363" class="Function"
    >Complete</a
    ><a name="18593"
    > </a
    ><a name="18594" class="Symbol"
    >_</a
    ><a name="18595"
    > </a
    ><a name="18596" class="Symbol"
    >_</a
    ><a name="18597"
    >
    </a
    ><a name="18602" href="#18529" class="Function"
    >proof</a
    ><a name="18607"
    > </a
    ><a name="18608" href="#18608" class="Bound"
    >p&#8321;</a
    ><a name="18610"
    > </a
    ><a name="18611" href="#18611" class="Bound"
    >p&#8322;</a
    ><a name="18613"
    > </a
    ><a name="18614" class="Symbol"
    >(</a
    ><a name="18615" href="#3240" class="InductiveConstructor"
    >let-e</a
    ><a name="18620"
    > </a
    ><a name="18621" href="#18621" class="Bound"
    >t&#8321;</a
    ><a name="18623"
    > </a
    ><a name="18624" href="#18624" class="Bound"
    >t&#8322;</a
    ><a name="18626" class="Symbol"
    >)</a
    ><a name="18627"
    >
        </a
    ><a name="18636" class="Symbol"
    >=</a
    ><a name="18637"
    > </a
    ><a name="18638" href="#18608" class="Bound"
    >p&#8321;</a
    ><a name="18640"
    > </a
    ><a name="18641" href="#18621" class="Bound"
    >t&#8321;</a
    ><a name="18643"
    > </a
    ><a name="18644" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="18647"
    > </a
    ><a name="18648" href="#10655" class="InductiveConstructor"
    >push-e</a
    ><a name="18654"
    > </a
    ><a name="18655" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="18656"
    > </a
    ><a name="18657" class="Symbol"
    >(</a
    ><a name="18658" href="#18611" class="Bound"
    >p&#8322;</a
    ><a name="18660"
    > </a
    ><a name="18661" href="#18624" class="Bound"
    >t&#8322;</a
    ><a name="18663"
    > </a
    ><a name="18664" href="#13780" class="Function Operator"
    >&#10214;&#8853;&#10215;</a
    ><a name="18667"
    > </a
    ><a name="18668" href="#12959" class="InductiveConstructor"
    >pop-e</a
    ><a name="18673"
    > </a
    ><a name="18674" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="18675"
    > </a
    ><a name="18676" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="18682" class="Symbol"
    >)</a
    ></code
  ></pre
>
<p>We can extract a more standard-looking code generator function simply by throwing away the proof that our code generator produces.</p>
<pre class="Agda"
><code
  ><a name="18828"
    ></a
    ><a name="18841" href="#18841" class="Function"
    >codegen</a
    ><a name="18848"
    > </a
    ><a name="18849" class="Symbol"
    >:</a
    ><a name="18850"
    > </a
    ><a name="18851" class="Symbol"
    >&#8704;{</a
    ><a name="18853" href="#18853" class="Bound"
    >w</a
    ><a name="18854"
    > </a
    ><a name="18855" href="#18855" class="Bound"
    >s</a
    ><a name="18856" class="Symbol"
    >}</a
    ><a name="18857"
    >
        </a
    ><a name="18866" class="Symbol"
    >&#8594;</a
    ><a name="18867"
    > </a
    ><a name="18868" href="#1984" class="Datatype"
    >Term</a
    ><a name="18872"
    > </a
    ><a name="18873" href="#18855" class="Bound"
    >s</a
    ><a name="18874"
    >
        </a
    ><a name="18883" class="Symbol"
    >&#8594;</a
    ><a name="18884"
    > </a
    ><a name="18885" href="#5303" class="Datatype"
    >SM</a
    ><a name="18887"
    > </a
    ><a name="18888" href="#18853" class="Bound"
    >w</a
    ><a name="18889"
    > </a
    ><a name="18890" href="#18855" class="Bound"
    >s</a
    ><a name="18891"
    > </a
    ><a name="18892" class="Symbol"
    >(</a
    ><a name="18893" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="18896"
    > </a
    ><a name="18897" href="#18853" class="Bound"
    >w</a
    ><a name="18898" class="Symbol"
    >)</a
    ><a name="18899"
    > </a
    ><a name="18900" href="#18855" class="Bound"
    >s</a
    ><a name="18901"
    >
</a
    ><a name="18902" href="#18841" class="Function"
    >codegen</a
    ><a name="18909"
    > </a
    ><a name="18910" class="Symbol"
    >{</a
    ><a name="18911" href="#18911" class="Bound"
    >w</a
    ><a name="18912" class="Symbol"
    >}{</a
    ><a name="18914" href="#18914" class="Bound"
    >s</a
    ><a name="18915" class="Symbol"
    >}</a
    ><a name="18916"
    > </a
    ><a name="18917" href="#18917" class="Bound"
    >t</a
    ><a name="18918"
    > </a
    ><a name="18919" class="Symbol"
    >=</a
    ><a name="18920"
    > </a
    ><a name="18921" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#155" class="Field"
    >proj&#8321;</a
    ><a name="18926"
    > </a
    ><a name="18927" class="Symbol"
    >(</a
    ><a name="18928" href="#16872" class="Function"
    >codegen&#8242;</a
    ><a name="18936"
    > </a
    ><a name="18937" class="Symbol"
    >{</a
    ><a name="18938" href="#18911" class="Bound"
    >w</a
    ><a name="18939" class="Symbol"
    >}{</a
    ><a name="18941" href="#18914" class="Bound"
    >s</a
    ><a name="18942" class="Symbol"
    >}</a
    ><a name="18943"
    > </a
    ><a name="18944" href="#18917" class="Bound"
    >t</a
    ><a name="18945" class="Symbol"
    >)</a
    ></code
  ></pre
>
<details>
<p><summary>The soundness proof for this code generator isn’t particularly illuminating and is rather awkwardly expressed. Nevertheless, for the truly brave, you may click here to view it.</summary></p>
<p>We use an alternative presentation of the soundness property, that makes explicit several equalities that are implicit in the original formulation of soundness. We prove that our new formulation still implies the original one.</p>
<pre class="Agda"
><code
  ><a name="19395"
    ></a
    ><a name="19408" class="Keyword"
    >open</a
    ><a name="19412"
    > </a
    ><a name="19413" class="Keyword"
    >import</a
    ><a name="19419"
    > </a
    ><a name="19420" href="http://agda.github.io/agda-stdlib/Relation.Binary.PropositionalEquality.html#1" class="Module"
    >Relation.Binary.PropositionalEquality</a
    ><a name="19457"
    >

</a
    ><a name="19459" href="#19459" class="Function"
    >Sound&#8242;</a
    ><a name="19465"
    > </a
    ><a name="19466" class="Symbol"
    >:</a
    ><a name="19467"
    > </a
    ><a name="19468" class="Symbol"
    >&#8704;{</a
    ><a name="19470" href="#19470" class="Bound"
    >w</a
    ><a name="19471"
    > </a
    ><a name="19472" href="#19472" class="Bound"
    >s</a
    ><a name="19473" class="Symbol"
    >}</a
    ><a name="19474"
    > </a
    ><a name="19475" class="Symbol"
    >&#8594;</a
    ><a name="19476"
    > </a
    ><a name="19477" href="#1984" class="Datatype"
    >Term</a
    ><a name="19481"
    > </a
    ><a name="19482" href="#19472" class="Bound"
    >s</a
    ><a name="19483"
    > </a
    ><a name="19484" class="Symbol"
    >&#8594;</a
    ><a name="19485"
    > </a
    ><a name="19486" href="#5303" class="Datatype"
    >SM</a
    ><a name="19488"
    > </a
    ><a name="19489" href="#19470" class="Bound"
    >w</a
    ><a name="19490"
    > </a
    ><a name="19491" href="#19472" class="Bound"
    >s</a
    ><a name="19492"
    > </a
    ><a name="19493" class="Symbol"
    >(</a
    ><a name="19494" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#128" class="InductiveConstructor"
    >suc</a
    ><a name="19497"
    > </a
    ><a name="19498" href="#19470" class="Bound"
    >w</a
    ><a name="19499" class="Symbol"
    >)</a
    ><a name="19500"
    > </a
    ><a name="19501" href="#19472" class="Bound"
    >s</a
    ><a name="19502"
    > </a
    ><a name="19503" class="Symbol"
    >&#8594;</a
    ><a name="19504"
    > </a
    ><a name="19505" class="PrimitiveType"
    >Set</a
    ><a name="19508"
    >
</a
    ><a name="19509" href="#19459" class="Function"
    >Sound&#8242;</a
    ><a name="19515"
    > </a
    ><a name="19516" class="Symbol"
    >{</a
    ><a name="19517" href="#19517" class="Bound"
    >w</a
    ><a name="19518" class="Symbol"
    >}</a
    ><a name="19519"
    > </a
    ><a name="19520" href="#19520" class="Bound"
    >t</a
    ><a name="19521"
    > </a
    ><a name="19522" href="#19522" class="Bound"
    >u</a
    ><a name="19523"
    > </a
    ><a name="19524" class="Symbol"
    >=</a
    ><a name="19525"
    > </a
    ><a name="19526" class="Symbol"
    >&#8704;{</a
    ><a name="19528" href="#19528" class="Bound"
    >E</a
    ><a name="19529"
    > </a
    ><a name="19530" href="#19530" class="Bound"
    >E&#8242;</a
    ><a name="19532" class="Symbol"
    >}{</a
    ><a name="19534" href="#19534" class="Bound"
    >W</a
    ><a name="19535"
    > </a
    ><a name="19536" class="Symbol"
    >:</a
    ><a name="19537"
    > </a
    ><a name="19538" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="19541"
    > </a
    ><a name="19542" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="19543"
    > </a
    ><a name="19544" href="#19517" class="Bound"
    >w</a
    ><a name="19545" class="Symbol"
    >}{</a
    ><a name="19547" href="#19547" class="Bound"
    >W&#8242;</a
    ><a name="19549" class="Symbol"
    >}</a
    ><a name="19550"
    >
               </a
    ><a name="19566" class="Symbol"
    >&#8594;</a
    ><a name="19567"
    > </a
    ><a name="19568" href="#19534" class="Bound"
    >W</a
    ><a name="19569"
    > </a
    ><a name="19570" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="19571"
    > </a
    ><a name="19572" href="#19528" class="Bound"
    >E</a
    ><a name="19573"
    > </a
    ><a name="19574" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="19575"
    > </a
    ><a name="19576" href="#19522" class="Bound"
    >u</a
    ><a name="19577"
    > </a
    ><a name="19578" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="19579"
    > </a
    ><a name="19580" href="#19547" class="Bound"
    >W&#8242;</a
    ><a name="19582"
    > </a
    ><a name="19583" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="19584"
    > </a
    ><a name="19585" href="#19530" class="Bound"
    >E&#8242;</a
    ><a name="19587"
    >
                 </a
    ><a name="19605" class="Comment"
    >------------------------------------------</a
    ><a name="19647"
    >
               </a
    ><a name="19663" class="Symbol"
    >&#8594;</a
    ><a name="19664"
    > </a
    ><a name="19665" class="Symbol"
    >(</a
    ><a name="19666" href="#19528" class="Bound"
    >E</a
    ><a name="19667"
    > </a
    ><a name="19668" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#83" class="Datatype Operator"
    >&#8801;</a
    ><a name="19669"
    > </a
    ><a name="19670" href="#19530" class="Bound"
    >E&#8242;</a
    ><a name="19672" class="Symbol"
    >)</a
    ><a name="19673"
    > </a
    ><a name="19674" href="http://agda.github.io/agda-stdlib/Data.Product.html#1353" class="Function Operator"
    >&#215;</a
    ><a name="19675"
    > </a
    ><a name="19676" class="Symbol"
    >(</a
    ><a name="19677" href="http://agda.github.io/agda-stdlib/Data.Vec.html#1270" class="Function"
    >tail</a
    ><a name="19681"
    > </a
    ><a name="19682" href="#19547" class="Bound"
    >W&#8242;</a
    ><a name="19684"
    > </a
    ><a name="19685" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#83" class="Datatype Operator"
    >&#8801;</a
    ><a name="19686"
    > </a
    ><a name="19687" href="#19534" class="Bound"
    >W</a
    ><a name="19688" class="Symbol"
    >)</a
    ><a name="19689"
    > </a
    ><a name="19690" href="http://agda.github.io/agda-stdlib/Data.Product.html#1353" class="Function Operator"
    >&#215;</a
    ><a name="19691"
    > </a
    ><a name="19692" href="#19528" class="Bound"
    >E</a
    ><a name="19693"
    > </a
    ><a name="19694" href="#2724" class="Datatype Operator"
    >&#8866;</a
    ><a name="19695"
    > </a
    ><a name="19696" href="#19520" class="Bound"
    >t</a
    ><a name="19697"
    > </a
    ><a name="19698" href="#2724" class="Datatype Operator"
    >&#8659;</a
    ><a name="19699"
    > </a
    ><a name="19700" href="http://agda.github.io/agda-stdlib/Data.Vec.html#1204" class="Function"
    >head</a
    ><a name="19704"
    > </a
    ><a name="19705" href="#19547" class="Bound"
    >W&#8242;</a
    ><a name="19707"
    >

</a
    ><a name="19709" href="#19709" class="Function"
    >sound&#8242;&#8594;sound</a
    ><a name="19721"
    > </a
    ><a name="19722" class="Symbol"
    >:</a
    ><a name="19723"
    > </a
    ><a name="19724" class="Symbol"
    >&#8704;{</a
    ><a name="19726" href="#19726" class="Bound"
    >w</a
    ><a name="19727"
    > </a
    ><a name="19728" href="#19728" class="Bound"
    >s</a
    ><a name="19729" class="Symbol"
    >}{</a
    ><a name="19731" href="#19731" class="Bound"
    >t</a
    ><a name="19732" class="Symbol"
    >}{</a
    ><a name="19734" href="#19734" class="Bound"
    >u</a
    ><a name="19735" class="Symbol"
    >}</a
    ><a name="19736"
    > </a
    ><a name="19737" class="Symbol"
    >&#8594;</a
    ><a name="19738"
    > </a
    ><a name="19739" href="#19459" class="Function"
    >Sound&#8242;</a
    ><a name="19745"
    > </a
    ><a name="19746" class="Symbol"
    >{</a
    ><a name="19747" href="#19726" class="Bound"
    >w</a
    ><a name="19748" class="Symbol"
    >}{</a
    ><a name="19750" href="#19728" class="Bound"
    >s</a
    ><a name="19751" class="Symbol"
    >}</a
    ><a name="19752"
    > </a
    ><a name="19753" href="#19731" class="Bound"
    >t</a
    ><a name="19754"
    > </a
    ><a name="19755" href="#19734" class="Bound"
    >u</a
    ><a name="19756"
    > </a
    ><a name="19757" class="Symbol"
    >&#8594;</a
    ><a name="19758"
    > </a
    ><a name="19759" href="#15780" class="Function"
    >Sound</a
    ><a name="19764"
    > </a
    ><a name="19765" href="#19731" class="Bound"
    >t</a
    ><a name="19766"
    > </a
    ><a name="19767" href="#19734" class="Bound"
    >u</a
    ><a name="19768"
    >
</a
    ><a name="19769" href="#19709" class="Function"
    >sound&#8242;&#8594;sound</a
    ><a name="19781"
    > </a
    ><a name="19782" href="#19782" class="Bound"
    >p</a
    ><a name="19783"
    > </a
    ><a name="19784" href="#19784" class="Bound"
    >x</a
    ><a name="19785"
    > </a
    ><a name="19786" class="Keyword"
    >with</a
    ><a name="19790"
    > </a
    ><a name="19791" href="#19782" class="Bound"
    >p</a
    ><a name="19792"
    > </a
    ><a name="19793" href="#19784" class="Bound"
    >x</a
    ><a name="19794"
    >
</a
    ><a name="19795" class="Symbol"
    >...</a
    ><a name="19798"
    > </a
    ><a name="19799" class="Symbol"
    >|</a
    ><a name="19800"
    > </a
    ><a name="19801" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="19805"
    > </a
    ><a name="19806" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="19807"
    > </a
    ><a name="19808" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="19812"
    > </a
    ><a name="19813" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="19814"
    > </a
    ><a name="19815" href="#19815" class="Bound"
    >q</a
    ><a name="19816"
    > </a
    ><a name="19817" class="Symbol"
    >=</a
    ><a name="19818"
    > </a
    ><a name="19819" href="#19815" class="Bound"
    >q</a
    ></code
  ></pre
>
<p>As our soundness proof requires us to do a lot of rule inversion on the evaluation of <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> programs, we need an eliminator for the introduction rule <code>_⟦⊕⟧_</code>, used in the completeness proof, which breaks an evaluation of a sequential composition into evaluations of its component parts:</p>
<pre class="Agda"
><code
  ><a name="20129"
    ></a
    ><a name="20142" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="20148"
    > </a
    ><a name="20149" class="Symbol"
    >:</a
    ><a name="20150"
    > </a
    ><a name="20151" class="Symbol"
    >&#8704;{</a
    ><a name="20153" href="#20153" class="Bound"
    >w</a
    ><a name="20154"
    > </a
    ><a name="20155" href="#20155" class="Bound"
    >s</a
    ><a name="20156"
    > </a
    ><a name="20157" href="#20157" class="Bound"
    >w&#8242;</a
    ><a name="20159"
    > </a
    ><a name="20160" href="#20160" class="Bound"
    >s&#8242;</a
    ><a name="20162"
    > </a
    ><a name="20163" href="#20163" class="Bound"
    >w&#8243;</a
    ><a name="20165"
    > </a
    ><a name="20166" href="#20166" class="Bound"
    >s&#8243;</a
    ><a name="20168" class="Symbol"
    >}</a
    ><a name="20169"
    >
          </a
    ><a name="20180" class="Symbol"
    >{</a
    ><a name="20181" href="#20181" class="Bound"
    >W</a
    ><a name="20182"
    > </a
    ><a name="20183" class="Symbol"
    >:</a
    ><a name="20184"
    > </a
    ><a name="20185" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="20188"
    > </a
    ><a name="20189" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="20190"
    > </a
    ><a name="20191" href="#20153" class="Bound"
    >w</a
    ><a name="20192" class="Symbol"
    >}{</a
    ><a name="20194" href="#20194" class="Bound"
    >S</a
    ><a name="20195"
    > </a
    ><a name="20196" class="Symbol"
    >:</a
    ><a name="20197"
    > </a
    ><a name="20198" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="20201"
    > </a
    ><a name="20202" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="20203"
    > </a
    ><a name="20204" href="#20155" class="Bound"
    >s</a
    ><a name="20205" class="Symbol"
    >}</a
    ><a name="20206"
    >
          </a
    ><a name="20217" class="Symbol"
    >{</a
    ><a name="20218" href="#20218" class="Bound"
    >W&#8243;</a
    ><a name="20220"
    > </a
    ><a name="20221" class="Symbol"
    >:</a
    ><a name="20222"
    > </a
    ><a name="20223" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="20226"
    > </a
    ><a name="20227" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="20228"
    > </a
    ><a name="20229" href="#20163" class="Bound"
    >w&#8243;</a
    ><a name="20231" class="Symbol"
    >}{</a
    ><a name="20233" href="#20233" class="Bound"
    >S&#8243;</a
    ><a name="20235"
    > </a
    ><a name="20236" class="Symbol"
    >:</a
    ><a name="20237"
    > </a
    ><a name="20238" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="20241"
    > </a
    ><a name="20242" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="20243"
    > </a
    ><a name="20244" href="#20166" class="Bound"
    >s&#8243;</a
    ><a name="20246" class="Symbol"
    >}</a
    ><a name="20247"
    >
          </a
    ><a name="20258" class="Symbol"
    >{</a
    ><a name="20259" href="#20259" class="Bound"
    >a</a
    ><a name="20260"
    > </a
    ><a name="20261" class="Symbol"
    >:</a
    ><a name="20262"
    > </a
    ><a name="20263" href="#5303" class="Datatype"
    >SM</a
    ><a name="20265"
    > </a
    ><a name="20266" href="#20153" class="Bound"
    >w</a
    ><a name="20267"
    > </a
    ><a name="20268" href="#20155" class="Bound"
    >s</a
    ><a name="20269"
    > </a
    ><a name="20270" href="#20157" class="Bound"
    >w&#8242;</a
    ><a name="20272"
    > </a
    ><a name="20273" href="#20160" class="Bound"
    >s&#8242;</a
    ><a name="20275" class="Symbol"
    >}{</a
    ><a name="20277" href="#20277" class="Bound"
    >b</a
    ><a name="20278"
    > </a
    ><a name="20279" class="Symbol"
    >:</a
    ><a name="20280"
    > </a
    ><a name="20281" href="#5303" class="Datatype"
    >SM</a
    ><a name="20283"
    > </a
    ><a name="20284" href="#20157" class="Bound"
    >w&#8242;</a
    ><a name="20286"
    > </a
    ><a name="20287" href="#20160" class="Bound"
    >s&#8242;</a
    ><a name="20289"
    > </a
    ><a name="20290" href="#20163" class="Bound"
    >w&#8243;</a
    ><a name="20292"
    > </a
    ><a name="20293" href="#20166" class="Bound"
    >s&#8243;</a
    ><a name="20295" class="Symbol"
    >}</a
    ><a name="20296"
    >

       </a
    ><a name="20305" class="Symbol"
    >&#8594;</a
    ><a name="20306"
    > </a
    ><a name="20307" href="#20181" class="Bound"
    >W</a
    ><a name="20308"
    > </a
    ><a name="20309" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20310"
    > </a
    ><a name="20311" href="#20194" class="Bound"
    >S</a
    ><a name="20312"
    > </a
    ><a name="20313" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20314"
    > </a
    ><a name="20315" href="#20259" class="Bound"
    >a</a
    ><a name="20316"
    > </a
    ><a name="20317" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="20318"
    > </a
    ><a name="20319" href="#20277" class="Bound"
    >b</a
    ><a name="20320"
    > </a
    ><a name="20321" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="20322"
    > </a
    ><a name="20323" href="#20218" class="Bound"
    >W&#8243;</a
    ><a name="20325"
    > </a
    ><a name="20326" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20327"
    > </a
    ><a name="20328" href="#20233" class="Bound"
    >S&#8243;</a
    ><a name="20330"
    >
       </a
    ><a name="20338" class="Symbol"
    >&#8594;</a
    ><a name="20339"
    > </a
    ><a name="20340" href="http://agda.github.io/agda-stdlib/Data.Product.html#942" class="Function"
    >&#8707;[</a
    ><a name="20342"
    > </a
    ><a name="20343" href="#20343" class="Bound"
    >W&#8242;</a
    ><a name="20345"
    > </a
    ><a name="20346" href="http://agda.github.io/agda-stdlib/Data.Product.html#942" class="Function"
    >]</a
    ><a name="20347"
    > </a
    ><a name="20348" href="http://agda.github.io/agda-stdlib/Data.Product.html#942" class="Function"
    >&#8707;[</a
    ><a name="20350"
    > </a
    ><a name="20351" href="#20351" class="Bound"
    >S&#8242;</a
    ><a name="20353"
    > </a
    ><a name="20354" href="http://agda.github.io/agda-stdlib/Data.Product.html#942" class="Function"
    >]</a
    ><a name="20355"
    > </a
    ><a name="20356" class="Symbol"
    >((</a
    ><a name="20358" href="#20181" class="Bound"
    >W</a
    ><a name="20359"
    > </a
    ><a name="20360" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20361"
    > </a
    ><a name="20362" href="#20194" class="Bound"
    >S</a
    ><a name="20363"
    > </a
    ><a name="20364" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20365"
    > </a
    ><a name="20366" href="#20259" class="Bound"
    >a</a
    ><a name="20367"
    > </a
    ><a name="20368" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="20369"
    > </a
    ><a name="20370" href="#20343" class="Bound"
    >W&#8242;</a
    ><a name="20372"
    > </a
    ><a name="20373" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20374"
    > </a
    ><a name="20375" href="#20351" class="Bound"
    >S&#8242;</a
    ><a name="20377" class="Symbol"
    >)</a
    ><a name="20378"
    > </a
    ><a name="20379" href="http://agda.github.io/agda-stdlib/Data.Product.html#1353" class="Function Operator"
    >&#215;</a
    ><a name="20380"
    > </a
    ><a name="20381" class="Symbol"
    >(</a
    ><a name="20382" href="#20343" class="Bound"
    >W&#8242;</a
    ><a name="20384"
    > </a
    ><a name="20385" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20386"
    > </a
    ><a name="20387" href="#20351" class="Bound"
    >S&#8242;</a
    ><a name="20389"
    > </a
    ><a name="20390" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20391"
    > </a
    ><a name="20392" href="#20277" class="Bound"
    >b</a
    ><a name="20393"
    > </a
    ><a name="20394" href="#13264" class="Datatype Operator"
    >&#8659;</a
    ><a name="20395"
    > </a
    ><a name="20396" href="#20218" class="Bound"
    >W&#8243;</a
    ><a name="20398"
    > </a
    ><a name="20399" href="#13264" class="Datatype Operator"
    >&#8739;</a
    ><a name="20400"
    > </a
    ><a name="20401" href="#20233" class="Bound"
    >S&#8243;</a
    ><a name="20403" class="Symbol"
    >))</a
    ><a name="20405"
    >
</a
    ><a name="20406" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="20412"
    > </a
    ><a name="20413" class="Symbol"
    >{</a
    ><a name="20414" class="Argument"
    >a</a
    ><a name="20415"
    > </a
    ><a name="20416" class="Symbol"
    >=</a
    ><a name="20417"
    > </a
    ><a name="20418" href="#5338" class="InductiveConstructor"
    >halt</a
    ><a name="20422" class="Symbol"
    >}</a
    ><a name="20423"
    > </a
    ><a name="20424" href="#20424" class="Bound"
    >p</a
    ><a name="20425"
    > </a
    ><a name="20426" class="Symbol"
    >=</a
    ><a name="20427"
    > </a
    ><a name="20428" class="Symbol"
    >_</a
    ><a name="20429"
    > </a
    ><a name="20430" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20431"
    > </a
    ><a name="20432" class="Symbol"
    >_</a
    ><a name="20433"
    > </a
    ><a name="20434" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20435"
    > </a
    ><a name="20436" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="20442"
    > </a
    ><a name="20443" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20444"
    > </a
    ><a name="20445" href="#20424" class="Bound"
    >p</a
    ><a name="20446"
    >
</a
    ><a name="20447" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="20453"
    > </a
    ><a name="20454" class="Symbol"
    >{</a
    ><a name="20455" class="Argument"
    >a</a
    ><a name="20456"
    > </a
    ><a name="20457" class="Symbol"
    >=</a
    ><a name="20458"
    > </a
    ><a name="20459" href="#20459" class="Bound"
    >a</a
    ><a name="20460"
    > </a
    ><a name="20461" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="20462"
    > </a
    ><a name="20463" href="#20463" class="Bound"
    >as</a
    ><a name="20465" class="Symbol"
    >}</a
    ><a name="20466"
    > </a
    ><a name="20467" class="Symbol"
    >(</a
    ><a name="20468" href="#20468" class="Bound"
    >x</a
    ><a name="20469"
    > </a
    ><a name="20470" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="20471"
    > </a
    ><a name="20472" href="#20472" class="Bound"
    >p</a
    ><a name="20473" class="Symbol"
    >)</a
    ><a name="20474"
    > </a
    ><a name="20475" class="Keyword"
    >with</a
    ><a name="20479"
    > </a
    ><a name="20480" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="20486"
    > </a
    ><a name="20487" class="Symbol"
    >{</a
    ><a name="20488" class="Argument"
    >a</a
    ><a name="20489"
    > </a
    ><a name="20490" class="Symbol"
    >=</a
    ><a name="20491"
    > </a
    ><a name="20492" href="#20463" class="Bound"
    >as</a
    ><a name="20494" class="Symbol"
    >}</a
    ><a name="20495"
    > </a
    ><a name="20496" href="#20472" class="Bound"
    >p</a
    ><a name="20497"
    >
</a
    ><a name="20498" class="Symbol"
    >...</a
    ><a name="20501"
    > </a
    ><a name="20502" class="Symbol"
    >|</a
    ><a name="20503"
    > </a
    ><a name="20504" class="Symbol"
    >_</a
    ><a name="20505"
    > </a
    ><a name="20506" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20507"
    > </a
    ><a name="20508" class="Symbol"
    >_</a
    ><a name="20509"
    > </a
    ><a name="20510" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20511"
    > </a
    ><a name="20512" href="#20512" class="Bound"
    >p&#8321;</a
    ><a name="20514"
    > </a
    ><a name="20515" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20516"
    > </a
    ><a name="20517" href="#20517" class="Bound"
    >p&#8322;</a
    ><a name="20519"
    > </a
    ><a name="20520" class="Symbol"
    >=</a
    ><a name="20521"
    > </a
    ><a name="20522" class="Symbol"
    >_</a
    ><a name="20523"
    > </a
    ><a name="20524" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20525"
    > </a
    ><a name="20526" class="Symbol"
    >_</a
    ><a name="20527"
    > </a
    ><a name="20528" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20529"
    > </a
    ><a name="20530" class="Bound"
    >x</a
    ><a name="20531"
    > </a
    ><a name="20532" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="20533"
    > </a
    ><a name="20534" href="#20512" class="Bound"
    >p&#8321;</a
    ><a name="20536"
    > </a
    ><a name="20537" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20538"
    > </a
    ><a name="20539" href="#20517" class="Bound"
    >p&#8322;</a
    ></code
  ></pre
>
<p>Then the soundness proof is given as a boatload of rule inversion and matching on equalities, to convince Agda that there is no other way to possibly evaluate the compiler output:</p>
<pre class="Agda"
><code
  ><a name="20734"
    ></a
    ><a name="20747" href="#20747" class="Function"
    >soundness</a
    ><a name="20756"
    > </a
    ><a name="20757" class="Symbol"
    >:</a
    ><a name="20758"
    > </a
    ><a name="20759" class="Symbol"
    >&#8704;{</a
    ><a name="20761" href="#20761" class="Bound"
    >w</a
    ><a name="20762"
    > </a
    ><a name="20763" href="#20763" class="Bound"
    >s</a
    ><a name="20764" class="Symbol"
    >}{</a
    ><a name="20766" href="#20766" class="Bound"
    >t</a
    ><a name="20767"
    > </a
    ><a name="20768" class="Symbol"
    >:</a
    ><a name="20769"
    > </a
    ><a name="20770" href="#1984" class="Datatype"
    >Term</a
    ><a name="20774"
    > </a
    ><a name="20775" href="#20763" class="Bound"
    >s</a
    ><a name="20776" class="Symbol"
    >}</a
    ><a name="20777"
    > </a
    ><a name="20778" class="Symbol"
    >&#8594;</a
    ><a name="20779"
    > </a
    ><a name="20780" href="#19459" class="Function"
    >Sound&#8242;</a
    ><a name="20786"
    > </a
    ><a name="20787" class="Symbol"
    >{</a
    ><a name="20788" href="#20761" class="Bound"
    >w</a
    ><a name="20789" class="Symbol"
    >}</a
    ><a name="20790"
    > </a
    ><a name="20791" href="#20766" class="Bound"
    >t</a
    ><a name="20792"
    > </a
    ><a name="20793" class="Symbol"
    >(</a
    ><a name="20794" href="#18841" class="Function"
    >codegen</a
    ><a name="20801"
    > </a
    ><a name="20802" href="#20766" class="Bound"
    >t</a
    ><a name="20803" class="Symbol"
    >)</a
    ><a name="20804"
    >
</a
    ><a name="20805" href="#20747" class="Function"
    >soundness</a
    ><a name="20814"
    > </a
    ><a name="20815" class="Symbol"
    >{</a
    ><a name="20816" class="Argument"
    >t</a
    ><a name="20817"
    > </a
    ><a name="20818" class="Symbol"
    >=</a
    ><a name="20819"
    > </a
    ><a name="20820" href="#2011" class="InductiveConstructor"
    >Lit</a
    ><a name="20823"
    > </a
    ><a name="20824" href="#20824" class="Bound"
    >x</a
    ><a name="20825" class="Symbol"
    >}</a
    ><a name="20826"
    > </a
    ><a name="20827" class="Symbol"
    >(</a
    ><a name="20828" href="#7275" class="InductiveConstructor"
    >num-e</a
    ><a name="20833"
    >     </a
    ><a name="20838" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="20839"
    > </a
    ><a name="20840" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="20846" class="Symbol"
    >)</a
    ><a name="20847"
    > </a
    ><a name="20848" class="Symbol"
    >=</a
    ><a name="20849"
    > </a
    ><a name="20850" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="20854"
    > </a
    ><a name="20855" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20856"
    > </a
    ><a name="20857" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="20861"
    > </a
    ><a name="20862" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20863"
    > </a
    ><a name="20864" href="#2780" class="InductiveConstructor"
    >lit-e</a
    ><a name="20869"
    >
</a
    ><a name="20870" href="#20747" class="Function"
    >soundness</a
    ><a name="20879"
    > </a
    ><a name="20880" class="Symbol"
    >{</a
    ><a name="20881" class="Argument"
    >t</a
    ><a name="20882"
    > </a
    ><a name="20883" class="Symbol"
    >=</a
    ><a name="20884"
    > </a
    ><a name="20885" href="#2139" class="InductiveConstructor"
    >Var</a
    ><a name="20888"
    > </a
    ><a name="20889" href="#20889" class="Bound"
    >x</a
    ><a name="20890" class="Symbol"
    >}</a
    ><a name="20891"
    > </a
    ><a name="20892" class="Symbol"
    >(</a
    ><a name="20893" href="#11840" class="InductiveConstructor"
    >pick-e</a
    ><a name="20899"
    > </a
    ><a name="20900" href="#20900" class="Bound"
    >x&#8321;</a
    ><a name="20902"
    > </a
    ><a name="20903" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="20904"
    > </a
    ><a name="20905" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="20911" class="Symbol"
    >)</a
    ><a name="20912"
    > </a
    ><a name="20913" class="Symbol"
    >=</a
    ><a name="20914"
    > </a
    ><a name="20915" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="20919"
    > </a
    ><a name="20920" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20921"
    > </a
    ><a name="20922" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="20926"
    > </a
    ><a name="20927" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="20928"
    > </a
    ><a name="20929" href="#3143" class="InductiveConstructor"
    >var-e</a
    ><a name="20934"
    > </a
    ><a name="20935" href="#20900" class="Bound"
    >x&#8321;</a
    ><a name="20937"
    >
</a
    ><a name="20938" href="#20747" class="Function"
    >soundness</a
    ><a name="20947"
    > </a
    ><a name="20948" class="Symbol"
    >{</a
    ><a name="20949" class="Argument"
    >t</a
    ><a name="20950"
    > </a
    ><a name="20951" class="Symbol"
    >=</a
    ><a name="20952"
    > </a
    ><a name="20953" href="#20953" class="Bound"
    >t&#8321;</a
    ><a name="20955"
    > </a
    ><a name="20956" href="#2030" class="InductiveConstructor Operator"
    >&#8864;</a
    ><a name="20957"
    > </a
    ><a name="20958" href="#20958" class="Bound"
    >t&#8322;</a
    ><a name="20960" class="Symbol"
    >}</a
    ><a name="20961"
    > </a
    ><a name="20962" href="#20962" class="Bound"
    >x</a
    ><a name="20963"
    >
  </a
    ><a name="20966" class="Keyword"
    >with</a
    ><a name="20970"
    > </a
    ><a name="20971" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="20977"
    > </a
    ><a name="20978" class="Symbol"
    >{</a
    ><a name="20979" class="Argument"
    >a</a
    ><a name="20980"
    > </a
    ><a name="20981" class="Symbol"
    >=</a
    ><a name="20982"
    > </a
    ><a name="20983" href="#18841" class="Function"
    >codegen</a
    ><a name="20990"
    > </a
    ><a name="20991" href="#20953" class="Bound"
    >t&#8321;</a
    ><a name="20993"
    > </a
    ><a name="20994" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="20995"
    > </a
    ><a name="20996" href="#18841" class="Function"
    >codegen</a
    ><a name="21003"
    > </a
    ><a name="21004" href="#20958" class="Bound"
    >t&#8322;</a
    ><a name="21006" class="Symbol"
    >}</a
    ><a name="21007"
    > </a
    ><a name="21008" href="#20962" class="Bound"
    >x</a
    ><a name="21009"
    >
</a
    ><a name="21010" class="Symbol"
    >...</a
    ><a name="21013"
    >  </a
    ><a name="21015" class="Symbol"
    >|</a
    ><a name="21016"
    > </a
    ><a name="21017" class="Symbol"
    >_</a
    ><a name="21018"
    > </a
    ><a name="21019" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21020"
    > </a
    ><a name="21021" class="Symbol"
    >_</a
    ><a name="21022"
    > </a
    ><a name="21023" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21024"
    > </a
    ><a name="21025" href="#21025" class="Bound"
    >p</a
    ><a name="21026"
    > </a
    ><a name="21027" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21028"
    > </a
    ><a name="21029" class="Symbol"
    >_</a
    ><a name="21030"
    >
  </a
    ><a name="21033" class="Keyword"
    >with</a
    ><a name="21037"
    > </a
    ><a name="21038" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="21044"
    > </a
    ><a name="21045" class="Symbol"
    >{</a
    ><a name="21046" class="Argument"
    >a</a
    ><a name="21047"
    > </a
    ><a name="21048" class="Symbol"
    >=</a
    ><a name="21049"
    > </a
    ><a name="21050" href="#18841" class="Function"
    >codegen</a
    ><a name="21057"
    > </a
    ><a name="21058" class="Bound"
    >t&#8321;</a
    ><a name="21060" class="Symbol"
    >}</a
    ><a name="21061"
    > </a
    ><a name="21062" href="#21025" class="Bound"
    >p</a
    ><a name="21063"
    >
</a
    ><a name="21064" class="Symbol"
    >...</a
    ><a name="21067"
    >  </a
    ><a name="21069" class="Symbol"
    >|</a
    ><a name="21070"
    > </a
    ><a name="21071" class="Symbol"
    >_</a
    ><a name="21072"
    > </a
    ><a name="21073" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21074"
    > </a
    ><a name="21075" class="Symbol"
    >_</a
    ><a name="21076"
    > </a
    ><a name="21077" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21078"
    > </a
    ><a name="21079" href="#21079" class="Bound"
    >p&#8321;</a
    ><a name="21081"
    > </a
    ><a name="21082" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21083"
    > </a
    ><a name="21084" href="#21084" class="Bound"
    >p&#8322;</a
    ><a name="21086"
    >
  </a
    ><a name="21089" class="Keyword"
    >with</a
    ><a name="21093"
    > </a
    ><a name="21094" href="#20747" class="Function"
    >soundness</a
    ><a name="21103"
    > </a
    ><a name="21104" class="Symbol"
    >{</a
    ><a name="21105" class="Argument"
    >t</a
    ><a name="21106"
    > </a
    ><a name="21107" class="Symbol"
    >=</a
    ><a name="21108"
    > </a
    ><a name="21109" class="Bound"
    >t&#8321;</a
    ><a name="21111" class="Symbol"
    >}</a
    ><a name="21112"
    > </a
    ><a name="21113" href="#21079" class="Bound"
    >p&#8321;</a
    ><a name="21115"
    > </a
    ><a name="21116" class="Symbol"
    >|</a
    ><a name="21117"
    > </a
    ><a name="21118" href="#20747" class="Function"
    >soundness</a
    ><a name="21127"
    > </a
    ><a name="21128" class="Symbol"
    >{</a
    ><a name="21129" class="Argument"
    >t</a
    ><a name="21130"
    > </a
    ><a name="21131" class="Symbol"
    >=</a
    ><a name="21132"
    > </a
    ><a name="21133" class="Bound"
    >t&#8322;</a
    ><a name="21135" class="Symbol"
    >}</a
    ><a name="21136"
    > </a
    ><a name="21137" href="#21084" class="Bound"
    >p&#8322;</a
    ><a name="21139"
    >
</a
    ><a name="21140" href="#20747" class="Function"
    >soundness</a
    ><a name="21149"
    > </a
    ><a name="21150" class="Symbol"
    >{</a
    ><a name="21151" class="Argument"
    >t</a
    ><a name="21152"
    > </a
    ><a name="21153" class="Symbol"
    >=</a
    ><a name="21154"
    > </a
    ><a name="21155" href="#21155" class="Bound"
    >t&#8321;</a
    ><a name="21157"
    > </a
    ><a name="21158" href="#2030" class="InductiveConstructor Operator"
    >&#8864;</a
    ><a name="21159"
    > </a
    ><a name="21160" href="#21160" class="Bound"
    >t&#8322;</a
    ><a name="21162" class="Symbol"
    >}</a
    ><a name="21163"
    > </a
    ><a name="21164" href="#21164" class="Bound"
    >x</a
    ><a name="21165"
    >
    </a
    ><a name="21170" class="Symbol"
    >|</a
    ><a name="21171"
    > </a
    ><a name="21172" class="Symbol"
    >_</a
    ><a name="21173"
    >  </a
    ><a name="21175" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21176"
    >  </a
    ><a name="21178" class="Symbol"
    >_</a
    ><a name="21179"
    > </a
    ><a name="21180" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21181"
    >  </a
    ><a name="21183" class="Symbol"
    >_</a
    ><a name="21184"
    > </a
    ><a name="21185" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21186"
    > </a
    ><a name="21187" class="DottedPattern Symbol"
    >._</a
    ><a name="21189"
    > </a
    ><a name="21190" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21191"
    > </a
    ><a name="21192" class="Symbol"
    >_</a
    ><a name="21193"
    > </a
    ><a name="21194" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21195"
    > </a
    ><a name="21196" href="#9511" class="InductiveConstructor"
    >times-e</a
    ><a name="21203"
    > </a
    ><a name="21204" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21205"
    > </a
    ><a name="21206" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="21212"
    >
    </a
    ><a name="21217" class="Symbol"
    >|</a
    ><a name="21218"
    >      </a
    ><a name="21224" class="DottedPattern Symbol"
    >._</a
    ><a name="21226"
    > </a
    ><a name="21227" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21228"
    > </a
    ><a name="21229" class="DottedPattern Symbol"
    >._</a
    ><a name="21231"
    > </a
    ><a name="21232" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21233"
    > </a
    ><a name="21234" class="DottedPattern Symbol"
    >._</a
    ><a name="21236"
    > </a
    ><a name="21237" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21238"
    > </a
    ><a name="21239" class="Symbol"
    >_</a
    ><a name="21240"
    > </a
    ><a name="21241" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21242"
    > </a
    ><a name="21243" class="Symbol"
    >_</a
    ><a name="21244"
    >
    </a
    ><a name="21249" class="Symbol"
    >|</a
    ><a name="21250"
    > </a
    ><a name="21251" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21255"
    > </a
    ><a name="21256" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21257"
    > </a
    ><a name="21258" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21262"
    > </a
    ><a name="21263" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21264"
    > </a
    ><a name="21265" href="#21265" class="Bound"
    >a</a
    ><a name="21266"
    >
    </a
    ><a name="21271" class="Symbol"
    >|</a
    ><a name="21272"
    > </a
    ><a name="21273" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21277"
    > </a
    ><a name="21278" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21279"
    > </a
    ><a name="21280" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21284"
    > </a
    ><a name="21285" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21286"
    > </a
    ><a name="21287" href="#21287" class="Bound"
    >b</a
    ><a name="21288"
    >
    </a
    ><a name="21293" class="Symbol"
    >=</a
    ><a name="21294"
    > </a
    ><a name="21295" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21299"
    > </a
    ><a name="21300" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21301"
    > </a
    ><a name="21302" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21306"
    > </a
    ><a name="21307" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21308"
    > </a
    ><a name="21309" href="#2851" class="InductiveConstructor"
    >times-e</a
    ><a name="21316"
    > </a
    ><a name="21317" href="#21265" class="Bound"
    >a</a
    ><a name="21318"
    > </a
    ><a name="21319" href="#21287" class="Bound"
    >b</a
    ><a name="21320"
    >
</a
    ><a name="21321" href="#20747" class="Function"
    >soundness</a
    ><a name="21330"
    > </a
    ><a name="21331" class="Symbol"
    >{</a
    ><a name="21332" class="Argument"
    >t</a
    ><a name="21333"
    > </a
    ><a name="21334" class="Symbol"
    >=</a
    ><a name="21335"
    > </a
    ><a name="21336" href="#21336" class="Bound"
    >t&#8321;</a
    ><a name="21338"
    > </a
    ><a name="21339" href="#2063" class="InductiveConstructor Operator"
    >&#8862;</a
    ><a name="21340"
    > </a
    ><a name="21341" href="#21341" class="Bound"
    >t&#8322;</a
    ><a name="21343" class="Symbol"
    >}</a
    ><a name="21344"
    > </a
    ><a name="21345" href="#21345" class="Bound"
    >x</a
    ><a name="21346"
    >
  </a
    ><a name="21349" class="Keyword"
    >with</a
    ><a name="21353"
    > </a
    ><a name="21354" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="21360"
    > </a
    ><a name="21361" class="Symbol"
    >{</a
    ><a name="21362" class="Argument"
    >a</a
    ><a name="21363"
    > </a
    ><a name="21364" class="Symbol"
    >=</a
    ><a name="21365"
    > </a
    ><a name="21366" href="#18841" class="Function"
    >codegen</a
    ><a name="21373"
    > </a
    ><a name="21374" href="#21336" class="Bound"
    >t&#8321;</a
    ><a name="21376"
    > </a
    ><a name="21377" href="#5559" class="Function Operator"
    >&#8853;</a
    ><a name="21378"
    > </a
    ><a name="21379" href="#18841" class="Function"
    >codegen</a
    ><a name="21386"
    > </a
    ><a name="21387" href="#21341" class="Bound"
    >t&#8322;</a
    ><a name="21389" class="Symbol"
    >}</a
    ><a name="21390"
    > </a
    ><a name="21391" href="#21345" class="Bound"
    >x</a
    ><a name="21392"
    >
</a
    ><a name="21393" class="Symbol"
    >...</a
    ><a name="21396"
    >  </a
    ><a name="21398" class="Symbol"
    >|</a
    ><a name="21399"
    > </a
    ><a name="21400" class="Symbol"
    >_</a
    ><a name="21401"
    > </a
    ><a name="21402" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21403"
    > </a
    ><a name="21404" class="Symbol"
    >_</a
    ><a name="21405"
    > </a
    ><a name="21406" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21407"
    > </a
    ><a name="21408" href="#21408" class="Bound"
    >p</a
    ><a name="21409"
    > </a
    ><a name="21410" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21411"
    > </a
    ><a name="21412" class="Symbol"
    >_</a
    ><a name="21413"
    >
  </a
    ><a name="21416" class="Keyword"
    >with</a
    ><a name="21420"
    > </a
    ><a name="21421" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="21427"
    > </a
    ><a name="21428" class="Symbol"
    >{</a
    ><a name="21429" class="Argument"
    >a</a
    ><a name="21430"
    > </a
    ><a name="21431" class="Symbol"
    >=</a
    ><a name="21432"
    > </a
    ><a name="21433" href="#18841" class="Function"
    >codegen</a
    ><a name="21440"
    > </a
    ><a name="21441" class="Bound"
    >t&#8321;</a
    ><a name="21443" class="Symbol"
    >}</a
    ><a name="21444"
    > </a
    ><a name="21445" href="#21408" class="Bound"
    >p</a
    ><a name="21446"
    >
</a
    ><a name="21447" class="Symbol"
    >...</a
    ><a name="21450"
    >  </a
    ><a name="21452" class="Symbol"
    >|</a
    ><a name="21453"
    > </a
    ><a name="21454" class="Symbol"
    >_</a
    ><a name="21455"
    > </a
    ><a name="21456" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21457"
    > </a
    ><a name="21458" class="Symbol"
    >_</a
    ><a name="21459"
    > </a
    ><a name="21460" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21461"
    > </a
    ><a name="21462" href="#21462" class="Bound"
    >p&#8321;</a
    ><a name="21464"
    > </a
    ><a name="21465" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21466"
    > </a
    ><a name="21467" href="#21467" class="Bound"
    >p&#8322;</a
    ><a name="21469"
    >
  </a
    ><a name="21472" class="Keyword"
    >with</a
    ><a name="21476"
    > </a
    ><a name="21477" href="#20747" class="Function"
    >soundness</a
    ><a name="21486"
    > </a
    ><a name="21487" class="Symbol"
    >{</a
    ><a name="21488" class="Argument"
    >t</a
    ><a name="21489"
    > </a
    ><a name="21490" class="Symbol"
    >=</a
    ><a name="21491"
    > </a
    ><a name="21492" class="Bound"
    >t&#8321;</a
    ><a name="21494" class="Symbol"
    >}</a
    ><a name="21495"
    > </a
    ><a name="21496" href="#21462" class="Bound"
    >p&#8321;</a
    ><a name="21498"
    > </a
    ><a name="21499" class="Symbol"
    >|</a
    ><a name="21500"
    > </a
    ><a name="21501" href="#20747" class="Function"
    >soundness</a
    ><a name="21510"
    > </a
    ><a name="21511" class="Symbol"
    >{</a
    ><a name="21512" class="Argument"
    >t</a
    ><a name="21513"
    > </a
    ><a name="21514" class="Symbol"
    >=</a
    ><a name="21515"
    > </a
    ><a name="21516" class="Bound"
    >t&#8322;</a
    ><a name="21518" class="Symbol"
    >}</a
    ><a name="21519"
    > </a
    ><a name="21520" href="#21467" class="Bound"
    >p&#8322;</a
    ><a name="21522"
    >
</a
    ><a name="21523" href="#20747" class="Function"
    >soundness</a
    ><a name="21532"
    > </a
    ><a name="21533" class="Symbol"
    >{</a
    ><a name="21534" class="Argument"
    >t</a
    ><a name="21535"
    > </a
    ><a name="21536" class="Symbol"
    >=</a
    ><a name="21537"
    > </a
    ><a name="21538" href="#21538" class="Bound"
    >t&#8321;</a
    ><a name="21540"
    > </a
    ><a name="21541" href="#2063" class="InductiveConstructor Operator"
    >&#8862;</a
    ><a name="21542"
    > </a
    ><a name="21543" href="#21543" class="Bound"
    >t&#8322;</a
    ><a name="21545" class="Symbol"
    >}</a
    ><a name="21546"
    > </a
    ><a name="21547" href="#21547" class="Bound"
    >x</a
    ><a name="21548"
    >
    </a
    ><a name="21553" class="Symbol"
    >|</a
    ><a name="21554"
    > </a
    ><a name="21555" class="Symbol"
    >_</a
    ><a name="21556"
    >  </a
    ><a name="21558" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21559"
    >  </a
    ><a name="21561" class="Symbol"
    >_</a
    ><a name="21562"
    > </a
    ><a name="21563" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21564"
    >  </a
    ><a name="21566" class="Symbol"
    >_</a
    ><a name="21567"
    > </a
    ><a name="21568" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21569"
    > </a
    ><a name="21570" class="DottedPattern Symbol"
    >._</a
    ><a name="21572"
    > </a
    ><a name="21573" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21574"
    > </a
    ><a name="21575" class="Symbol"
    >_</a
    ><a name="21576"
    > </a
    ><a name="21577" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21578"
    > </a
    ><a name="21579" href="#8374" class="InductiveConstructor"
    >plus-e</a
    ><a name="21585"
    > </a
    ><a name="21586" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21587"
    > </a
    ><a name="21588" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="21594"
    >
    </a
    ><a name="21599" class="Symbol"
    >|</a
    ><a name="21600"
    >      </a
    ><a name="21606" class="DottedPattern Symbol"
    >._</a
    ><a name="21608"
    > </a
    ><a name="21609" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21610"
    > </a
    ><a name="21611" class="DottedPattern Symbol"
    >._</a
    ><a name="21613"
    > </a
    ><a name="21614" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21615"
    > </a
    ><a name="21616" class="DottedPattern Symbol"
    >._</a
    ><a name="21618"
    > </a
    ><a name="21619" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21620"
    > </a
    ><a name="21621" class="Symbol"
    >_</a
    ><a name="21622"
    > </a
    ><a name="21623" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21624"
    > </a
    ><a name="21625" class="Symbol"
    >_</a
    ><a name="21626"
    >
    </a
    ><a name="21631" class="Symbol"
    >|</a
    ><a name="21632"
    > </a
    ><a name="21633" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21637"
    > </a
    ><a name="21638" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21639"
    > </a
    ><a name="21640" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21644"
    > </a
    ><a name="21645" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21646"
    > </a
    ><a name="21647" href="#21647" class="Bound"
    >a</a
    ><a name="21648"
    >
    </a
    ><a name="21653" class="Symbol"
    >|</a
    ><a name="21654"
    > </a
    ><a name="21655" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21659"
    > </a
    ><a name="21660" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21661"
    > </a
    ><a name="21662" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21666"
    > </a
    ><a name="21667" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21668"
    > </a
    ><a name="21669" href="#21669" class="Bound"
    >b</a
    ><a name="21670"
    >
    </a
    ><a name="21675" class="Symbol"
    >=</a
    ><a name="21676"
    > </a
    ><a name="21677" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21681"
    > </a
    ><a name="21682" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21683"
    > </a
    ><a name="21684" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="21688"
    > </a
    ><a name="21689" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21690"
    > </a
    ><a name="21691" href="#2997" class="InductiveConstructor"
    >plus-e</a
    ><a name="21697"
    > </a
    ><a name="21698" href="#21647" class="Bound"
    >a</a
    ><a name="21699"
    > </a
    ><a name="21700" href="#21669" class="Bound"
    >b</a
    ><a name="21701"
    >
</a
    ><a name="21702" href="#20747" class="Function"
    >soundness</a
    ><a name="21711"
    > </a
    ><a name="21712" class="Symbol"
    >{</a
    ><a name="21713" class="Argument"
    >t</a
    ><a name="21714"
    > </a
    ><a name="21715" class="Symbol"
    >=</a
    ><a name="21716"
    > </a
    ><a name="21717" href="#2096" class="InductiveConstructor Operator"
    >Let</a
    ><a name="21720"
    > </a
    ><a name="21721" href="#21721" class="Bound"
    >t&#8321;</a
    ><a name="21723"
    > </a
    ><a name="21724" href="#2096" class="InductiveConstructor Operator"
    >In</a
    ><a name="21726"
    > </a
    ><a name="21727" href="#21727" class="Bound"
    >t&#8322;</a
    ><a name="21729" class="Symbol"
    >}</a
    ><a name="21730"
    > </a
    ><a name="21731" href="#21731" class="Bound"
    >x</a
    ><a name="21732"
    >
  </a
    ><a name="21735" class="Keyword"
    >with</a
    ><a name="21739"
    > </a
    ><a name="21740" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="21746"
    > </a
    ><a name="21747" class="Symbol"
    >{</a
    ><a name="21748" class="Argument"
    >a</a
    ><a name="21749"
    > </a
    ><a name="21750" class="Symbol"
    >=</a
    ><a name="21751"
    > </a
    ><a name="21752" href="#18841" class="Function"
    >codegen</a
    ><a name="21759"
    > </a
    ><a name="21760" href="#21721" class="Bound"
    >t&#8321;</a
    ><a name="21762" class="Symbol"
    >}</a
    ><a name="21763"
    > </a
    ><a name="21764" href="#21731" class="Bound"
    >x</a
    ><a name="21765"
    >
</a
    ><a name="21766" class="Symbol"
    >...</a
    ><a name="21769"
    >  </a
    ><a name="21771" class="Symbol"
    >|</a
    ><a name="21772"
    > </a
    ><a name="21773" class="Symbol"
    >_</a
    ><a name="21774"
    > </a
    ><a name="21775" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21776"
    > </a
    ><a name="21777" class="Symbol"
    >_</a
    ><a name="21778"
    > </a
    ><a name="21779" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21780"
    > </a
    ><a name="21781" class="Symbol"
    >_</a
    ><a name="21782"
    > </a
    ><a name="21783" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21784"
    > </a
    ><a name="21785" href="#21785" class="Bound"
    >p&#8321;</a
    ><a name="21787"
    > </a
    ><a name="21788" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21789"
    > </a
    ><a name="21790" href="#10655" class="InductiveConstructor"
    >push-e</a
    ><a name="21796"
    > </a
    ><a name="21797" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21798"
    > </a
    ><a name="21799" href="#21799" class="Bound"
    >q</a
    ><a name="21800"
    >
  </a
    ><a name="21803" class="Keyword"
    >with</a
    ><a name="21807"
    > </a
    ><a name="21808" href="#20142" class="Function"
    >&#8853;-elim</a
    ><a name="21814"
    > </a
    ><a name="21815" class="Symbol"
    >{</a
    ><a name="21816" class="Argument"
    >a</a
    ><a name="21817"
    > </a
    ><a name="21818" class="Symbol"
    >=</a
    ><a name="21819"
    > </a
    ><a name="21820" href="#18841" class="Function"
    >codegen</a
    ><a name="21827"
    > </a
    ><a name="21828" class="Bound"
    >t&#8322;</a
    ><a name="21830" class="Symbol"
    >}</a
    ><a name="21831"
    > </a
    ><a name="21832" href="#21799" class="Bound"
    >q</a
    ><a name="21833"
    >
</a
    ><a name="21834" class="Symbol"
    >...</a
    ><a name="21837"
    >  </a
    ><a name="21839" class="Symbol"
    >|</a
    ><a name="21840"
    > </a
    ><a name="21841" class="Symbol"
    >_</a
    ><a name="21842"
    > </a
    ><a name="21843" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21844"
    > </a
    ><a name="21845" class="Symbol"
    >_</a
    ><a name="21846"
    > </a
    ><a name="21847" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21848"
    > </a
    ><a name="21849" class="Symbol"
    >_</a
    ><a name="21850"
    > </a
    ><a name="21851" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21852"
    > </a
    ><a name="21853" class="Symbol"
    >_</a
    ><a name="21854"
    > </a
    ><a name="21855" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21856"
    > </a
    ><a name="21857" href="#21857" class="Bound"
    >p&#8322;</a
    ><a name="21859"
    > </a
    ><a name="21860" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21861"
    > </a
    ><a name="21862" class="Symbol"
    >_</a
    ><a name="21863"
    >
  </a
    ><a name="21866" class="Keyword"
    >with</a
    ><a name="21870"
    > </a
    ><a name="21871" href="#20747" class="Function"
    >soundness</a
    ><a name="21880"
    > </a
    ><a name="21881" class="Symbol"
    >{</a
    ><a name="21882" class="Argument"
    >t</a
    ><a name="21883"
    > </a
    ><a name="21884" class="Symbol"
    >=</a
    ><a name="21885"
    > </a
    ><a name="21886" class="Bound"
    >t&#8321;</a
    ><a name="21888" class="Symbol"
    >}</a
    ><a name="21889"
    > </a
    ><a name="21890" class="Bound"
    >p&#8321;</a
    ><a name="21892"
    > </a
    ><a name="21893" class="Symbol"
    >|</a
    ><a name="21894"
    > </a
    ><a name="21895" href="#20747" class="Function"
    >soundness</a
    ><a name="21904"
    > </a
    ><a name="21905" class="Symbol"
    >{</a
    ><a name="21906" class="Argument"
    >t</a
    ><a name="21907"
    > </a
    ><a name="21908" class="Symbol"
    >=</a
    ><a name="21909"
    > </a
    ><a name="21910" class="Bound"
    >t&#8322;</a
    ><a name="21912" class="Symbol"
    >}</a
    ><a name="21913"
    > </a
    ><a name="21914" href="#21857" class="Bound"
    >p&#8322;</a
    ><a name="21916"
    >
</a
    ><a name="21917" href="#20747" class="Function"
    >soundness</a
    ><a name="21926"
    > </a
    ><a name="21927" class="Symbol"
    >{</a
    ><a name="21928" class="Argument"
    >t</a
    ><a name="21929"
    > </a
    ><a name="21930" class="Symbol"
    >=</a
    ><a name="21931"
    > </a
    ><a name="21932" href="#2096" class="InductiveConstructor Operator"
    >Let</a
    ><a name="21935"
    > </a
    ><a name="21936" href="#21936" class="Bound"
    >t&#8321;</a
    ><a name="21938"
    > </a
    ><a name="21939" href="#2096" class="InductiveConstructor Operator"
    >In</a
    ><a name="21941"
    > </a
    ><a name="21942" href="#21942" class="Bound"
    >t&#8322;</a
    ><a name="21944" class="Symbol"
    >}</a
    ><a name="21945"
    > </a
    ><a name="21946" href="#21946" class="Bound"
    >x</a
    ><a name="21947"
    >
  </a
    ><a name="21950" class="Symbol"
    >|</a
    ><a name="21951"
    > </a
    ><a name="21952" class="Symbol"
    >_</a
    ><a name="21953"
    > </a
    ><a name="21954" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21955"
    > </a
    ><a name="21956" class="DottedPattern Symbol"
    >._</a
    ><a name="21958"
    > </a
    ><a name="21959" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21960"
    > </a
    ><a name="21961" class="DottedPattern Symbol"
    >._</a
    ><a name="21963"
    >      </a
    ><a name="21969" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21970"
    > </a
    ><a name="21971" class="Symbol"
    >_</a
    ><a name="21972"
    > </a
    ><a name="21973" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21974"
    > </a
    ><a name="21975" href="#10655" class="InductiveConstructor"
    >push-e</a
    ><a name="21981"
    > </a
    ><a name="21982" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21983"
    > </a
    ><a name="21984" href="#21984" class="Bound"
    >q</a
    ><a name="21985"
    >
  </a
    ><a name="21988" class="Symbol"
    >|</a
    ><a name="21989"
    > </a
    ><a name="21990" class="Symbol"
    >_</a
    ><a name="21991"
    > </a
    ><a name="21992" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="21993"
    > </a
    ><a name="21994" class="DottedPattern Symbol"
    >._</a
    ><a name="21996"
    > </a
    ><a name="21997" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="21998"
    > </a
    ><a name="21999" class="DottedPattern Symbol"
    >._</a
    ><a name="22001"
    > </a
    ><a name="22002" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="22003"
    > </a
    ><a name="22004" class="DottedPattern Symbol"
    >._</a
    ><a name="22006"
    > </a
    ><a name="22007" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22008"
    > </a
    ><a name="22009" class="Symbol"
    >_</a
    ><a name="22010"
    > </a
    ><a name="22011" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22012"
    > </a
    ><a name="22013" href="#12959" class="InductiveConstructor"
    >pop-e</a
    ><a name="22018"
    > </a
    ><a name="22019" href="#13415" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="22020"
    > </a
    ><a name="22021" href="#13382" class="InductiveConstructor"
    >halt-e</a
    ><a name="22027"
    >
  </a
    ><a name="22030" class="Symbol"
    >|</a
    ><a name="22031"
    > </a
    ><a name="22032" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="22036"
    > </a
    ><a name="22037" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22038"
    > </a
    ><a name="22039" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="22043"
    > </a
    ><a name="22044" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22045"
    > </a
    ><a name="22046" href="#22046" class="Bound"
    >a</a
    ><a name="22047"
    >
  </a
    ><a name="22050" class="Symbol"
    >|</a
    ><a name="22051"
    > </a
    ><a name="22052" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="22056"
    > </a
    ><a name="22057" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22058"
    > </a
    ><a name="22059" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="22063"
    > </a
    ><a name="22064" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22065"
    > </a
    ><a name="22066" href="#22066" class="Bound"
    >b</a
    ><a name="22067"
    >
  </a
    ><a name="22070" class="Symbol"
    >=</a
    ><a name="22071"
    > </a
    ><a name="22072" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="22076"
    > </a
    ><a name="22077" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22078"
    > </a
    ><a name="22079" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ><a name="22083"
    > </a
    ><a name="22084" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Sigma.html#139" class="InductiveConstructor Operator"
    >,</a
    ><a name="22085"
    > </a
    ><a name="22086" href="#3240" class="InductiveConstructor"
    >let-e</a
    ><a name="22091"
    > </a
    ><a name="22092" href="#22046" class="Bound"
    >a</a
    ><a name="22093"
    > </a
    ><a name="22094" href="#22066" class="Bound"
    >b</a
    ></code
  ></pre
>
</details>
<h2 id="compiler-frontend">Compiler Frontend</h2>
<p>Now that we have a verified code generator, as a final flourish we’ll implement a basic compiler frontend<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a> for our language and run it on some basic examples.</p>
<p>We define a surface syntax as follows. In the tradition of all the greatest languages such as BASIC, FORTRAN and COBOL, capital letters are exclusively used, and English words are favoured over symbols because it makes the language readable to non-programmers. I should also acknowledge the definite influence of PHP, Perl and <code>sh</code> on the choice of the <code>$</code> sigil to precede variable names. The sigil <code>#</code> precedes numeric literals as Agda does not allow us to overload them.</p>
<pre class="Agda"
><code
  ><a name="22779"
    ></a
    ><a name="22792" class="Keyword"
    >data</a
    ><a name="22796"
    > </a
    ><a name="22797" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22801"
    > </a
    ><a name="22802" class="Symbol"
    >:</a
    ><a name="22803"
    > </a
    ><a name="22804" class="PrimitiveType"
    >Set</a
    ><a name="22807"
    > </a
    ><a name="22808" class="Keyword"
    >where</a
    ><a name="22813"
    >
  </a
    ><a name="22816" href="#22816" class="InductiveConstructor Operator"
    >LET_BE_IN_</a
    ><a name="22826"
    > </a
    ><a name="22827" class="Symbol"
    >:</a
    ><a name="22828"
    > </a
    ><a name="22829" href="http://agda.github.io/agda-stdlib/Agda.Builtin.String.html#165" class="Postulate"
    >String</a
    ><a name="22835"
    > </a
    ><a name="22836" class="Symbol"
    >&#8594;</a
    ><a name="22837"
    > </a
    ><a name="22838" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22842"
    > </a
    ><a name="22843" class="Symbol"
    >&#8594;</a
    ><a name="22844"
    > </a
    ><a name="22845" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22849"
    > </a
    ><a name="22850" class="Symbol"
    >&#8594;</a
    ><a name="22851"
    > </a
    ><a name="22852" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22856"
    >
  </a
    ><a name="22859" href="#22859" class="InductiveConstructor Operator"
    >_PLUS_</a
    ><a name="22865"
    >     </a
    ><a name="22870" class="Symbol"
    >:</a
    ><a name="22871"
    > </a
    ><a name="22872" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22876"
    > </a
    ><a name="22877" class="Symbol"
    >&#8594;</a
    ><a name="22878"
    > </a
    ><a name="22879" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22883"
    > </a
    ><a name="22884" class="Symbol"
    >&#8594;</a
    ><a name="22885"
    > </a
    ><a name="22886" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22890"
    >
  </a
    ><a name="22893" href="#22893" class="InductiveConstructor Operator"
    >_TIMES_</a
    ><a name="22900"
    >    </a
    ><a name="22904" class="Symbol"
    >:</a
    ><a name="22905"
    > </a
    ><a name="22906" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22910"
    > </a
    ><a name="22911" class="Symbol"
    >&#8594;</a
    ><a name="22912"
    > </a
    ><a name="22913" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22917"
    > </a
    ><a name="22918" class="Symbol"
    >&#8594;</a
    ><a name="22919"
    > </a
    ><a name="22920" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22924"
    >
  </a
    ><a name="22927" href="#22927" class="InductiveConstructor Operator"
    >$_</a
    ><a name="22929"
    >         </a
    ><a name="22938" class="Symbol"
    >:</a
    ><a name="22939"
    > </a
    ><a name="22940" href="http://agda.github.io/agda-stdlib/Agda.Builtin.String.html#165" class="Postulate"
    >String</a
    ><a name="22946"
    > </a
    ><a name="22947" class="Symbol"
    >&#8594;</a
    ><a name="22948"
    > </a
    ><a name="22949" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22953"
    >
  </a
    ><a name="22956" href="#22956" class="InductiveConstructor Operator"
    >#_</a
    ><a name="22958"
    >         </a
    ><a name="22967" class="Symbol"
    >:</a
    ><a name="22968"
    > </a
    ><a name="22969" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Nat.html#97" class="Datatype"
    >&#8469;</a
    ><a name="22970"
    > </a
    ><a name="22971" class="Symbol"
    >&#8594;</a
    ><a name="22972"
    > </a
    ><a name="22973" href="#22797" class="Datatype"
    >Surf</a
    ><a name="22977"
    >

</a
    ><a name="22979" class="Keyword"
    >infixr</a
    ><a name="22985"
    > </a
    ><a name="22986" class="Number"
    >4</a
    ><a name="22987"
    > </a
    ><a name="22988" href="#22816" class="InductiveConstructor Operator"
    >LET_BE_IN_</a
    ><a name="22998"
    >
</a
    ><a name="22999" class="Keyword"
    >infixl</a
    ><a name="23005"
    > </a
    ><a name="23006" class="Number"
    >5</a
    ><a name="23007"
    > </a
    ><a name="23008" href="#22859" class="InductiveConstructor Operator"
    >_PLUS_</a
    ><a name="23014"
    >
</a
    ><a name="23015" class="Keyword"
    >infixl</a
    ><a name="23021"
    > </a
    ><a name="23022" class="Number"
    >6</a
    ><a name="23023"
    > </a
    ><a name="23024" href="#22893" class="InductiveConstructor Operator"
    >_TIMES_</a
    ><a name="23031"
    >
</a
    ><a name="23032" class="Keyword"
    >infix</a
    ><a name="23037"
    > </a
    ><a name="23038" class="Number"
    >7</a
    ><a name="23039"
    > </a
    ><a name="23040" href="#22927" class="InductiveConstructor Operator"
    >$_</a
    ><a name="23042"
    >
</a
    ><a name="23043" class="Keyword"
    >infix</a
    ><a name="23048"
    > </a
    ><a name="23049" class="Number"
    >7</a
    ><a name="23050"
    > </a
    ><a name="23051" href="#22956" class="InductiveConstructor Operator"
    >#_</a
    ></code
  ></pre
>
<p>Unlike our <code>Term</code> AST, this surface syntax does not include any scope information, uses strings for variable names, and is more likely to be something that would be produced from a parser. In order to compile this language, we must first translate it into our wellformed-by-construction <code>Term</code> type, which necessitates <em>scope-checking</em>.</p>
<div class="hidden">
<pre class="Agda"
><code
  ><a name="23423"
    ></a
    ><a name="23436" class="Keyword"
    >open</a
    ><a name="23440"
    > </a
    ><a name="23441" class="Keyword"
    >import</a
    ><a name="23447"
    > </a
    ><a name="23448" href="http://agda.github.io/agda-stdlib/Data.Maybe.html#1" class="Module"
    >Data.Maybe</a
    ><a name="23458"
    >
</a
    ><a name="23459" class="Keyword"
    >open</a
    ><a name="23463"
    > </a
    ><a name="23464" class="Keyword"
    >import</a
    ><a name="23470"
    > </a
    ><a name="23471" href="http://agda.github.io/agda-stdlib/Data.Maybe.Categorical.html#1" class="Module"
    >Data.Maybe.Categorical</a
    ><a name="23493"
    >
</a
    ><a name="23494" class="Keyword"
    >open</a
    ><a name="23498"
    > </a
    ><a name="23499" class="Keyword"
    >import</a
    ><a name="23505"
    > </a
    ><a name="23506" href="http://agda.github.io/agda-stdlib/Category.Monad.html#1" class="Module"
    >Category.Monad</a
    ><a name="23520"
    >
</a
    ><a name="23521" class="Keyword"
    >open</a
    ><a name="23525"
    > </a
    ><a name="23526" class="Keyword"
    >import</a
    ><a name="23532"
    > </a
    ><a name="23533" href="http://agda.github.io/agda-stdlib/Category.Applicative.html#1" class="Module"
    >Category.Applicative</a
    ><a name="23553"
    >
</a
    ><a name="23554" class="Keyword"
    >import</a
    ><a name="23560"
    > </a
    ><a name="23561" href="http://agda.github.io/agda-stdlib/Level.html#1" class="Module"
    >Level</a
    ><a name="23566"
    >
</a
    ><a name="23567" class="Keyword"
    >open</a
    ><a name="23571"
    > </a
    ><a name="23572" href="http://agda.github.io/agda-stdlib/Category.Monad.html#774" class="Module"
    >RawMonad</a
    ><a name="23580"
    > </a
    ><a name="23581" class="Symbol"
    >(</a
    ><a name="23582" href="http://agda.github.io/agda-stdlib/Data.Maybe.Categorical.html#1107" class="Function"
    >monad</a
    ><a name="23587"
    > </a
    ><a name="23588" class="Symbol"
    >{</a
    ><a name="23589" href="http://agda.github.io/agda-stdlib/Agda.Primitive.html#611" class="Primitive"
    >Level.zero</a
    ><a name="23599" class="Symbol"
    >})</a
    ><a name="23601"
    >
</a
    ><a name="23602" class="Keyword"
    >open</a
    ><a name="23606"
    > </a
    ><a name="23607" class="Keyword"
    >import</a
    ><a name="23613"
    > </a
    ><a name="23614" href="http://agda.github.io/agda-stdlib/Relation.Nullary.html#1" class="Module"
    >Relation.Nullary</a
    ></code
  ></pre
>
</div>
<pre class="Agda"
><code
  ><a name="23650"
    ></a
    ><a name="23663" href="#23663" class="Function"
    >check</a
    ><a name="23668"
    > </a
    ><a name="23669" class="Symbol"
    >:</a
    ><a name="23670"
    > </a
    ><a name="23671" class="Symbol"
    >&#8704;{</a
    ><a name="23673" href="#23673" class="Bound"
    >n</a
    ><a name="23674" class="Symbol"
    >}</a
    ><a name="23675"
    > </a
    ><a name="23676" class="Symbol"
    >&#8594;</a
    ><a name="23677"
    > </a
    ><a name="23678" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="23681"
    > </a
    ><a name="23682" href="http://agda.github.io/agda-stdlib/Agda.Builtin.String.html#165" class="Postulate"
    >String</a
    ><a name="23688"
    > </a
    ><a name="23689" href="#23673" class="Bound"
    >n</a
    ><a name="23690"
    > </a
    ><a name="23691" class="Symbol"
    >&#8594;</a
    ><a name="23692"
    > </a
    ><a name="23693" href="#22797" class="Datatype"
    >Surf</a
    ><a name="23697"
    > </a
    ><a name="23698" class="Symbol"
    >&#8594;</a
    ><a name="23699"
    > </a
    ><a name="23700" href="http://agda.github.io/agda-stdlib/Data.Maybe.Base.html#674" class="Datatype"
    >Maybe</a
    ><a name="23705"
    > </a
    ><a name="23706" class="Symbol"
    >(</a
    ><a name="23707" href="#1984" class="Datatype"
    >Term</a
    ><a name="23711"
    > </a
    ><a name="23712" href="#23673" class="Bound"
    >n</a
    ><a name="23713" class="Symbol"
    >)</a
    ><a name="23714"
    >
</a
    ><a name="23715" href="#23663" class="Function"
    >check</a
    ><a name="23720"
    > </a
    ><a name="23721" href="#23721" class="Bound"
    >&#915;</a
    ><a name="23722"
    > </a
    ><a name="23723" class="Symbol"
    >(</a
    ><a name="23724" href="#22816" class="InductiveConstructor Operator"
    >LET</a
    ><a name="23727"
    > </a
    ><a name="23728" href="#23728" class="Bound"
    >x</a
    ><a name="23729"
    > </a
    ><a name="23730" href="#22816" class="InductiveConstructor Operator"
    >BE</a
    ><a name="23732"
    > </a
    ><a name="23733" href="#23733" class="Bound"
    >s</a
    ><a name="23734"
    > </a
    ><a name="23735" href="#22816" class="InductiveConstructor Operator"
    >IN</a
    ><a name="23737"
    > </a
    ><a name="23738" href="#23738" class="Bound"
    >t</a
    ><a name="23739" class="Symbol"
    >)</a
    ><a name="23740"
    > </a
    ><a name="23741" class="Symbol"
    >=</a
    ><a name="23742"
    > </a
    ><a name="23743" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#747" class="Function"
    >pure</a
    ><a name="23747"
    > </a
    ><a name="23748" href="#2096" class="InductiveConstructor Operator"
    >Let_In_</a
    ><a name="23755"
    > </a
    ><a name="23756" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23757"
    > </a
    ><a name="23758" href="#23663" class="Function"
    >check</a
    ><a name="23763"
    > </a
    ><a name="23764" href="#23721" class="Bound"
    >&#915;</a
    ><a name="23765"
    > </a
    ><a name="23766" href="#23733" class="Bound"
    >s</a
    ><a name="23767"
    > </a
    ><a name="23768" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23769"
    > </a
    ><a name="23770" href="#23663" class="Function"
    >check</a
    ><a name="23775"
    > </a
    ><a name="23776" class="Symbol"
    >(</a
    ><a name="23777" href="#23728" class="Bound"
    >x</a
    ><a name="23778"
    > </a
    ><a name="23779" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="23780"
    > </a
    ><a name="23781" href="#23721" class="Bound"
    >&#915;</a
    ><a name="23782" class="Symbol"
    >)</a
    ><a name="23783"
    > </a
    ><a name="23784" href="#23738" class="Bound"
    >t</a
    ><a name="23785"
    >
</a
    ><a name="23786" href="#23663" class="Function"
    >check</a
    ><a name="23791"
    > </a
    ><a name="23792" href="#23792" class="Bound"
    >&#915;</a
    ><a name="23793"
    > </a
    ><a name="23794" class="Symbol"
    >(</a
    ><a name="23795" href="#23795" class="Bound"
    >s</a
    ><a name="23796"
    > </a
    ><a name="23797" href="#22859" class="InductiveConstructor Operator"
    >PLUS</a
    ><a name="23801"
    >  </a
    ><a name="23803" href="#23803" class="Bound"
    >t</a
    ><a name="23804" class="Symbol"
    >)</a
    ><a name="23805"
    >       </a
    ><a name="23812" class="Symbol"
    >=</a
    ><a name="23813"
    > </a
    ><a name="23814" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#747" class="Function"
    >pure</a
    ><a name="23818"
    > </a
    ><a name="23819" href="#2063" class="InductiveConstructor Operator"
    >_&#8862;_</a
    ><a name="23822"
    >     </a
    ><a name="23827" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23828"
    > </a
    ><a name="23829" href="#23663" class="Function"
    >check</a
    ><a name="23834"
    > </a
    ><a name="23835" href="#23792" class="Bound"
    >&#915;</a
    ><a name="23836"
    > </a
    ><a name="23837" href="#23795" class="Bound"
    >s</a
    ><a name="23838"
    > </a
    ><a name="23839" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23840"
    > </a
    ><a name="23841" href="#23663" class="Function"
    >check</a
    ><a name="23846"
    > </a
    ><a name="23847" href="#23792" class="Bound"
    >&#915;</a
    ><a name="23848"
    > </a
    ><a name="23849" href="#23803" class="Bound"
    >t</a
    ><a name="23850"
    >
</a
    ><a name="23851" href="#23663" class="Function"
    >check</a
    ><a name="23856"
    > </a
    ><a name="23857" href="#23857" class="Bound"
    >&#915;</a
    ><a name="23858"
    > </a
    ><a name="23859" class="Symbol"
    >(</a
    ><a name="23860" href="#23860" class="Bound"
    >s</a
    ><a name="23861"
    > </a
    ><a name="23862" href="#22893" class="InductiveConstructor Operator"
    >TIMES</a
    ><a name="23867"
    > </a
    ><a name="23868" href="#23868" class="Bound"
    >t</a
    ><a name="23869" class="Symbol"
    >)</a
    ><a name="23870"
    >       </a
    ><a name="23877" class="Symbol"
    >=</a
    ><a name="23878"
    > </a
    ><a name="23879" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#747" class="Function"
    >pure</a
    ><a name="23883"
    > </a
    ><a name="23884" href="#2030" class="InductiveConstructor Operator"
    >_&#8864;_</a
    ><a name="23887"
    >     </a
    ><a name="23892" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23893"
    > </a
    ><a name="23894" href="#23663" class="Function"
    >check</a
    ><a name="23899"
    > </a
    ><a name="23900" href="#23857" class="Bound"
    >&#915;</a
    ><a name="23901"
    > </a
    ><a name="23902" href="#23860" class="Bound"
    >s</a
    ><a name="23903"
    > </a
    ><a name="23904" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23905"
    > </a
    ><a name="23906" href="#23663" class="Function"
    >check</a
    ><a name="23911"
    > </a
    ><a name="23912" href="#23857" class="Bound"
    >&#915;</a
    ><a name="23913"
    > </a
    ><a name="23914" href="#23868" class="Bound"
    >t</a
    ><a name="23915"
    >
</a
    ><a name="23916" href="#23663" class="Function"
    >check</a
    ><a name="23921"
    > </a
    ><a name="23922" href="#23922" class="Bound"
    >&#915;</a
    ><a name="23923"
    > </a
    ><a name="23924" class="Symbol"
    >(</a
    ><a name="23925" href="#22956" class="InductiveConstructor Operator"
    >#</a
    ><a name="23926"
    > </a
    ><a name="23927" href="#23927" class="Bound"
    >x</a
    ><a name="23928" class="Symbol"
    >)</a
    ><a name="23929"
    >             </a
    ><a name="23942" class="Symbol"
    >=</a
    ><a name="23943"
    > </a
    ><a name="23944" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#747" class="Function"
    >pure</a
    ><a name="23948"
    > </a
    ><a name="23949" class="Symbol"
    >(</a
    ><a name="23950" href="#2011" class="InductiveConstructor"
    >Lit</a
    ><a name="23953"
    > </a
    ><a name="23954" href="#23927" class="Bound"
    >x</a
    ><a name="23955" class="Symbol"
    >)</a
    ><a name="23956"
    >
</a
    ><a name="23957" href="#23663" class="Function"
    >check</a
    ><a name="23962"
    > </a
    ><a name="23963" href="#23963" class="Bound"
    >&#915;</a
    ><a name="23964"
    > </a
    ><a name="23965" class="Symbol"
    >(</a
    ><a name="23966" href="#22927" class="InductiveConstructor Operator"
    >$</a
    ><a name="23967"
    > </a
    ><a name="23968" href="#23968" class="Bound"
    >x</a
    ><a name="23969" class="Symbol"
    >)</a
    ><a name="23970"
    >             </a
    ><a name="23983" class="Symbol"
    >=</a
    ><a name="23984"
    > </a
    ><a name="23985" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#747" class="Function"
    >pure</a
    ><a name="23989"
    > </a
    ><a name="23990" href="#2139" class="InductiveConstructor"
    >Var</a
    ><a name="23993"
    >     </a
    ><a name="23998" href="http://agda.github.io/agda-stdlib/Category.Applicative.Indexed.html#780" class="Function Operator"
    >&#8859;</a
    ><a name="23999"
    > </a
    ><a name="24000" href="#24019" class="Function"
    >find</a
    ><a name="24004"
    > </a
    ><a name="24005" href="#23963" class="Bound"
    >&#915;</a
    ><a name="24006"
    > </a
    ><a name="24007" href="#23968" class="Bound"
    >x</a
    ><a name="24008"
    >
 </a
    ><a name="24010" class="Keyword"
    >where</a
    ><a name="24015"
    >
   </a
    ><a name="24019" href="#24019" class="Function"
    >find</a
    ><a name="24023"
    > </a
    ><a name="24024" class="Symbol"
    >:</a
    ><a name="24025"
    > </a
    ><a name="24026" class="Symbol"
    >&#8704;{</a
    ><a name="24028" href="#24028" class="Bound"
    >n</a
    ><a name="24029" class="Symbol"
    >}</a
    ><a name="24030"
    > </a
    ><a name="24031" class="Symbol"
    >&#8594;</a
    ><a name="24032"
    > </a
    ><a name="24033" href="http://agda.github.io/agda-stdlib/Data.Vec.html#737" class="Datatype"
    >Vec</a
    ><a name="24036"
    > </a
    ><a name="24037" href="http://agda.github.io/agda-stdlib/Agda.Builtin.String.html#165" class="Postulate"
    >String</a
    ><a name="24043"
    > </a
    ><a name="24044" href="#24028" class="Bound"
    >n</a
    ><a name="24045"
    > </a
    ><a name="24046" class="Symbol"
    >&#8594;</a
    ><a name="24047"
    > </a
    ><a name="24048" href="http://agda.github.io/agda-stdlib/Agda.Builtin.String.html#165" class="Postulate"
    >String</a
    ><a name="24054"
    > </a
    ><a name="24055" class="Symbol"
    >&#8594;</a
    ><a name="24056"
    > </a
    ><a name="24057" href="http://agda.github.io/agda-stdlib/Data.Maybe.Base.html#674" class="Datatype"
    >Maybe</a
    ><a name="24062"
    > </a
    ><a name="24063" class="Symbol"
    >(</a
    ><a name="24064" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#915" class="Datatype"
    >Fin</a
    ><a name="24067"
    > </a
    ><a name="24068" href="#24028" class="Bound"
    >n</a
    ><a name="24069" class="Symbol"
    >)</a
    ><a name="24070"
    >
   </a
    ><a name="24074" href="#24019" class="Function"
    >find</a
    ><a name="24078"
    > </a
    ><a name="24079" href="http://agda.github.io/agda-stdlib/Data.Vec.html#777" class="InductiveConstructor"
    >[]</a
    ><a name="24081"
    > </a
    ><a name="24082" href="#24082" class="Bound"
    >s</a
    ><a name="24083"
    > </a
    ><a name="24084" class="Symbol"
    >=</a
    ><a name="24085"
    > </a
    ><a name="24086" href="http://agda.github.io/agda-stdlib/Data.Maybe.Base.html#742" class="InductiveConstructor"
    >nothing</a
    ><a name="24093"
    >
   </a
    ><a name="24097" href="#24019" class="Function"
    >find</a
    ><a name="24101"
    > </a
    ><a name="24102" class="Symbol"
    >(</a
    ><a name="24103" href="#24103" class="Bound"
    >x</a
    ><a name="24104"
    > </a
    ><a name="24105" href="http://agda.github.io/agda-stdlib/Data.Vec.html#796" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="24106"
    > </a
    ><a name="24107" href="#24107" class="Bound"
    >v</a
    ><a name="24108" class="Symbol"
    >)</a
    ><a name="24109"
    > </a
    ><a name="24110" href="#24110" class="Bound"
    >s</a
    ><a name="24111"
    > </a
    ><a name="24112" class="Keyword"
    >with</a
    ><a name="24116"
    > </a
    ><a name="24117" href="#24110" class="Bound"
    >s</a
    ><a name="24118"
    > </a
    ><a name="24119" href="http://agda.github.io/agda-stdlib/Data.String.Unsafe.html#749" class="Function Operator"
    >&#8799;</a
    ><a name="24120"
    > </a
    ><a name="24121" href="#24103" class="Bound"
    >x</a
    ><a name="24122"
    >
   </a
    ><a name="24126" class="Symbol"
    >...</a
    ><a name="24129"
    > </a
    ><a name="24130" class="Symbol"
    >|</a
    ><a name="24131"
    > </a
    ><a name="24132" href="http://agda.github.io/agda-stdlib/Relation.Nullary.html#570" class="InductiveConstructor"
    >yes</a
    ><a name="24135"
    > </a
    ><a name="24136" class="Symbol"
    >_</a
    ><a name="24137"
    > </a
    ><a name="24138" class="Symbol"
    >=</a
    ><a name="24139"
    > </a
    ><a name="24140" href="http://agda.github.io/agda-stdlib/Data.Maybe.Base.html#712" class="InductiveConstructor"
    >just</a
    ><a name="24144"
    > </a
    ><a name="24145" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#937" class="InductiveConstructor"
    >zero</a
    ><a name="24149"
    >
   </a
    ><a name="24153" class="Symbol"
    >...</a
    ><a name="24156"
    > </a
    ><a name="24157" class="Symbol"
    >|</a
    ><a name="24158"
    > </a
    ><a name="24159" href="http://agda.github.io/agda-stdlib/Relation.Nullary.html#597" class="InductiveConstructor"
    >no</a
    ><a name="24161"
    >  </a
    ><a name="24163" class="Symbol"
    >_</a
    ><a name="24164"
    > </a
    ><a name="24165" class="Symbol"
    >=</a
    ><a name="24166"
    > </a
    ><a name="24167" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#968" class="InductiveConstructor"
    >suc</a
    ><a name="24170"
    > </a
    ><a name="24171" href="http://agda.github.io/agda-stdlib/Category.Functor.html#492" class="Function Operator"
    >&lt;$&gt;</a
    ><a name="24174"
    > </a
    ><a name="24175" href="#24019" class="Function"
    >find</a
    ><a name="24179"
    > </a
    ><a name="24180" class="Bound"
    >v</a
    ><a name="24181"
    > </a
    ><a name="24182" class="Bound"
    >s</a
    ></code
  ></pre
>
<p>Note that this function is the only one in our development that is partial: it can fail if an undeclared variable is used. For this reason, we use the <code>Applicative</code> instance for <code>Maybe</code> to make the error handling more convenient.</p>
<p>Our compiler function, then, merely composes our checker with our code generator:</p>
<pre class="Agda"
><code
  ><a name="24509"
    ></a
    ><a name="24522" href="#24522" class="Function"
    >compiler</a
    ><a name="24530"
    > </a
    ><a name="24531" class="Symbol"
    >:</a
    ><a name="24532"
    > </a
    ><a name="24533" href="#22797" class="Datatype"
    >Surf</a
    ><a name="24537"
    > </a
    ><a name="24538" class="Symbol"
    >&#8594;</a
    ><a name="24539"
    > </a
    ><a name="24540" href="http://agda.github.io/agda-stdlib/Data.Maybe.Base.html#674" class="Datatype"
    >Maybe</a
    ><a name="24545"
    > </a
    ><a name="24546" class="Symbol"
    >(</a
    ><a name="24547" href="#5303" class="Datatype"
    >SM</a
    ><a name="24549"
    > </a
    ><a name="24550" class="Number"
    >0</a
    ><a name="24551"
    > </a
    ><a name="24552" class="Number"
    >0</a
    ><a name="24553"
    > </a
    ><a name="24554" class="Number"
    >1</a
    ><a name="24555"
    > </a
    ><a name="24556" class="Number"
    >0</a
    ><a name="24557" class="Symbol"
    >)</a
    ><a name="24558"
    >
</a
    ><a name="24559" href="#24522" class="Function"
    >compiler</a
    ><a name="24567"
    > </a
    ><a name="24568" href="#24568" class="Bound"
    >s</a
    ><a name="24569"
    > </a
    ><a name="24570" class="Symbol"
    >=</a
    ><a name="24571"
    > </a
    ><a name="24572" href="#18841" class="Function"
    >codegen</a
    ><a name="24579"
    > </a
    ><a name="24580" href="http://agda.github.io/agda-stdlib/Category.Functor.html#492" class="Function Operator"
    >&lt;$&gt;</a
    ><a name="24583"
    > </a
    ><a name="24584" href="#23663" class="Function"
    >check</a
    ><a name="24589"
    > </a
    ><a name="24590" href="http://agda.github.io/agda-stdlib/Data.Vec.html#777" class="InductiveConstructor"
    >[]</a
    ><a name="24592"
    > </a
    ><a name="24593" href="#24568" class="Bound"
    >s</a
    ></code
  ></pre
>
<p>Note that we can’t really demonstrate correctness of the scope-checking function, save that if it outputs a <code>Term</code> <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/> then there are no scope errors in <img width=13 alt="t" height=15 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAQAAABqSHSNAAAAeklEQVR4nGNgwAaUsIqiAGOGmQzvGDoIK+xg+A+ERCgMBSsMJazQBazQhQoKBYHuAsGZYIUzobw0bCbtBsO7YIVnoDw8nqKeG0cV/scWI9gVzoTzcSZhiMJ3wAQMif93QBIrEARK/YfGNwjjyRRpUIVEZAhBoAMw/A0AJB5HyisBx98AAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-1px;"/>, as it is impossible to construct a <code>Term</code> with scope errors. One possibility would be to define a semantics for the surface syntax, however this would necessitate a formalisation of substitution and other such unpleasant things. So, we shall gain assurance for this phase of the compiler by embedding some test cases and checking them automatically at compile time.</p>
<p>If we take a simple example, say:</p>
<pre class="Agda"
><code
  ><a name="25167"
    ></a
    ><a name="25180" href="#25180" class="Function"
    >example</a
    ><a name="25187"
    > </a
    ><a name="25188" class="Symbol"
    >=</a
    ><a name="25189"
    > </a
    ><a name="25190" href="#22816" class="InductiveConstructor Operator"
    >LET</a
    ><a name="25193"
    > </a
    ><a name="25194" class="String"
    >&quot;x&quot;</a
    ><a name="25197"
    > </a
    ><a name="25198" href="#22816" class="InductiveConstructor Operator"
    >BE</a
    ><a name="25200"
    > </a
    ><a name="25201" href="#22956" class="InductiveConstructor Operator"
    >#</a
    ><a name="25202"
    > </a
    ><a name="25203" class="Number"
    >4</a
    ><a name="25204"
    >
           </a
    ><a name="25216" href="#22816" class="InductiveConstructor Operator"
    >IN</a
    ><a name="25218"
    > </a
    ><a name="25219" href="#22816" class="InductiveConstructor Operator"
    >LET</a
    ><a name="25222"
    > </a
    ><a name="25223" class="String"
    >&quot;y&quot;</a
    ><a name="25226"
    > </a
    ><a name="25227" href="#22816" class="InductiveConstructor Operator"
    >BE</a
    ><a name="25229"
    > </a
    ><a name="25230" href="#22956" class="InductiveConstructor Operator"
    >#</a
    ><a name="25231"
    > </a
    ><a name="25232" class="Number"
    >5</a
    ><a name="25233"
    >
           </a
    ><a name="25245" href="#22816" class="InductiveConstructor Operator"
    >IN</a
    ><a name="25247"
    > </a
    ><a name="25248" href="#22816" class="InductiveConstructor Operator"
    >LET</a
    ><a name="25251"
    > </a
    ><a name="25252" class="String"
    >&quot;z&quot;</a
    ><a name="25255"
    > </a
    ><a name="25256" href="#22816" class="InductiveConstructor Operator"
    >BE</a
    ><a name="25258"
    > </a
    ><a name="25259" href="#22956" class="InductiveConstructor Operator"
    >#</a
    ><a name="25260"
    > </a
    ><a name="25261" class="Number"
    >6</a
    ><a name="25262"
    >
           </a
    ><a name="25274" href="#22816" class="InductiveConstructor Operator"
    >IN</a
    ><a name="25276"
    > </a
    ><a name="25277" href="#22927" class="InductiveConstructor Operator"
    >$</a
    ><a name="25278"
    > </a
    ><a name="25279" class="String"
    >&quot;x&quot;</a
    ><a name="25282"
    > </a
    ><a name="25283" href="#22893" class="InductiveConstructor Operator"
    >TIMES</a
    ><a name="25288"
    > </a
    ><a name="25289" href="#22927" class="InductiveConstructor Operator"
    >$</a
    ><a name="25290"
    > </a
    ><a name="25291" class="String"
    >&quot;y&quot;</a
    ><a name="25294"
    > </a
    ><a name="25295" href="#22859" class="InductiveConstructor Operator"
    >PLUS</a
    ><a name="25299"
    > </a
    ><a name="25300" href="#22927" class="InductiveConstructor Operator"
    >$</a
    ><a name="25301"
    > </a
    ><a name="25302" class="String"
    >&quot;z&quot;</a
    ></code
  ></pre
>
<p>We expect that this program should correspond to the following <img width=33 alt="\mathsf{SM}" height=17 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAZCAQAAAAyag7MAAABn0lEQVR4nKWWUbmFIAyAV4EKVqACFahABStQwQpWOBWsYAUrnItjCBtDj9+dT27Iv41tCNCLhwif9MT0WMX+T3Gww5c9OwS24kP66WaXg9YoEsi0YgQRNmVpQcxDQLjc68SiemP+OUyZhtiHiBWtKuL8+ADT6V23KmP0c5rQtmgIg8o49I0jVtxGkxkzETWEQ6XTvlIQASPWZMdzUhH2VRQ55tBZLVWbisilpp2FhgDM9tpZI2kHiEgVdZ+sgvC4Wjp0UGwDhLn64DwuP4inIPJ2vDsqdoBoIaUF+4gqYkFnWql1NkScMosRIkuzIqzojlwC/hlxypTyuVyThkMqIhdorcG56flHRJFAGD9ARNYdWwP8GVHnlo6YGgcmlrYXCKBpU6urReS3esDVlVeIWQwWjqiDZGcl/AoRRN1whMHT8pTQGuvrRLUDjyOyfbkGxy3CisuoaGXZSoRDFzZRdyoi0KTld14eja1OIoBald+CKsJfrbbR3Z2HyaHeev12UdF1YpJB/n9s3fXZI0xywomheXvcNpkX+o96vgN/kD8vUE2wUMtvggAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-1px;"/> program:<a href="#fn3" class="footnote-ref" id="fnref3"><sup>3</sup></a></p>
<pre class="Agda"
><code
  ><a name="25410"
    ></a
    ><a name="25423" href="#25423" class="Function"
    >result</a
    ><a name="25429"
    > </a
    ><a name="25430" class="Symbol"
    >:</a
    ><a name="25431"
    > </a
    ><a name="25432" href="#5303" class="Datatype"
    >SM</a
    ><a name="25434"
    > </a
    ><a name="25435" class="Number"
    >0</a
    ><a name="25436"
    > </a
    ><a name="25437" class="Number"
    >0</a
    ><a name="25438"
    > </a
    ><a name="25439" class="Number"
    >1</a
    ><a name="25440"
    > </a
    ><a name="25441" class="Number"
    >0</a
    ><a name="25442"
    >
</a
    ><a name="25443" href="#25423" class="Function"
    >result</a
    ><a name="25449"
    > </a
    ><a name="25450" class="Symbol"
    >=</a
    ><a name="25451"
    > </a
    ><a name="25452" href="#4758" class="InductiveConstructor"
    >num</a
    ><a name="25455"
    > </a
    ><a name="25456" class="Number"
    >4</a
    ><a name="25457"
    >
       </a
    ><a name="25465" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25466"
    > </a
    ><a name="25467" href="#4900" class="InductiveConstructor"
    >push</a
    ><a name="25471"
    >
       </a
    ><a name="25479" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25480"
    > </a
    ><a name="25481" href="#4758" class="InductiveConstructor"
    >num</a
    ><a name="25484"
    > </a
    ><a name="25485" class="Number"
    >5</a
    ><a name="25486"
    >
       </a
    ><a name="25494" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25495"
    > </a
    ><a name="25496" href="#4900" class="InductiveConstructor"
    >push</a
    ><a name="25500"
    >
       </a
    ><a name="25508" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25509"
    > </a
    ><a name="25510" href="#4758" class="InductiveConstructor"
    >num</a
    ><a name="25513"
    > </a
    ><a name="25514" class="Number"
    >6</a
    ><a name="25515"
    >
       </a
    ><a name="25523" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25524"
    > </a
    ><a name="25525" href="#4900" class="InductiveConstructor"
    >push</a
    ><a name="25529"
    >
       </a
    ><a name="25537" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25538"
    > </a
    ><a name="25539" href="#4944" class="InductiveConstructor"
    >pick</a
    ><a name="25543"
    > </a
    ><a name="25544" class="Symbol"
    >(</a
    ><a name="25545" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#2156" class="Function"
    >i</a
    ><a name="25546"
    > </a
    ><a name="25547" class="Number"
    >2</a
    ><a name="25548" class="Symbol"
    >)</a
    ><a name="25549"
    >
       </a
    ><a name="25557" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25558"
    > </a
    ><a name="25559" href="#4944" class="InductiveConstructor"
    >pick</a
    ><a name="25563"
    > </a
    ><a name="25564" class="Symbol"
    >(</a
    ><a name="25565" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#2156" class="Function"
    >i</a
    ><a name="25566"
    > </a
    ><a name="25567" class="Number"
    >1</a
    ><a name="25568" class="Symbol"
    >)</a
    ><a name="25569"
    >
       </a
    ><a name="25577" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25578"
    > </a
    ><a name="25579" href="#4850" class="InductiveConstructor"
    >times</a
    ><a name="25584"
    >
       </a
    ><a name="25592" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25593"
    > </a
    ><a name="25594" href="#4944" class="InductiveConstructor"
    >pick</a
    ><a name="25598"
    > </a
    ><a name="25599" class="Symbol"
    >(</a
    ><a name="25600" href="http://agda.github.io/agda-stdlib/Data.Fin.Base.html#2156" class="Function"
    >i</a
    ><a name="25601"
    > </a
    ><a name="25602" class="Number"
    >0</a
    ><a name="25603" class="Symbol"
    >)</a
    ><a name="25604"
    >
       </a
    ><a name="25612" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25613"
    > </a
    ><a name="25614" href="#4800" class="InductiveConstructor"
    >plus</a
    ><a name="25618"
    >
       </a
    ><a name="25626" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25627"
    > </a
    ><a name="25628" href="#4990" class="InductiveConstructor"
    >pop</a
    ><a name="25631"
    >
       </a
    ><a name="25639" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25640"
    > </a
    ><a name="25641" href="#4990" class="InductiveConstructor"
    >pop</a
    ><a name="25644"
    >
       </a
    ><a name="25652" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25653"
    > </a
    ><a name="25654" href="#4990" class="InductiveConstructor"
    >pop</a
    ><a name="25657"
    >
       </a
    ><a name="25665" href="#5358" class="InductiveConstructor Operator"
    >&#8759;</a
    ><a name="25666"
    > </a
    ><a name="25667" href="#5338" class="InductiveConstructor"
    >halt</a
    ></code
  ></pre
>
<p>We can embed this test case as a type by constructing an equality value — that way, the test will be re-run every time it is type-checked:</p>
<pre class="Agda"
><code
  ><a name="25825"
    ></a
    ><a name="25838" href="#25838" class="Function"
    >test-example</a
    ><a name="25850"
    > </a
    ><a name="25851" class="Symbol"
    >:</a
    ><a name="25852"
    > </a
    ><a name="25853" href="#24522" class="Function"
    >compiler</a
    ><a name="25861"
    > </a
    ><a name="25862" href="#25180" class="Function"
    >example</a
    ><a name="25869"
    > </a
    ><a name="25870" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#83" class="Datatype Operator"
    >&#8801;</a
    ><a name="25871"
    > </a
    ><a name="25872" href="http://agda.github.io/agda-stdlib/Data.Maybe.Base.html#712" class="InductiveConstructor"
    >just</a
    ><a name="25876"
    > </a
    ><a name="25877" href="#25423" class="Function"
    >result</a
    ><a name="25883"
    >
</a
    ><a name="25884" href="#25838" class="Function"
    >test-example</a
    ><a name="25896"
    > </a
    ><a name="25897" class="Symbol"
    >=</a
    ><a name="25898"
    > </a
    ><a name="25899" href="http://agda.github.io/agda-stdlib/Agda.Builtin.Equality.html#140" class="InductiveConstructor"
    >refl</a
    ></code
  ></pre
>
<p>As this page is only generated when the Agda compiler type checks the code snippets, we know that this test has passed! Hooray!</p>
<h2 id="conclusions">Conclusions</h2>
<p>Working in Agda to verify compilers is a very different experience from that of implementing a certifying compiler in Haskell and Isabelle. In general, the <em>implementation</em> of a compiler phase and the <em>justification of its correctness</em> are much, much closer together than in Agda than in my previous approach. This allows us to save a lot of effort by deriving programs from their proofs.</p>
<p>Also, dependent types are sophisticated enough to allow arbitrary invariants to be encoded in the structure of terms, which makes it possible, with clever formalisations, to avoid having to discharge trivial proof obligations repeatedly. This is in stark contrast to traditional theorem provers like Isabelle, where irritating proof obligations are the norm, and heavyweight tactics must be used to discharge them en-masse.</p>
<p>My next experiments will be to try and scale this kind of approach up to more realistic languages. I’ll be sure to post again if I find anything interesting.</p>
<h4 id="references" class="unnumbered">References</h4>
<div id="refs" class="references">
<div id="ref-Bahr">
<p><span class="smallcaps">Bahr, P.</span>, 2015. Calculating certified compilers for non-deterministic languages. In R. Hinze &amp; J. Voigtländer, eds. <em>Mathematics of Program Construction</em>. Lecture Notes in Computer Science. Springer International Publishing, pp. 159–186.</p>
</div>
<div id="ref-deBruijn">
<p><span class="smallcaps">de Bruijn, N.G.</span>, 1972. Lambda Calculus Notation with Nameless Dummies: a Tool for Automatic Formula Manipulation with Application to the Church-Rosser Theorem. <em>Indagationes Mathematicae (Elsevier)</em>, 34, pp.381–392.</p>
</div>
<div id="ref-Hutton">
<p><span class="smallcaps">Hutton, G. and Wright, J.</span>, 2004. Compiling exceptions correctly. In <em>Mathematics of Program Construction</em>. Springer, pp. 211–227.</p>
</div>
<div id="ref-McBride">
<p><span class="smallcaps">McBride, C.</span>, 2003. First-Order Unification by Structural Recursion. <em>Journal of Functional Programming</em>, 13(6), pp.1061–1075.</p>
</div>
<div id="ref-Nipkow">
<p><span class="smallcaps">Nipkow, T., Paulson, L.C. and Wenzel, M.</span>, 2002. <em>Isabelle/HOL: A Proof Assistant for Higher-Order Logic</em>, Springer.</p>
</div>
<div id="ref-Cogent">
<p><span class="smallcaps">O’Connor, L., Keller, G., Murray, T., Klein, G., Rizkallah, C., Chen, Z., Sewell, T., Lim, J., Amani, S., Nagashima, Y. and Hixon, A.</span>, 2016. Cogent: Certified compilation for a Functional Systems Language. <em>Submitted to POPL. Currently under review</em>.</p>
</div>
<div id="ref-ATAPL">
<p><span class="smallcaps">Walker, D.</span>, 2005. Substructural Type Systems. In B. C. Pierce, ed. <em>Advanced Topics in Types and Programming Languages</em>. MIT Press.</p>
</div>
</div>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>The proof is boring and tedious.<a href="#fnref1" class="footnote-back">↩</a></p></li>
<li id="fn2"><p>Minus the parser.<a href="#fnref2" class="footnote-back">↩</a></p></li>
<li id="fn3"><p>I actually generated this program by running the code generator implemented earlier.<a href="#fnref3" class="footnote-back">↩</a></p></li>
</ol>
</section>

<div class="tags"><a href="/tags/agda.html">agda</a>, <a href="/tags/term-representation.html">term-representation</a>, <a href="/tags/verification.html">verification</a>, <a href="/tags/types.html">types</a>, <a href="/tags/semantics.html">semantics</a>, <a href="/tags/compilers.html">compilers</a>, <a href="/tags/theorem-proving.html">theorem-proving</a></div>
]]></description>
    <pubDate>Sun, 23 Aug 2015 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2015-08-23-verified-compiler.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>A Lattice of Languages is a Verification Buffet</title>
    <link>http://liamoc.net/posts/2015-06-16-semantic-lattice.html</link>
    <description><![CDATA[<p>I have <a href="http://liamoc.net/posts/2013-11-13-imperativereasoning.html">written before</a> about the use of total, purely functional languages to eliminate cumbersome low-level reasoning. By having a denotational semantics that are about as straightforward as highschool algebra, we can make many verification problems substantially simpler. Totality and the absence of effects<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a> means that we can pick redexes in any order, and have a wellfounded induction principle for datatypes <span class="citation" data-cites="Turner">[Turner 2004]</span>.</p>
<p>In existing large-scale verified software artifacts like <a href="http://sel4.systems">seL4</a> however, we still use <em>C</em> as our implementation language<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a>, despite the fact that it is positively hellish to reason about <span class="citation" data-cites="Koenig">[Koenig 1988]</span>. The reasons for this are numerous, but there are two main ones. The first concern, and the least important, is that most purely functional language implementations, and certainly all total ones, depend on a runtime, which would enlarge the <a href="http://en.wikipedia.org/wiki/Trusted_computing_base">trusted computing base</a>, and compromise the system’s efficiency. The second and more pressing concern is that for low-level systems like microkernels, or even services such as drivers and file system servers, are forced to confront the reality of the von Neumann architecture. Sometimes they might need to manipulate some bytes in memory, or perform potentially unsafe pointer arithmetic. If we are to follow traditional systems orthodoxy, they simply cannot be efficiently expressed at the level of abstraction of say, Haskell.</p>
<p>This has meant that these systems are forced to choose an implementation language which requires no runtime support and which supports all of these unsafe features. Sadly, traditional “systems” languages such as C, while satisfying this criteria, will always extract their pound of flesh when it comes to verification. The huge cost to verifiability that comes with allowing divergence and unsafe memory access and so on is not just paid where those semantic features are used, but <em>everywhere in the program</em>. The majority of the seL4 proofs are concerned with re-establishing refinement invariants between a state-monadic executable specification and the C implementation. This specification is semantically equivalent, more or less, to the C implementation, but the proof is huge. The majority of obligations are about things like pointer validity, heap validity, type safety, loop termination and so on — things that we don’t have to worry about in total, pure languages.</p>
<p>My research project is focused on reducing the cost of verification by replacing the systems implementation language with one that has a straightforward denotational semantics, about which correctness properties can be easily stated. This language is under a number of constraints: It can’t rely on a runtime, and it must have minimal performance overhead compared to a manually written C implementation. Furthermore, the compilation needs to be highly trustworthy.</p>
<p>The language Cogent, which we will submit to POPL this year, is essentially a linear lambda calculus, with a bunch of usability features, such as pattern matching, records and a simple C FFI. The use of linear types eliminates the need for a garbage collector, and allows for efficient implementation of a purely functional semantics using destructive updates <span class="citation" data-cites="Wadler">[Wadler 1990]</span>. Indeed, two semantics are ascribed to the language: One which resembles any pure functional language (a denotation in terms of sets and total functions), and one which is of a much more imperative flavour (with a state monadic denotation). We have proven that the imperative semantics is a refinement of the pure semantics for any well-typed program, and the compiler <em>co-generates</em> an efficient C implementation and a proof, in <a href="http://isabelle.in.tum.de">Isabelle/HOL</a> <span class="citation" data-cites="Nipkow">[Nipkow et al. 2002]</span>, that this imperative semantics is an abstraction of the C code it generates.</p>
<p>To verify properties about programs written in this language, it suffices to use the simple equational reasoning tactics used for any HOL program. Hoare logic and stateful reasoning are gone, and high-level properties are generally stated as equations between terms. The snag, however, is in the C FFI. As the language is so restrictive (total, safe, and with no indirectly observable mutation), the C FFI is used heavily to provide everything from red-black trees to loop iterators. While Cogent lets us reason nicely about code written in it, the moment a C function is used it produces a number of thorny proof obligations, essentially requiring us to show that, at least to an outside observer, the C code has not violated the invariants assumed by Cogent’s type system.</p>
<p>We were able to express the vast majority of an Ext2 file system implementation in Cogent, and the verification of file systems written in Cogent is certainly easier than a raw C implementation. However, there are a number of places in the file system implementation where efficiency is sacrificed in order to be able to express the file system in a safe way. For example, deserialising structures from a disk buffer into file system structures is done byte-by-byte, rather than by a memory map.</p>
<p>The flaw in Cogent’s approach is that it’s all-or-nothing. If a program can’t be expressed in this highly restrictive language, it must be expressed in C, and then all of Cogent’s verification advantages are lost.</p>
<p>To remedy this, I first designed a <em>spectrum</em> of languages, each differing primarily in their treatment of memory.</p>
<p><img width=444 alt=" \xymatrix@R=0.1em{ &amp; \mathcal{L}_C &amp; \mathcal{L}_R &amp; \mathcal{L}_\textbf{1} \\ \text{Liberty} &amp; \ar[rrr] &amp; \ar[ll]  &amp; &amp; \text{Safety} \\ } " height=53 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-38px;"/></p>
<p>The language <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/> is more or less Cogent as it exists now. Linear types allow for the extremely simple semantics that make verification much easier. The language <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> is less restrictive, by doing away with linear types and bringing explicit references to the language. This introduces manual memory management, and stateful reasoning, however the memory model remains fairly high level. It is possible to leak memory or invalidate pointers in <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, unlike <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/>, but the lack of linear types now permits programs that rely on sharing mutable pointers, such as efficient data structure implementations. The lowest level language <img width=32 alt="\mathcal{L}_C" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAQAAABGOSfkAAABUElEQVR4nLVWCxHDIAzFAhawUAtYqAUs1AIWsFALWMDCLNQCS9L1C+nGLrxe7zYO8kLyeFSpZxg1qaCi8vBLHBrCvuD1alEZHisdPkHmKywRzLIEHkIeZREnwJzT6f8MxRokCQIQeMmAd2Bbx37h16Z2EOYGTwQdgR2I36f9j9i7xblviwci0M2rLNmK/S6OqfHUomclWIHhAwk8PKcXWWMbK9mNENKfAmqSyMJTmIcG+4LYVWdH2BFDgB4aOO6CAJN5VZNkwluYjhueGGObbwSNjuVIPdsTCxIN5NexpeUaMjAdM7T7DYZqOC9HhVzR5Fj+ZA7640aZahxIgOXptm2OtdxyGaDd+Va0K0zLTa2r5uagaFt4X1EGjk+/ETxhYI9/ZGQqBie1Bx5rn1wx3mqVLPSHIuxFxG/BJGn26/dfJoOL8CYgEMv/gKEjWhHDGzxTmFfVICdiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> is also stateful, but the state consists of a heap of bytes. Here, pointer arithmetic is permitted, as well as arbitrary casting and reinterpretation of memory, more or less on the same semantic level as C.</p>
<p>Clearly, the compiler for <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/> can simply compile to <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, and <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> to <img width=32 alt="\mathcal{L}_C" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAQAAABGOSfkAAABUElEQVR4nLVWCxHDIAzFAhawUAtYqAUs1AIWsFALWMDCLNQCS9L1C+nGLrxe7zYO8kLyeFSpZxg1qaCi8vBLHBrCvuD1alEZHisdPkHmKywRzLIEHkIeZREnwJzT6f8MxRokCQIQeMmAd2Bbx37h16Z2EOYGTwQdgR2I36f9j9i7xblviwci0M2rLNmK/S6OqfHUomclWIHhAwk8PKcXWWMbK9mNENKfAmqSyMJTmIcG+4LYVWdH2BFDgB4aOO6CAJN5VZNkwluYjhueGGObbwSNjuVIPdsTCxIN5NexpeUaMjAdM7T7DYZqOC9HhVzR5Fj+ZA7640aZahxIgOXptm2OtdxyGaDd+Va0K0zLTa2r5uagaFt4X1EGjk+/ETxhYI9/ZGQqBie1Bx5rn1wx3mqVLPSHIuxFxG/BJGn26/dfJoOL8CYgEMv/gKEjWhHDGzxTmFfVICdiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>. Once in <img width=32 alt="\mathcal{L}_C" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAQAAABGOSfkAAABUElEQVR4nLVWCxHDIAzFAhawUAtYqAUs1AIWsFALWMDCLNQCS9L1C+nGLrxe7zYO8kLyeFSpZxg1qaCi8vBLHBrCvuD1alEZHisdPkHmKywRzLIEHkIeZREnwJzT6f8MxRokCQIQeMmAd2Bbx37h16Z2EOYGTwQdgR2I36f9j9i7xblviwci0M2rLNmK/S6OqfHUomclWIHhAwk8PKcXWWMbK9mNENKfAmqSyMJTmIcG+4LYVWdH2BFDgB4aOO6CAJN5VZNkwluYjhueGGObbwSNjuVIPdsTCxIN5NexpeUaMjAdM7T7DYZqOC9HhVzR5Fj+ZA7640aZahxIgOXptm2OtdxyGaDd+Va0K0zLTa2r5uagaFt4X1EGjk+/ETxhYI9/ZGQqBie1Bx5rn1wx3mqVLPSHIuxFxG/BJGn26/dfJoOL8CYgEMv/gKEjWhHDGzxTmFfVICdiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/>, it is straightforward to emit implementation code in LLVM IR or C. The advantage of this spectrum is that we can allow the programmer access to <em>every</em> level of abstraction. I plan to achieve this by allowing code from <img width=32 alt="\mathcal{L}_C" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAQAAABGOSfkAAABUElEQVR4nLVWCxHDIAzFAhawUAtYqAUs1AIWsFALWMDCLNQCS9L1C+nGLrxe7zYO8kLyeFSpZxg1qaCi8vBLHBrCvuD1alEZHisdPkHmKywRzLIEHkIeZREnwJzT6f8MxRokCQIQeMmAd2Bbx37h16Z2EOYGTwQdgR2I36f9j9i7xblviwci0M2rLNmK/S6OqfHUomclWIHhAwk8PKcXWWMbK9mNENKfAmqSyMJTmIcG+4LYVWdH2BFDgB4aOO6CAJN5VZNkwluYjhueGGObbwSNjuVIPdsTCxIN5NexpeUaMjAdM7T7DYZqOC9HhVzR5Fj+ZA7640aZahxIgOXptm2OtdxyGaDd+Va0K0zLTa2r5uagaFt4X1EGjk+/ETxhYI9/ZGQqBie1Bx5rn1wx3mqVLPSHIuxFxG/BJGn26/dfJoOL8CYgEMv/gKEjWhHDGzxTmFfVICdiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> to be written <em>inline</em> inside <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/>, and both of these in turn inside <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/>, in the vein of the inline assembly language supported by most C compilers. The crucial point here is that each of these inline blocks will generate a <em>proof obligation</em> to ensure that, externally, the inline block is “well-behaved” with respect to the abstractions of the higher level language. For example, embedding <img width=32 alt="\mathcal{L}_C" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAQAAABGOSfkAAABUElEQVR4nLVWCxHDIAzFAhawUAtYqAUs1AIWsFALWMDCLNQCS9L1C+nGLrxe7zYO8kLyeFSpZxg1qaCi8vBLHBrCvuD1alEZHisdPkHmKywRzLIEHkIeZREnwJzT6f8MxRokCQIQeMmAd2Bbx37h16Z2EOYGTwQdgR2I36f9j9i7xblviwci0M2rLNmK/S6OqfHUomclWIHhAwk8PKcXWWMbK9mNENKfAmqSyMJTmIcG+4LYVWdH2BFDgB4aOO6CAJN5VZNkwluYjhueGGObbwSNjuVIPdsTCxIN5NexpeUaMjAdM7T7DYZqOC9HhVzR5Fj+ZA7640aZahxIgOXptm2OtdxyGaDd+Va0K0zLTa2r5uagaFt4X1EGjk+/ETxhYI9/ZGQqBie1Bx5rn1wx3mqVLPSHIuxFxG/BJGn26/dfJoOL8CYgEMv/gKEjWhHDGzxTmFfVICdiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> inside <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> generates the obligation that any valid pointers left by the <img width=32 alt="\mathcal{L}_C" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAQAAABGOSfkAAABUElEQVR4nLVWCxHDIAzFAhawUAtYqAUs1AIWsFALWMDCLNQCS9L1C+nGLrxe7zYO8kLyeFSpZxg1qaCi8vBLHBrCvuD1alEZHisdPkHmKywRzLIEHkIeZREnwJzT6f8MxRokCQIQeMmAd2Bbx37h16Z2EOYGTwQdgR2I36f9j9i7xblviwci0M2rLNmK/S6OqfHUomclWIHhAwk8PKcXWWMbK9mNENKfAmqSyMJTmIcG+4LYVWdH2BFDgB4aOO6CAJN5VZNkwluYjhueGGObbwSNjuVIPdsTCxIN5NexpeUaMjAdM7T7DYZqOC9HhVzR5Fj+ZA7640aZahxIgOXptm2OtdxyGaDd+Va0K0zLTa2r5uagaFt4X1EGjk+/ETxhYI9/ZGQqBie1Bx5rn1wx3mqVLPSHIuxFxG/BJGn26/dfJoOL8CYgEMv/gKEjWhHDGzxTmFfVICdiAAAAAElFTkSuQmCC" class=inline-math style="margin:0; vertical-align:-5px;"/> program point to data of the right type. Embedding <img width=31 alt="\mathcal{L}_R" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAdCAQAAAB/Xpa/AAABRUlEQVR4nLWVCxXDIAxFsYAFLGABC7NQC7UQC1ioBSzMQi1ggQUoKwPS7mzh9ezX0tvs5YMQ11JiFVY4AfiNVRKRO75AeBHwMJzoJ0acZRJ844MD4k4rWOEx1mf1e0ODNBfcIhy4YK1iCh9z0DmBzMVXBAk+SdFxd7/sN7mZ6Qzz0qkTXM6Br192Y5w8MYz9/bndzx9HDqlHU56yGmjqqLHLXKmLBdA99LNkY5V5Gh1noSWv3sEv+8Ogbx6XrMSQ6j3tI9/H6CUtLYfrHiDxwe25Gq7piaTwUozMvHeegJHUkdqBnwWu0l0eAxwKqoaXh3u5wGza6sZdm/9jSGYudG/4psw0pjY0RvWK55fjnZQc3rqgUQUNw7iyLbd4Whqdp2Z78fwPPK2zWoAfX5ei5cXrpokcJ96k+XkmWqYKc7N234+KegHQZK8eRzTL6AAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-5px;"/> inside <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/> requires showing that all available pointers are valid, no memory was leaked, and that there is at most one pointer to each object remaining. I am exploring the possibility of making each of these languages embedded inside a dependently-typed programming language such as Agda or Idris, to allow the proofs to be expressed along with the program.</p>
<p>These different languages are all total. Trying to fit recursion or loops into our spectrum leads to some unfortunate consequences. Putting them on the “Liberty” side would mean throwing away our nice memory model whenever we want to write a loop, and putting it to the left of <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/> on the “Safety” side would mean that every time we step down to a lower level of memory abstraction we would also be obliged to prove termination. So, rather than a <em>spectrum</em>, we have a <em>lattice</em> of languages, with non-total languages running parallel to the total ones:</p>
<p><img width=572 alt=" \xymatrix@R=0.1em{ \text{Partial} &amp; &amp; \mathcal{L}_C^\bot &amp; \mathcal{L}_R^\bot &amp; \mathcal{L}_\textbf{1}^\bot \\ \text{Total} &amp; &amp; \mathcal{L}_C &amp; \mathcal{L}_R &amp; \mathcal{L}_\textbf{1} \\ &amp; \text{Liberty} &amp; \ar[rrr] &amp; \ar[ll]  &amp; &amp; \text{Safety} \\ } " height=91 src="data:image/png;base64,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" class=display-math style="margin:0; vertical-align:-73px;"/></p>
<p>The compiler moves from <img width=28 alt="\mathcal{L}_\textbf{1}" height=19 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAQAAAC96eVgAAABG0lEQVR4nNWVbRWDIBSGbwUqWIEKVLDCKlDhVqCCFahgBStYgb3AdE75OA72Yy/H4xR4uN6vEZU1kCZDlhi/ukgAteBiWslhqB7IGRZGqQCd2qEMzPuTu0C9bfPheYIjZCvUAMqtkLN8aMa+yBiYTkm0iQO0s7xHbX3ZPdlfhMn1D5MMUNEXqm9Wj8COaqbYbPMYT5sV3sR2o8vIoRAk/jjMhVJewr0YVt+bTHaWE1/ANajCuSsW6EzzmO5DH2F6G/YCFjjwelgROmCLt0Ttnd7BEUfLDN5fVYTyoTDFa6kfC2AcZtNbi9D1lC4SIXMnh6SNyUJFcssDDtmQnKmxavTTkvBsvmK+hJb1D1AZEtDsyafa/29j40nmxxN9KpjfWQ+MwwAAAABJRU5ErkJggg==" class=inline-math style="margin:0; vertical-align:-4px;"/> towards <img width=32 alt="\mathcal{L}_C^\bot" height=25 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAlCAQAAACuEKIkAAABcElEQVR4nO1WW5XEIAzFAhawgAUs1AIWagELWKgFLGBhLNRCNwmzM90S2skU/jacfrQluXlxg1K9xCjdzRYrSYV/gCEARs0qkrLpD6BB5QFPUKvaYLm+AFplUCriCGDpCxDA5Dst3QHQ57x7XyBZtidABABZyEIALOs0DqAU9aoxbwAEApCJCAArkK63fQ+QPiixpSjbaz1T3sQlFknxbeD4mC9P7U1JTWKbhK3LijkpcDhhVAv/Au04dQI5NDb/8gBI6xmSiuYjcUBsVdABpa2wbW4Q28IATKTxNqjpFK0chP/Tx6kC0aB2/ObZhCaIqAIwoI4eutcEw1D3Hsfq8GC9HrWn/B0p7MhBP9loIwORssudbhGpr4fqWwhzOySt1rma1DufOXLzkLRf84EJW07qrNhGb7svSF0k5oPLzE1BgHkkQGq0aTfx42Moreyr792miX5CxFef4XU595yH5YpcpnCCJwPAgGloiMWY8/ID5bi6RoVy0hsAAAAASUVORK5CYII=" class=inline-math style="margin:0; vertical-align:-7px;"/>, and to embed a language from the upper-left corner inside a language towards the lower-right corner requires a proof.</p>
<p>I have yet to completely clarify exactly what these languages would look like. It’s my hope that they can share a large amount of syntax, to avoid confusing programmers. Once I work out the details, I suspect this approach will allow programmers to implement systems in a reasonably high-level way, but breaking some language-based abstractions when necessary, where the only costs to verifiability come directly from these points were the abstraction is broken.</p>
<h4 id="references" class="unnumbered">References</h4>
<div id="refs" class="references">
<div id="ref-Koenig">
<p><span class="smallcaps">Koenig, A.</span>, 1988. <em>C traps and pitfalls</em>, Pearson Education India.</p>
</div>
<div id="ref-Nipkow">
<p><span class="smallcaps">Nipkow, T., Paulson, L.C. and Wenzel, M.</span>, 2002. <em>Isabelle/HOL: A Proof Assistant for Higher-Order Logic</em>, Springer.</p>
</div>
<div id="ref-Turner">
<p><span class="smallcaps">Turner, D.</span>, 2004. Total functional programming. <em>Journal of Universal Computer Science</em>, 10, pp.187–209.</p>
</div>
<div id="ref-Wadler">
<p><span class="smallcaps">Wadler, P.</span>, 1990. Linear types can change the world! In M. Broy &amp; C. Jones, eds. <em>IFIP Tc 2 Working Conference on Programming Concepts and Methods, Sea of Galilee, Israel</em>. North Holland Publishing, pp. 347–359.</p>
</div>
</div>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>After all, nontermination is an effect.<a href="#fnref1" class="footnote-back">↩</a></p></li>
<li id="fn2"><p>An executable specification is implemented in Haskell, but its refinement to the C implementation is proven manually using traditional hoare logic techniques and a C parser.<a href="#fnref2" class="footnote-back">↩</a></p></li>
</ol>
</section>

<div class="tags"><a href="/tags/verification.html">verification</a>, <a href="/tags/types.html">types</a>, <a href="/tags/semantics.html">semantics</a>, <a href="/tags/linear-types.html">linear-types</a>, <a href="/tags/cogent.html">cogent</a>, <a href="/tags/total.html">total</a>, <a href="/tags/functional.html">functional</a>, <a href="/tags/edsls.html">edsls</a>, <a href="/tags/reasoning.html">reasoning</a></div>
]]></description>
    <pubDate>Tue, 16 Jun 2015 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2015-06-16-semantic-lattice.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>
<item>
    <title>FP-SYD Coq-fight 2014</title>
    <link>http://liamoc.net/posts/2014-04-26-coqfight.html</link>
    <description><![CDATA[<p><br> <img src="/images/coqfight.png" /></p>
<p>On the 23rd of April 2014, the first ever live theorem-proving competition was held at <a href="http://fp-syd.ouroborus.net/">FP-SYD</a>, with predictably great results.</p>
<p>The six contestants, fueled by nothing by alcoholic beverages and armed only with their favorite Coq environment and a handful of basic tactics, set out to prove a set of challenging lemmas in elimination rounds of five minutes or less.</p>
<p>Commentary/sledging was provided helpfully by our commentary team, including Boey Maun Suang, Thomas Sewell and Erik de Castro Lopo (as well as our contestants on the sidelines).</p>
<p>The final rankings were:</p>
<ol type="1">
<li>Amos Robinson</li>
<li>Liam O’Connor (me!)</li>
<li>Tony Sloane</li>
<li>Dom De Re and Eric Willigers (tied)</li>
<li>Ben Lippmeier</li>
</ol>
<p>Amos took home the chicken trophy, and a good time was had by all. It’s a remarkably fun event, both for those watching (many of whom were not familiar with Coq or theorem proving), and for those participating (I found it quite exhilirating!).</p>
<p>Many thanks go to Ben Lippmeier who organised basically everything and calibrated each lemma for difficulty, and to Atlassian for hosting FP-SYD.</p>

<div class="tags"><a href="/tags/coq.html">coq</a>, <a href="/tags/competition.html">competition</a>, <a href="/tags/fp-syd.html">fp-syd</a>, <a href="/tags/theorem-proving.html">theorem-proving</a>, <a href="/tags/reasoning.html">reasoning</a></div>
]]></description>
    <pubDate>Sat, 26 Apr 2014 00:00:00 UT</pubDate>
    <guid>http://liamoc.net/posts/2014-04-26-coqfight.html</guid>
    <dc:creator>Liam O'Connor</dc:creator>
</item>

    </channel>
</rss>
