<?xml version='1.0' encoding='utf-8'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://hijiri.dev/</id>
  <title><![CDATA[hijiri.dev]]></title>
  <subtitle><![CDATA[Nyx's rant location]]></subtitle>
  <icon>https://hijiri.dev/favicon.png</icon>
  <link href="https://hijiri.dev" />
  <link href="https://hijiri.dev/atom.xml" rel="self" type="application/atom+xml" />
  <updated>2026-01-27T20:15:42.654Z</updated>
  <author>
    <name><![CDATA[Nyx]]></name>
  </author>
  <category term="Data Structures" scheme="https://hijiri.dev/?tags=Data%20Structures" />
  <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  <category term="Logic" scheme="https://hijiri.dev/?tags=Logic" />
  <category term="Mathematics" scheme="https://hijiri.dev/?tags=Mathematics" />
  <category term="Machine Learning" scheme="https://hijiri.dev/?tags=Machine%20Learning" />
  <category term="Neural Networks" scheme="https://hijiri.dev/?tags=Neural%20Networks" />
  <category term="N-Gram" scheme="https://hijiri.dev/?tags=N-Gram" />
  <category term="TranslationPost" scheme="https://hijiri.dev/?tags=TranslationPost" />
  <category term="Youtube" scheme="https://hijiri.dev/?tags=Youtube" />
  <category term="Linux" scheme="https://hijiri.dev/?tags=Linux" />
  <category term="PersonalPost" scheme="https://hijiri.dev/?tags=PersonalPost" />
  <category term="Spunout" scheme="https://hijiri.dev/?tags=Spunout" />
  <category term="Python" scheme="https://hijiri.dev/?tags=Python" />
  <category term="Sheets" scheme="https://hijiri.dev/?tags=Sheets" />
  <category term="Bash" scheme="https://hijiri.dev/?tags=Bash" />
  <category term="Clearvision" scheme="https://hijiri.dev/?tags=Clearvision" />
  <entry>
    <title type="html"><![CDATA[Advanced Data Structures - The Binary Search Tree]]></title>
    <link href="https://hijiri.dev/site-index/dev/ads-bst_unlisted" />
    <id>https://hijiri.dev/site-index/dev/ads-bst_unlisted</id>
    <published>null</published>
    <updated>2026-01-27T20:14:07.363Z</updated>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-1cimein">This will be the first in a series on data structures and algorithms. We start with the most basic implementation of the basic BST in python, and will move onto a few more complex structures.</p> <h1 id="binary-search-tree" data-svelte-h="svelte-dw5dpr"><a href="#binary-search-tree">Binary Search Tree</a></h1> <p data-svelte-h="svelte-1u37nkx">The BST is, as anyone with a touch of interest in CS might know, absolutely essential. It’s the basis for most of our advanced structures for searching and sorting. It’s also the basis for many of the data structures we’ll discuss.</p> <p data-svelte-h="svelte-14y06ju">First, let us define what a BST is:</p> <h2 id="definition" data-svelte-h="svelte-671rp"><a href="#definition">Definition</a></h2> <p data-svelte-h="svelte-1301x5k">Let a BST be a tree (if you don’t know what a tree in CS is, you should probably figure that out before attempting advanced data structures) where each node has at most 2 children, and the left child is less than the parent, and the right child is greater than the parent.</p> <p data-svelte-h="svelte-1dke49i">If you know how traversals work, an inorder traversal of a BST should yield a sorted list of elements.</p> <h2 id="use-cases" data-svelte-h="svelte-1qtpm2c"><a href="#use-cases">Use Cases</a></h2> <p data-svelte-h="svelte-8vl701">The BST is a basic data structure commonly used to search for elements. Because each level essentially divides the search space in half, the BST can be <code>O(log n)</code> sometimes. I say sometimes, because the tree can be <code>O(n)</code> very easily.</p> <h2 id="functionality" data-svelte-h="svelte-zklcqj"><a href="#functionality">Functionality</a></h2> <p data-svelte-h="svelte-1kap5xe">The BST has 2 main functions, to insert and delete. Searching is so trivial to implement on a BST (check a node, if less call the search function on the left child, same for greater and right node) that we don’t really have to mention it.</p> <h2 id="preliminaries" data-svelte-h="svelte-vz7l1o"><a href="#preliminaries">Preliminaries</a></h2> <p data-svelte-h="svelte-16rh691">We’d like to create an overarching structure to use for the tree, and then implement methods to turn that tree into a BST. Since a tree can be represented as a collection of linked nodes with children, we’ll start with that.</p> <p data-svelte-h="svelte-1cwobh2">Having a key value pair is traditional in data structures, since often times we have both a “search key” and a “value” that we want to store. Take a file structure for instance, where the name (or more specifically the path) of the file is the key, and the file content itself is the value.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'>class Node():</div><div class='line'>    def  __init__(self,</div><div class='line'>                  key        : int  = None,</div><div class='line'>                  value      : int  = None,</div><div class='line'>                  leftchild  : Node = None,</div><div class='line'>                  rightchild : Node = None):</div><div class='line'>        self.key        = key</div><div class='line'>        self.value      = value</div><div class='line'>        self.leftchild  = leftchild</div><div class='line'>        self.rightchild = rightchild</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-tlvc78">This node class is pretty simple.</p> <h2 id="insertion" data-svelte-h="svelte-n2e8ld"><a href="#insertion">Insertion</a></h2> <p data-svelte-h="svelte-m21q3e">Since our BST is just a simple BST, the insert idea is also very simple. Let’s first define a template for our data structure. Ideally, we want a class that can represent all nodes in the tree. This node should have a left and right child, and a key value pair.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'># For the tree rooted at root and the key and value given:</div><div class='line'># Insert the key/value pair.</div><div class='line'># The key is guaranteed to not be in the tree.</div><div class='line'>def insert(root: Node, key: int, value: int) -&gt; Node:</div><div class='line'>    if root is None: </div><div class='line'>        # if root is none then we are building tree</div><div class='line'>        return Node(key, value)</div><div class='line'>    cur = root # traversal setup</div><div class='line'>    while True:</div><div class='line'>        if key &lt; cur.key:</div><div class='line'>            # if it's less and there is no left child then we can insert</div><div class='line'>            if cur.leftchild is None:</div><div class='line'>                cur.leftchild = Node(key, value)</div><div class='line'>                break</div><div class='line'>            # else recursively go into the left child</div><div class='line'>            else:</div><div class='line'>                cur = cur.leftchild</div><div class='line'>        else:</div><div class='line'>            # similar</div><div class='line'>            if cur.rightchild is None:</div><div class='line'>                cur.rightchild = Node(key, value)</div><div class='line'>                break</div><div class='line'>            else:</div><div class='line'>                cur = cur.rightchild</div><div class='line'>    return root</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1jp6dyq">The insert method is pretty simple. We just traverse the tree until we find a place to insert the key. If the key is less than the current node, we go left, else we go right. If we hit a <code>None</code> child, we insert the key there, since we are then at a leaf. Additionally note that we include a base case, because you will find that our initializer for the tree simple includes just declaring a None node and passing in the key and value.</p> <h2 id="deletion" data-svelte-h="svelte-1rkrosa"><a href="#deletion">Deletion</a></h2> <p data-svelte-h="svelte-1isln8">Deletion is a bit more complex. Consider the following:</p> <ul data-svelte-h="svelte-1r618ck"><li>If the node has no children, we can just delete it.</li> <li>If the node has one child, we can just replace the node with the child.</li> <li>If the node has two children (eg it’s a true parent node), it gets complex. Say we delete the node. How do we then “rebalance” or move around the 2 child trees so that the BST property is still maintained? It turns out that the easiest option is to find a replacement node from within the tree. Note that this option needs to be in between the left and right child of the node we are deleting.</li></ul> <p data-svelte-h="svelte-11lhjdz">How do we find this replacement node? We can either find the maximum of the left subtree or the minimum of the right subtree. These two are the only nodes guaranteed to be in between any of the nodes of the left tree, and any of the nodes of the right tree.</p> <p data-svelte-h="svelte-15or9q5">If you picture the children as sets of numbers on a line, and note that the deleted node is in the center, this may be more apparent.</p> <p data-svelte-h="svelte-bui9e2">In this method we use what is called the “inorder successor”, or the minimum of the right subtree. It’s called such because if you were to do an inorder traversal, this number would be immediately succeeding the deleted node.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'># Helper function to find the inorder successor</div><div class='line'># by finding the minimum of a tree. We will pass in</div><div class='line'># the right subtree child of the node we are deleting.</div><div class='line'>def findminnode(node: Node) -&gt; Node:</div><div class='line'>    cur = node</div><div class='line'>    while cur.leftchild is not None:</div><div class='line'>        cur = cur.leftchild</div><div class='line'>    return cur</div><div class='line'></div><div class='line'># For the tree rooted at root and the key given, delete the key.</div><div class='line'># When replacement is necessary use the inorder successor.</div><div class='line'>def delete(root: Node, key: int) -&gt; Node:</div><div class='line'>    if root is None:</div><div class='line'>        return root # base case </div><div class='line'>    # we look by key. key should be inorder so we use bs to find it </div><div class='line'>    if key &lt; root.key:</div><div class='line'>        root.leftchild = delete(root.leftchild, key)</div><div class='line'>    elif key &gt; root.key:</div><div class='line'>        root.rightchild = delete(root.rightchild, key)</div><div class='line'>    else: # case that key=root.key </div><div class='line'>        if root.leftchild is None: </div><div class='line'>            return root.rightchild</div><div class='line'>        elif root.rightchild is None:</div><div class='line'>            return root.leftchild</div><div class='line'>        # inorder successor nonsense </div><div class='line'>        # set key to smallest of right child</div><div class='line'>        tmp = findminnode(root.rightchild) # returns a node</div><div class='line'>        root.key = tmp.key</div><div class='line'>        root.value = tmp.value</div><div class='line'>        # deletus the inorder tmp!!</div><div class='line'>        root.rightchild = delete(root.rightchild, tmp.key)</div><div class='line'>    return root</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1orokkq">Note that once we find the inorder successor, we replace the key and value of the node we are deleting with the key and value of the inorder successor. We then delete the inorder successor, which is, as it turns out, guaranteed to be either a leaf node or only have 1 child to the right (since it can’t have a left child, as it’s the smallest in that set already).</p> <h2 id="search" data-svelte-h="svelte-6jnlxo"><a href="#search">Search</a></h2> <p data-svelte-h="svelte-1bsbblv">Search is trivial. We just traverse the tree until we find what we want.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'># For the tree rooted at root and the key given:</div><div class='line'># Calculate the list of values on the path from the root down to and including the search key node.</div><div class='line'># The key is guaranteed to be in the tree.</div><div class='line'># Return the json.dumps of the list with indent=2.</div><div class='line'>def search(root: Node, search_key: int) -&gt; str:</div><div class='line'>    value_list = []</div><div class='line'>    def search_helper(node: Node, search_key: int) -&gt; bool: # im using bool to flag when to break</div><div class='line'>        if node is None: # base case</div><div class='line'>            return False</div><div class='line'>        value_list.append(node.value)</div><div class='line'>        if node.key == search_key: # we found the key and can return with the value_list complete</div><div class='line'>            return True</div><div class='line'>        if search_key &lt; node.key:</div><div class='line'>            return search_helper(node.leftchild, search_key)</div><div class='line'>        elif search_key &gt; node.key:</div><div class='line'>            return search_helper(node.rightchild, search_key)</div><div class='line'>    # i've been looking at the word "search" for too long and now it looks stupid</div><div class='line'>    search_helper(root, search_key)</div><div class='line'>    return value_list</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1dgdzyp">And we have a simple search function that returns the path to the key.</p> <h2 id="closing-thoughts" data-svelte-h="svelte-14659tb"><a href="#closing-thoughts">Closing Thoughts</a></h2> <p data-svelte-h="svelte-1uw6547">This is a simple implementation of a BST. It’s not the most efficient, but it’s a good starting point. We can improve this by balancing the tree, which we will discuss in a future post. I hope you learned something; although hopefully the concepts were already familiar to you, since a BST is by far the most basic structure I intend to go over. Also, if I feel good after finishing this series, I may start one on binary exploitation.</p>]]>
    </content>
    <category term="Data Structures" scheme="https://hijiri.dev/?tags=Data%20Structures" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[An Introduction to Elementary Logic and Cantor's Theorem]]></title>
    <link href="https://hijiri.dev/site-index/dev/logic-intro" />
    <id>https://hijiri.dev/site-index/dev/logic-intro</id>
    <published>2026-01-17T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-1hs9cg5">Going to aim to keep this introduction as simple as possible. It’s heavily inspired by Aris Papadopoulos’ course Math445, which I took last semester.</p> <p data-svelte-h="svelte-1qvs2ne">I also want to mention that, yeah, I’ve been dead. I have an unlisted advanced datastructures series that I want to finish, and additionally I need to keep working on the machine learning stuff. I also want to start a new one on security. But for now, logic.</p> <h2 id="assumptions" data-svelte-h="svelte-10p8cy8"><a href="#assumptions">Assumptions</a></h2> <p data-svelte-h="svelte-jobfrj">I will be assuming that you have some basic familiarity with sets, functions, and proofs. If you don’t, there are a lot of resources online that can help you get up to speed.</p> <p data-svelte-h="svelte-bb9kdj">A “section” will be a self contained part of this article. Each section is designed to contain its own definitions and theorems, and new sections may depend on previous sections, but not vice versa. Some definitions might not pass through either.</p> <h1 id="math" data-svelte-h="svelte-tm8i04"><a href="#math">Math</a></h1> <h2 id="basic-definitions" data-svelte-h="svelte-picx8a"><a href="#basic-definitions">Basic Definitions</a></h2> <p><strong data-svelte-h="svelte-1sz38oy">Definition (Equinumerous):</strong> Two sets <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span> are equinumerous if there exists a bijection (a one-to-one and onto function) <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo>:</mo><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">f: X \to Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span>. We can write this as <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mo>∼</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X \sim Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span><span class="mspace"></span><span class="mrel">∼</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>The gist of this is that there are an equal “number” of elements in both sets. If this is true, then naturally there is a function that maps each element to each other using the index of the element. The definition of “number” is dubious of course, since we know that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi><mo>∼</mo><mi mathvariant="double-struck">Z</mi><mo>∼</mo><mi mathvariant="double-struck">Q</mi></mrow><annotation encoding="application/x-tex">\mathbb{N} \sim \mathbb{Z} \sim \mathbb{Q}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span><span class="mspace"></span><span class="mrel">∼</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">Z</span><span class="mspace"></span><span class="mrel">∼</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">Q</span></span></span></span><!-- HTML_TAG_END --></span>, and we’ll get into this soon.</p> <p><strong data-svelte-h="svelte-7x9hvo">Definition (Subnumerous):</strong> <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span> is subnumerous to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span> if there exists an injection (a one-to-one function) <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo>:</mo><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">f: X \to Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span>. We can write this as <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mo>⪯</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X \preceq Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span><span class="mspace"></span><span class="mrel">⪯</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span>. The gist of this is that there are “less than or equal to” elements in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span> as there are in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Y</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-1hhpuzh">Definition (Power Set):</strong> The power set of a set <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span>, denoted <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">P</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{P}(X)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">P</span><span class="mopen">(</span><span class="mord mathnormal">X</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, is the set of all subsets of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <h2 id="theorem-cantors-theorem" data-svelte-h="svelte-18uytee"><a href="#theorem-cantors-theorem">Theorem (Cantor’s Theorem)</a></h2> <p>For any set, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> is not equinumerous to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">P</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{P}(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">P</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, there is no bijection between a set and its power set. Here, the power set is defined as above.</p> <p data-svelte-h="svelte-6p45c8"><strong>Proof #1:</strong> This proof, more overarching, does not use the diagonal argument.</p> <p>Take an arbitrary map <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> from <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">P</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{P}(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">P</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. We will show that this map cannot be surjective, and thus cannot be a bijection. To prove this, we will construct a set that is not in the image of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> (since the definition of surjective is that every element in the codomain has a preimage in the domain).</p> <p>Then, let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><mo stretchy="false">{</mo><mi>x</mi><mo>∈</mo><mi>A</mi><mo>∣</mo><mi>x</mi><mo>∉</mo><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">B = \{ x \in A \mid x \not\in f(x) \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∣</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span></span><span class="base"><span class="strut"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)}</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> is the set of all elements in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> that are not in their own image under <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>. Note that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> is in the power set of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span>, since it is a subset of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> (we are only taking elements from <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> to form <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>).</p> <p>Then, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">B=f(b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> for some <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>∈</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">b \in A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> if and only if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>∈</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">b \in B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> if and only if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>∉</mo><mi>f</mi><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">b \not\in f(b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span><span class="mspace"></span><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span></span><span class="base"><span class="strut"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> if and only if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>∉</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">b \not\in B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span><span class="mspace"></span><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span></span><span class="base"><span class="strut"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>. This is a contradiction, so there is no such <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, and thus <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> is not in the image of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>. Therefore, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> is not surjective, and thus cannot be a bijection.</p> <p>However, this proof can be a little bit unsatisfying, since it doesn’t really give us a concrete example of a set that is not in the image of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>. In fact, we define some set <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> that depends on <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>, so it feels a bit like cheating.</p> <p><strong>Proof #2 (for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi></mrow><annotation encoding="application/x-tex">\mathbb{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span></span></span></span><!-- HTML_TAG_END --></span>):</strong> Now, we will use the diagonal argument to construct a concrete example of a set that is not in the image of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>, for the case where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>=</mo><mi mathvariant="double-struck">N</mi></mrow><annotation encoding="application/x-tex">A=\mathbb{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">N</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>Take any arbitrary map <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> from <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">P</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{P}(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">P</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. For the sake of simplicity and without loss of generality let</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo stretchy="false">}</mo><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mn>2</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn><mo stretchy="false">}</mo><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mn>1</mn><mo separator="true">,</mo><mn>4</mn><mo stretchy="false">}</mo><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mn>4</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mn>2</mn><mo stretchy="false">}</mo><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mn>5</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>5</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">f(1)=\{1,3\}, f(2)=\{2,4,5\}, f(3)=\{1,4\}, f(4)=\{2\}, f(5)=\{1,3,5\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">3</span><span class="mclose">}</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">5</span><span class="mclose">}</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">3</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">4</span><span class="mclose">}</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">4</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">2</span><span class="mclose">}</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">5</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">5</span><span class="mclose">}</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>etc. Note that the domain is elements of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> (which for now we’ll take to be <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi></mrow><annotation encoding="application/x-tex">\mathbb{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span></span></span></span><!-- HTML_TAG_END --></span> for simplicity), and the range is subsets of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>Then, you can represent this as a matrix of 0s and 1s, where each row represents the image of an element in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span>, and each column represents whether or not an element is in the subset. For example, for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(1), f(2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, we have that</p> <div class="overflow-x-auto mb-4"><table class="table w-full"><thead data-svelte-h="svelte-aknkfb"><tr><th></th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>…</th></tr></thead> <tbody data-svelte-h="svelte-7gebac"><tr><td>1</td> <td>1</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>…</td></tr> <tr><td>2</td> <td>0</td> <td>1</td> <td>0</td> <td>1</td> <td>1</td> <td>…</td></tr> <tr><td>…</td> <td>…</td> <td>…</td> <td>…</td> <td>…</td> <td>…</td> <td>…</td></tr></tbody></table></div> <p>Then, for each diagonal element (i.e. the elements where the row and column indices are the same), we flip the value (0 becomes 1, and 1 becomes 0). This gives us a new set of values that differ from each row in at least one position, always. Thus, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><mo stretchy="false">{</mo><mi>x</mi><mo>∈</mo><mi>A</mi><mo>∣</mo><mtext>the </mtext><mi>x</mi><mtext>-th diagonal element is </mtext><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">B=\{ x \in A \mid \text{the } x\text{-th diagonal element is } 1 \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∣</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord text"><span class="mord">the </span></span><span class="mord mathnormal">x</span><span class="mord text"><span class="mord">-th diagonal element is </span></span><span class="mord">1</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> is not in the image of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>, since it differs from each <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> in at least one position (the <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span>-th position).</p> <p>That is, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> contains <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">1</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>∉</mo><mi>f</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">1 \not\in f(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">1</span><span class="mspace"></span><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span></span><span class="base"><span class="strut"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, contains <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">2</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>∉</mo><mi>f</mi><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 \not\in f(2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">2</span><span class="mspace"></span><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span></span><span class="base"><span class="strut"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, and so on. Thus, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> cannot be equal to any <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Note that we must use the diagonal here because if we just flipped the first element of each row, for example, then it is possible that two rows could be identical in all other positions, and thus we wouldn’t be able to guarantee that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> is not in the image of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> because we’ve inverted them into each other.</p> <p><strong data-svelte-h="svelte-1k9vlty">Exercise:</strong> It’s an extremely interesting (and kind of annoying, if you want to do it “correctly”) exercise to prove that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi><mo>∼</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><msup><mo stretchy="false">}</mo><mi mathvariant="double-struck">N</mi></msup></mrow><annotation encoding="application/x-tex">\mathbb{N}\sim \{0,1\}^\mathbb{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span><span class="mspace"></span><span class="mrel">∼</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">1</span><span class="mclose"><span class="mclose">}</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathbb mtight">N</span></span></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> (the set of all infinite binary sequences). You can also do this for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi><mo>∼</mo><mi mathvariant="double-struck">Q</mi></mrow><annotation encoding="application/x-tex">\mathbb{N}\sim \mathbb{Q}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span><span class="mspace"></span><span class="mrel">∼</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">Q</span></span></span></span><!-- HTML_TAG_END --></span> if you want to go a bit further, but that’s further more annoying.</p> <h2 id="finishing-remarks" data-svelte-h="svelte-ovzv0e"><a href="#finishing-remarks">Finishing Remarks</a></h2> <p><strong data-svelte-h="svelte-1cq5i6j">Definition (Countable):</strong> A set <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span> is countable if it is equinumerous to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi></mrow><annotation encoding="application/x-tex">\mathbb{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span></span></span></span><!-- HTML_TAG_END --></span> (or finite). Otherwise, it is uncountable.</p> <p>For instance, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi><mo separator="true">,</mo><mi mathvariant="double-struck">Z</mi><mo separator="true">,</mo><mi mathvariant="double-struck">Q</mi></mrow><annotation encoding="application/x-tex">\mathbb{N}, \mathbb{Z}, \mathbb{Q}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathbb">Z</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathbb">Q</span></span></span></span><!-- HTML_TAG_END --></span> are countable, while <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">R</mi></mrow><annotation encoding="application/x-tex">\mathbb{R}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">R</span></span></span></span><!-- HTML_TAG_END --></span> is uncountable.</p> <p><strong data-svelte-h="svelte-18rewac">Note:</strong> One interesting fun note is that the continuum hypothesis, which states that there exists no set <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span></span></span></span><!-- HTML_TAG_END --></span> such that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">N</mi><mo>≺</mo><mi>X</mi><mo>≺</mo><mi mathvariant="double-struck">R</mi></mrow><annotation encoding="application/x-tex">\mathbb{N} \prec X \prec \mathbb{R}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">N</span><span class="mspace"></span><span class="mrel">≺</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">X</span><span class="mspace"></span><span class="mrel">≺</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">R</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, there is no set with cardinality strictly between that of the integers and the real numbers. This was shown to be independent of the standard axioms of set theory (ZFC, or the Zermelo-Fraenkel set theory with the axiom of choice), meaning that it can neither be proven nor disproven using those axioms. That is to say, both the continuum hypothesis and its negation are consistent with ZFC, assuming ZFC itself is consistent.</p> <p data-svelte-h="svelte-11cn1f3">That is to say, ZFC is not capable of deciding the truth value of the continuum hypothesis within its own system. This tells us that a seemingly good set of axioms can still be incomplete in some sense. We’ll get into this more later!</p> <p data-svelte-h="svelte-ni351x">For fun, you may want to read up on ZFC <a href="https://en.wikipedia.org/wiki/Zermelo%E2%80%93Fraenkel_set_theory" rel="nofollow noopener noreferrer external" target="_blank">here</a>.</p> <h1 id="end" data-svelte-h="svelte-fq8h61"><a href="#end">End</a></h1> <p data-svelte-h="svelte-2xh5ny">Next: Propositional logic</p>]]>
    </content>
    <category term="Logic" scheme="https://hijiri.dev/?tags=Logic" />
    <category term="Mathematics" scheme="https://hijiri.dev/?tags=Mathematics" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[An Introduction to Propositional Logic]]></title>
    <link href="https://hijiri.dev/site-index/dev/logic-proplogic" />
    <id>https://hijiri.dev/site-index/dev/logic-proplogic</id>
    <published>2026-01-17T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-162ysrc">Propositional Logic is a deep topic, covering most of what we can call “logical reasoning”. You have probably seen most of it before, and the goal today is to use it towards proving some kind of completeness theorem.</p> <p data-svelte-h="svelte-1bpnmjq">Be warned that at the moment, I have no intention of putting proofs in here. The “introduction” posts will be definitions only, pretty much. I may come back later and have a series of posts titled eg. “Proofs of Propositional Logic”, but for now, just definitions.</p> <h1 id="math" data-svelte-h="svelte-tm8i04"><a href="#math">Math</a></h1> <p data-svelte-h="svelte-x0rquh">The general idea is that propositional logic allows us to define a set of propositions, and then use logical connectives to build more complex propositions. We will distinguish between syntax, semantics, and the proof system that ties them together.</p> <h2 id="basic-definitions" data-svelte-h="svelte-picx8a"><a href="#basic-definitions">Basic Definitions</a></h2> <p data-svelte-h="svelte-1pvron0">A propositional logic system must be able to express some kind of statement, give a meaning to that statement, and then have a way to prove things about those statements.</p> <p data-svelte-h="svelte-xdg53k">To put it another way, think of the typical Algebra 1 expressions you work with. We need a way to write expressions and formulas, eg “x+y” and “2+3”, a way to assign meaning to those expressions, eg “x=2” and “y=3”, and then a way to prove things about those expressions, eg “2+3=5”.</p> <h3 id="structure-of-propositional-logic" data-svelte-h="svelte-1u4p0mv"><a href="#structure-of-propositional-logic">Structure of Propositional Logic</a></h3> <p data-svelte-h="svelte-1m8fot9"><strong>Definition (Propositional Symbols):</strong> I include the tex here for easy copy pasting for those using tex.</p> <div class="overflow-x-auto mb-4"><table class="table w-full"><thead data-svelte-h="svelte-19i2q0e"><tr><th>Symbol</th> <th>Name</th> <th>Meaning</th> <th>Tex</th></tr></thead> <tbody><tr><td><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∧</mo></mrow><annotation encoding="application/x-tex">\wedge</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">∧</span></span></span></span><!-- HTML_TAG_END --></span></td> <td data-svelte-h="svelte-2mkg65">And</td> <td data-svelte-h="svelte-9m3fq6">Conjunction</td> <td data-svelte-h="svelte-cfrjrp"><code>\wedge</code></td></tr> <tr><td><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∨</mo></mrow><annotation encoding="application/x-tex">\vee</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">∨</span></span></span></span><!-- HTML_TAG_END --></span></td> <td data-svelte-h="svelte-ml1c5v">Or</td> <td data-svelte-h="svelte-1yqjw0m">Disjunction</td> <td data-svelte-h="svelte-1ryl3ax"><code>\vee</code></td></tr> <tr><td><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi></mrow><annotation encoding="application/x-tex">\neg</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">¬</span></span></span></span><!-- HTML_TAG_END --></span></td> <td data-svelte-h="svelte-onlye9">Not</td> <td data-svelte-h="svelte-1bn4al">Negation</td> <td data-svelte-h="svelte-1xvlo3b"><code>\neg</code></td></tr> <tr><td><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mrel">→</span></span></span></span><!-- HTML_TAG_END --></span></td> <td data-svelte-h="svelte-1kpb7tl">Implies</td> <td data-svelte-h="svelte-7wf88j">Implication</td> <td data-svelte-h="svelte-1wv5xoo"><code>\rightarrow</code></td></tr> <tr><td><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">()</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span></td> <td data-svelte-h="svelte-4y3p4u">Parentheses</td> <td data-svelte-h="svelte-1ft45zr">Grouping</td> <td data-svelte-h="svelte-hlkbde"><code>()</code></td></tr></tbody></table></div> <p data-svelte-h="svelte-jo6b93">Note that we are defining grouping here!</p> <p data-svelte-h="svelte-1mqs93b">If you have ever taken a programming languages course, you will know that grouping is very important for defining order of operations. We will not define a “parser” here, but know that parentheses are very important, and that when we evaluate expressions, we will always evaluate it as if there <em>was</em> a parser.</p> <p>For instance, we will always evaluate the innermost parentheses first. Additionally, we must group every expression with parentheses. For example, instead of writing <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∧</mo><mi>B</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A \wedge B \rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span></span></span></span><!-- HTML_TAG_END --></span>, we will write <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo>→</mo><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">((A \wedge B) \rightarrow C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-feceu2">If I do not write parentheses, it should be obvious from context that I am omitting them for brevity, and that it can be grouped in a way that makes sense.</p> <p><strong data-svelte-h="svelte-6gv7qt">Definition (Propositional Variable):</strong> A propositional variable, the set of which will be denoted <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span>, is just some set of symbols that represent a proposition. For example, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span></span></span></span><!-- HTML_TAG_END --></span>, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">R</span></span></span></span><!-- HTML_TAG_END --></span> could be propositional variables. The cardinality of this set must be at least countably infinite, eg <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∣</mi><mi>V</mi><mi>a</mi><mi>r</mi><mi mathvariant="normal">∣</mi><mo>=</mo><msub><mi mathvariant="normal">ℵ</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">|Var|=\aleph_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">∣</span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mord">∣</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord">ℵ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-1llkpt4"><strong>Definition (Propositional Formula):</strong> A propositional formula is the following:</p> <ul><li data-svelte-h="svelte-12z8bvn">Any propositional variable is a propositional formula.</li> <li>Propositional formulas are closed under the logical connectives defined above. For example, if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> are propositional formulas, then so are <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \wedge B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \vee B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>→</mo><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">((A) \rightarrow (B))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li data-svelte-h="svelte-14xjvn0">Nothing else is a propositional formula.</li></ul> <p>Note that this is a recursive (or inductive) definition. We can build up complex formulas from simpler ones, and that is the only way we can do them. It also means we can break down complex formulas into simpler ones by finding a recursive path that builds it up, and then reversing that path. Note that this recursive path also doesn’t have to be unique under valuation; for example, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo>∨</mo><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">((A \wedge B) \vee C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> can be built up in two different ways depending on which connective we apply first, which are <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">((A \wedge B))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span></span></span></span><!-- HTML_TAG_END --></span>, or <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>B</mi><mo>∨</mo><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(B \vee C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-mq50gr">When discussing how to build a tree of a propositional formula, we may use “recursive” because it’s more computational. However, when discussing proofs by induction on propositional formulas, we will use “inductive” since it’s more mathematical.</p> <p data-svelte-h="svelte-6d4y7t"><strong>TLDR</strong>: a propositional formula is the smallest possible set of things that contains all propositional variables and is closed under the logical connectives.</p> <p data-svelte-h="svelte-r97qjs">Because formulas are inductive items, proofs on them will be done with structural induction, eg by proving a base case and then showing that the property holds under closure.</p> <p><strong data-svelte-h="svelte-9yk82">Definition (Subformula):</strong> The function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, which defines the set of subformulas of a propositional formula, is defined as follows:</p> <ul><li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mi>P</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">Sub(P) = \{ P \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">P</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> for any propositional variable <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((\neg A)) = \{ (\neg A) \} \cup Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((A \wedge B)) = \{ (A \wedge B) \} \cup Sub(A) \cup Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((A \vee B)) = \{ (A \vee B) \} \cup Sub(A) \cup Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((A \rightarrow B)) = \{ (A \rightarrow B) \} \cup Sub(A) \cup Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li data-svelte-h="svelte-hbm1gq">Nothing else.</li></ul> <p>As an example, let’s prove that for all formulas, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi \in Sub(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Again, we will do this by structural induction.</p> <p><strong data-svelte-h="svelte-dxly1o">Example:</strong> We will prove that for all formulas, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi \in Sub(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-1qimrtw">Proof:</strong> We will do this by structural induction on <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <ul><li><strong data-svelte-h="svelte-10t98sb">Base Case:</strong> Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> be a propositional variable, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span>. Then, by the definition of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mi>P</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">Sub(P) = \{ P \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">P</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span>, so <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P \in Sub(P)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><strong data-svelte-h="svelte-1v6yk8f">Inductive Step:</strong> Assume that for all formulas <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A \in Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">B \in Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. We will show that this holds for the formulas <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \wedge B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \vee B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \rightarrow B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.<ul><li>Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>=</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi = (\neg A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Then, by the definition of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((\neg A)) = \{ (\neg A) \} \cup Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. By the inductive hypothesis, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A \in Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, so <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg A) \in Sub((\neg A))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li>Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi = (A \wedge B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Then, by the definition of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((A \wedge B)) = \{ (A \wedge B) \} \cup Sub(A) \cup Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. By the inductive hypothesis, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A \in Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">B \in Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, so <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \wedge B) \in Sub((A \wedge B))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li>Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi = (A \vee B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Then, by the definition of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((A \vee B)) = \{ (A \vee B) \} \cup Sub(A) \cup Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. By the inductive hypothesis, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A \in Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">B \in Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, so <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∨</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \vee B) \in Sub((A \vee B))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li>Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi = (A \rightarrow B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Then, by the definition of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">}</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Sub((A \rightarrow B)) = \{ (A \rightarrow B) \} \cup Sub(A) \cup Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)}</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. By the inductive hypothesis, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A \in Sub(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">B \in Sub(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, so <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A \rightarrow B) \in Sub((A \rightarrow B))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>.</li></ul></li></ul> <p>Thus, by structural induction, we have that for all formulas <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>∈</mo><mi>S</mi><mi>u</mi><mi>b</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi \in Sub(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-dbdby3">This is a <em>very</em> bulky proof! For the future, I will truncate similar proofs to just the base case and one inductive step, since the rest are analogous. Additionally, we will avoid trying to prove things that are obvious.</p> <p><strong data-svelte-h="svelte-11e6scd">Definition (Variables):</strong> Let’s formally define the function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Var(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, which gives us the set of propositional variables in a formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>. Note that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Var()</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">(</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is different than <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span>. The first is a function that produces a set of propositional variables from a formula, while the second is the set of all propositional variables.</p> <ul><li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mi>P</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">Var(P) = \{ P \}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">P</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> for any propositional variable <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>A</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Var((\neg A)) = Var(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">((</span><span class="mord">¬</span><span class="mord mathnormal">A</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>∪</mo><mi>V</mi><mi>a</mi><mi>r</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Var((A \wedge B)) = Var(A) \cup Var(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li data-svelte-h="svelte-sufrmz">… and so on for the other connectives.</li> <li data-svelte-h="svelte-hbm1gq">Nothing else.</li></ul> <h3 id="substitution" data-svelte-h="svelte-17go3ln"><a href="#substitution">Substitution</a></h3> <p>The notion of substitution is something that we should all understand to some degree. In 6th grade algebra, when we have the expression <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>+</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">x + 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">2</span></span></span></span><!-- HTML_TAG_END --></span>, and we don’t know what <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span> is in <em data-svelte-h="svelte-eqy3em">this</em> expression, but we do know that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">x = 3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">3</span></span></span></span><!-- HTML_TAG_END --></span> from some other context, we can replace <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span> with <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">3</span></span></span></span><!-- HTML_TAG_END --></span> to get <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn><mo>+</mo><mn>2</mn><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">3 + 2 = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">3</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">2</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">5</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>The idea is that we can replace things in propositional logic too. They can be from within the same universe of discourse, or from different ones. For example, if we have the formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><mo>∧</mo><mi>Q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(P \wedge Q)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, and we know that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> is equivalent to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>R</mi><mo>∨</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(R \vee S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">R</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, then we can replace <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> with <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>R</mi><mo>∨</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(R \vee S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">R</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> to get <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>R</mi><mo>∨</mo><mi>S</mi><mo stretchy="false">)</mo><mo>∧</mo><mi>Q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">((R \vee S) \wedge Q)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord mathnormal">R</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-cu48ub">Definition (Substitution):</strong> Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>∈</mo><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">A\in Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span> (recall that this is the set of all propositional variables), and let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> be a propositional formula. Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> be another propositional formula. Then, we define the substitution of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span> with <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>ϕ</mi><mo stretchy="false">[</mo><mi>A</mi><mo>:</mo><mo>=</mo><mi>ψ</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\phi[\psi/A] = \phi[A := \psi]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">:=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mclose">]</span></span></span></span></span><!-- HTML_TAG_END --></div> <p data-svelte-h="svelte-uraeps">These two notations are equivalent. We will use the first. In order for it to be well defined, let’s have that</p> <ul><li>For <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>∈</mo><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">B\in Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">B[\psi/A] = \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">B = A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span>, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mo mathvariant="normal">≠</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">B \neq A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span></li> <li>For <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg \phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>ϕ</mi><mo stretchy="false">)</mo><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi mathvariant="normal">¬</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg \phi)[\psi/A] = \neg (\phi[\psi/A])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">¬</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">])</span></span></span></span><!-- HTML_TAG_END --></span></li> <li>For <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\phi_1 \wedge \phi_2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\phi_1 \wedge \phi_2)[\psi/A] = (\phi_1[\psi/A] \wedge \phi_2[\psi/A])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">])</span></span></span></span><!-- HTML_TAG_END --></span></li> <li data-svelte-h="svelte-sufrmz">… and so on for the other connectives.</li> <li data-svelte-h="svelte-hbm1gq">Nothing else.</li></ul> <p data-svelte-h="svelte-tgw0qw">A shorthand we’re going to make here is that</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><msub><mi>ψ</mi><mn>1</mn></msub><mi mathvariant="normal">/</mi><msub><mi>A</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>ψ</mi><mn>2</mn></msub><mi mathvariant="normal">/</mi><msub><mi>A</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>ψ</mi><mi>n</mi></msub><mi mathvariant="normal">/</mi><msub><mi>A</mi><mi>n</mi></msub><mo stretchy="false">]</mo><mo>=</mo><mi>ϕ</mi><mo stretchy="false">[</mo><msub><mi>ψ</mi><mn>1</mn></msub><mi mathvariant="normal">/</mi><msub><mi>A</mi><mn>1</mn></msub><mo stretchy="false">]</mo><mo stretchy="false">[</mo><msub><mi>ψ</mi><mn>2</mn></msub><mi mathvariant="normal">/</mi><msub><mi>A</mi><mn>2</mn></msub><mo stretchy="false">]</mo><mo>…</mo><mo stretchy="false">[</mo><msub><mi>ψ</mi><mi>n</mi></msub><mi mathvariant="normal">/</mi><msub><mi>A</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\phi[\psi_1/A_1, \psi_2/A_2, \ldots, \psi_n/A_n] = \phi[\psi_1/A_1][\psi_2/A_2] \ldots [\psi_n/A_n]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">]</span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">]</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">]</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>Next, we will define a lemma, which basically just states that substitution on a variable that does not exist in the formula does nothing. To make an analogy if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">x=5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">5</span></span></span></span><!-- HTML_TAG_END --></span> and we have the expression <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>+</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">y + 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">y</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">2</span></span></span></span><!-- HTML_TAG_END --></span>, substituting <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span> with <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">5</span></span></span></span><!-- HTML_TAG_END --></span> does nothing since <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span> is not in the expression.</p> <p><strong data-svelte-h="svelte-184b2ve">Lemma:</strong> If <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">A\notin Vars</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi[\psi/A]=\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span></p> <p data-svelte-h="svelte-p2mxs2"><strong>Proof:</strong> We will use induction on the structure of formulas.</p> <p><strong data-svelte-h="svelte-1nw1cz3">Base case</strong>: Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>=</mo><mi>B</mi><mo>∈</mo><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">\phi=B\in Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span>. Then, assuming that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">(</span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, eg that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">≠</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A\neq B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">\phi[\psi/A]=B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-9g2o2z">Inductive Step</strong>: Assume that for formulas <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi><mo separator="true">,</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\psi, \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi[\psi/A]=\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>, and if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><mi>ψ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars(\psi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">(</span><span class="mord mathnormal">ψ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi[\psi/A]=\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span>. We must show it holds for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi><mo separator="true">,</mo><mo>∧</mo><mo separator="true">,</mo><mo>∨</mo><mo separator="true">,</mo><mo>→</mo></mrow><annotation encoding="application/x-tex">\neg, \wedge, \vee, \rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">¬</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">∧</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">∨</span><span class="mpunct">,</span><span class="mspace"></span><span class="mrel">→</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <ul><li>For <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg \phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>ϕ</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars((\neg \phi))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">((</span><span class="mord">¬</span><span class="mord mathnormal">ϕ</span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Thus, by the inductive hypothesis, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi[\psi/A]=\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>. Therefore, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>ϕ</mi><mo stretchy="false">)</mo><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mi mathvariant="normal">¬</mi><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">¬</mi><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">(\neg \phi)[\psi/A] = \neg (\phi[\psi/A]) = \neg \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">¬</span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">])</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">¬</span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li>For <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\phi_1 \wedge \phi_2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars((\phi_1 \wedge \phi_2))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">((</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars(\phi_1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo mathvariant="normal">∉</mo><mi>V</mi><mi>a</mi><mi>r</mi><mi>s</mi><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A\notin Vars(\phi_2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord vbox"><span class="thinbox"><span class="llap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">rs</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. Thus, by the inductive hypothesis, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><msub><mi>ϕ</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">\phi_1[\psi/A]=\phi_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><msub><mi>ϕ</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">\phi_2[\psi/A]=\phi_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>. Therefore, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>=</mo><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>ψ</mi><mi mathvariant="normal">/</mi><mi>A</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\phi_1 \wedge \phi_2)[\psi/A] = (\phi_1[\psi/A] \wedge \phi_2[\psi/A]) = (\phi_1 \wedge \phi_2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">ψ</span><span class="mord">/</span><span class="mord mathnormal">A</span><span class="mclose">])</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li data-svelte-h="svelte-sufrmz">… and so on for the other connectives.</li></ul> <p data-svelte-h="svelte-1h840u0"><strong>Definition (Propositional Sentence):</strong> A propositional sentence is a propositional formula with no free variables. In other words, all variables in the formula are bound by some quantifier. At the moment, since we have not defined quantifiers, all propositional formulas are propositional sentences.</p> <h2 id="tautologies-contradiction-entailment-and-proofs" data-svelte-h="svelte-14cdwuy"><a href="#tautologies-contradiction-entailment-and-proofs">Tautologies, Contradiction, Entailment, and Proofs</a></h2> <p data-svelte-h="svelte-1i0gjd9">Now that we have some basic definitions and syntax out of the way, we want to define some semantics. The idea is that we want to be able to assign truth values to propositional formulas, and then use those truth values to determine whether a formula is a tautology, contradiction, or contingent.</p> <h3 id="what-does-truth-mean" data-svelte-h="svelte-1s4scno"><a href="#what-does-truth-mean">What does truth mean?</a></h3> <p data-svelte-h="svelte-10wv14h"><strong>Definition (Truth Table):</strong> We want to give meetings to our formulas, and one of the easiest ways to do that is via truth tables. A truth table represents a <strong>truth function</strong>, which is a mapping from propositional variables to truth values (True or False).</p> <p>We will denote <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span></span></span></span><!-- HTML_TAG_END --></span>, or <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mi>r</mi><mi>u</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">True</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span><span class="mord mathnormal">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span></span></span></span><!-- HTML_TAG_END --></span>, as the truth value “true”, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">F</span></span></span></span><!-- HTML_TAG_END --></span>, or <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mi>a</mi><mi>l</mi><mi>s</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">False</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">F</span><span class="mord mathnormal">a</span><span class="mord mathnormal">l</span><span class="mord mathnormal">se</span></span></span></span><!-- HTML_TAG_END --></span>, as the truth value “false”. Propositional variables can take on either truth value.</p> <p>Then, truth functions map <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi>F</mi><mo separator="true">,</mo><mi>T</mi></mrow><mrow><mi mathvariant="normal">∣</mi><mi>S</mi><mi mathvariant="normal">∣</mi></mrow></msup><mo>→</mo><mrow><mi>F</mi><mo separator="true">,</mo><mi>T</mi></mrow></mrow><annotation encoding="application/x-tex">{F,T}^{|S|} \to {F,T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathnormal">F</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">T</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∣</span><span class="mord mathnormal mtight">S</span><span class="mord mtight">∣</span></span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">F</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">T</span></span></span></span></span><!-- HTML_TAG_END --></span>, where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">S</span></span></span></span><!-- HTML_TAG_END --></span> is some set of propositional variables. For example, the truth function for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><mo>∧</mo><mi>Q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(P \wedge Q)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is defined as follows:</p> <div class="overflow-x-auto mb-4"><table class="table w-full"><thead data-svelte-h="svelte-1nfxebm"><tr><th>P</th> <th>Q</th> <th>(P ∧ Q)</th></tr></thead> <tbody data-svelte-h="svelte-42ba50"><tr><td>T</td> <td>T</td> <td>T</td></tr> <tr><td>T</td> <td>F</td> <td>F</td></tr> <tr><td>F</td> <td>T</td> <td>F</td></tr> <tr><td>F</td> <td>F</td> <td>F</td></tr></tbody></table></div> <p>If you are unfamiliar with the basic definitions of our connectives, here is a quick refresher: the conjunction <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><mo>∧</mo><mi>Q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(P \wedge Q)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is true if both <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span></span></span></span><!-- HTML_TAG_END --></span> are true, and false otherwise. The disjunction <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><mo>∨</mo><mi>Q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(P \vee Q)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is true if at least one of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> or <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span></span></span></span><!-- HTML_TAG_END --></span> is true, and false otherwise. The negation <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>P</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\neg P)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal">P</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is true if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> is false, and false if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> is true. The implication <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><mo>→</mo><mi>Q</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(P \rightarrow Q)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is false only when <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> is true and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">Q</span></span></span></span><!-- HTML_TAG_END --></span> is false; otherwise, it is true. These can be summarized in truth tables as well.</p> <p>Note that we have ex falso quodlibet here: from a contradiction, anything follows. That is to say, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>→</mo><mi>x</mi></mrow><annotation encoding="application/x-tex">F \rightarrow x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">F</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span> is always true, regardless of the truth value of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">x</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-16vvxtw">Definition (Truth Assignment):</strong> A truth assignment is a function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span> which assigns each propositional variable a truth value. That is, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo>:</mo><mi>V</mi><mi>a</mi><mi>r</mi><mo>→</mo><mo stretchy="false">{</mo><mi>T</mi><mo separator="true">,</mo><mi>F</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\mathcal{A}: Var \to \{T,F\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">T</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">F</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span>. This gives a <em data-svelte-h="svelte-q1cy4f">meaning</em> to propositional formulas.</p> <p>Then, we can define the evaluation of a propositional formula under a truth assignment! Assume that we have, defined by truth tables, the functions <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mo lspace="0em" rspace="0em">∧</mo></msub><mo separator="true">,</mo><msub><mi>f</mi><mo lspace="0em" rspace="0em">∨</mo></msub><mo separator="true">,</mo><msub><mi>f</mi><mi mathvariant="normal">¬</mi></msub><mo separator="true">,</mo><msub><mi>f</mi><mo lspace="0em" rspace="0em">→</mo></msub></mrow><annotation encoding="application/x-tex">f_{\wedge}, f_{\vee}, f_{\neg}, f_{\rightarrow}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∧</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∨</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">¬</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mrel mtight">→</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> which give the truth values of the respective connectives given their inputs.</p> <p><strong data-svelte-h="svelte-uq3g53">Definition (Valuation Function):</strong> Then, we can define the valuation function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><annotation encoding="application/x-tex">\mathtt{val}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathtt">val</span></span></span></span></span><!-- HTML_TAG_END --></span> as</p> <ul><li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="script">A</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathtt{val}_{\mathcal{A}}(P) = \mathcal{A}(P)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> for any propositional variable <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span>, eg <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo>∈</mo><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">P \in Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span>.</li> <li>Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ϕ</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">\phi_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ϕ</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">\phi_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> be propositional sentences (a reminder that in our current system a propositional sentence is equivalent to a propositional formula). Then, <ul><li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><msub><mi>f</mi><mi mathvariant="normal">¬</mi></msub><mo stretchy="false">(</mo><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathtt{val}_{\mathcal{A}}((\neg \phi_1)) = f_{\neg}(\mathtt{val}_{\mathcal{A}}(\phi_1))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">((</span><span class="mord">¬</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">¬</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span></li> <li><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo>∧</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><msub><mi>f</mi><mo lspace="0em" rspace="0em">∧</mo></msub><mo stretchy="false">(</mo><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathtt{val}_{\mathcal{A}}((\phi_1 \wedge \phi_2)) = f_{\wedge}(\mathtt{val}_{\mathcal{A}}(\phi_1), \mathtt{val}_{\mathcal{A}}(\phi_2))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">((</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∧</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">))</span></span></span></span><!-- HTML_TAG_END --></span></li> <li data-svelte-h="svelte-sufrmz">… and so on for the other connectives.</li></ul></li></ul> <p>We write <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi mathvariant="script">A</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\phi[\mathcal{A}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathcal">A</span><span class="mclose">]</span></span></span></span><!-- HTML_TAG_END --></span> as shorthand for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathtt{val}_{\mathcal{A}}(\phi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-ci8kpo">Definition (Models):</strong> We say that a truth assignment <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span> is a model of a propositional formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">\mathtt{val}_{\mathcal{A}}(\phi) = T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span></span></span></span><!-- HTML_TAG_END --></span>. Then, we write that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo>⊨</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\mathcal{A} \models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, the formula evaluates to true under the truth assignment. Similarly <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo>⊭</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}\not\models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span></span><span class="base"><span class="strut"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>F</mi></mrow><annotation encoding="application/x-tex">\mathtt{val}_{\mathcal{A}}(\phi) = F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">F</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-6wdugs">Definition (Tautology):</strong> A formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> is a tautology if for ALL assignments <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo>⊨</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\mathcal{A} \models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, the formula is always true regardless of the truth values of its propositional variables. We denote this as <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊨</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>An example of a tautology is <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>P</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(P \vee \neg P)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mspace"></span><span class="mbin">∨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">¬</span><span class="mord mathnormal">P</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, which is true regardless of whether <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span> is true or false. (you can choose any valuation for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span></span></span></span><!-- HTML_TAG_END --></span>, and it will always be true)</p> <p>This tautology is called the law of excluded middle. Another tautology is MP, or Modus Ponens, which states that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>A</mi><mo>∧</mo><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">((A\wedge (A \rightarrow B)) \rightarrow B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∧</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">))</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is a tautology. That is to say, if we know <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span></span></span></span><!-- HTML_TAG_END --></span>, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>→</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A\to B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>, then we can conclude <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">B</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-109sabs">It’s somewhat controversial if the law of excluded middle should be a tautology, since in some logics (eg intuitionistic logic), it is not. However, in classical propositional logic, it is. And MP is definitely a tautology in all standard propositional logics.</p> <p><strong data-svelte-h="svelte-1uewaay">Definition (Logical Entailment):</strong> A formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> <strong data-svelte-h="svelte-169495s">logically entails</strong> a formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> if for all <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span>, such that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi mathvariant="script">A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">\phi[\mathcal{A}]=T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathcal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi><mo stretchy="false">[</mo><mi mathvariant="script">A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">\psi[\mathcal{A}]=T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mopen">[</span><span class="mord mathcal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, whenever <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> is true, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> is also true. We denote this as <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>⊨</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\phi \models \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>More generally, for a set of formulas <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Γ</mi></mrow><annotation encoding="application/x-tex">\Gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">Γ</span></span></span></span><!-- HTML_TAG_END --></span>, we say that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Γ</mi></mrow><annotation encoding="application/x-tex">\Gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">Γ</span></span></span></span><!-- HTML_TAG_END --></span> logically entails <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> if for all <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span>, such that for all <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>∈</mo><mi mathvariant="normal">Γ</mi></mrow><annotation encoding="application/x-tex">\phi \in \Gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">Γ</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo stretchy="false">[</mo><mi mathvariant="script">A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">\phi[\mathcal{A}]=T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mopen">[</span><span class="mord mathcal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span></span></span></span><!-- HTML_TAG_END --></span>, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi><mo stretchy="false">[</mo><mi mathvariant="script">A</mi><mo stretchy="false">]</mo><mo>=</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">\psi[\mathcal{A}]=T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mopen">[</span><span class="mord mathcal">A</span><span class="mclose">]</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">T</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, whenever all formulas in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Γ</mi></mrow><annotation encoding="application/x-tex">\Gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">Γ</span></span></span></span><!-- HTML_TAG_END --></span> are true, then <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> is also true. We denote this as <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Γ</mi><mo>⊨</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\Gamma \models \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">Γ</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-vdvpfv">Definition (Logical Equivalence):</strong> We say that a formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> is logically equivalent to a formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>↔</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\phi\leftrightarrow \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">↔</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> is a tautology. In terms of logical entailment, this is equivalent to saying that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>⊨</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\phi \models \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi><mo>⊨</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\psi \models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>. We denote this as <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>≡</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\phi \equiv \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">≡</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>It’s a fun exercise to prove that if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> are formulas, then the following are equivalent: <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> logically implies <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span>, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>ϕ</mi><mo>→</mo><mi>ψ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\phi \rightarrow \psi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is a tautology. In symbols, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>⊨</mo><mi>ψ</mi></mrow><annotation encoding="application/x-tex">\phi \models \psi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span></span></span></span><!-- HTML_TAG_END --></span> if and only if <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊨</mo><mo stretchy="false">(</mo><mi>ϕ</mi><mo>→</mo><mi>ψ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\models (\phi \rightarrow \psi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ψ</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p><strong data-svelte-h="svelte-8ev6r2">Definition (Unsatisfiable):</strong> A formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> is unsatisfiable if there is NO truth assignment <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span> such that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo>⊨</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\mathcal{A} \models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>. In other words, the formula is always false regardless of the truth values of its propositional variables. We can also say that a set of formulas <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Γ</mi></mrow><annotation encoding="application/x-tex">\Gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">Γ</span></span></span></span><!-- HTML_TAG_END --></span> is unsatisfiable if there is NO truth assignment <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span></span></span></span><!-- HTML_TAG_END --></span> such that for all <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mo>∈</mo><mi mathvariant="normal">Γ</mi></mrow><annotation encoding="application/x-tex">\phi \in \Gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span><span class="mspace"></span><span class="mrel">∈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">Γ</span></span></span></span><!-- HTML_TAG_END --></span>, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo>⊨</mo><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\mathcal{A} \models \phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">⊨</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <h3 id="truth-functions" data-svelte-h="svelte-qd1ycu"><a href="#truth-functions">Truth Functions</a></h3> <p>Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="double-struck">A</mi></mrow><annotation encoding="application/x-tex">\mathbb{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathbb">A</span></span></span></span><!-- HTML_TAG_END --></span> be the set of all truth assignments. Then, we should intuitively be able to define a function from truth assignments to truth values for any propositional formula. This is called a truth function.</p> <p><strong data-svelte-h="svelte-1slt76l">Definition (Truth Function):</strong> A function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo>:</mo><mi mathvariant="double-struck">A</mi><mo>→</mo><mo stretchy="false">{</mo><mi>T</mi><mo separator="true">,</mo><mi>F</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">f: \mathbb{A}\to \{T,F\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">T</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">F</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> is a truth function if there exists a finite set of variables <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>A</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>A</mi><mi>n</mi></msub><mo stretchy="false">}</mo><mo>⊆</mo><mi>V</mi><mi>a</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">\{A_1,\dots, A_n\}\subseteq Var</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">}</span><span class="mspace"></span><span class="mrel">⊆</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">Va</span><span class="mord mathnormal">r</span></span></span></span><!-- HTML_TAG_END --></span> such that for all assignments <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">A</mi><mo separator="true">,</mo><mi mathvariant="script">B</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}, \mathcal{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathcal">B</span></span></span></span><!-- HTML_TAG_END --></span> we have that if</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="script">A</mi><mo stretchy="false">(</mo><msub><mi>A</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="script">B</mi><mo stretchy="false">(</mo><msub><mi>A</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">∀</mi><mi>i</mi><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">\mathcal{A}(A_i) = \mathcal{B}(A_i) \forall i=1,\dots,n </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathcal">B</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mord">∀</span><span class="mord mathnormal">i</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">n</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>Then, we have that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi mathvariant="script">A</mi><mo stretchy="false">)</mo><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi mathvariant="script">B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(\mathcal{A}) = f(\mathcal{B})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathcal">A</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathcal">B</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. In this case, we can call <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>A</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>A</mi><mi>n</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{A_1,\dots, A_n\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> the set of variables that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> depends on, or the <em data-svelte-h="svelte-8zwfvv">support</em> of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>Then, given some formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> we can define the function for <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> in the most obvious way:</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>f</mi><mi>ϕ</mi></msub><mo>:</mo><mi mathvariant="double-struck">A</mi><mo>→</mo><mo stretchy="false">{</mo><mi>T</mi><mo separator="true">,</mo><mi>F</mi><mo stretchy="false">}</mo><mo>=</mo><mi mathvariant="script">A</mi><mo>↦</mo><msub><mrow><mi mathvariant="monospace">v</mi><mi mathvariant="monospace">a</mi><mi mathvariant="monospace">l</mi></mrow><mi mathvariant="script">A</mi></msub><mo stretchy="false">(</mo><mi>ϕ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_{\phi}: \mathbb{A} \to \{T,F\} = \mathcal{A} \mapsto \mathtt{val}_{\mathcal{A}}(\phi) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">T</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">F</span><span class="mclose">}</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">↦</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord"><span class="mord mathtt">val</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathcal mtight">A</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mclose">)</span></span></span></span></span><!-- HTML_TAG_END --></div> <p data-svelte-h="svelte-ial0er">Note that every propositional variable implies a truth function, where</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>f</mi><mi>P</mi></msub><mo>:</mo><mi mathvariant="double-struck">A</mi><mo>→</mo><mo stretchy="false">{</mo><mi>T</mi><mo separator="true">,</mo><mi>F</mi><mo stretchy="false">}</mo><mo>=</mo><mi mathvariant="script">A</mi><mo>↦</mo><mi mathvariant="script">A</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_{P}: \mathbb{A} \to \{T,F\} = \mathcal{A} \mapsto \mathcal{A}(P) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">P</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathbb">A</span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">T</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">F</span><span class="mclose">}</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mspace"></span><span class="mrel">↦</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathcal">A</span><span class="mopen">(</span><span class="mord mathnormal">P</span><span class="mclose">)</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>The support of this function is just <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mi>P</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{P\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">P</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-1f2w4iq">Additionally, all truth functions can be described by a finite truth table. This is because the support of a truth function is finite, and thus there are only finitely many combinations of truth values for the variables in the support. Thus, we can enumerate all possible combinations of truth values for the variables in the support, and then define the output of the function for each combination. This is of course impractical for large supports, but it is theoretically possible, and might remind you that we are working with finite, countable objects here.</p> <p><strong data-svelte-h="svelte-2fvq9o">Definition (Adequacy of Truth Functions):</strong> Let <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">F</mi></mrow><annotation encoding="application/x-tex">\mathcal{F}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">F</span></span></span></span><!-- HTML_TAG_END --></span> be a set of truth functions. We will say that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">F</mi></mrow><annotation encoding="application/x-tex">\mathcal{F}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">F</span></span></span></span><!-- HTML_TAG_END --></span> is adequate if for every truth function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>, there exists a formula <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> such that the truth function induced by <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> is equal to <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span>, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">ϕ</span></span></span></span><!-- HTML_TAG_END --></span> only uses truth functions from <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">F</mi></mrow><annotation encoding="application/x-tex">\mathcal{F}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">F</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>That is, every truth function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo>:</mo><mo stretchy="false">{</mo><mi>T</mi><mo separator="true">,</mo><mi>F</mi><msup><mo stretchy="false">}</mo><mi>n</mi></msup><mo>→</mo><mo stretchy="false">{</mo><mi>T</mi><mo separator="true">,</mo><mi>F</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">g:\{T,F\}^n \to \{T,F\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">g</span><span class="mspace"></span><span class="mrel">:</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">T</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">F</span><span class="mclose"><span class="mclose">}</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mrel">→</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord mathnormal">T</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">F</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> can be expressed as a propositional formula using only the truth functions in <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">F</mi></mrow><annotation encoding="application/x-tex">\mathcal{F}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathcal">F</span></span></span></span><!-- HTML_TAG_END --></span> under composition.</p> <p><strong data-svelte-h="svelte-1csjnia">Theorem:</strong> I don’t really do theorems in this because I didn’t want to bloat the post with proofs, but it’s worth stating that the set of truth functions <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mo>∧</mo><mo separator="true">,</mo><mo>∨</mo><mo separator="true">,</mo><mi mathvariant="normal">¬</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{\wedge, \vee, \neg\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mord">∧</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">∨</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">¬</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> is adequate. It might be a fun exercise to show that the remaining functions <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mrel">→</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>↔</mo></mrow><annotation encoding="application/x-tex">\leftrightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mrel">↔</span></span></span></span><!-- HTML_TAG_END --></span> can be expressed in terms of these three functions.</p> <p>From this, you can also deduce that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mo>→</mo><mo separator="true">,</mo><mi mathvariant="normal">¬</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{\rightarrow, \neg\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mopen">{</span><span class="mrel">→</span></span><span class="base"><span class="strut"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord">¬</span><span class="mclose">}</span></span></span></span><!-- HTML_TAG_END --></span> is adequate, since you can express <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∧</mo></mrow><annotation encoding="application/x-tex">\wedge</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">∧</span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∨</mo></mrow><annotation encoding="application/x-tex">\vee</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">∨</span></span></span></span><!-- HTML_TAG_END --></span> in terms of these two functions.</p> <h1 id="end" data-svelte-h="svelte-fq8h61"><a href="#end">End</a></h1> <p data-svelte-h="svelte-o8t4xs">Next: Propositional logic proof systems.</p>]]>
    </content>
    <category term="Logic" scheme="https://hijiri.dev/?tags=Logic" />
    <category term="Mathematics" scheme="https://hijiri.dev/?tags=Mathematics" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[An Introduction to Neural Networks and LLMs]]></title>
    <link href="https://hijiri.dev/site-index/dev/ml-neural-intro" />
    <id>https://hijiri.dev/site-index/dev/ml-neural-intro</id>
    <published>2025-02-27T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-10hpdyx">There’s a lot. like, a LOT. of math, and history, that we can go into with regards to neural networks. For the sake of trying to make the article more approachable (if you’re using my articles as a reference paper for your classes you REALLY shouldn’t) I’m going to gloss over anything that’s not essentially high school maths. Let it be known that I will not be directly referencing many of the founding papers of neural networks.</p> <p data-svelte-h="svelte-13c7rnd">If you’re interested about the specifics of neural models with regards to LLMs, try reading this <a href="https://papers.nips.cc/paper_files/paper/2000/file/728f206c2a01bf572b5940d7d9a8fa4c-Paper.pdf" rel="nofollow noopener noreferrer external" target="_blank">paper by Bengio et al</a>. And for those who want to approach the math of backprop in more detail, read this <a href="http://karpathy.github.io/neuralnets/" rel="nofollow noopener noreferrer external" target="_blank">blog post by Karpathy</a>!</p> <h1 id="learning-basics" data-svelte-h="svelte-r2v9d3"><a href="#learning-basics">Learning Basics</a></h1> <p data-svelte-h="svelte-1p40su7">Neural networks can easily be seen as a black box that takes in some input, and spits out some output. Okay, great. For the sake of introduction, suppose that it is, in fact, a black box. Let’s create a basic 1 node network that will learn to give us <code>y=x</code>.</p> <p data-svelte-h="svelte-ycyrfi">The node starts off by operating on one input (a number), and gives one output (also a number). The node has a weight, which is a number that it multiplies the input by. The node also has a bias, which is a number that it adds to the output. These are both randomly initialized.</p> <p data-svelte-h="svelte-1ndny25">Using python, our node looks like this:</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'>class Node:</div><div class='line'>    def __init__(self):</div><div class='line'>        self.weight = random.random()</div><div class='line'>        self.bias = random.random()</div><div class='line'></div><div class='line'>    def forward(self, x):</div><div class='line'>        return x * self.weight + self.bias</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-wpe4w5">Note that we are using the <code>forward</code> method to compute the output of the node. This is because we will later add more methods to the node, and we want to keep the code organized.</p> <h2 id="adjusting-for-loss" data-svelte-h="svelte-15y4drd"><a href="#adjusting-for-loss">Adjusting for Loss</a></h2> <p data-svelte-h="svelte-1c14jee">Now, we want it to give us <code>y=x</code>, the “target”. We will do this by using a loss function, which will figure out how far away the output is from the “target” and then update the weights and biases accordingly.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'>class Node:</div><div class='line'>    def __init__(self):</div><div class='line'>        self.weight = random.random()</div><div class='line'>        self.bias = random.random()</div><div class='line'></div><div class='line'>    def forward(self, x):</div><div class='line'>        return x * self.weight + self.bias</div><div class='line'></div><div class='line'>    def loss(self, x, y):</div><div class='line'>        output = self.forward(x)</div><div class='line'>        # Note that we square this here to make sure that the loss is always positive</div><div class='line'>        # This is called the Mean Squared Error (MSE) loss</div><div class='line'>        return (output - y) ** 2</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1tw8049">Now that we have this loss, how do we update the weights and biases? We will use a method called <strong>gradient descent</strong>. This is a method that will update the weights and biases in the direction that will minimize the loss. This goes into the math of derivatives, but the essence is that we figure out how much the loss will change if we change the weight or bias by a small amount, and then update the weight or bias in the direction that will minimize the loss.</p> <p data-svelte-h="svelte-1io44od">We calculate the gradient as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>w</mi></mrow></mfrac><mo>=</mo><mfrac><mn>2</mn><mi>N</mi></mfrac><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub><mo stretchy="false">)</mo><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\frac{\partial L}{\partial w} = \frac{2}{N}\sum_{i=1}^N (y_i - \hat{y}_i)x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">w</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord mathnormal">N</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span class="pstrut"><span class="mop op-symbol large-op">∑</span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal">y</span></span><span class="pstrut"><span class="accent-body"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p>where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">L</span></span></span></span><!-- HTML_TAG_END --></span> is the loss, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span></span></span></span><!-- HTML_TAG_END --></span> is the weight, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">N</span></span></span></span><!-- HTML_TAG_END --></span> is the number of samples, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>y</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">y_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> is the target, <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\hat{y}_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal">y</span></span><span class="pstrut"><span class="accent-body"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> is the output, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> is the input.</p> <p data-svelte-h="svelte-jy7o1a">This is the gradient of, specifically, the MSE loss function. MSE is commonly used for regression problems (like this one), where we want to have a common loss function that is easy to compute and differentiable.</p> <p data-svelte-h="svelte-85z30c">Much more generally, gradient can be calculated as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>w</mi></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mrow></mfrac><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>w</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{\partial L}{\partial w} = \frac{1}{N}\sum_{i=1}^N \frac{\partial L}{\partial \hat{y}_i}\frac{\partial \hat{y}_i}{\partial w}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">w</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord mathnormal">N</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span class="pstrut"><span class="mop op-symbol large-op">∑</span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mspace"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal">y</span></span><span class="pstrut"><span class="accent-body"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">w</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal">y</span></span><span class="pstrut"><span class="accent-body"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p>where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\hat{y}_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal">y</span></span><span class="pstrut"><span class="accent-body"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> is the output of the model, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span></span></span></span><!-- HTML_TAG_END --></span> is the weight. This is called the <strong data-svelte-h="svelte-suz9q9">chain rule</strong>, and it allows us to compute the gradient of any loss function with respect to any weight.</p> <p data-svelte-h="svelte-mj4qyo">Then, we update the weights and biases as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>w</mi><mo>=</mo><mi>w</mi><mo>−</mo><mi>α</mi><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>w</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">w = w - \alpha \frac{\partial L}{\partial w}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span><span class="mspace"></span><span class="mbin">−</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">α</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">w</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">∂</span><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p>Where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">α</span></span></span></span><!-- HTML_TAG_END --></span> is the learning rate, which is a <strong data-svelte-h="svelte-u36149">hyperparameter</strong> that controls how much we update the weights and biases. Hyperparameters are parameters that are not <em data-svelte-h="svelte-1ptjofb">learned</em> (like weights and biases are, for us) but are set before training.</p> <p data-svelte-h="svelte-1w6g7jd">Generalizing this again, we could imagine that a node with many weights and many biases can be computed as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>y</mi><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>n</mi></msub><msub><mi>x</mi><mi>n</mi></msub><mo>+</mo><msub><mi>b</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y=f(w_1x_1+b_1,w_2x_2+b_2,\dots,w_nx_n+b_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">y</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> is some function (we’re going to go over this later, but if you’re familiar with activation functions, this is that), and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">w_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>b</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">b_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> are the weights and biases. For now note we aren’t using any activation function, so <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> is just the identity function.</p> <h2 id="training" data-svelte-h="svelte-14pmq3q"><a href="#training">Training</a></h2> <p data-svelte-h="svelte-19vgw0j">Now we have all the pieces, we can “train” our node by giving it a bunch of inputs and the corresponding targets (we call this the “dataset”), and then updating the weights and biases using gradient descent.</p> <p data-svelte-h="svelte-1rojlw1">Essentially, since we already know <code>y=x</code>, we can just give it a bunch of input/output pairs, and if we define the gradient descent correctly it will learn to give us <code>y=x</code>.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'>class Node:</div><div class='line'>    def __init__(self):</div><div class='line'>        self.weight = random.random()</div><div class='line'>        self.bias = random.random()</div><div class='line'></div><div class='line'>    def forward(self, x):</div><div class='line'>        return x * self.weight + self.bias</div><div class='line'></div><div class='line'>    def loss(self, x, y):</div><div class='line'>        output = self.forward(x)</div><div class='line'>        return (output - y) ** 2</div><div class='line'></div><div class='line'>    def gradient(self, x, y):</div><div class='line'>        output = self.forward(x)</div><div class='line'>        dL_dy = 2 * (output - y)</div><div class='line'>        dy_dw = x</div><div class='line'>        return dL_dy * dy_dw</div><div class='line'></div><div class='line'>    def update(self, x, y, alpha):</div><div class='line'>        grad = self.gradient(x, y)</div><div class='line'>        self.weight -= alpha * grad</div><div class='line'></div><div class='line'>    def train(self, dataset, alpha):</div><div class='line'>        for x, y in dataset:</div><div class='line'>            self.update(x, y, alpha)</div><div class='line'>node = Node()</div><div class='line'>dataset = [(i, i) for i in range(100)]</div><div class='line'>node.train(dataset, 0.01)</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-ncn6h7">Note that we never actually defined the function <code>y=x</code> anywhere in here! We just gave it a bunch of random numbers and it was able to “correct” itself to learn the function.</p> <p data-svelte-h="svelte-5vanv5">Imagine you’re blind, and you have a ball in your hand. You want to throw the ball to your friend, but you can’t see them. First, you throw the ball. It likely won’t hit your friend, but you have an “oracle” that tells you how far off you were. You then adjust your throw based on the feedback, and throw again. You keep doing this until you hit your friend. This is essentially what we did here.</p> <h1 id="neural-networks" data-svelte-h="svelte-16o2p2w"><a href="#neural-networks">Neural Networks</a></h1> <p data-svelte-h="svelte-ym2pix">Well, neural networks are just a bunch of nodes. Imagine that instead of one we had, let’s say, 10 nodes, 100 nodes, or (as many LLMs do nowadays), tens of billions of nodes.</p> <h2 id="structure" data-svelte-h="svelte-lb6bx9"><a href="#structure">Structure</a></h2> <p data-svelte-h="svelte-1tzbx6s">How do we connect these nodes? Well, we can connect them in a few ways. The most common way is to have a “layer” of nodes, where each node is connected to every other node in the next layer. This is called a <strong>fully connected layer</strong>.</p> <p data-svelte-h="svelte-1igwac">There are also other types of layers, such as <strong>convolutional layers</strong>, which are used for image processing, and <strong>recurrent layers</strong>, which are used for sequence processing.</p> <p data-svelte-h="svelte-4bmllw">We can also have “skip connections”, where we connect nodes from one layer to nodes in a later layer. This is called a <strong>residual connection</strong>.</p> <p data-svelte-h="svelte-mg6q1z">Other types of model architectures include <strong>transformers</strong>, which are used for sequence processing, and <strong>graph neural networks</strong>, which are used for graph processing.</p> <p data-svelte-h="svelte-1f27yvc">Many of these are not very relevant for LLMs and language modelling, so we won’t go too hard into them in this series. However, I highly suggest going over them if you’re interested in the field of machine learning!</p> <h2 id="activation-functions" data-svelte-h="svelte-2thcgd"><a href="#activation-functions">Activation Functions</a></h2> <p>We were talking about that function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span></span></span></span><!-- HTML_TAG_END --></span> earlier. This is called an <strong data-svelte-h="svelte-17iur1q">activation function</strong>, and it is used to introduce non-linearity into the model.</p> <p data-svelte-h="svelte-n9kw70">Essentially, if you didn’t have any activation functions, then the nodes (or <strong>neurons</strong>), could just “collapse”. To illustrate, suppose we had 2 nodes as simple as the one earlier, in series. Then,</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>y</mi><mn>1</mn></msub><mo>=</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">y_1 = w_1x_1 + b_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p data-svelte-h="svelte-1qlona5">and</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>y</mi><mn>2</mn></msub><mo>=</mo><msub><mi>w</mi><mn>2</mn></msub><msub><mi>y</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">y_2 = w_2y_1 + b_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p data-svelte-h="svelte-1bk60c8">Then, you could expand this to</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>y</mi><mn>2</mn></msub><mo>=</mo><msub><mi>w</mi><mn>2</mn></msub><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub><mo>=</mo><msub><mi>w</mi><mn>2</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>w</mi><mn>2</mn></msub><msub><mi>b</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">y_2 = w_2(w_1x_1 + b_1) + b_2 = w_2w_1x_1 + w_2b_1 + b_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p>Note that this is just a linear function <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mi>x</mi><mo>+</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">ax+b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">a</span><span class="mord mathnormal">x</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span></span></span></span><!-- HTML_TAG_END --></span> where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><msub><mi>w</mi><mn>2</mn></msub><msub><mi>w</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">a=w_2w_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">a</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><msub><mi>w</mi><mn>2</mn></msub><msub><mi>b</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">b=w_2b_1+b_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">b</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p>This means that if you had a network of 1000 nodes, you could just collapse it into one node with a weight of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>…</mo><msub><mi>w</mi><mn>1000</mn></msub></mrow><annotation encoding="application/x-tex">w_1w_2\dots w_{1000}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1000</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> and a bias of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>b</mi><mn>1</mn></msub><mo>+</mo><msub><mi>b</mi><mn>2</mn></msub><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mi>b</mi><mn>1000</mn></msub></mrow><annotation encoding="application/x-tex">b_1+b_2+\dots+b_{1000}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="minner">⋯</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1000</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-1t6q3zg">Thus, we want “nonlinearities” in between in order to allow for complex behavior.</p> <p data-svelte-h="svelte-4g024d">There are many activation functions, but the most common ones are:</p> <ul><li><strong data-svelte-h="svelte-31xziq">ReLU</strong>: <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>max</mi><mo>⁡</mo><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x) = \max(0, x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">max</span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span></li> <li><strong data-svelte-h="svelte-17g5vru">Sigmoid</strong>: <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mi>x</mi></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">f(x) = \frac{1}{1+e^{-x}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span></span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><!-- HTML_TAG_END --></span></li> <li><strong data-svelte-h="svelte-vqpet1">Tanh</strong>: <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><msup><mi>e</mi><mi>x</mi></msup><mo>−</mo><msup><mi>e</mi><mrow><mo>−</mo><mi>x</mi></mrow></msup></mrow><mrow><msup><mi>e</mi><mi>x</mi></msup><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mi>x</mi></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span></span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><!-- HTML_TAG_END --></span></li> <li><strong data-svelte-h="svelte-1l1r1ds">Softmax</strong>: <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mfrac><msup><mi>e</mi><msub><mi>x</mi><mi>i</mi></msub></msup><mrow><msubsup><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><msup><mi>e</mi><msub><mi>x</mi><mi>j</mi></msub></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">f(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop mtight"><span class="mop op-symbol small-op mtight">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace mtight"></span><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal mtight">j</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord mathnormal mtight">i</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><!-- HTML_TAG_END --></span></li></ul> <p data-svelte-h="svelte-15hyfa1"><a href="https://en.wikipedia.org/wiki/Activation_function" rel="nofollow noopener noreferrer external" target="_blank">There’s a whole wikipedia article</a> with a table of other ones if you’re interested!</p> <p data-svelte-h="svelte-e2hfpa">The most common one is the ReLU, which is used in most modern neural networks. The sigmoid and tanh are used in older neural networks, and the softmax is used in the output layer of classification models.</p> <p data-svelte-h="svelte-116vqb3">There’s a lot of reasons why you might use one over the other (and softmax in particular is only really used in the output layer of non-regression models), but it actually turns out that with enough compute and data you can pretty much use any activation function and get similar results.</p> <h1 id="fin" data-svelte-h="svelte-n3dy59"><a href="#fin">Fin</a></h1> <p data-svelte-h="svelte-szhfcb">Well, that’s it for this one, just a quickie. This basic setup of nodes allows you to “learn” and regress to very basic functions, like polynomial math equations.</p> <p data-svelte-h="svelte-jifgd8">In the next one we’ll go over a bit of intermediary knowledge and then jump to RNNs, which is where LLMs really started to become powerful.</p>]]>
    </content>
    <category term="Machine Learning" scheme="https://hijiri.dev/?tags=Machine%20Learning" />
    <category term="Neural Networks" scheme="https://hijiri.dev/?tags=Neural%20Networks" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[N-Gram Model Evaluation & Training in Machine Learning and LMs]]></title>
    <link href="https://hijiri.dev/site-index/dev/ml-ngram-evaluation" />
    <id>https://hijiri.dev/site-index/dev/ml-ngram-evaluation</id>
    <published>2025-02-05T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-xky0qi">So we have our N-Gram model (see <a href="../ml-ngram-prediction/">N-Gram Model Prediction in Machine Learning and LMs</a>). Now, how do we evaluate it? And why do we need to evaluate it?</p> <p data-svelte-h="svelte-1lmt3go">Well, to make any progress in the field we would like to be able to compare new models. Thus, we need some kind of metric to compare models. We now set out to find methods to evaluate models, and then discuss training and testing data.</p> <p data-svelte-h="svelte-1p0qh7b">First, some definitions;</p> <ul data-svelte-h="svelte-1dguqi5"><li>A <strong>training set</strong> is the set of data we use to learn the parameters of our model. This becomes much more relevant in the future when we start discussing neural models, but it’s essentially the data that we use to “train” our model.</li> <li>A <strong>test set</strong> is a completely different set of data from the training set. It will be kept completely witheld from the model until it comes time for testing, and we will use it to evaluate the model’s performance. We want this set to be diverse, and sometimes even separate entirely by context from the training set, since in the context of NLP the ability to generalize is a huge part of the model’s performance. It importantly must be separate because we want to see how well the model generalizes to new data, not how well it memorizes the training data.</li> <li>The <strong>dev set</strong>, sometimes called the <strong>validation set</strong>, is a set that we use in neural models to tune parameters. This may not be entirely relevant now, but will be later; this is what we use to do testing during training. Sometimes, you want feedback before the model is done; this is what we use the devset for. It’s important that the devset is correlated to the test set in context but do not overlap.</li></ul> <h1 id="evaluation" data-svelte-h="svelte-1347hk"><a href="#evaluation">Evaluation</a></h1> <p data-svelte-h="svelte-17ms7xp">The most obvious idea to evaluate the performance of an LM is <strong>extrinsic evaluation</strong>. This idea essentially is to take the model, put it in a real-world scenario, and see how well it performs. For instance, we could use the model to generate text, and then have humans rate the text. Alternatively, for something like a translation model or speech recognition, we might want to run two comparable models and then choose the better outcome.</p> <p data-svelte-h="svelte-q5spa4">However, running huge NLP models with this level of complexity is both expensive and time consuming; not to mention that the best judge of this sort of thing would be a human, which we don’t like involving in training processes. Thus, we would like to have some kind of <strong>intrinsic evaluation</strong>, or something that can quickly evaluate the quality of a model without any application</p> <h2 id="perplexity" data-svelte-h="svelte-1s2jv8q"><a href="#perplexity">Perplexity</a></h2> <p data-svelte-h="svelte-6hlesv">The perplexity of a test set is the inverse probability of the test set, normalized by the number of words. That is, we’re looking for the probability that the model will predict the test set. Hopefully that’s intuitive; the best way to evaluate a model internally is to see how well it will predict some data that it has never seen before that mirrors real life.</p> <p data-svelte-h="svelte-1jhzvdy">We can’t use the test set for mid-training evaluation, for which we use the dev set.</p> <p>You can normalize by the number of words <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">N</span></span></span></span><!-- HTML_TAG_END --></span> by taking the <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">N</span></span></span></span><!-- HTML_TAG_END --></span>th root of the perplexity value. For some test set of words <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mo>=</mo><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>N</mi></msub></mrow><annotation encoding="application/x-tex">W=w_1, w_2, \ldots, w_N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">W</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>, the perplexity is defined as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>Perplexity</mtext><mo stretchy="false">(</mo><mi>W</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mrow><mo fence="true">(</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mfrac><mn>1</mn><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow></mfrac><mo fence="true">)</mo></mrow><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mi>N</mi></mrow></msup></mrow><annotation encoding="application/x-tex">\text{Perplexity}(W) = \left( \prod_{i=1}^N \frac{1}{P(w_i | w_1, w_2, \ldots, w_{i-1})} \right)^{1/N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord text"><span class="mord">Perplexity</span></span><span class="mopen">(</span><span class="mord mathnormal">W</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="minner"><span class="minner"><span class="mopen delimcenter"><span class="delimsizing size4">(</span></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span class="pstrut"><span class="mop op-symbol large-op">∏</span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mspace"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter"><span class="delimsizing size4">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1/</span><span class="mord mathnormal mtight">N</span></span></span></span></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p>I encourage you to take some time to convince yourself of where this came from. To briefly demonstrate why, the idea is to take <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>N</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w_1, w_2, \ldots, w_N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> and then take the <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">N</span></span></span></span><!-- HTML_TAG_END --></span>th root of it. After expanding with the chain rule we have the above.</p> <p data-svelte-h="svelte-eg22oh">Note because of the inversion, the higher the probability of the word sequence, the lower the perplexity will be. Consequently, we will train for a <strong>lower perplexity</strong> value.</p> <p data-svelte-h="svelte-1lmrhwq">In other words, the lower the perplexity value, the higher the probability that our trained model will predict the completions in our dev/test sets.</p> <h2 id="weighted-average-branching-factor" data-svelte-h="svelte-hur42f"><a href="#weighted-average-branching-factor">Weighted Average Branching Factor</a></h2> <p data-svelte-h="svelte-15rc0qq">Another way to think about perplexity is to imagine it as the so called “weighted average branching factor”. A <strong>branching factor</strong> is simply the number of branches, or possibilities, that follow any word.</p> <p>For instance, consider a situation that only considers a vocabulary of 3. Then, the branching factor is 3. Call these words <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">w_1, w_2, w_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>. Then, assume that we have a LM N-Gram model that predicts the next word with all 3 being equally likely with a chance of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>3</mn></mrow><annotation encoding="application/x-tex">1/3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord">1/3</span></span></span></span><!-- HTML_TAG_END --></span>. Then, suppose we have a test set with exactly 1 entry, of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">w_1 w_1 w_1 w_1 w_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>.</p> <p data-svelte-h="svelte-1rjhmcj">First, the perplexity of this model is demonstrably 3. That is,</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mtext>perplexity</mtext><mn>1</mn></msub><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>=</mo><msup><mrow><mo fence="true">(</mo><msup><mrow><mo fence="true">(</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>3</mn></mrow></mfrac><mo fence="true">)</mo></mrow><mn>5</mn></msup><mo fence="true">)</mo></mrow><mrow><mo>−</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>5</mn></mrow></msup><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">\text{perplexity}_1(w_1 w_1 w_1 w_1 w_2) = \left(\left( \frac{1}{1/3} \right)^{5}\right)^{-1/5} = 3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord text"><span class="mord">perplexity</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="minner"><span class="minner"><span class="mopen delimcenter"><span class="delimsizing size4">(</span></span><span class="minner"><span class="minner"><span class="mopen delimcenter"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord">1/3</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter"><span class="delimsizing size3">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span></span></span></span></span><span class="mclose delimcenter"><span class="delimsizing size4">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1/5</span></span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">3</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>Now consider an N-gram model, called 2, that works in the same context with the same vocabulary but was trained to predict <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>.8</mn><mo separator="true">,</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>.1</mn><mo separator="true">,</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>3</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>.1</mn></mrow><annotation encoding="application/x-tex">P(w_1)=.8, P(w_2)=.1, P(w_3)=.1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">.8</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">.1</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">.1</span></span></span></span><!-- HTML_TAG_END --></span>. Then, the perplexity of this model is demonstrably lower.</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mtext>perplexity</mtext><mn>2</mn></msub><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>.8</mn><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>.8</mn><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>.8</mn><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>.8</mn><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>.1</mn><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mrow><mo stretchy="false">(</mo><mo>−</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>5</mn><mo stretchy="false">)</mo></mrow></msup><mo>≈</mo><mn>0.528</mn></mrow><annotation encoding="application/x-tex">\text{perplexity}_2(w_1 w_1 w_1 w_1 w_2) = ((1/.8)\cdot (1/.8)\cdot (1/.8)\cdot (1/.8)\cdot (1/.1))^{(-1/5)}\approx 0.528</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord text"><span class="mord">perplexity</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">((</span><span class="mord">1/.8</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">1/.8</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">1/.8</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">1/.8</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mopen">(</span><span class="mord">1/.1</span><span class="mclose">)</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">−</span><span class="mord mtight">1/5</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace"></span><span class="mrel">≈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord">0.528</span></span></span></span></span><!-- HTML_TAG_END --></div> <h1 id="a-brief-summary-on-improvements-of-performance" data-svelte-h="svelte-1n91k7h"><a href="#a-brief-summary-on-improvements-of-performance">(A brief summary on) Improvements of Performance</a></h1> <p data-svelte-h="svelte-1i3pwsh">N-Gram models are still very problematic. Here I give a brief overview of some methods used to improve performance. These have all been advanced very far in the field by amazing researchers, and this stuff goes back decades. I don’t intend to cover things in depth here, but here’s a general idea of a lot of the things and I encourage you to read the literature if you’re interested in N-Grams or NLP in general.</p> <h2 id="sampling" data-svelte-h="svelte-1ybokkl"><a href="#sampling">Sampling</a></h2> <p data-svelte-h="svelte-yfyqwc">When you predict the next word in a N-Gram model, the obvious method is simply to choose the most probable result. However, we can use sampling instead to choose less likely answers.</p> <p data-svelte-h="svelte-14shy22">Intuitively, when you speak, you don’t always use the most common word. As an example, if it were raining outside, you might not always say “It is raining”. You might say “It is lightly raining”, or “It is pouring”. These sentences would never be completed by a model that always chooses the most probable word, because “lighly raining” and “pouring” are (at least in the year im writing this, haha) much less likely to appear in a training set than simply “raining”.</p> <p data-svelte-h="svelte-mmws2a">Consequently, we want there to be some chance of choosing a less likely word. This is called <strong>sampling</strong>.</p> <p>One intuitive idea is to choose each word with a probability proportional to its likelihood. That is, if we have a word <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span></span></span></span><!-- HTML_TAG_END --></span> with probability <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>w</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord mathnormal">w</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, then we can choose <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span></span></span></span><!-- HTML_TAG_END --></span> with probability <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>w</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord mathnormal">w</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>. This is called <strong data-svelte-h="svelte-1d8wcif">unnormalized sampling</strong>, and can help your model to be more diverse.</p> <p data-svelte-h="svelte-mkky46">There’s a lot of sampling methods! And a lot of papers on them! I encourage the reader to check them out with a search on N-Gram sampling methods.</p> <h2 id="training-sets" data-svelte-h="svelte-1z011o1"><a href="#training-sets">Training Sets</a></h2> <p data-svelte-h="svelte-1opob1g">Just like neural models, which we will go over later, the N-Gram model is also very dependent on the training set and can easily overfit. That is, it can “memorize” or get used to things too easily.</p> <p data-svelte-h="svelte-vn8ush">Suppose that I gave the N-Gram model exclusively sentences that appear in Jane Austen’s works. I regret to inform the reader that I’m not really a fan of Austen’s older English, and that seeing “thou” and “thee” in every sentence would be quite annoying, and certainly not representative of a modern English speaker. Consequently, our N-Gram model can be said to be “overfitted” to the training set.</p> <p data-svelte-h="svelte-xhcp7a">We thus require a diverse training set, that doesn’t just include one specific context (for instance we can’t just have school conversations because they won’t have any information on how to talk about the weather or trashtalk people in Call of Duty). Yet similarly, we want to restrict our training data to the appropriate variety that we want to include. Maybe you actually don’t want to include Call of Duty trashtalk in your model, and that’s fine too.</p> <h2 id="smoothing" data-svelte-h="svelte-12oz4m6"><a href="#smoothing">Smoothing</a></h2> <p data-svelte-h="svelte-gts2se">A problem with using the MLE estimate for probability is that some completely fine English sentences will have a probability of 0. This is because we can’t possibly have seen every single sentence in the English language, and so some sentences will have a probability of 0.</p> <p data-svelte-h="svelte-1h5b1tk">An example? “Green Eggs”. You would never expect to see those two words together in a lot of datasets, and you’d rarely hear about it irl, but despite that it’s, well, definitely valid and is part of Dr Seuss!</p> <p data-svelte-h="svelte-toc530">Consequently, we want to do some <strong>smoothing</strong> or <strong>discounting</strong> as well. Essentially, we want to use some algorithm that will give us a non-zero probability for every word.</p> <h3 id="laplace-smoothing" data-svelte-h="svelte-1dfi5ui"><a href="#laplace-smoothing">Laplace Smoothing</a></h3> <p data-svelte-h="svelte-c2ydej">Laplace smoothing is to add a fixed number (typically 1) to all counts. All counts that were 0 (impossible by the training set’s count and thus by the N-Gram model) will now have a value of 1, which makes it marginally possible! Other counts will also be increased, which keeps their weights high and not devalued but less proportional.</p> <p data-svelte-h="svelte-17tg7s5">This method sucks in general because it’s simplistic, but it gives a nice baseline and is practical enough for basic features like text classification, which doesn’t really need to produce smooth output and focuses more on precision (and having every vocab word possible is important).</p> <p data-svelte-h="svelte-1v4w139">This has unique effects upon the model. For instance, it will change each individual probability and thus the conditional probabilities, which can change the perplexity of the model to some observable degree even though words that are ungodly rare will still be ungodly rare. This is just a reality of introducing a smoothing method; should you have 100k words in your vocab and even if your training set was so large that many of them have counts in the thousands, you are still adding 100k different counts to the dataset. Maybe not significant when comparing one to the other, but still significant in the grand scheme of things.</p> <h3 id="add-k-smoothing" data-svelte-h="svelte-1o96xmn"><a href="#add-k-smoothing">Add-k Smoothing</a></h3> <p>This is just laplace smoothing but instead of 1 you add <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">k</span></span></span></span><!-- HTML_TAG_END --></span>.</p> <h3 id="interpolation" data-svelte-h="svelte-6ietqy"><a href="#interpolation">Interpolation</a></h3> <p data-svelte-h="svelte-rdt1jq">Interpolation is the idea of coputing a new probability by interpolating different models. If we had a 3-gram model and there were no instances of something in the 3-gram, we could reduce it to a 2-gram model and attempt to predict the word that way based on the 2-gram model.</p> <p>You can further reduce this to a 1-gram model, and so on and so forth. That is, for a trigram probability <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w_n|w_{n-2}w_{n-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, we can compute</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi>λ</mi><mn>1</mn></msub><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo>+</mo><msub><mi>λ</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>+</mo><msub><mi>λ</mi><mn>3</mn></msub><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>w</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w_n|w_{n-2}w_{n-1})=\lambda_1P(w_n)+\lambda_2P(w_n|w_{n-1})+\lambda_3P(w_n|w_{n-1}w_{n-2})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">λ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">λ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">λ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>The <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>λ</mi></mrow><annotation encoding="application/x-tex">\lambda</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">λ</span></span></span></span><!-- HTML_TAG_END --></span> values are “hyperparameters” that you can tune; however, its important that they sum to 1, so that this remains a weighted average.</p> <p>There’s a lot of work on interpolation and how to make it better; if you’re truly interested I suggest checking out the <strong data-svelte-h="svelte-8553eq">EM</strong> algorithm, an iterative learning algorithm that converges on the best local <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>λ</mi></mrow><annotation encoding="application/x-tex">\lambda</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">λ</span></span></span></span><!-- HTML_TAG_END --></span> values.</p> <h3 id="backoff" data-svelte-h="svelte-1alq4t4"><a href="#backoff">Backoff</a></h3> <p data-svelte-h="svelte-16sf3u5">In a backoff model, if the n-gram model has no data for a given n-gram, it will back off to the (n-1)-gram model. This is a simple way to interpolate between models, and is a good way to avoid the problem of having a 0 probability for a word. However to keep our probability distribution, we have to scale the probabilities of the higher level N-Grams down in order to save some probability space for the lower level ones.</p> <p data-svelte-h="svelte-qcl794">In practice, it’s easier to use something called <strong>stupid backoff</strong>, which is the equivalent of putting your hands over your eyes and pretending that the probability distribution rules don’t exist. If you need to back off, you back off. Screw the rules!</p> <h1 id="conclusion" data-svelte-h="svelte-dq8n5"><a href="#conclusion">Conclusion</a></h1> <p data-svelte-h="svelte-d2bzho">Thanks for reading! I hope you learned a lot about N-Gram models and how to evaluate them. This will be the last in a 2-part series about N-Grams; I don’t intend to go into them greatly since this series is also kind of my regurgitation of readings following CMSC848O. Many thanks to Prof. Mohit Iyyer for guiding my learning.</p> <p data-svelte-h="svelte-oy73l5">Next articles will focus on ML, in particular neural models since they have advanced to become by far and away the standard in the context of language modeling.</p> <p data-svelte-h="svelte-ku41oi">Now I need to stop procrastinating on my cybersecurity and DSA articles.</p>]]>
    </content>
    <category term="Machine Learning" scheme="https://hijiri.dev/?tags=Machine%20Learning" />
    <category term="N-Gram" scheme="https://hijiri.dev/?tags=N-Gram" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[N-Gram Model Prediction in Machine Learning and LMs]]></title>
    <link href="https://hijiri.dev/site-index/dev/ml-ngram-prediction" />
    <id>https://hijiri.dev/site-index/dev/ml-ngram-prediction</id>
    <published>2025-02-01T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-bp7hml">This will be the first in a brief series on how language models work.</p> <p data-svelte-h="svelte-1auqohg">Suppose you have an example sentence, for instance</p> <blockquote data-svelte-h="svelte-1z44ly"><p>“The student opened their ____“.</p></blockquote> <p data-svelte-h="svelte-1vblscs">You as a person, what would you put? Well, you might say “book”, or “laptop”, or “notebook”. You, the reader, might have much more ideas than this also. But how do you know these ideas? Where do we get the “next word” from, and how do we complete sentences?</p> <p data-svelte-h="svelte-17fwnh1">This problem is the entire basis of language models, many of which recently exploding in popularity (eg. ChatGPT, Claude, Perplexity)</p> <p data-svelte-h="svelte-9wr8mz">Although we very rarely think about it, there must exist some kind of unique way that we as humans understand language that gives us an inference on what would happen next.</p> <p data-svelte-h="svelte-p5y86c">Consider this: If this sentence was asked to someone in the 1940s, they would not be able to answer “laptop”. In the modern day, most who read this sentence would answer “laptop”, as they become increasingly ubiquitous and physical textbooks phase out of classroom usage in the vast majority of classrooms.</p> <p data-svelte-h="svelte-1y8c6mi">Thus, our internal “language model”, so to speak, is based on the data we have seen. One intuitive idea, then, is that we as humans quite simply would predict the next word using the most common word that we could think of that fits in that location.</p> <h1 id="whats-an-n-gram-anyway" data-svelte-h="svelte-1hgxoop"><a href="#whats-an-n-gram-anyway">What’s an N-Gram anyway?</a></h1> <p data-svelte-h="svelte-yzf9dn">Back to our example, we have “The student opened their ____“.</p> <p data-svelte-h="svelte-19zhmpe">Then, suppose we had every single english sentence ever written! That is, we somehow managed to accumulate the entire corpus of the English language, and found an infinitely powerful and fast machine that could process it. Then, an intuitive idea is that we could simply count the number of times any word appears after “The student opened their ____“.</p> <p data-svelte-h="svelte-123g8jh">For instance, suppose that we had the following sentences:</p> <blockquote data-svelte-h="svelte-16ssuh4"><ol><li><strong>The student opened their</strong> book</li> <li>Then, <strong>the student opened their</strong> laptop</li> <li>However, the teacher was displeased to see <strong>the student opened their</strong> laptop</li> <li><strong>The student opened their</strong> notebook</li> <li>However, he then turned to see that <strong>the student opened their</strong> notebook</li> <li><strong>The student opened their</strong> laptop</li></ol></blockquote> <p data-svelte-h="svelte-6jrw9h">We can then “Ctrl+F” through our data using some program and find that the word “laptop” appears 3 times, “notebook” appears 2 times, and “book” appears 1 time. Then, since “laptop” is the most common word, we would predict that the next word is “laptop”.</p> <p data-svelte-h="svelte-109c9sz">However, this has obvious drawbacks! For one, we would need to have every single sentence ever written in order to predict the next word. Even then, this method fails all the time. Many “brand new sentences” are written every single day, and English is inherently a creative language.</p> <p data-svelte-h="svelte-dlashv">For instance, if I prompt a program with an entire paragraph, it will very frequently NOT find that entire paragraph even if we HAD the entire English language laid out before us and we could somehow store all however many petabytes of data that would be, nevermind process it all in a reasonable amount of time.</p> <p data-svelte-h="svelte-2b8gjf">So we must settle for the “N-Gram”.</p> <p data-svelte-h="svelte-j81a3y">The N-Gram idea is simply to ignore everything but the last N words. For instance, in the above example, we could only consider the 2 last words as a prompt, or “context” for the next word (Note: a prompt differentiates from a context in the sense that a prompt is given by the user while context constantly changes; suppose we need to generate multiple words, then for each new word we add that to the context along with the original prompt). Thus, rather than considering</p> <blockquote data-svelte-h="svelte-77s0cx"><p>“The student opened their ____”</p></blockquote> <p data-svelte-h="svelte-c16k9c">We would consider</p> <blockquote data-svelte-h="svelte-16l33wl"><p>“opened their ____”</p></blockquote> <p>This would require us to store far less data, since we could just precompute every single 2-gram in the English language (given a vocabulary of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">V</span></span></span></span><!-- HTML_TAG_END --></span> words, this would require <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>V</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(V^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> space, which is still very unreasonable but much better than the infinite amount of data we would need to store otherwise). Note that we compute 2-grams for a 3-gram model, since we need to compute the probability of the last word in a chain of 3 words, given the previous 2 words.</p> <p data-svelte-h="svelte-m4iqqg">It would also allow us to give responses to much more unique prompts, since we would not have to have seen the entire prompt before to give a response, only the last 2 words.</p> <p data-svelte-h="svelte-1al8k6j">An example of something like this that you’ve almost certainly seen a lot is your phone autocomplete! You may have noticed that your phone will often try to guess the next word you are going to type, and does a pretty good job on a small scale. If you keep spamming the autocomplete result, however, the phone might give you a super long run on sentence, that makes no sense.</p> <p data-svelte-h="svelte-15rmaw3">This is because it’s just an N-gram model! (ok this is complicated; a lot of newer phones have started implementing full on tiny LLMs, but this is a story for another article). Thus, it does pretty good only with the context of one or two words, but as soon as you start typing a longer sentence, or something that exceeds the size N of the N-gram, it will start to fail.</p> <h1 id="prediction" data-svelte-h="svelte-1pyf60r"><a href="#prediction">Prediction</a></h1> <h2 id="general-idea" data-svelte-h="svelte-ix82rb"><a href="#general-idea">General Idea</a></h2> <p data-svelte-h="svelte-1g0v6kj">Okay, so we have an idea of how to predict the next word. But how do we actually do it? That is, how do we predict the “most likely” next word?</p> <p data-svelte-h="svelte-1hv0dnb">Once again, a naive method would be to simply count the number of times each word appears after the prompt, and then predict the most common word.</p> <p>Mathematically, what we’re really asking is what <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>w</mi><mi mathvariant="normal">∣</mi><mi>h</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w|h)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord mathnormal">w</span><span class="mord">∣</span><span class="mord mathnormal">h</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is, where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">w</span></span></span></span><!-- HTML_TAG_END --></span> is the word we want to predict, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi></mrow><annotation encoding="application/x-tex">h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">h</span></span></span></span><!-- HTML_TAG_END --></span> is the history of words we have seen so far. For instance, we might want to compute</p> <p><span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mtext>computer</mtext><mi mathvariant="normal">∣</mi><mtext>The student opened their</mtext><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(\text{computer}|\text{The student opened their})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord text"><span class="mord">computer</span></span><span class="mord">∣</span><span class="mord text"><span class="mord">The student opened their</span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span></p> <p data-svelte-h="svelte-157u664">We can decompose this sequence using the chain rule of probability as</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo>…</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mn>3</mn></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><msub><mi>x</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>…</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msubsup><mi mathvariant="normal">Π</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{align*}P(x_1\dots x_n)&amp;=P(x_1)P(x_2|x_1)P(x_3|x_1x_2)\dots P(x_n|x_1\dots x_{n-1})\\&amp;=\Pi_{i=1}^n P(x_i|x_1\dots x_{i-1})\end{align*}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span><span class="pstrut"><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord"></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span><span class="pstrut"><span class="mord"><span class="mord"></span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span><span class="mord"><span class="mord">Π</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <h2 id="the-markov-assumption" data-svelte-h="svelte-1pmppkw"><a href="#the-markov-assumption">The Markov Assumption</a></h2> <p data-svelte-h="svelte-1h9vtjp">The Markov Assumption is that context is only dependent on the last few words to some degree. For instance, the assumption that a 2-gram model is sufficient to predict the next word, as opposed to an infinity-gram model.</p> <p data-svelte-h="svelte-1pe339u">It should be intuitively clear that this results in a loss of information, and thus accuracy. However, for the sake of computation, we have to let this go for now. Thus, assume for a 2-gram model for instance, that</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>≈</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x_n|x_1\dots x_{n-1})\approx P(x_n|x_{n-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">≈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span></span><!-- HTML_TAG_END --></div> <p>and in general for some <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">N</span></span></span></span><!-- HTML_TAG_END --></span>-gram model</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mn>1</mn></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>≈</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>i</mi><mo>−</mo><mi>N</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x_i|x_1\dots x_{i-1})\approx P(x_i|x_{i-N+1}\dots x_{i-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">≈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">N</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span></span><!-- HTML_TAG_END --></div> <h2 id="computing-pwh"><a href="#computing-pwh">Computing <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>w</mi><mi mathvariant="normal">∣</mi><mi>h</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w|h)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord mathnormal">w</span><span class="mord">∣</span><span class="mord mathnormal">h</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span></a></h2> <p data-svelte-h="svelte-stlwob">The question remains of how we will get these base probability values; we will do so via the Maximum Likelihood Estimation (MLE) method. We get an MLE estimate by counting from the dataset, and then normalizing the counts to get a probability distribution (so that they are in between 0 and 1)</p> <p>We will find <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x_n|x_{n-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>, for instance, by computing</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><mrow><munder><mo>∑</mo><mi>x</mi></munder><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mi>x</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">P(x_n|x_{n-1})=\frac{C(x_{n-1}x_n)}{\sum_{x}C(x_{n-1}x)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mop"><span class="mop op-symbol small-op">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p>where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">C(x_{n-1}x_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is the number of times the bigram <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>x</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">x_{n-1}x_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> appears in the dataset, and <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">C(x_{n-1}x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span> is the number of times the unigram <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> appears in the dataset.</p> <p>Since the sum of all bigram counts that start with <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> is the same as the unigram count of <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span>, this can be simplified to</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">P(x_n|x_{n-1})=\frac{C(x_{n-1}x_n)}{C(x_{n-1})}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p data-svelte-h="svelte-1rcl6s0">To elaborate; the sum of all bigram counts is the same as the unigram count because we’re counting the number of times any word appears after another word, and then summing this; but this is the same as just counting the number of times the first word appears.</p> <p data-svelte-h="svelte-rpybvr">For the general case of an n-gram model, we can then compute</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mi>N</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mi>N</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>…</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><mrow><mi>C</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mi>N</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>…</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">P(x_n|x_{n-N+1}\dots x_{n-1})=\frac{C(x_{n-N+1}\dots x_n)}{C(x_{n-N+1}\dots x_{n-1})}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord mathnormal">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">N</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="mord"><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">N</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span><span class="pstrut"><span class="frac-line"></span></span><span class="pstrut"><span class="mord"><span class="mord mathnormal">C</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">N</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="minner">…</span><span class="mspace"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><!-- HTML_TAG_END --></div> <p data-svelte-h="svelte-azj7ld">Note that this estimates n-gram probability by dividing a sequence frequency by its prefix frequency; we call this <strong>relative frequency</strong>.</p> <h2 id="scale" data-svelte-h="svelte-5k3ql6"><a href="#scale">Scale</a></h2> <p data-svelte-h="svelte-j0b96l">In practice, language models are huge. Thus, we may be multiplying together numbers between 0 and 1 many, many times. If you took 5th grade maths you may recall that multiply two numbers between 0 and 1 results in an even smaller number; this will eventually result in data underflow, which would be catastrophic. To prevent this we frequently use <strong>log probability</strong> as the method of storage.</p> <p>Recall from your high school maths that <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>a</mi><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\log(ab)=\log(a)+\log(b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord mathnormal">ab</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span><!-- HTML_TAG_END --></span>; thus, we can convert our multiplication into addition, which is much more stable. In general, where <span class="math math-inline"><!-- HTML_TAG_START --><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">p_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span></span></span></span><!-- HTML_TAG_END --></span> is some probability,</p> <div class="math math-display"><!-- HTML_TAG_START --><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mn>1</mn></msub><mo>⋅</mo><msub><mi>p</mi><mn>2</mn></msub><mo>⋅</mo><msub><mi>p</mi><mn>3</mn></msub><mo>⋅</mo><msub><mi>p</mi><mn>4</mn></msub><mo>⋅</mo><msub><mi>p</mi><mn>5</mn></msub><mo>≈</mo><mi>exp</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>p</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>p</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>p</mi><mn>3</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>p</mi><mn>4</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>p</mi><mn>5</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_1\cdot p_2\cdot p_3\cdot p_4\cdot p_5\approx \exp(\log(p_1)+\log(p_2)+\log(p_3)+\log(p_4)+\log(p_5))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mbin">⋅</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mspace"></span><span class="mrel">≈</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">exp</span><span class="mopen">(</span><span class="mop">log</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">)</span><span class="mspace"></span><span class="mbin">+</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mop">log</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span class="pstrut"><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"></span></span></span></span></span><span class="mclose">))</span></span></span></span></span><!-- HTML_TAG_END --></div> <h1 id="next" data-svelte-h="svelte-jvd6sr"><a href="#next">Next</a></h1> <p data-svelte-h="svelte-ikfq1c">We’ll discuss a broad overview of training and evaluation, along with entropy next, to continue the N-Gram series. We will eventually advance to neural models and modern attention, transformer, and scaling ideas.</p> <p data-svelte-h="svelte-yxdsqw">I hope to continue this series alongside working on the ADS series and covering other mid level ML concepts.</p>]]>
    </content>
    <category term="Machine Learning" scheme="https://hijiri.dev/?tags=Machine%20Learning" />
    <category term="N-Gram" scheme="https://hijiri.dev/?tags=N-Gram" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[Fda 510K Database Searching]]></title>
    <link href="https://hijiri.dev/site-index/dev/fdasearch" />
    <id>https://hijiri.dev/site-index/dev/fdasearch</id>
    <published>2024-05-10T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="fda-510k-database-searching" data-svelte-h="svelte-17z2xar"><a href="#fda-510k-database-searching">FDA 510K Database Searching</a></h1> <p data-svelte-h="svelte-11zvork">The US FDA, or Food and Drug Administration, has this huge responsibility which is approving medical devices for use in the United States. The 510K database is a collection of all the devices that have been approved for use in the US. Maintained online, it’s extremely primitive and is, honestly, horrible to work with as a developer. There is no API, and the only real way to do anything is web scraping (which I hate to do on a government website, so ideally we will want to keep this to a minimum).</p> <h2 id="what-is-a-510k" data-svelte-h="svelte-llxs9r"><a href="#what-is-a-510k">What is a 510K?</a></h2> <p data-svelte-h="svelte-4rchhc">A 510k is the submission form made to the FDA to get a medical device approved for use in the US. It’s a long, detailed form that includes a lot of information about the device, its intended use, and the testing that was done to prove that it’s safe and effective. More importantly, this information can include the intended use, restrictions, etc.</p> <p data-svelte-h="svelte-7d5pg7">Now say that we want to search for all devices under a certain category with a keyword in the 510k. How do we do that? uhh… turns out there isn’t really a native solution, and because this is such a niche problem, there isn’t really a third party solution either.</p> <p data-svelte-h="svelte-ucsbin">It turns out that the FDA has this database, but has literally nothing to search it with. About 4 months ago, I wrote a short (very inefficient) script to do it myself. It’s written in python and is found <a href="https://github.com/NyxIsBad/fdasearch" rel="nofollow noopener noreferrer external" target="_blank">here</a>.</p> <p data-svelte-h="svelte-11t4spa">This isn’t a medical device/regulations site, so lets go into the code, which is the actually interesting part.</p> <h1 id="the-script" data-svelte-h="svelte-fabwe0"><a href="#the-script">The Script</a></h1> <p data-svelte-h="svelte-6x6yr7">The idea is essentially to scrape the site using regular URL patterns. I used BS4 for this, but because of how incredibly simple the scrape is you can probably get away with writing your own protocol or using a different library.</p> <h2 id="imports" data-svelte-h="svelte-y49mxs"><a href="#imports">Imports:</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'># data related libs</div><div class='line'>import pandas as pd</div><div class='line'>import csv </div><div class='line'>import pickle</div><div class='line'># ocr</div><div class='line'>from tempfile import TemporaryDirectory</div><div class='line'>import pytesseract</div><div class='line'>import pdf2image</div><div class='line'>from PIL import Image</div><div class='line'>import requests</div><div class='line'>import cv2</div><div class='line'># web scraping w/ bs4</div><div class='line'>import httplib2</div><div class='line'>from bs4 import BeautifulSoup, SoupStrainer</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1jsyvbg">I’m using pandas because we’re actually going to be working with a considerable amount of data here. The CSV library is used because I’m going to be loading the initial code files from a CSV that the FDA helpfully provides <a href="https://www.fda.gov/medical-devices/510k-clearances/downloadable-510k-files" rel="nofollow noopener noreferrer external" target="_blank">here</a>. The pickle library is used to save the data in a way that can be loaded quickly. The script takes a while to run because we’re going to OCR a lot of PDFs, so we want to be able to stop and restart the code without having to re-do everything.</p> <h2 id="global-variables" data-svelte-h="svelte-1r4m2fq"><a href="#global-variables">Global Variables</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default" py="true"><div class="language-id">py</div><div class='code-container'><code><div class='line'># -------------------------</div><div class='line'># GLOBALS</div><div class='line'># -------------------------</div><div class='line'># 1: read from csvs, generate lists, save them</div><div class='line'># 2: read from lists, scan pdfs, create txts</div><div class='line'># 3: scan through txts for keywords</div><div class='line'>start_idx = 0</div><div class='line'>mode = 2</div><div class='line'># file prefix</div><div class='line'>DATADIR = "data/"</div><div class='line'># data names (eg. the names of the csvs)</div><div class='line'>DATA = ['96cur','7680','8185','8690','9195']</div><div class='line'># pdf prefix</div><div class='line'>PDFDIR = "pdf/"</div><div class='line'># csv delimiter</div><div class='line'>DELIM = '|'</div><div class='line'># valid product codes</div><div class='line'>VALID_CODE = ['GEI','PAY','ONQ','OHV','GEX','OHS','NUV','ONG','ONE','ONF']</div><div class='line'># keywords - all lowercase</div><div class='line'>COND_KEYWORD = ['wrinkle']</div><div class='line'>KEYWORD = ['fitzpatrick','scale','type']</div><div class='line'># DB Link (510k)</div><div class='line'>DBPREFIX = 'https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/pmn.cfm?ID='</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1co9s6e">I end up writing this script to have 3 modes.</p> <ul data-svelte-h="svelte-anl1lc"><li>The first one is a first pass, which just creates a list of the possible 510k files of interest. It will sort out the ones that don’t have a public summary file (eg there’s almost no details publicly available, so isn’t very useful).</li> <li>The second one goes through the lists of the 510k files and scans them for keywords. It will OCR the PDFs and save the text files in the data directory.</li> <li>The third one goes through the text files and scans them for the keywords. I ended up not implementing this because it’s actually slightly redundant given the second step.</li></ul> <p data-svelte-h="svelte-tfzftk">In my above example code I also have some basic file/directory names, the delimiter for the CSV that the FDA publishes (which is |). Then I speciy my search conditions. Here we will look for any one of the keywords if and only if the statement has the conditional keyword, and we will search all files under those product codes.</p> <h2 id="helper-functions" data-svelte-h="svelte-1xng5yx"><a href="#helper-functions">Helper Functions</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default" py="true"><div class="language-id">py</div><div class='code-container'><code><div class='line'># -------------------------</div><div class='line'># DATA/FILE SAVING/LOADING</div><div class='line'># -------------------------</div><div class='line'># Load codes from csv    </div><div class='line'>def load_csv(input):</div><div class='line'>    data = pd.read_csv(input, sep=DELIM, header=0, keep_default_na=False)</div><div class='line'>    return data # returns df</div><div class='line'># load a list from a text file</div><div class='line'>def load_txt(input):</div><div class='line'>    lst = list()</div><div class='line'>    with open(input,'r') as f:</div><div class='line'>        for line in f:</div><div class='line'>            lst.append(line.rstrip())</div><div class='line'>    return lst</div><div class='line'># Load a list from file</div><div class='line'>def load_obj(file):</div><div class='line'>    with open(file,"rb") as f:</div><div class='line'>        obj = pickle.load(f)</div><div class='line'>    return obj</div><div class='line'># output a list as a text</div><div class='line'>def write_txt(out, lst):</div><div class='line'>    with open(out, "w") as f:</div><div class='line'>        for item in lst:</div><div class='line'>            f.write(f"&#123;item&#125;&#92;n")</div><div class='line'># write an object to file </div><div class='line'>def write_obj(out, obj):</div><div class='line'>    with open(out, "wb") as f:</div><div class='line'>        pickle.dump(obj,f)</div><div class='line'># read csv files</div><div class='line'>def read_single(file):</div><div class='line'>    return load_csv(file)</div><div class='line'># read multiple csv</div><div class='line'>def read_multiple(arr):</div><div class='line'>    return pd.concat(map(lambda date: load_csv(f'&#123;DATADIR&#125;&#123;date&#125;.csv'), arr))</div><div class='line'># -------------------------</div><div class='line'># FILTERING</div><div class='line'># -------------------------</div><div class='line'># return the rows in a df that match a value in the arr</div><div class='line'>def filter_by_col_arr(pd_arr, column, value_arr):</div><div class='line'>    return pd_arr.loc[pd_arr[column].isin(value_arr)]</div><div class='line'># return the rows in a df that match the value</div><div class='line'>def filter_by_col(pd_arr, column, value):</div><div class='line'>    return pd_arr.loc[pd_arr[column] == value]</div><div class='line'># returns the column as a list</div><div class='line'>def get_col_as_list(pd_arr, column):</div><div class='line'>    return list(pd_arr[column])</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1m1b4jl">An assortment of helper functions that I wrote for a few different formats so I can call them quickly in the code later</p> <h2 id="scraping" data-svelte-h="svelte-1m1tv07"><a href="#scraping">Scraping</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default" py="true"><div class="language-id">py</div><div class='code-container'><code><div class='line'># gets the link for a summary or statement from the FDA db by scraping</div><div class='line'>def getlink(type, prefix, code):</div><div class='line'>    http = httplib2.Http()</div><div class='line'>    status, resp = http.request(f'&#123;prefix&#125;&#123;code&#125;')</div><div class='line'>    for link in BeautifulSoup(resp, features='html.parser', parse_only=SoupStrainer('a')):</div><div class='line'>        if link.has_attr('href') and link.string==type:</div><div class='line'>            return link['href']</div><div class='line'>    return ""</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-mhoi6v">This is an incredibly simple bs4 function that I wrote to get the summary argument from the FDA database. It simply takes a link and looks for the first link that has the text “type” in it. We pass in Summary later, so it looks for the link with the text “Summary” in it.</p> <p data-svelte-h="svelte-1ivezyd">The URL scheme of the 510k DB is the most important, and is a little bit tricky to figure out because it’s not very well documented. The URL for the codes we are interested in are in the form of <code>https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/pmn.cfm?ID={code}</code>. The code is the product code, and the FDA has a list of valid product codes that they use.</p> <p data-svelte-h="svelte-e5jxga">However other than CDRH’s 510ks, there are other departments, sometimes there are weird prefixes for the codes, etc. Specifically in the context of this search, these parameters work. If you want to adapt this script for other purposes you definitely need to change this part.</p> <h2 id="main-function" data-svelte-h="svelte-1s08jzt"><a href="#main-function">Main Function</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default" py="true"><div class="language-id">py</div><div class='code-container'><code><div class='line'># -------------------------</div><div class='line'># READ/OCR PDF</div><div class='line'># -------------------------</div><div class='line'># Reading the text. There are multiple cases to this.</div><div class='line'># Case 1: OCR correctly reads text. In this case, we concatenate all text and </div><div class='line'>#       save it as a .txt file in PDFDIR/ocr/&#123;code&#125;.txt. Also return "success" or 1</div><div class='line'># Case 2: We can't read it. Then, we return "fail" or 0. This will get concatenated to the </div><div class='line'>#       "none_knums" variable and outputted as a text file.</div><div class='line'>def pdfscanner(type, prefix, code):</div><div class='line'>    # vars</div><div class='line'>    img_lst = []</div><div class='line'>    # open the file online and then create a pdfreader instance</div><div class='line'>    url = getlink(type, prefix, code)</div><div class='line'>    if url == "": </div><div class='line'>        return 0</div><div class='line'>    # get the actual content.</div><div class='line'>    pdf = requests.get(url, stream=True).content</div><div class='line'>    # We use OCR to recognize the text. </div><div class='line'>    # We can use PdfReader to find the DPI.</div><div class='line'>    # reader = PdfReader(bytes_stream)</div><div class='line'>    print(f"&#123;type&#125; of &#123;code&#125;: URL &#123;url&#125; | DB URL: &#123;prefix&#125;&#123;code&#125;")</div><div class='line'>    </div><div class='line'>    # Implementation of case 1:</div><div class='line'>    with TemporaryDirectory() as tempdir:</div><div class='line'>        # Step 1, turn the pdf into images.</div><div class='line'>        # read the pdf as images</div><div class='line'>        pdf_pages = pdf2image.convert_from_bytes(pdf)</div><div class='line'>        for num, pg in enumerate(pdf_pages, start=1):</div><div class='line'>            fname = f'&#123;tempdir&#125;/&#123;code&#125;_&#123;num:03&#125;.png'</div><div class='line'>            pg.save(fname,"PNG")</div><div class='line'>            img_lst.append(fname)</div><div class='line'>        # Step 2, read the images</div><div class='line'>        # open the txt file output</div><div class='line'>        with open(f'&#123;PDFDIR&#125;/ocr/&#123;code&#125;.txt','w') as f: </div><div class='line'>            for img in img_lst:</div><div class='line'>                # OCR the page</div><div class='line'>                # image preprocessing can be put under here</div><div class='line'>                image = cv2.imread(f'&#123;img&#125;')</div><div class='line'></div><div class='line'>                page_txt = str(pytesseract.image_to_string(image, lang='eng', config='--psm 6')).replace("-&#92;n","")</div><div class='line'>                f.write(f'&#123;page_txt&#125;&#92;n')</div><div class='line'>    return 1</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1n66ai0">This is the bulk of the work done. You can tell that there’s quite a few phases here.</p> <p data-svelte-h="svelte-1w95ey4">First, some error handling, and attempt to &quot;&quot;save&quot;&quot; the PDF. If it fails we leave and try the next one, noting it down in an output file. Otherwise, we move onto the OCR step. I used pdf2image to convert the PDF to images, and then pytesseract to read the images. I save the text to a file in the PDFDIR/ocr directory.</p> <h2 id="driver-code" data-svelte-h="svelte-1rxzxd9"><a href="#driver-code">Driver Code</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default" py="true"><div class="language-id">py</div><div class='code-container'><code><div class='line'># -------------------------</div><div class='line'># DRIVER CODE</div><div class='line'># -------------------------</div><div class='line'></div><div class='line'>if mode==1:</div><div class='line'>    # read the csvs in as df</div><div class='line'>    csv = read_multiple(DATA)</div><div class='line'>    # find results by product code</div><div class='line'>    results = filter_by_col_arr(csv, 'PRODUCTCODE', VALID_CODE)</div><div class='line'>    </div><div class='line'>    # find results with summary</div><div class='line'>    results_summary = filter_by_col(results, 'STATEORSUMM', 'Summary')</div><div class='line'>    results_statement = filter_by_col(results, 'STATEORSUMM', 'Statement')</div><div class='line'>    results_none = filter_by_col(results, 'STATEORSUMM', '')</div><div class='line'>    # get the knumbers</div><div class='line'>    results_knums = get_col_as_list(results_summary, 'KNUMBER')</div><div class='line'>    summary_knums = get_col_as_list(results_summary, 'KNUMBER')</div><div class='line'>    statement_knums = get_col_as_list(results_statement, 'KNUMBER')</div><div class='line'>    none_knums = get_col_as_list(results_none, 'KNUMBER')</div><div class='line'>    # write to files</div><div class='line'>    write_obj(f'&#123;DATADIR&#125;matching_codes_pickle',results)</div><div class='line'>    write_obj(f'&#123;DATADIR&#125;matching_codes_with_summary_pickle', results_summary)</div><div class='line'>    write_obj(f'&#123;DATADIR&#125;matching_codes_with_statement_pickle', results_statement)</div><div class='line'>    write_obj(f'&#123;DATADIR&#125;matching_codes_none_pickle', results_none)</div><div class='line'></div><div class='line'>    write_txt(f'&#123;DATADIR&#125;matching_codes.txt', results_knums)</div><div class='line'>    write_txt(f'&#123;DATADIR&#125;matching_codes_with_summary.txt', summary_knums)</div><div class='line'>    write_txt(f'&#123;DATADIR&#125;matching_codes_with_statement.txt', statement_knums)</div><div class='line'>    write_txt(f'&#123;DATADIR&#125;matching_codes_none.txt', none_knums)</div><div class='line'>    # print some numbers</div><div class='line'>    print(f'Total files: &#123;len(results)&#125;&#92;n'</div><div class='line'>        f'Matching files with a knumber and summary: &#123;len(summary_knums)&#125;&#92;n'</div><div class='line'>        f'Matching files by summary: &#123;len(results_summary)&#125;+&#123;len(results_statement)&#125;+&#123;len(results_none)&#125;')</div><div class='line'>elif mode==2:</div><div class='line'>    summary_knums = load_txt(f'&#123;DATADIR&#125;matching_codes_with_summary.txt')</div><div class='line'>    print(f'Successfully loaded &#123;len(summary_knums)&#125; nums!')</div><div class='line'>    # vars</div><div class='line'>    failed = []</div><div class='line'>    success = []</div><div class='line'>    # create the txt files for each knum with a summary</div><div class='line'>    for num, knum in enumerate(summary_knums[start_idx:]):</div><div class='line'>        if pdfscanner('Summary', DBPREFIX, knum) == 1:</div><div class='line'>            print(f'Successfully converted #&#123;num+start_idx&#125;: &#123;knum&#125; to txt')</div><div class='line'>            success.append(knum)</div><div class='line'>        else:</div><div class='line'>            print(f'Failed to convert #&#123;num+start_idx&#125;: &#123;knum&#125; to txt')</div><div class='line'>            failed.append(knum)</div><div class='line'>    write_txt(f'&#123;DATADIR&#125;converted_to_txt.txt', success)</div><div class='line'>    write_txt(f'&#123;DATADIR&#125;failed_to_txt.txt', failed)</div><div class='line'>elif mode==3: </div><div class='line'>    print("Implement mode 3")</div><div class='line'>else:</div><div class='line'>    print("How did you get here? Wrong mode #.")</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1gbtut0">This stuff is pretty simple and mostly involves a lot of logging and file saving/writing etc. You can see where I call OCR in mode 2, and note that we are looking for the “Summary”. There are other types of documents that the FDA has, but I only cared about the summaries. Note mode 3 not implemented because we already have search by keyword anyway. It wouldn’t be too hard to write though, and I have other FAR scripts on my github that do this.</p> <h2 id="summary" data-svelte-h="svelte-1ktah9w"><a href="#summary">Summary</a></h2> <p data-svelte-h="svelte-17unqcv">This script is a bit of a mess, but it works. It’s not the most efficient thing in the world, but it’s a good example of how to scrape a website that doesn’t have an API. The FDA’s 510k database is a good example of this, and I hope that this script can be useful to someone. I’m not going to be maintaining it, and I certainly will not do something like this again, as I only did this for the sake of finding this very specific query. Anyway, I hope this was helpful to someone.</p>]]>
    </content>
  </entry>
  <entry>
    <title type="html"><![CDATA[Polyomino Problem]]></title>
    <link href="https://hijiri.dev/site-index/dev/polyomino" />
    <id>https://hijiri.dev/site-index/dev/polyomino</id>
    <published>2023-12-11T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.367Z</updated>
    <content type="html">
      <![CDATA[<h1 id="toc" data-svelte-h="svelte-1om6o1e"><a href="#toc">TOC</a></h1> <ul data-svelte-h="svelte-3x6790"><li><a href="#toc">TOC</a></li> <li><a href="#the-problem">The Problem</a></li> <li><a href="#technical-details">Technical Details</a></li> <li><a href="#approach">Approach</a> <ul><li><a href="#initial-thoughts">Initial Thoughts</a></li> <li><a href="#how-to-fit">How to Fit?</a></li> <li><a href="#the-dfs-function">The DFS function</a></li></ul></li> <li><a href="#solution">Solution</a></li> <li><a href="#thoughts">Thoughts</a></li></ul> <h1 id="the-problem" data-svelte-h="svelte-1yli462"><a href="#the-problem">The Problem</a></h1> <p data-svelte-h="svelte-wyf5k1">I present to you today the Polyomino problem from an AtCoder contest I did. This was the prompt provided</p> <p><img alt="Prompt" class="rounded-lg my-2" decoding="async" loading="lazy" src="./prompt.png"></p> <p data-svelte-h="svelte-1gbu6tb">The problem immediately struck me as being relatively complex, and I wanted to walk through the interesting approaches made to solve it. For those interested in the final solution, you may want to consider skipping ahead.</p> <h1 id="technical-details" data-svelte-h="svelte-70piz7"><a href="#technical-details">Technical Details</a></h1> <p data-svelte-h="svelte-108uoqk">This was completed as part of an atcoder competition, so I’ll be working with C++ and typical competitive programming rules here. I specifically wrote this code under some time duress, so apologies if it’s a little bit scuffed.</p> <h1 id="approach" data-svelte-h="svelte-1f3blsa"><a href="#approach">Approach</a></h1> <p data-svelte-h="svelte-15zkoj">As you may have noticed, the problem is immediately very complex. We receive 3 4 by 4 “input images” of our polyominos, and we first need to be able to read those. That was relatively simple, and I decided to go with a vector array of strings to scan these in due to how manipulatable they are.</p> <p data-svelte-h="svelte-127yho0">Then, we must determine whether or not they can be put in a grid together.</p> <h2 id="initial-thoughts" data-svelte-h="svelte-1xaowyy"><a href="#initial-thoughts">Initial Thoughts</a></h2> <p data-svelte-h="svelte-g8m8uo">It’s immediately obvious that there are some conditions where we instantly fail. For instance, if there are not enough <code>#</code>’s inputted to actually fill a square, then we can instafail. Additionally, since the polyominos can be manipulated under translation and rotation, we need a rotation algorithm. Let’s get some basics out of the way first.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" cpp="true"><div class="language-id">cpp</div><div class='code-container'><code><div class='line'>// INPUT</div><div class='line'>vector&lt;array&lt;string, 4&gt;&gt; g(3);</div><div class='line'></div><div class='line'>for (auto &it: g) &#123;</div><div class='line'>    for (auto &i: it) &#123;</div><div class='line'>        cin &gt;&gt; i;</div><div class='line'>        cnt += count(i.begin(), i.end(), '#');</div><div class='line'>    &#125;</div><div class='line'>&#125;</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-kzujvh">The input method is extremely basic. We just define our vector array of strings, and read them in. We also track how many <code>#</code>’s are inputted so we can check if there are 16 of them, as mentioned earlier. I used <code>auto &amp;i : it</code>, the easy range for conditional, to make things easier. You could of course do this with a more traditional iterator.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" cpp="true"><div class="language-id">cpp</div><div class='code-container'><code><div class='line'>auto rotate = [](const array&lt;string, 4&gt; &a) &#123;</div><div class='line'>    auto b = a;</div><div class='line'>    for (long long i = 0; i &lt; 4; i++) &#123;</div><div class='line'>        for (long long j = 0; j &lt; 4; j++) &#123;</div><div class='line'>            b[j][3 - i] = a[i][j];</div><div class='line'>        &#125;</div><div class='line'>    &#125;</div><div class='line'>    return b;</div><div class='line'>&#125;;</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1kzp71l">And this is the rotate function. Notice that I just defined it within main. The algorithm itself is very simple; we create a new array b, which is initially uninitialized, and then transpose characters 1 at a time at a 90 degree rotation into b. Since we know the size of the array, we can just iterate over a for loop. In retrospect using an ll iterator was a waste of memory but it’s just a product of the int-&gt;ll macro I had.</p> <h2 id="how-to-fit" data-svelte-h="svelte-uckx5j"><a href="#how-to-fit">How to Fit?</a></h2> <p data-svelte-h="svelte-wqrxrb">The question of how to fit the polyominos into the actual square was the harder part. My initial naive approach was to try every single possible rotation and location. In actuality, there is no  “logical” way to determine how a puzzle piece fits into a puzzle. In the classical jigsaw puzzle question, and assuming there isn’t information on what color something is, for instance, our solutions typically involve either the naive approach of trying everything or to create an adjacency matrix of what fits against what and then pruning it.</p> <p data-svelte-h="svelte-161wdml">However, in this problem an adjacency matrix doesn’t make much sense. We don’t care so much about how pieces fit together with each other, as whether or not they’re all able to, within a 4x4 array. In this case, each piece has 4 rotations and 16 theoretical locations at most. That is, the worst case scenario checks <code>4^16^3</code> possibilities. This is insane, and we don’t want to try this.</p> <p data-svelte-h="svelte-1asrhcr">Let’s think of a way to reduce this.</p> <p data-svelte-h="svelte-1mf3ao5">We can treat the problem like a search and create a dfs algorithm. This algorithm will look at each possible rotation, and on each one attempt to fit them into the block in a way that satisfies the solution. However, to minimize the amount of checks we make, we want to retain “memory” of what is actually possible.</p> <p data-svelte-h="svelte-qd5hdf">To do this, I defined a 2d array “page” where we put the imaginary blocks. The page will be a reference point of where a “valid” placement of a block has already been found.</p> <p data-svelte-h="svelte-1osee9o">Writing a fit algorithm is actually relatively easy. we can just check all 16 locations and if the page is blank and the input polyomino is there, we can slot it in. Making sure to check for edges and other edge checks, we get this</p> <!-- HTML_TAG_START --><pre class="shiki material-default" cpp="true"><div class="language-id">cpp</div><div class='code-container'><code><div class='line'>auto fit = [&](long long k, long long x, long long y) &#123;</div><div class='line'>    for (long long i = 0, x_iter = x; i &lt; 4; i++, x_iter++)</div><div class='line'>        for (long long j = 0, y_iter = y; j &lt; 4; j++, y_iter++) &#123;</div><div class='line'>            if (g[k][i][j] == '.') &#123;</div><div class='line'>                continue;</div><div class='line'>            &#125;</div><div class='line'>            if (page[x_iter][y_iter] == '#') &#123;</div><div class='line'>                return 0;</div><div class='line'>            &#125;</div><div class='line'>            if (x_iter &lt; 0 or x_iter &gt; 3 or y_iter &lt; 0 or y_iter &gt; 3) &#123;</div><div class='line'>                return 0;</div><div class='line'>            &#125;                </div><div class='line'>            page[x_iter][y_iter] = '#';</div><div class='line'>        &#125;</div><div class='line'>    return 1;</div><div class='line'>&#125;;</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-zd5v59">It’s a pretty simple solution.</p> <h2 id="the-dfs-function" data-svelte-h="svelte-7vti1s"><a href="#the-dfs-function">The DFS function</a></h2> <p data-svelte-h="svelte-g26v60">There are plenty of different possibilities however, so we have to write the dfs function in a way that allows us to look at various possible fits and rotations. I wrote it in a recursive manner, where the base case is either failing after all rotations have been tried or when a spot has been found. I used a tmp variable to temporarily “save” the page, and if it’s valid I would “replace” it.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" cpp="true"><div class="language-id">cpp</div><div class='code-container'><code><div class='line'>auto dfs = [&](auto &&self, long long i) -&gt; bool &#123;</div><div class='line'>    if (i == 3) &#123;</div><div class='line'>        return 1;</div><div class='line'>    &#125;</div><div class='line'>    auto tmp = page;</div><div class='line'>    for (long long x = -3; x &lt;= 7; x++) &#123;</div><div class='line'>        for (long long y = -3; y &lt;= 7; y++) &#123;</div><div class='line'>            for (long long t = 0; t &lt; 4; t++) &#123;</div><div class='line'>                if (fit(i, x, y) and self(self, i + 1)) &#123;</div><div class='line'>                    return 1;</div><div class='line'>                &#125;</div><div class='line'>                g[i] = rotate(g[i]); </div><div class='line'>                page = tmp;</div><div class='line'>            &#125;</div><div class='line'>        &#125;</div><div class='line'>    &#125;</div><div class='line'>    return 0;</div><div class='line'>&#125;;</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-18cp6k0">Using tmp to save the page allows me to only take pages that are successful. We try to fit the shape in from -3 to 7 because the polyomino we receive as input isn’t always started at <code>input[0][0]</code>, so to speak. It could be at the input’s <code>input[2][3]</code>, at which point given how the fit algorithm is written we’d have to start at -2, -3. Since it can only be at most 3 to either side, we go from the range <code>(0, 4)</code> to <code>(-3, 7)</code>.</p> <p data-svelte-h="svelte-ft2ioc">Then, we try all 4 rotations of the shape and check if it fits. If it doesn’t, we rotate it and try again. Notice that our input structure <code>g</code> only has 3 elements (since we took in 3 polyominos) so we have to halt the recursion after all 3 have been rotated 4 times. These 3 functions are actually sufficient to solve the problem!</p> <h1 id="solution" data-svelte-h="svelte-1mdbl1x"><a href="#solution">Solution</a></h1> <p data-svelte-h="svelte-1bqlgqv">Now, let’s put it all together. I used a simple check at the end to determine whether or not the polyominos would fit, at which point I would print YES or NO correspondingly.</p> <!-- HTML_TAG_START --><pre class="shiki material-default" cpp="true"><div class="language-id">cpp</div><div class='code-container'><code><div class='line'>#include &lt;bits/stdc++.h&gt;</div><div class='line'></div><div class='line'>using namespace std;</div><div class='line'></div><div class='line'>int main() &#123;</div><div class='line'>    vector&lt;array&lt;string, 4&gt;&gt; g(3);</div><div class='line'>    array&lt;array&lt;char, 4&gt;, 4&gt; page;</div><div class='line'>    // unrelated note but count is actually a function</div><div class='line'>    // name in stdc. mildly infuriating.</div><div class='line'>    long long cnt = 0;</div><div class='line'>    // taking input to the problem</div><div class='line'>    for (auto &it: g) &#123;</div><div class='line'>        for (auto &i: it) &#123;</div><div class='line'>            cin &gt;&gt; i;</div><div class='line'>            cnt += count(i.begin(), i.end(), '#');</div><div class='line'>        &#125;</div><div class='line'>    &#125;</div><div class='line'>    // rotate function</div><div class='line'>    auto rotate = [](const array&lt;string, 4&gt; &a) &#123;</div><div class='line'>        auto b = a;</div><div class='line'>        for (long long i = 0; i &lt; 4; i++) &#123;</div><div class='line'>            for (long long j = 0; j &lt; 4; j++) &#123;</div><div class='line'>                b[j][3 - i] = a[i][j];</div><div class='line'>            &#125;</div><div class='line'>        &#125;</div><div class='line'>        return b;</div><div class='line'>    &#125;;</div><div class='line'>    // fit. note that page is global here so it can be used by</div><div class='line'>    // both fit and dfs. this is important because</div><div class='line'>    // we want it to "remember" what works.</div><div class='line'>    auto fit = [&](long long k, long long x, long long y) &#123;</div><div class='line'>        for (long long i = 0, x_iter = x; i &lt; 4; i++, x_iter++)</div><div class='line'>            for (long long j = 0, y_iter = y; j &lt; 4; j++, y_iter++) &#123;</div><div class='line'>                if (g[k][i][j] == '.') &#123;</div><div class='line'>                    continue;</div><div class='line'>                &#125;</div><div class='line'>                if (page[x_iter][y_iter] == '#') &#123;</div><div class='line'>                    return 0;</div><div class='line'>                &#125;</div><div class='line'>                if (x_iter &lt; 0 or x_iter &gt; 3 or y_iter &lt; 0 or y_iter &gt; 3) &#123;</div><div class='line'>                    return 0;</div><div class='line'>                &#125;                </div><div class='line'>                page[x_iter][y_iter] = '#';</div><div class='line'>            &#125;</div><div class='line'>        return 1;</div><div class='line'>    &#125;;</div><div class='line'>    // This is the search. We stop at i=3, which is kind of</div><div class='line'>    // the "accumulator"-esque part of the recursion.</div><div class='line'>    auto dfs = [&](auto &&self, long long i) -&gt; bool &#123;</div><div class='line'>        if (i == 3) &#123;</div><div class='line'>            return 1;</div><div class='line'>        &#125;</div><div class='line'>        auto tmp = page;</div><div class='line'>        for (long long x = -3; x &lt;= 7; x++) &#123;</div><div class='line'>            for (long long y = -3; y &lt;= 7; y++) &#123;</div><div class='line'>                for (long long t = 0; t &lt; 4; t++) &#123;</div><div class='line'>                    if (fit(i, x, y) and self(self, i + 1)) &#123;</div><div class='line'>                        return 1;</div><div class='line'>                    &#125;</div><div class='line'>                    g[i] = rotate(g[i]); </div><div class='line'>                    page = tmp;</div><div class='line'>                &#125;</div><div class='line'>            &#125;</div><div class='line'>        &#125;</div><div class='line'>        return 0;</div><div class='line'>    &#125;;</div><div class='line'>    // If the count isn't 16, we can auto fail.</div><div class='line'>    // Only then do we call dfs. </div><div class='line'>    // Note if cnt isn't 16 then dfs never runs. </div><div class='line'>    if (cnt == 16 and dfs(dfs, 0)) </div><div class='line'>        printf("Yes&#92;n");</div><div class='line'>    else</div><div class='line'>        printf("No&#92;n");</div><div class='line'>    return 0;</div><div class='line'>&#125;</div></code></div></pre><!-- HTML_TAG_END --> <h1 id="thoughts" data-svelte-h="svelte-1rktcys"><a href="#thoughts">Thoughts</a></h1> <p data-svelte-h="svelte-1lgggcd">The problem was really interesting to solve during the time pressure of a competition. In retrospect, the code could have been a lot cleaner. For instance, I could have redesigned the dfs code to not be so for loop intensive, since it deterministically goes through 400 recursions every layer.</p> <p data-svelte-h="svelte-14q4qac">Additionally, I think that you can tell the code was very clearly written for competitive programming. After all, there’s so much <code>auto</code> used.</p> <p data-svelte-h="svelte-obipsf">I think that the problem demonstrates how “geometric” problems that we typically use human intuition for (should you approach a problem like this in real life, we tend to just “intuit” possible block placements, and don’t really think about why our brains can conduct such pattern recognition so efficiently) can be solved more easily through compartmentalization. This problem was relatively simple, with many constraints and a small “puzzle” size. Yet it still required multiple compartmentalizations and solutions for each of them.</p>]]>
    </content>
  </entry>
  <entry>
    <title type="html"><![CDATA[Music Translation and Yorushika]]></title>
    <link href="https://hijiri.dev/site-index/tl/yorushika" />
    <id>https://hijiri.dev/site-index/tl/yorushika</id>
    <published>2023-10-09T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.407Z</updated>
    <content type="html">
      <![CDATA[<ul data-svelte-h="svelte-l7n8i8"><li><a href="#intro">Intro</a></li> <li><a href="#what-i-think">What I think</a></li></ul> <h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-i7fkcq">I am not great at translating or at Japanese or Chinese specifically. I do, however, have some layman’s understanding of both, and my family background helps a lot with that (since I’m Chinese). So when I noticed that a certain <a href="https://www.youtube.com/watch?v=J6eih31MaQ8" rel="nofollow noopener noreferrer external" target="_blank">Yorushika song</a> wasn’t translated, I hopped on the chance to get some practice in and translate it.</p>   <div data-testid="general-observer"></div> <br> <p data-svelte-h="svelte-1j0muu7">As it turns out, no one had ever translated it before, and the video has become somewhat popular, getting 820k views at the time of writing. It has buoyed me into trying other translations, and I’ve made 2 more, one for an advertisement (yes, an advertisement) whose animation I found particularly compelling, and a nao song. They’ve been incredibly interesting, and I wanted to talk about the benefits of doing song translation and how I did it.</p> <h1 id="what-i-think" data-svelte-h="svelte-1ot6bwv"><a href="#what-i-think">What I think</a></h1> <p data-svelte-h="svelte-130m1u6">It turns out that learning language without practice is incredibly difficult. And as it turns out, living in a completely different country (the US) to either language you’re trying to become more familiar with is not helpful at all. It helps greatly, therefore, to try to translate something that has a wide range of vocabulary as practice. This helps with keeping things fresh in your mind, and frequently in learning new words, since songs and books have all sorts of crazy vocabulary that you’d never see anywhere else.</p> <p data-svelte-h="svelte-60ilnr">It also helps that if you’re translating something, you probably have a lot of interest in it, and thus it’s far more engaging than reading a textbook or grinding Duolingo lessons/online quizzes.</p> <p data-svelte-h="svelte-ovs6b8">So translating music has been incredibly fun for me. In the working of the nao song, I spent many hours trying to think of the best equivalent english to translate it to, and how to best communicate the emotion that nao wanted to get across. An accurate translation doesn’t just have direct accurate vocab translation, but also brings across nuance. This is particularly hard to do in a song with little understanding of slang, so I spent a lot of time googling sayings in order to get an accurate idea of what nao was trying to represent. In fact, I was actually kind of surprised by my final translation, since it was actually slightly different than my prior impression of the song while just casually listening to it (of course, I maybe only truly understood half the song before).</p> <p data-svelte-h="svelte-1k239ap">I started translating the song 3 hours before one of my college classes… I accidentally ended up skipping it with how engrossed I was with the TL. Fortunately, the class wasn’t particularly important, although I’ll never admit that to the professor in question. But I did find it incredibly gratifying and a great learning experience.</p> <p data-svelte-h="svelte-v1bqcb">I strongly encourage any of you reading this who are trying to learn a new language to try translating a song or novel. They push you to understand quirky words (if you just look at textbooks, they’ll only try to teach you the standard language) and help you understand slang and nuances you’d never see anywhere else. It’s also fun! That’s not to say that you should ever replace standard models of learning like the classroom or textbooks with soley hobby translation like I am. I am not remotely serious about learning Japanese or Chinese to their fullest, and I don’t plan on moving there soon. But it’s a great way to practice.</p>]]>
    </content>
    <category term="TranslationPost" scheme="https://hijiri.dev/?tags=TranslationPost" />
    <category term="Youtube" scheme="https://hijiri.dev/?tags=Youtube" />
  </entry>
  <entry>
    <title type="html"><![CDATA[WSL and Cygwin]]></title>
    <link href="https://hijiri.dev/site-index/personal/wsl" />
    <id>https://hijiri.dev/site-index/personal/wsl</id>
    <published>2023-08-31T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.407Z</updated>
    <summary type="html"><![CDATA[this is not a devpost. im just thinkin, so it's a personalpost]]></summary>
    <content type="html">
      <![CDATA[<h1 id="a-curious-problem" data-svelte-h="svelte-nrgiru"><a href="#a-curious-problem">A Curious Problem</a></h1> <p data-svelte-h="svelte-1c2j40p">Windows is not UNIX. This is a fact that we cannot, unfortunately, change. For the longest time, I used cygwin to &quot;&quot;make do&quot;&quot; when writing C code - at least it could compile, right. But Mintty and the emulation that cygwin provided always missed a little bit of something, especially since it was just a compatibility layer for POSIX and not the real thing.</p> <p data-svelte-h="svelte-sdivn8">Windows came out with WSL ages ago for me. I’m not very old, so it came out when I was in middle school, and I didn’t even clearly know what the difference between Matlab and Java were at the time, so it didn’t really matter for me. But I did hear from many people that WSL sucked compared to cygwin or MinGW, so when I started coding in late middle school into high school, I too installed cygwin. Cygwin is incredibly easy to use, you install it, the files are still easy to find in your C: drive, and you could legitimately edit your .c files with notepad and then just compile them on cygwin’s cli if you wanted.</p> <p data-svelte-h="svelte-18jfxuk">WSL 2 came out a few years ago, and I started using it this summer and I cannot express how nice it is to have an actual kernel. It’s true that it is &quot;&quot;less convenient&quot;&quot; than cygwin or mingw still in the sense that the files are less accessible and you need to go through the trouble of starting WSL up, but for people who aren’t interested in using linux as an actual operating system but still want as complete of a UNIX based system as possible for the sake of programming, it’s pretty amazing. It works with everything (with minor differences)!</p> <p data-svelte-h="svelte-e1qqi7">I frequently ssh’d into some linux server for the sake of running programs in a more complete or powerful environment (typically because they had money and could have a lot of GPUs) and while WSL is not better than this in the slightest, it does give that feeling off. It’s certainly not fair to compare WSL to cygwin since WSL is basically just coLinux while cygwin is just a compatibility layer, but I do think that WSL is easier to use and install than cygwin or mingw. And I do think that WSL is easier for new programmers to approach than cygwin is.</p> <p data-svelte-h="svelte-1qazg5j">All told, I think this is a rare case where Windows actually pulled something off for the sake of programming that I wholeheartedly enjoy using. Good job. But I wrote this for one thing, which is to encourage any readers to at least <em>try</em> cygwin. It’s a cool experience and incredibly useful for learning a lot of basics, and I would hate for it to be so overshadowed by WSL (although deservingly so) that the experience and knowledge you get from using it is completely lost to history.</p>]]>
    </content>
    <category term="Linux" scheme="https://hijiri.dev/?tags=Linux" />
    <category term="PersonalPost" scheme="https://hijiri.dev/?tags=PersonalPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[The Spunout Server]]></title>
    <link href="https://hijiri.dev/site-index/dev/spunout" />
    <id>https://hijiri.dev/site-index/dev/spunout</id>
    <published>2023-08-28T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.371Z</updated>
    <content type="html">
      <![CDATA[<ul data-svelte-h="svelte-cldyij"><li><a href="#intro">Intro</a></li> <li><a href="#technical-stuff">Technical stuff</a></li> <li><a href="#the-sheet">The Sheet</a></li></ul> <h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-12tfrm9">So I play this game called osu!, which is pretty cool and could probably warrant a post in my personal section by itself. Regardless, I basically play a really rare (and objectively pointless, but subjectively cool) mod called Spunout, which makes the game basically no different than before, aside from removing an object called the spinner. The gameplay details of the mod can be left out, however - the points I need to make are first, that players in osu! sometimes &quot;&quot;main&quot;&quot; a mod (in which they play the majority of the game with that mod), and additionally that Spunout is incredibly rare.</p> <p data-svelte-h="svelte-1p7zrld">I used to be part of a discord server with 5 or 6 people in it where we all played Spunout. It was created purely from just <em>knowing</em> people who you knew played the game. But it died… years ago. I recently met a player called <a href="https://osu.ppy.sh/users/27209874" rel="nofollow noopener noreferrer external" target="_blank">renyoo</a> while reffing a tournament, and I had seen them around the mod leaderboards lately, so I struck up a conversation, and found out that they were really interested in the idea of a spunout server. So we made one, except I wanted to get everyone this time, and not just the few people who we knew. So we wrote a script! Also, for those interested, <a href="/site-index/dev/spunout/countries.csv">here is the csv file I used for the countries, since I couldn’t find a complete list of the osu! countries online that was accurate</a></p> <h1 id="technical-stuff" data-svelte-h="svelte-qe1xkr"><a href="#technical-stuff">Technical stuff</a></h1> <p data-svelte-h="svelte-1yh7ye9">More specifically, I wrote the first version of the script. Fortunately, I didn’t have to do any web scraping since the developer of osu!, peppy, is very nice to developers and provides an extensive API with an incredibly generous limit (2k requests per minute, at the time of writing, although I hear this will be reduced in the future). So I just did some basic query calls and came up with something that would page the top 10000 players from every country leaderboard, which altogether gave me around 800 thousand user IDs. I wasn’t really keen on learning a new language for the sake of this project and I was pretty lazy, so I just wrote it in python:</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'>import ossapi</div><div class='line'>from ossapi import Ossapi</div><div class='line'>import time</div><div class='line'>from tqdm import tqdm</div><div class='line'>import pickle</div><div class='line'>import pandas</div><div class='line'>import multiprocessing</div><div class='line'>from concurrent.futures import ThreadPoolExecutor, as_completed</div><div class='line'></div><div class='line'># I created a client using my id and secret here but you don't get to see it ;)</div><div class='line'># create api</div><div class='line'>api = Ossapi(client_id, client_secret)</div><div class='line'></div><div class='line'>#... some code</div><div class='line'></div><div class='line'>def get_users_country(country, scorelist, out):</div><div class='line'>    print(f"Start: &#123;country&#125;")</div><div class='line'>    user_ranking = api.ranking("osu", ossapi.RankingType.PERFORMANCE, country=country)</div><div class='line'>    api_count = 1</div><div class='line'>    curr = user_ranking.cursor</div><div class='line'>    user_list = list()</div><div class='line'>    # while curr checks to ensure that there remains pages</div><div class='line'>    while curr and len(user_list) &lt; 10000:</div><div class='line'>        for j in range(0,len(user_ranking.ranking)):</div><div class='line'>            # add user to list if they are neither in the score ranking nor pp ranking</div><div class='line'>            # global rank can actually be undefined in some cases</div><div class='line'>            if (not user_ranking.ranking[j].is_ranked) or (int(user_ranking.ranking[j].play_count or 0) &lt; 2000) or (int(user_ranking.ranking[j].global_rank or 0) &gt; 200000):</div><div class='line'>                #print(f"Skipping user since they're too low")</div><div class='line'>                break</div><div class='line'>            elif int(user_ranking.ranking[j].global_rank or 0) &lt;= 10000:</div><div class='line'>                #print(f"Skipping user since they're top 10k")</div><div class='line'>                break</div><div class='line'>            elif user_ranking.ranking[j].user.id in scorelist:</div><div class='line'>                #print(f"Skipping &#123;user_ranking.ranking[j].user.id&#125; as they are in score index")</div><div class='line'>                break</div><div class='line'>            else:</div><div class='line'>                user_list.append(user_ranking.ranking[j].user.id)</div><div class='line'>        user_ranking = api.ranking("osu", ossapi.RankingType.PERFORMANCE, cursor=curr, country=country)</div><div class='line'>        api_count += 1</div><div class='line'>        print(f"&#123;country&#125; Progress: &#123;len(user_list)&#125;/10000, with &#123;api_count&#125; calls")</div><div class='line'>        curr = user_ranking.cursor</div><div class='line'>        # api cooldown</div><div class='line'>        # time.sleep(.5)</div><div class='line'>    if not curr: </div><div class='line'>        print("Ended due to curr")</div><div class='line'>    with open(out,"wb") as f:</div><div class='line'>        pickle.dump(user_list,f)</div><div class='line'>    print(len(user_list))</div><div class='line'>    return user_list</div><div class='line'></div><div class='line'>#... more code</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-13d9jml">A lot of this project ran into early errors when I forgot to account for silly mistakes like making sure that there were actually 10 thousand players in any one country’s leaderboard (regions/states with little internet presence like American Samoa for instance would not have 10k), or checking if they were inactive (osu! would change their profile statistics to effectively “delist” them from the rankings, but the api call caught them and attempted to process them anyway)</p> <p data-svelte-h="svelte-3s87xa">I included pickle because python ended up being a super slow language, so I decided to split up the “getting users” (which would use relatively few api calls and calculations since I could get 50 players at a time) and actually checking for Spunout players (which would have been much more calculation and api intensive, with at least 2 calls per player). So I had dumb little helper functions like</p> <!-- HTML_TAG_START --><pre class="shiki material-default" python="true"><div class="language-id">python</div><div class='code-container'><code><div class='line'># Load a list from file</div><div class='line'>def load_users(file):</div><div class='line'>    with open(str(file),"rb") as f:</div><div class='line'>        user_list = pickle.load(f)</div><div class='line'>    return user_list</div><div class='line'># Load country codes from csv    </div><div class='line'>def load_csv(input):</div><div class='line'>    data = pandas.read_csv(input, header=0)</div><div class='line'>    return list(data.Code)</div><div class='line'># Load users from a txt document (The easiest way to save user lists between scripts of different languages was .txt)</div><div class='line'>def load_txt(input):</div><div class='line'>    user_list = list()</div><div class='line'>    with open(input,'r') as f:</div><div class='line'>        for line in f:</div><div class='line'>            user_list.append(line.rstrip())</div><div class='line'>    return user_list</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-51bdbt">Regardless, this finished the task of getting the hundreds of thousands of players reasonably quickly, taking me about an hour (intentionally slowed down to rate limit myself - i wanted to stay at 60 req/min even though I had 2k). Then, it was just the task of checking every single individual player</p> <p data-svelte-h="svelte-17r2fqw">Well, I wrote a short script to check players too, before realizing that the script would take (about) 140 hours to finish, even running about 1k req/min. That wouldn’t do. I started thinking about rewriting the whole thing in Java, before one of the people that we had invited already, <a href="https://osu.ppy.sh/users/8474535" rel="nofollow noopener noreferrer external" target="_blank">Kuwume</a>, simply saved me by writing it in C++. It’s <em>significantly</em> faster, and gets the job done much easier. I’m not going to link the script, but it did the job in about 6 hours as opposed to 140. He also capped out the API limit instead of taking it slow like I did.</p> <h1 id="the-sheet" data-svelte-h="svelte-1ef6626"><a href="#the-sheet">The Sheet</a></h1> <p data-svelte-h="svelte-1gpdcfc">I wanted to create a google sheet where you could see all the spunout players and their stats and how they rank against each other, and it’s <a href="https://docs.google.com/spreadsheets/d/1e7UGhOZ74jO7eVVq5Y6mv4w304djXanQbpF-XpXduJU/edit" rel="nofollow noopener noreferrer external" target="_blank">finished, and at this link</a>. But this one was also an adventure too! To detail, I did this using an apps script, which uses the list of Spunout players by ID that Kuwume and I generated in the previous bits. However, using Google Sheets’ App Script to update the sheet (which, in hindsight, might have been easier if I had simply just hosted the leaderboard on this website) was really troublesome due to the Sheets rate limits. I couldn’t call the API many times per minute, so I had to add delay into the script. I couldn’t update the sheet a certain amount of times per day, so I set it to only update every 6 hours. I couldn’t expose my API key, while Apps Scripts are public to literally everyone who can make a copy of the sheet, so I had to create a private sheet and a public sheet where I would do all the processing and filtering and raw data manipulation on the private sheet, and then use the <code>IMPORTRANGE()</code> function to get them onto the public sheet.</p> <p data-svelte-h="svelte-j6ixc9">Since I didn’t want to write JS, I ended up asking someone who had created a similar script if I could have the code for how he was calling the API from Apps Script, and then modified that code accordingly for my needs.</p> <p data-svelte-h="svelte-1fib41a">But that created a problem, since the <code>IMPORTRANGE()</code> function doesn’t literally import the cells, but rather makes a shallow copy of the data presented to the viewer. Thus, I couldn’t import any functions (or images!), so I ended up writing the script in a really funny way to split up things and then using <code>ARRAYFORMULA()</code> nonsense to regenerate the images/etc. This was an adventure for me, where I learned all about conditional formatting, all the verious quirks of google sheet formulas, etc. I also had to write in a lot of forumula checks to make sure that I was actually generating on a person to prevent errors too! I ended up designating a “reference cell” range where I’d calculate some numbers that were important to formulas, such as how many players I had, and then reference those later. But this ended up in some funny formulas, like <code>=QUERY(IMPORTRANGE(&quot;1cmqKgZdvNmdPWVgm5HYK4m5jjXe4W1fp_8DYLTNsGH4&quot;,&quot;Raw Data!B1:O&quot;&amp;IMPORTRANGE(&quot;1cmqKgZdvNmdPWVgm5HYK4m5jjXe4W1fp_8DYLTNsGH4&quot;,&quot;Raw Data!P21&quot;)),&quot;select * order by Col4 ASC&quot;)</code> where you can see I was using the reference cell for the number of players.</p> <p data-svelte-h="svelte-rdadni">Regardless, I think the end sheet looks pretty good! And here is the apps script snippet responsible for getting people:</p> <!-- HTML_TAG_START --><pre class="shiki material-default" js="true"><div class="language-id">js</div><div class='code-container'><code><div class='line'>// takes an array of user ids and returns the corresponding user objects from the API</div><div class='line'>function getUsers(userids, token) &#123;</div><div class='line'>  let headers = &#123;</div><div class='line'>    'Authorization': &#96;$&#123;token.token_type&#125; $&#123;token.access_token&#125;&#96;</div><div class='line'>  &#125;;</div><div class='line'>  let reqs = userids.map(user =&gt; (&#123;</div><div class='line'>    'url': &#96;$&#123;ENDPOINT&#125;/users/$&#123;user&#125;/osu?key=id&#96;,</div><div class='line'>    'method': 'get',</div><div class='line'>    'headers': headers,</div><div class='line'>    'muteHttpExceptions': true,</div><div class='line'>  &#125;));</div><div class='line'></div><div class='line'>  let responses = UrlFetchApp.fetchAll(reqs);</div><div class='line'>  let userObjects = responses</div><div class='line'>                    .map(e =&gt; JSON.parse(e.getContentText()))</div><div class='line'>                    .map(e =&gt; &#123;</div><div class='line'>                      if (e.error !== undefined) &#123;</div><div class='line'>                        let user = Object.assign(&#123;&#125;, defaultUser);</div><div class='line'>                        return user;</div><div class='line'>                      &#125; else &#123;</div><div class='line'>                        return e;</div><div class='line'>                      &#125;</div><div class='line'>                    &#125;);</div><div class='line'>  return userObjects;</div><div class='line'>&#125;</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-cx0xjh">with similar code used to check the top 100 plays of each user for spunout occurrence.</p>]]>
    </content>
    <category term="Spunout" scheme="https://hijiri.dev/?tags=Spunout" />
    <category term="Python" scheme="https://hijiri.dev/?tags=Python" />
    <category term="Sheets" scheme="https://hijiri.dev/?tags=Sheets" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[Recreating Bash]]></title>
    <link href="https://hijiri.dev/site-index/dev/bash" />
    <id>https://hijiri.dev/site-index/dev/bash</id>
    <published>2022-12-08T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.363Z</updated>
    <content type="html">
      <![CDATA[<h1 id="project-description" data-svelte-h="svelte-n5gobt"><a href="#project-description">Project Description</a></h1> <p data-svelte-h="svelte-hdl8u5">One of my uni classes last Fall was an introduction to Computer Systems, and during the last month we were introduced to various shells like bash and tcsh. Well, during the class we had also learned about everything required to make a shell, so that’s awfully convenient isn’t it?</p> <p data-svelte-h="svelte-l09ekl">Thus, I have recreated (to a very limited degree!) some elements of the bash shell.</p> <p data-svelte-h="svelte-1ch1nbd">It’s worth noting that I’m actually running this command via SSH, so when I input eg <code>cd</code>, it actually gives me the dir of my Windows VSC workspace.</p> <p data-svelte-h="svelte-1fg077a">I named the shell “badsh”.</p> <h1 id="about-the-code" data-svelte-h="svelte-1qjds49"><a href="#about-the-code">About the Code</a></h1> <p data-svelte-h="svelte-1n1qy1n">Given that this code heavily involves work from projects that I wrote in class, I can’t release the code (since otherwise the University people will give me a big no no and I’ll probably cry myself to sleep after getting kicked out of the school). However, there are some interesting things I’d like to share.</p> <p data-svelte-h="svelte-512ocv">The first, this was written in C. We are working with linux/bash here, so it was a given. We used a prebuilt bison parser during our class in order to parse cli input, but I decided that I wanted to be cool and wrote my own. Consequently, the code runs inefficiently and has many issues with parsing some specific patterns (eg giving it inputs for a manually implemented command (eg the whoami command, which simply returns the code author) with arguments that are nonascii characters will break it).</p> <p data-svelte-h="svelte-1xeqmng">The general algorithm is structured like so:</p> <ul data-svelte-h="svelte-ppbed9"><li>Read input<ul><li>If the buffer is 0, break</li> <li>Otherwise, read the buffer into command history (so we have command recall functionality)</li> <li>Parse the input<ul><li>This works by attempting to first find certain flags, such as <code>|</code> or <code>&amp;</code> or <code>&gt;</code> or <code>&lt;</code> (input redirection). Then,</li> <li>Construct a tree and recursively call the parser left or right until you finish building the tree(Some flags have more priority than others to keep in line with bash, of course)</li></ul></li> <li>Call executor sub program</li> <li>Repeat until the heat death of the universe or until we exit</li></ul></li></ul> <p data-svelte-h="svelte-1ferrnv">The executor program is relatively simple,</p> <ul data-svelte-h="svelte-yzlp2q"><li>Accept input in the form of our parsed tree<ul><li>Starting at the top of the tree, make our way down, recursively calling the executor on the left and right side.<ul><li>If left fails, kill everything</li> <li>Depending on which flag we’re seeing on our tree, we may want to start a pipe or read/write to a file. Implementations for those are there in the form of various forks and pipes via dup2.</li> <li>If we see a pipe or subshell, go through children in order to isolate the environment</li></ul></li> <li>Check input against manually implemented commands, eg “exit” or “cd”, which concern themselves with the special environment rather than linux’s native commands, or fun manually implemented ones like “whoami”</li> <li>Call an exec function in order to use linux’s native commands</li></ul></li></ul> <p data-svelte-h="svelte-1xfrb4s">Seems pretty simple, yea? Unfortunately, this took me the better part of my winter break. I started as soon as I got off school 2022-12-20 and now its 2023-01-05 and I’m finally showing this off.</p> <p><picture><source srcset="/_app/immutable/assets/20_43_42_000247.CJ88C9dR.avif 736w" type="image/avif"> <img alt="/site-index/dev/bash/20_43_42_000247.png" class="rounded-lg my-2" decoding="async" loading="lazy" src="/site-index/dev/bash/20_43_42_000247.png"></picture></p>]]>
    </content>
    <category term="Bash" scheme="https://hijiri.dev/?tags=Bash" />
    <category term="Linux" scheme="https://hijiri.dev/?tags=Linux" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[A July Trip to Korea]]></title>
    <link href="https://hijiri.dev/site-index/personal/koreatrip" />
    <id>https://hijiri.dev/site-index/personal/koreatrip</id>
    <published>2022-09-01T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.371Z</updated>
    <summary type="html"><![CDATA[And some pictures]]></summary>
    <content type="html">
      <![CDATA[<h1 id="intro" data-svelte-h="svelte-1yrunjm"><a href="#intro">Intro</a></h1> <p data-svelte-h="svelte-avoz6"><strong>Hello! I got a lot of help from about entry requirements and skimming places to go on various online forums, so I figured I’d share my experiences and maybe help allay some travel concerns for anyone planning to go to Korea late summer</strong>. I went with my father and younger sister, both of us Asian but not Korean (with zero Korean speaking skills - this was hilarious)… we also booked super annoying flights (not so hilarious)</p> <p data-svelte-h="svelte-1opdxi6">We are US Citizens, routing through Canada, but with no landside stop. <em>This would require you to take a Covid test in Canada, because it resets the clock, so if you’re doing a connection and don’t have the time to wait for your test results to come back, be careful!</em></p> <p data-svelte-h="svelte-kqsty6">Other notes: 1.) we came during the supposed height of monsoon season, but we only got rained on a single afternoon despite every “next day’s” forecast being rain. Lucky. 2.) <strong><em>ALWAYS CARRY YOUR PASSPORTS! They are your only form of legal ID and are super useful</em></strong>. 3.) This trip was kind of supposed to mix a bit of “daily life in Korea” into the mix, so we looked at a lot of not-typical things, like huge HomePlus stores, the Costcos there, the local markets. My dad’s friend showed us around Suwon, his apartment, the workplace, and his son showed us around the schools, recreation, etc. It’s very cool.</p> <h1 id="entry" data-svelte-h="svelte-192j1fk"><a href="#entry">Entry</a></h1> <p data-svelte-h="svelte-1omyrcv"><strong>July -</strong> <strong>(Before Trip)</strong>: Filled out K-ETA. <em>We’re American. Got approved within 20 minutes. Made sure to specify hotel address, and email is important!! Didn’t have a Korean number immediately so filled in my US one, but you will want to have an email for all your entry things to keep them together before you pick up a sim card.</em> Downloaded Naver Maps (in english mode) and Kakao T, and made an account for Kakao T. Google maps is inadequate (it draws walking lines through buildings, has weird transit directions sometimes, and has completely wrong operating hours for most businesses/places) and Kakao T is horribly important when you leave a major city. We packed somewhat light so we didn’t need the taxis to get to and from airports.</p> <p data-svelte-h="svelte-10k4ssj"><strong>July 7th</strong>: <em>Took a PCR test at the local CVS at 14:00 or so. They satisfied the PCR test requirement because it was 2 days in advance of our first flight to Canada, and even though it was over 48 hours, it satisfied the “48 hours until 0 hour” rule Korea has. Most of you won’t need to bother with double rules like this, because you don’t have a 40 hour flight plan.</em></p> <p data-svelte-h="svelte-1266y14"><strong>July 8th</strong>: Received PCR tests from CVS at night. Tests said they’d come back in 1-2 days so this was nice because we had more time to fill out Q-Code. <em>I filled out the Q-Code forms for all three of us and they returned the QR Codes to me in an email within an hour.</em></p> <p data-svelte-h="svelte-4ck0aw"><strong>July 9th</strong>: Checked into BWI. Flew to Canada. Found out even if you don’t enter landside, you <em>still must do ArriveCAN</em>. IF you’re flying a Canadian connection and don’t plan to enter the country, do it beforehand. After landing in Toronto, stayed airside through International Connections (fairly fast process), got settled down to sleep.</p> <p data-svelte-h="svelte-1vihan6"><strong>July 10th</strong>: Got onto the Seoul flight, painful delays.</p> <p data-svelte-h="svelte-15i3epc"><strong>July 11th</strong>: Landing in Seoul/Incheon! <em>We were given forms on the plane for Covid declaration (but only if you hadn’t done Q-Code), customs declaration, and a visit card. We filled out the latter two. After landing, they ushered us towards lines where people checked our Q-Code forms (super smooth and fast), and then sent through customs, immigration, and picked up our bags.</em></p> <p data-svelte-h="svelte-19nfy34">We did our Covid tests at the airport outside, at the Transportation Center. <em>I had read on this subreddit that the free public health centers were starting to check for long term residency for foreigners, so we played it safe and paid for tests.</em> We booked ahead through the GoSafe website and set the appointment 1.5 hours after our flight was meant to arrive to be ultra safe, but we arrived slightly late because of flight delays (thanks Air Canada). They didn’t care much. <em>We got the test results by email in about 2 hours.</em></p> <p data-svelte-h="svelte-ys9aia">We bought 3 T-Money cards from the Transportation Center for 4000 won each (later <em>I learned that we overpaid - standard T-Money cards are 2.5k at convenience stores. However, we got Tourist Cards, which have special benefits, so it’s worth the extra cost if you go to some specific places</em>. Do some research!), and got on the AREX train to get to Seoul. Transferred to the 1 train, they have cool conveyor belts to help you move heavy luggage if you’re tired after a long flight and the airport. Got to hotel, checked in, with negative entry tests, and felt great because we could finally be assured our vacation could start with no issues!</p> <p data-svelte-h="svelte-rrl7mj">All in all, entry was super smooth. Just make sure to do your K-ETA and Q-Code and you should be fine.</p> <h1 id="trip" data-svelte-h="svelte-1qk4s9h"><a href="#trip">Trip</a></h1> <p data-svelte-h="svelte-l4wr14"><strong>Night: Cheonggyecheon Stream</strong>, and got dinner at Burger King because nothing else was open. This was a lesson - a lot of places in Korea don’t stay open late past like 20:00, and they don’t open until late too, until 8:00 to 10:00.</p> <p><img alt="Under the rainbow bridge" class="rounded-lg my-2" decoding="async" loading="lazy" src="./IMG_20220711_232350.jpg"></p> <p data-svelte-h="svelte-1meb1zv"><strong>July 12</strong>: <strong>Morning: Hyundai Dept Store Seoul, I-Seoul-U sign. Afternoon: Myeongdong Shopping Street, DDP.</strong> Holy crap what a day, I was awfully tired. Noodles for dinner on tired feet was a good feeling. Not much to say, shopping and architecture, other than Myeongdong being destroyed by COVID. Oh, and we picked up our SIM card here. It’s very far from the airport, but the benefits are unlimited call/text/data for just <a href="https://www.trazy.com/experience/detail/prepaid-data-sim-card-long-term" rel="nofollow noopener noreferrer external" target="_blank">like 29 USD. We got the Lite plan - 300mb of fast data, but the “slow” data is still 3mbps, good enough for most everything</a>.</p> <p data-svelte-h="svelte-1y7hbj"><strong>July 13</strong>: <strong>Morning/afternoon: Starfield COEX Mall/Library</strong> (pronounced Liberry by my sister). <strong>Night:</strong> <strong><del>Lotte Tower</del></strong> <strong>Rained on!</strong> Went back to the hotel and found a local museum to go to, walked around some shops. COEX was pretty fun! We ran around the place buying things, and although most of the food places were closed, was pretty fun. Dad bought a lot of kitchenware to take home.</p> <p data-svelte-h="svelte-1xrp653"><strong>July 14: Morning: Gyeongbukgung Palace. Afternoon: Hanok Village</strong> (construction! pretty hard to explore, gave up after not being able to find a good way in). <strong>Night: Naksan Park.</strong> Probably one of the prettiest views of the trip, except the mosquitoes were outrageous. Everyone was flailing around, it was pretty funny, but the view was worth it. I got bit 3 times, while wearing a jacket and jeans; my dad and sister fared worse. Another thing you’ll learn in Korea is there’s a million couples everywhere in Seoul. Everywhere is couples. My sister and I got mistaken for one on more than one occasion. Gyeongbukgung doesn’t actually begin selling tickets until 9, but going a bit early allows you to get super nice pictures of the first courtyard area.</p> <p><img alt="The Palace" class="rounded-lg my-2" decoding="async" loading="lazy" src="./IMG_20220714_093259.jpg"> <img alt="The town below Naksan Park" class="rounded-lg my-2" decoding="async" loading="lazy" src="./IMG_20220714_203014.jpg"> <img alt="On top of the walls" class="rounded-lg my-2" decoding="async" loading="lazy" src="./IMG_20220714_201321.jpg"></p> <p data-svelte-h="svelte-wrh24q"><strong>July 15: Morning: War memorial</strong>, pretty solemn. <strong>Afternoon: Goto mall</strong> (giant thing), <strong>Gangnam</strong>. <strong>Night: Banpo Bridge</strong>, except we waited 3 hours and the show never happened. We were confused, everyone else there was confused, and after the last showing was meant to happen we just left. It was still fun though, because there were some nice people singing and having fun at the center circular stage.</p> <p data-svelte-h="svelte-18v7s78"><strong>July 16: Morning: Hybe Insight. Afternoon: National Museum of Korea.</strong> If you’re going to HYBE, everyone needs their own smartphone, even the children. But if you are missing one, you can borrow one of theirs.</p> <p data-svelte-h="svelte-3vmp97"><strong>July 17: Morning/Afternoon: Visited a friend down in Suwon. Night: N Seoul Tower.</strong> Booked tickets on Klook, they’re cheaper by like half! N Seoul Tower was pretty.</p> <p data-svelte-h="svelte-1hl9kw0"><strong>July 18: Morning: Flight to Jeju Island via Gimpo.</strong> This is where our planning starts to go weird. <strong>Afternoon/Night: Yongduam/Yongyeon Park/Rock.</strong> In Jeju, we didn’t have an international drivers license or anything, so taxis are key (get your own car if you’re planning on going to Jeju if you can!). If you can’t speak Korean like us, taxi drivers rarely understand english, so you will either have to pull up the place you want to go to in Korean or, to save both time and effort, use a booking app like Kakao T. It’s fast, you don’t have to flag a taxi and can just call it, and most importantly, you can book your destination on the app. This app and Naver carried our trip.</p> <p data-svelte-h="svelte-1wzfcbh"><strong>July 19: Morning: Arte Museum. Afternoon: Dodu-dong Rainbow Coastal Road + messing around on the rocks</strong>. This day was so relaxing. The Arte Museum is a bit of a pain to get to if you don’t have your own car. We ended up taking a taxi, as the bus would have taken 90 minutes. Also be aware of buses that have the same number but split later on - they announce the split in Korean, which we don’t understand, and this led to confusion and big time loss once.</p> <p data-svelte-h="svelte-1km3h4h"><strong>July 20: Morning: Flight to Busan. Afternoon: Oryukdo Skywalk</strong>. The skywalk itself isn’t as special as I thought it would be, but the area is so pretty - there’s trails carved into the side of a small mountain (pretty view) and the cafe near the skywalk has a pretty view. The water misting cooling devices were also a highlight, funny enough. My sister loved them</p> <p data-svelte-h="svelte-1qfgj2y"><strong>July 21: Morning: Bujeon Market. Afternoon: Songdo Cable Cars, UN Cemetery, Magnate Cafe.</strong> Apparently the Magnate Cafe is owned by the father of some kpop artist. The more you learn i guess. Great smoothies though. Bujeon Market was epic, but any of the markets will give you a similar experience. It’s the feeling of being there and seeing an airport sized indoor farmers market of everything under the sun that gets you. And there’s not just one in the city, but quite a few! and Bujeon isn’t even the largest one!</p> <p data-svelte-h="svelte-i2dlba"><strong>July 22: Morning: Train to Ulsan. Afternoon: Daewangnam Park + Lighthouse, Ilsan Beach</strong>. We caught Ulsan just in time for its annual shipbuilding and sea festival (July 22-24). Ulsan is an industrial powerhouse, home to a lot of Hyundai and pretty views. Daewangnam contends for best view of the trip.</p> <p data-svelte-h="svelte-cmtxrj"><strong>July 23: Morning: Amethyst Cavern Park + Temple + Zoo. Afternoon: Petroglyphs in Cheonjeon-ri</strong>. Probably one of my favorite days of the trip. Gosh, Amethyst Cavern was pretty good. Not much english signage but the mountains were pretty, the view was pretty, the caves were pretty, etc. The petroglyphs hike was also fun, and the temple was very interesting, although to be honest we were slightly intimidated by the scale and tone of it. We had KyoChon chicken for dinner. Much recommend. Lots of chains in Korea, get it sometime.</p> <p><img alt="Brilliant rolling hills in front of the Amethyst Cavern Park" class="rounded-lg my-2" decoding="async" loading="lazy" src="./IMG_20220723_123643.jpg"></p> <p data-svelte-h="svelte-uscgzv"><strong>July 24: Morning: Train to Incheon (actually, Seoul and then train to Incheon) Afternoon: Songdo Central Park</strong>. Songdo Park at night is very beautiful. You can tell everyone living around loves it too</p> <p data-svelte-h="svelte-becqag"><strong>July 25: Morning: Shrimp Tower, Chinatown. Afternoon: Some kind of supercomplex Homeplus + E-Mart + Mall all in one</strong>. Yes, we went to go see a 2 story tower with absolutely nothing special with the exception of being shaped like a shrimp. In Korean it’s called 소래포구 새우 타워. Go see it. It’s funny.</p> <p data-svelte-h="svelte-1oo35u2"><strong>July 26: Morning: Local walk, parks. Afternoon: FLIGHT!!!</strong> We brought luggage onto a bus obviously not meant for carrying luggage. This is when I was glad that we packed light, because our small carry ons slipped into the footwells and all was well</p> <p><img alt="Donuts we got in ICN" class="rounded-lg my-2" decoding="async" loading="lazy" src="./IMG_20220726_171312.jpg"></p> <p data-svelte-h="svelte-wbza2u"><strong>July 27:</strong> <strong>Home (and here I am)!</strong> I won’t write much here other than that Vancouver transfer security is horrid, and that leaving Incheon was very smooth. All the food in Incheon is in floor 1, B1 (mostly B1), or the Transport hub. The US has literally no entry requirements for vaccinated travelers, and I know you guys don’t want to hear about country specific exit requirements, because it won’t even apply to you. God help Canadian airport wait times. Please. Open another lane. I beg. Half the people in my line were late for connecting flights because of you :grr:</p> <h1 id="final-remarks" data-svelte-h="svelte-143it5b"><a href="#final-remarks">Final Remarks</a></h1> <p data-svelte-h="svelte-x5i8m4">The tourist places were pretty well populated, although not by tourists, even though I saw a few milling around the popular places in Seoul. Most places (and all in places like Ulsan) were mostly filled by domestic tourism, which seems to be booming. Almost everything is up and operating just fine, although you’ll occasionally find the shuttered place. Be sure to use Naver for directions. Google maps just doesn’t cut it for the reasons above, although it can be good for searching for tourist places in english (and fast food, which you can’t search for generally in Naver)</p> <p data-svelte-h="svelte-1bl2rw9">If any of you have questions about my entry experience or the rest of the trip, feel free to leave them below and I’ll try my best to respond to it! I heard that some entry requirements have changed in this short 2 week timespan, like <em>now you have to upload your post arrival negative covid test to Q-Code.</em></p> <p data-svelte-h="svelte-7fdhqf">A lot of u/Sybernova11’s post <a href="https://www.reddit.com/r/koreatravel/comments/w2uxc7/korea_trip_report_july_1117/" rel="nofollow noopener noreferrer external" target="_blank">here</a> explains public transportation way better than I did!</p>]]>
    </content>
    <category term="PersonalPost" scheme="https://hijiri.dev/?tags=PersonalPost" />
  </entry>
  <entry>
    <title type="html"><![CDATA[The Clearvision Project]]></title>
    <link href="https://hijiri.dev/site-index/dev/clearvision" />
    <id>https://hijiri.dev/site-index/dev/clearvision</id>
    <published>2022-07-08T00:00:00.000Z</published>
    <updated>2026-01-27T20:14:07.363Z</updated>
    <content type="html">
      <![CDATA[<ul data-svelte-h="svelte-yee1ty"><li><a href="#description">Description</a></li> <li><a href="#support">Support</a></li></ul> <p data-svelte-h="svelte-d7qgts">~this blog is WIP and so is this page~</p> <h2 id="description" data-svelte-h="svelte-1ye4rgu"><a href="#description">Description</a></h2> <p data-svelte-h="svelte-178b2m3">Initially made by Zerthox, <a href="https://github.com/ClearVision" rel="nofollow noopener noreferrer external" target="_blank">Clearvision</a> is a project created by myself and other members of the ClearVision organization, or the ClearVision Team. It is designed to customize discord, a chatting platform.</p> <p data-svelte-h="svelte-1comc5a">It’s a theme written in scss and hosted on github. You can install it via any discord injector that supports .theme.css files, such as <a href="https://betterdiscord.app/" rel="nofollow noopener noreferrer external" target="_blank">BetterDiscord</a>, <a href="https://powercord.dev/" rel="nofollow noopener noreferrer external" target="_blank">Powercord</a>, Vizality, Replugged, etc etc.</p> <h2 id="support" data-svelte-h="svelte-10hd5an"><a href="#support">Support</a></h2> <p data-svelte-h="svelte-qgat31">You can find me and the rest of the team at <a href="https://discord.gg/7pNUC9C" rel="nofollow noopener noreferrer external" target="_blank">our support discord</a>, or just open an issue on our repo.</p>]]>
    </content>
    <category term="Clearvision" scheme="https://hijiri.dev/?tags=Clearvision" />
    <category term="DevPost" scheme="https://hijiri.dev/?tags=DevPost" />
  </entry>
</feed>