<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>csimpson</title>
    <link>/</link>
    <description>Recent content on csimpson</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 28 Nov 2025 00:00:00 -0800</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Classifying Sheffer Functions</title>
      <link>/posts/classifying_pt1/</link>
      <pubDate>Fri, 28 Nov 2025 00:00:00 -0800</pubDate>
      <guid>/posts/classifying_pt1/</guid>
      <description>&lt;p&gt;In the series &lt;em&gt;&lt;strong&gt;Universal Boolean Functions&lt;/strong&gt;&lt;/em&gt;, we looked at sets of Boolean functions that have the property that they can form any other Boolean function when we compose them together with projections. We paid special attention to &lt;em&gt;&lt;strong&gt;Sheffer&lt;/strong&gt;&lt;/em&gt; functions, which have the property that iterated composition of them with projections can form any Boolean function, or to put it another way if \(f\) is Sheffer, the set \(\{f\}\) is universal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sessions</title>
      <link>/sessions/</link>
      <pubDate>Tue, 18 Nov 2025 07:40:43 -0400</pubDate>
      <guid>/sessions/</guid>
      <description>&lt;p&gt;2025&lt;/p&gt;&#xA;&lt;h3 id=&#34;universal-sets-of-boolean-functions&#34;&gt;Universal Sets of Boolean Functions&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/posts/universality_pt1/&#34;&gt;Part 1: The Basics&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/posts/universality_pt2/&#34;&gt;Part 2: Clones and Sheffer Functions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/posts/universality_pt3/&#34;&gt;Part 3: Zhegalkin Polynomials&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/posts/universality_pt4/&#34;&gt;Part 4: Post&#39;s Completeness Criterion&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;/posts/universality_pt5/&#34;&gt;Part 5: Identifying Sheffer Functions Using the Completeness Criterion&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Universal Boolean Functions Part 5: Identifying Sheffer Functions Using Post&#39;s Completeness Criterion</title>
      <link>/posts/universality_pt5/</link>
      <pubDate>Fri, 07 Nov 2025 00:00:00 -0800</pubDate>
      <guid>/posts/universality_pt5/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;In the previous posts in this series, we&amp;rsquo;ve talked about completeness of sets of Boolean functions, building to a proof of Post&amp;rsquo;s completeness criterion. In this post, we&amp;rsquo;ll investigate some applications of this to Sheffer functions. Proofs in this post again come from Pöschel and Rosenberg&amp;rsquo;s chapter in&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Crama Y, Hammer PL, eds. Boolean Models and Methods in Mathematics, Computer Science, and Engineering. Cambridge University Press; 2010.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;unless otherwise specified.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Universal Boolean Functions Part 4: Post&#39;s Criterion for Completeness</title>
      <link>/posts/universality_pt4/</link>
      <pubDate>Wed, 05 Nov 2025 00:00:49 -0800</pubDate>
      <guid>/posts/universality_pt4/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;/posts/universality_pt2/&#34;&gt;second post&lt;/a&gt; in this series, we went through a proof sketch showing that NAND and NOR were the only two binary Sheffer functions. In studying these functions, the main mystery is why certain sets of functions are complete, and why some seem to have restrictions on what sort of compositions can be formed.&lt;/p&gt;&#xA;&lt;p&gt;In this post we&amp;rsquo;ll use the idea of preservation of relations to great effect: we&amp;rsquo;ll obtain criteria for a set of functions to be complete, and a simpler one to show that a a given function is Sheffer. As a bonus, we&amp;rsquo;ll start to build towards a structural understanding of the space of clones. In writing this, I&amp;rsquo;m following chapter one of&lt;/p&gt;</description>
    </item>
    <item>
      <title>Universal Boolean Functions Part 3: Zhegalkin Polynomials</title>
      <link>/posts/universality_pt3/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:49 -0800</pubDate>
      <guid>/posts/universality_pt3/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;h3 id=&#34;polynomials-on&#34;&gt;Polynomials on \(\mathbb{Z}/2\mathbb{Z}\)&lt;/h3&gt;&#xA;&lt;p&gt;Recall how arithmetic works in the integers mod 2:&lt;/p&gt;&#xA;&lt;div style=&#34;display: flex;&#34;&gt;&#xD;&#xA;&lt;div style=&#34;margin:auto&#34;&gt;&#xD;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;\(\dotplus\)&lt;/th&gt;&#xA;          &lt;th&gt;0&lt;/th&gt;&#xA;          &lt;th&gt;1&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div style=&#34;margin:auto&#34;&gt;&#xD;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;\(\cdot\)&lt;/th&gt;&#xA;          &lt;th&gt;0&lt;/th&gt;&#xA;          &lt;th&gt;1&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The operations of addition and multiplication over \(\mathbb{Z}/2\mathbb{Z}\) behave exactly like the truth functional connectives \(\oplus\) and \(\wedge\) respectively. It makes sense for us to consider the ring \(\mathbb{Z}/2\mathbb{Z}[x_1,\dots, x_n]\) of polynomials in \(n\) variables over this field as some sort of analog of Boolean functions: typically Boolean functions are more complicated than \(\wedge\) or \(\oplus\), and polynomials are a natural way of increasing the complexity of an algebraic expression in a controlled way. What do the polynomials here look like if we consider the argument \(x\) to be some element of this field?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Universal Sets of Boolean Functions Part 2: Clones and Sheffer Functions</title>
      <link>/posts/universality_pt2/</link>
      <pubDate>Wed, 17 Sep 2025 00:00:49 -0800</pubDate>
      <guid>/posts/universality_pt2/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;/posts/universality_pt1/&#34;&gt;last post&lt;/a&gt; in this series, we defined universality of Boolean functions, went through a few proofs that specific sets were universal, and we showed the existence of two arity 2 Sheffer functions &lt;strong&gt;NAND&lt;/strong&gt; and &lt;strong&gt;NOR&lt;/strong&gt;. In this post, we&amp;rsquo;ll sketch out a proof showing that these are the only binary Sheffer functions.&lt;/p&gt;&#xA;&lt;p&gt;Determining that a given function can&amp;rsquo;t be created by compositions of others from a set seems, at least at the outset, difficult. Who are we to say there is not some absurd combination, maybe involving many thousands layers of composition, that does not replicate the function we want? If there is a key fact that I took from the learning I did for this post, it&amp;rsquo;s that &lt;strong&gt;the properties of Boolean functions that are preserved by composition are the key to understanding their behaviour&lt;/strong&gt;. If we can show that there is a property preserved by any combination of functions in our set, but that does not hold for all Boolean functions in general, then we have shown it cannot be universal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Universal Sets of Boolean Functions: The Basics</title>
      <link>/posts/universality_pt1/</link>
      <pubDate>Sun, 17 Aug 2025 00:00:49 -0800</pubDate>
      <guid>/posts/universality_pt1/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;&#xA;&lt;p&gt;While reading on nonstandard models of arithmetic, I recalled a fact that had come up once in a class on logic. While a formal language with many connectives is nice to work &lt;em&gt;in&lt;/em&gt;, it becomes unwieldy to work &lt;em&gt;on&lt;/em&gt;, requiring more inductive cases to be covered in the process of proving whatever fact you&amp;rsquo;re interested on. Because of this, we chose to work on a very simple language with only the connectives for not (\(\neg\)) and implies (\(\rightarrow\)).&lt;/p&gt;</description>
    </item>
    <item>
      <title>ASMFMT: Assemble Beautifully</title>
      <link>/posts/asmfmt/</link>
      <pubDate>Fri, 23 Jul 2021 19:58:02 -0400</pubDate>
      <guid>/posts/asmfmt/</guid>
      <description>&lt;figure&gt;&lt;img src=&#34;/img/2-asmfmt/asmfmt_final.gif&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;&#xA;&lt;p&gt;Assembly is a tough language to write in. It is both excessively verbose and obstruse, which means it requires detailed and clear comments. While writing ROMS for the GameBoy I often found myself frustrated at the amount of comments that I had to write and at how they looked. Proper formatting would improve the readability, but would take time. I thought the problem of formatting text to match some kind of style guide was interesting in its own right, so I diverted and wrote a formatter to be used as a part of my ROM build process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GBDB: A database for Nintendo GameBoy Opcodes</title>
      <link>/posts/gbdb/</link>
      <pubDate>Sat, 12 Jun 2021 07:57:02 -0400</pubDate>
      <guid>/posts/gbdb/</guid>
      <description>&lt;figure&gt;&lt;img src=&#34;/img/1-gbdb/gbdb_logo_v2_bg_final.gif&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;intro--problem-statement&#34;&gt;Intro &amp;amp; Problem Statement&lt;/h2&gt;&#xA;&lt;p&gt;Recently I&amp;rsquo;ve taken an interest in emulation and home-brew development for the original Nintendo GameBoy. I chose the beloved grey brick as a starting point for emulation for a few reasons:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Relative simplicity of the system. It certainly didn&amp;rsquo;t feel simple when I first started looking at it, but compared to consoles of today the GameBoy is very lightweight. In terms of specifications, the GameBoy has an 8-bit CPU, a 16 bit address bus, 8 KB each of Work Ram and Video RAM, and a 160x140 pixel screen. I/O, sound, and LCD screen are all memory mapped, meaning that reads/writes in certain areas of the memory space will give information about or affect these peripherals.&lt;/li&gt;&#xA;&lt;li&gt;Strength of the community. The GameBoy home-brew community has been going strong since at least 1995, when the original version of the &lt;a href=&#34;https://gbdev.io/pandocs/&#34;&gt;PanDocs&lt;/a&gt;, a collection of technical documentation on the hardware of the GameBoy, was started. The community has done an incredible work of documenting the behaviour of the system and creating tool chains to allow for development on it, such as GDBK2020 or RGBDS. See the appendix for some neat examples.&lt;/li&gt;&#xA;&lt;li&gt;GameBoy games were the first video games I owned, and the first really interesting glitches I encountered were on the Pokemon games. Hearing rumours about things like &lt;a href=&#34;https://bulbapedia.bulbagarden.net/wiki/Mew_glitch&#34;&gt;the mew glitch&lt;/a&gt; or seeing the garbage displayed when visiting a &lt;a href=&#34;https://bulbapedia.bulbagarden.net/wiki/Glitch_City&#34;&gt;glitch city&lt;/a&gt; piqued my curiosity: what exactly is going on here? What would cause this machine to misbehave in such a way? Starting this project, I felt like I had the tools needed to get a deeper understanding of this phenomena.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;/img/1-gbdb/glitch_city.gif&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;The character map becomes the territory&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Getting way off into the weeds, I decided that I would possibly give coding a GameBoy emulator a try. Grossly oversimplifying, the GB CPU is running the following loop&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>/about/</link>
      <pubDate>Tue, 25 May 2021 07:40:43 -0400</pubDate>
      <guid>/about/</guid>
      <description>&lt;h3 id=&#34;peek&#34;&gt;PEEK&lt;/h3&gt;&#xA;&lt;p&gt;The mysteries are not to be revealed.&lt;/p&gt;&#xA;&lt;h3 id=&#34;poke&#34;&gt;POKE&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/csimpson1&#34;&gt;GitHub&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
