<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Elliot's Blog</title><link>https://ebobrow.github.io/posts/</link><description>Recent content in Posts on Elliot's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 25 Apr 2026 12:40:59 -0700</lastBuildDate><atom:link href="https://ebobrow.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Products, Exponentials, and Adjoint Functors</title><link>https://ebobrow.github.io/posts/2026-04-25-adjoint/</link><pubDate>Sat, 25 Apr 2026 12:40:59 -0700</pubDate><guid>https://ebobrow.github.io/posts/2026-04-25-adjoint/</guid><description>&lt;p&gt;In category theory, you often think something is a certain type of thing but
actually it turns out to also be a different type of thing. In a first
introduction, it appears that functors are somehow one level higher than
morphisms, because functors map morphisms to morphisms. Similarly, natural
transformations should be one level higher than functors because they map
functors to functors. This is true if you want to be closed-minded and sad. But
it ignores a beautiful thing about category theory: it is so abstract and
general that it can do category theory about itself.&lt;/p&gt;</description></item><item><title>Equality in Type Theory</title><link>https://ebobrow.github.io/posts/2026-04-08-equality/</link><pubDate>Wed, 08 Apr 2026 09:54:44 -0700</pubDate><guid>https://ebobrow.github.io/posts/2026-04-08-equality/</guid><description>&lt;p&gt;As math gets more advanced, the things you prove get dumber and dumber. In
Calculus, you prove really cool things like &amp;ldquo;This sum of infinitely many real
numbers equals a finite number!&amp;rdquo; Then you take Analysis where you have to
explain &amp;ldquo;What is infinity?&amp;rdquo; and &amp;ldquo;What is a real number?&amp;rdquo; and &amp;ldquo;What is equals?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The answer to the last question, as it turns out, is, &amp;ldquo;Nobody knows.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="word-to-the-wise"&gt;Word to the Wise&lt;/h2&gt;
&lt;p&gt;The secret to PL theory is that we take a collection of very common symbols,
strip them of their meaning entirely, and then build it back from the ground up.
For the rest of this post, to protect your sanity, kindly forget everything you
think you know about $\equiv$ and $=$. We may as well use 🐒 and 🪕.&lt;/p&gt;</description></item><item><title>Why is it called Call-By-Push-Value?</title><link>https://ebobrow.github.io/posts/2026-03-08-cbpv/</link><pubDate>Sun, 08 Mar 2026 10:07:53 -0700</pubDate><guid>https://ebobrow.github.io/posts/2026-03-08-cbpv/</guid><description>&lt;p&gt;Call-by-push-value (CBPV) is a programming language that subsumes call-by-name
(CBN) and call-by-value (CBV) semantics, making it useful to reason about
effectful computations. But why is it called that?&lt;/p&gt;
&lt;h2 id="call-by-name-and-call-by-value"&gt;Call-by-name and call-by-value&lt;/h2&gt;
&lt;p&gt;First, we should motivate CBPV by explaining what CBN and CBV are. To start out
with, we will only consider the basic lambda calculus with no effects. The
important rule here when expressing the lambda calculus&amp;rsquo;s semantics is
$\beta$-reduction: How do we apply a function?&lt;/p&gt;</description></item><item><title>Semantics</title><link>https://ebobrow.github.io/posts/2025-07-26-semantics/</link><pubDate>Sat, 26 Jul 2025 16:58:31 +0200</pubDate><guid>https://ebobrow.github.io/posts/2025-07-26-semantics/</guid><description>&lt;p&gt;There are two important aspects in the study of programming languages as formal
mathematical objects: syntax (or statics) and semantics (or dynamics). The syntax
specification includes an (often inductive) definition of well-formed terms in
the language, as well as, in typed languages, a specification of the typing
judgment. There is plenty of interesting stuff to study in syntax, but this blog
post is about semantics. Semantics is about assigning actual meaning to terms in
the language. This is important for reasoning about, for example, correctness,
equivalence, or termination. Depending on your language and use case, there are
many different ways to specify the semantics. This post is a survey of what I
have experienced to be the most common ones.&lt;/p&gt;</description></item><item><title>What even is type theory?</title><link>https://ebobrow.github.io/posts/type-theory/</link><pubDate>Fri, 23 May 2025 19:08:38 -0700</pubDate><guid>https://ebobrow.github.io/posts/type-theory/</guid><description>&lt;p&gt;The problem with being self-taught in PLs is that I sort of learned everything
at the same time, which means I did not get a good sense of what things fall in
what categories. In this post I seek to determine, once and for all, what is
type theory and what is not. To do that, we&amp;rsquo;re going to back it way up and start
at the very beginning.&lt;/p&gt;
&lt;h2 id="logic"&gt;Logic&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s easier to begin to answer this question with what is not type theory.
In other words, some of the things that I know about typing systems are just
true of logic in general.&lt;/p&gt;</description></item><item><title>MU Puzzle in Automated Theorem Provers</title><link>https://ebobrow.github.io/posts/miu/</link><pubDate>Wed, 21 May 2025 08:20:28 -0700</pubDate><guid>https://ebobrow.github.io/posts/miu/</guid><description>&lt;p&gt;I recently began re-reading &lt;em&gt;Gödel, Escher, Bach&lt;/em&gt; and was intrigued by the MU
puzzle, which is Hofstadter&amp;rsquo;s introduction to formal systems. The puzzle is
this: the MIU language consists of the &amp;ldquo;axiom&amp;rdquo; &lt;em&gt;MI&lt;/em&gt; as well as all strings
constructed according to the following four rules.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you have the string &lt;em&gt;xI&lt;/em&gt;, then you can construct the string &lt;em&gt;xIU&lt;/em&gt; (where
&lt;em&gt;x&lt;/em&gt; is any string of any length).&lt;/li&gt;
&lt;li&gt;If you have &lt;em&gt;Mx&lt;/em&gt;, then you can construct &lt;em&gt;Mxx&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;em&gt;III&lt;/em&gt; appears anywhere in a string, you can replace it with &lt;em&gt;U&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;em&gt;UU&lt;/em&gt; appears anywhere in a string, you can remove it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Can you ever construct the string &lt;em&gt;MI&lt;/em&gt;?&lt;/p&gt;</description></item></channel></rss>