<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>nealcnotes</title>
<link>https://nealcnotes.com/</link>
<atom:link href="https://nealcnotes.com/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.10.19</generator>
<lastBuildDate>Sat, 31 Oct 2026 07:00:00 GMT</lastBuildDate>
<item>
  <title>Lesson 1: Talking to the computer in words</title>
  <link>https://nealcnotes.com/posts/lesson1-setup-gauss.html</link>
  <description><![CDATA[ 




<section id="why-are-we-doing-this" class="level2">
<h2 class="anchored" data-anchor-id="why-are-we-doing-this">Why are we doing this?</h2>
<p>An AI can install software, add up numbers and write proofs faster than either of us ever will. So why learn any of it?</p>
<p>For the same reason people learned pure math long before anyone needed it. Almost nobody uses calculus at work. What it built was the ability to understand: to follow an argument, see why it holds, and notice when it doesn’t.</p>
<p>That’s the point of this course: not to get the computer to do things, but to <strong>understand what it did, and why</strong>, well enough to catch it when it’s wrong.</p>
<p>Every step comes with three habits:</p>
<ul>
<li><strong>Predict.</strong> Before you press Enter, say what will happen.</li>
<li><strong>Check.</strong> Did it? If not, that’s the interesting part.</li>
<li><strong>Explain.</strong> Say <em>why</em>, in your own words.</li>
</ul>
<p>Today, in four parts:</p>
<ol type="1">
<li><strong>Set up</strong> Linux inside Windows, with an AI tutor beside it.</li>
<li><strong>Python basics:</strong> boxes, questions and repeats.</li>
<li><strong>Add up</strong> 1 to 100, and ask when checking becomes proving.</li>
<li><strong>Lean:</strong> the same program in a language that checks proofs.</li>
</ol>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>How to use this page
</div>
</div>
<div class="callout-body-container callout-body">
<p>Each grey box has a copy button in its top right corner. Paste into the terminal with Ctrl+Shift+V and press Enter. Read the sentence above each box <em>before</em> you run it.</p>
</div>
</div>
</section>
<section id="part-1-set-up" class="level1">
<h1>Part 1: Set up</h1>
<section id="turn-on-linux-wsl" class="level2">
<h2 class="anchored" data-anchor-id="turn-on-linux-wsl">Turn on Linux (WSL)</h2>
<p>Underneath the windows and buttons, a computer works with text. A <strong>terminal</strong> is a window where you talk to it in words. We’ll use <strong>Linux</strong>, running inside Windows (that’s <strong>WSL</strong>, Windows Subsystem for Linux).</p>
<ol type="1">
<li>Click Start and type <strong>PowerShell</strong>.</li>
<li>Right-click <strong>Windows PowerShell</strong>, choose <strong>Run as administrator</strong>, and click Yes.</li>
<li>Paste this and press Enter:</li>
</ol>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode powershell code-with-copy"><code class="sourceCode powershell"><span id="cb1-1">wsl <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">--</span>install</span></code></pre></div></div>
<p>When it says so, <strong>restart the computer</strong>. A window called <strong>Ubuntu</strong> (our kind of Linux) then opens and asks you to make up a <strong>username</strong> (short, lowercase, no spaces) and a <strong>password</strong>.</p>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Warning</span>The password is invisible
</div>
</div>
<div class="callout-body-container callout-body">
<p>When you type it, <em>nothing appears</em>, not even dots. That’s normal. Type it anyway and press Enter.</p>
</div>
</div>
<p>From now on, open <strong>Terminal</strong> from the Start menu and pick <strong>Ubuntu</strong> from the ▾ menu next to the tabs.</p>
</section>
<section id="look-around" class="level2">
<h2 class="anchored" data-anchor-id="look-around">Look around</h2>
<p>The line ending in <code>$</code> is the <strong>prompt</strong>: the computer waiting for you.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">pwd</span></span></code></pre></div></div>
<p><code>pwd</code> prints where you are, something like <code>/home/anna</code>: your <strong>home folder</strong>, written as a <strong>path</strong> (folders inside folders, separated by <code>/</code>).</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mkdir</span> course</span>
<span id="cb3-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> course</span>
<span id="cb3-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">pwd</span></span></code></pre></div></div>
<p><strong>Predict</strong> before the last line: what will <code>pwd</code> print now? (<code>mkdir</code> makes a folder, <code>cd</code> goes into one, <code>cd ..</code> goes up a level.)</p>
</section>
<section id="stop-the-password-questions" class="level2">
<h2 class="anchored" data-anchor-id="stop-the-password-questions">Stop the password questions</h2>
<p>Commands starting with <code>sudo</code> run as the administrator, and Linux asks for your password each time. The Windows login already protects this computer, so we tell Linux to stop asking:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb4-1"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">echo</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$USER</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> ALL=(ALL) NOPASSWD:ALL"</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">|</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> tee /etc/sudoers.d/<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$USER</span></span>
<span id="cb4-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> chmod 0440 /etc/sudoers.d/<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$USER</span></span></code></pre></div></div>
</section>
<section id="your-tutor-claude-code" class="level2">
<h2 class="anchored" data-anchor-id="your-tutor-claude-code">Your tutor: Claude Code</h2>
<p><strong>Claude</strong> is an AI, a <strong>language model</strong>: it learned from a huge amount of text to predict what words come next. That turns out to be enough to explain things and write code. It also makes Claude <em>very good at sounding right</em>. Usually it is right. Sometimes it isn’t, and it can’t always tell. That’s why you check.</p>
<p><strong>Claude Code</strong> lets you talk to Claude in the terminal. You’ll need a Claude account.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb5-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">curl</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-fsSL</span> https://claude.ai/install.sh <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">|</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bash</span></span></code></pre></div></div>
<p><code>curl</code> downloads the installer, and <code>| bash</code> runs it (the <code>|</code>, a <em>pipe</em>, sends one command’s output into the next).</p>
<p>Claude could do this whole lesson by itself. That’s why we tell it not to. This box writes a file called <code>CLAUDE.md</code>: standing instructions Claude reads every time it starts in this folder.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb6-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> ~/course/CLAUDE.md <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;&lt;'EOF'</span></span>
<span id="cb6-2"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"># Tutor mode</span></span>
<span id="cb6-3"></span>
<span id="cb6-4"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">I'm a beginner learning to program, and above all to reason.</span></span>
<span id="cb6-5"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">The point is that I work things out myself.</span></span>
<span id="cb6-6"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">You're my tutor, not the one doing the work.</span></span>
<span id="cb6-7"></span>
<span id="cb6-8"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- Never write the code for my exercises,</span></span>
<span id="cb6-9"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  and don't run commands or edit files for me.</span></span>
<span id="cb6-10"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  If you solve it, the lesson is lost.</span></span>
<span id="cb6-11"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- If I paste an error message, explain in plain words</span></span>
<span id="cb6-12"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  what it means and where to look. One hint, not the fix.</span></span>
<span id="cb6-13"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- If I ask what a command does, explain it simply,</span></span>
<span id="cb6-14"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  then ask me to predict what will happen before I run it.</span></span>
<span id="cb6-15"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- Ask me "why?" often, and look for the hole</span></span>
<span id="cb6-16"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  in my explanations.</span></span>
<span id="cb6-17"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- If I ask how you work, or why AI gets things wrong,</span></span>
<span id="cb6-18"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  explain honestly and simply. That's part of the course.</span></span>
<span id="cb6-19"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- Allowed: if I ask for code *to referee*</span></span>
<span id="cb6-20"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  (with a hidden bug for me to find), write it.</span></span>
<span id="cb6-21"><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">- Keep answers short. Use everyday words.</span></span>
<span id="cb6-22"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">EOF</span></span></code></pre></div></div>
<p>Press <strong>Alt+Shift+D</strong> to split the window into two panes. In the <strong>right</strong> pane, start Claude:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb7-1"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> ~/course</span>
<span id="cb7-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">claude</span></span></code></pre></div></div>
<p>The first time, it opens a browser to log in. Claude asks before it does anything on your computer: say no unless you understand what it’s asking.</p>
<p>Try two questions: <em>“What did the <code>cat &gt; CLAUDE.md</code> command I just ran do?”</em> and <em>“When are you most likely to be wrong?”</em></p>
<p>From now on: <strong>left pane, you work. Right pane, you ask.</strong></p>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Asking well
</div>
</div>
<div class="callout-body-container callout-body">
<p>Claude only knows what you tell it. A good question says <strong>what you did</strong>, <strong>what happened</strong>, and <strong>what you think</strong>: <em>“I ran <code>python3 gauss.py</code> and got this error: (paste). I think line 3 is wrong. Am I right?”</em> Errors are normal. Read each one yourself first and guess, then paste it with your guess. Fixing it is your job.</p>
</div>
</div>
</section>
<section id="a-friendlier-shell-fish" class="level2">
<h2 class="anchored" data-anchor-id="a-friendlier-shell-fish">A friendlier shell: fish</h2>
<p>The program that reads what you type is the <strong>shell</strong>. Ubuntu’s is <code>bash</code>. We’ll use <strong>fish</strong>, which helps you type less. Ask Claude what <code>chsh</code> does, and <strong>predict</strong> what will change, and when:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb8-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> apt update <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">&amp;&amp;</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> apt install <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-y</span> fish</span>
<span id="cb8-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> chsh <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-s</span> /usr/bin/fish <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$USER</span></span></code></pre></div></div>
<p>(<code>apt</code> installs software.) Close the left pane (<code>exit</code>) and open a new one with Alt+Shift+D. Was your prediction right?</p>
<p>Fish suggests the rest of a command in grey from what you typed before (→ accepts it), and Tab finishes names. ↑ brings back earlier commands.</p>
<p>Fish doesn’t know yet where Claude was installed. Tell it once:</p>
<pre class="fish"><code>fish_add_path ~/.local/bin</code></pre>
<p><strong>Explain</strong> (ask Claude if you’re stuck): what is a “path”, and why did bash find Claude but fish didn’t?</p>
</section>
<section id="an-editor-nvim" class="level2">
<h2 class="anchored" data-anchor-id="an-editor-nvim">An editor: nvim</h2>
<p>To write programs we need a text <strong>editor</strong>. <strong>nvim</strong> runs inside the terminal.</p>
<pre class="fish"><code>sudo apt install -y neovim
cd ~/course
nvim hello.txt</code></pre>
<p>nvim starts in <em>normal mode</em>, where keys are commands, not letters. Four things are enough:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Press</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>i</code></td>
<td>start typing (<em>insert mode</em>)</td>
</tr>
<tr class="even">
<td><code>Esc</code></td>
<td>stop typing</td>
</tr>
<tr class="odd">
<td><code>:wq</code> Enter</td>
<td>save and quit</td>
</tr>
<tr class="even">
<td><code>:q!</code> Enter</td>
<td>quit <em>without</em> saving</td>
</tr>
</tbody>
</table>
<p>Press <code>i</code>, type <code>hello</code>, press <code>Esc</code>, type <code>:wq</code>, press Enter. <strong>Predict:</strong> what will this print?</p>
<pre class="fish"><code>cat hello.txt</code></pre>
<p>Stuck in nvim? Press <code>Esc</code> a few times, then <code>:q!</code>. (More nvim: type <code>:Tutor</code> inside it.)</p>
</section>
<section id="python" class="level2">
<h2 class="anchored" data-anchor-id="python">Python</h2>
<pre class="fish"><code>python3</code></pre>
<p>The prompt changes to <code>&gt;&gt;&gt;</code>: you’re talking to Python now. <strong>Predict</strong> each answer, then check:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb13-1"><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb13-2"><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb13-3"><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb13-4"><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span></span></code></pre></div></div>
<p>Ask Claude why <code>7 / 2</code> and <code>7 // 2</code> differ, then explain it back. Leave Python with <strong>Ctrl+D</strong>.</p>
<p>A good place to stop for the day.</p>
</section>
</section>
<section id="part-2-python-basics" class="level1">
<h1>Part 2: Python basics</h1>
<section id="boxes-and-questions" class="level2">
<h2 class="anchored" data-anchor-id="boxes-and-questions">Boxes and questions</h2>
<p>Start Python again and <strong>predict</strong> each line before pressing Enter:</p>
<pre class="fish"><code>python3</code></pre>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span></span>
<span id="cb15-2">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb15-3">x</span>
<span id="cb15-4">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb15-5">x</span>
<span id="cb15-6">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span></span>
<span id="cb15-7">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span></span></code></pre></div></div>
<p><code>x = 5</code> makes a box called <code>x</code> and puts 5 in it. <code>x + 1</code> works out an answer but leaves the box alone.</p>
<p>In maths, <code>x = x + 1</code> is nonsense. In Python, <code>=</code> means <strong>“work out the right side, then put it in the box on the left”</strong>.</p>
<p><code>==</code> <em>asks</em> whether two things are equal, and the answer is <code>True</code> or <code>False</code>. One <code>=</code> stores, two <code>==</code> ask. Mixing them up is one of the most common mistakes in programming.</p>
<p>Leave Python with Ctrl+D.</p>
</section>
<section id="decisions-if" class="level2">
<h2 class="anchored" data-anchor-id="decisions-if">Decisions: if</h2>
<pre class="fish"><code>cd ~/course
nvim decide.py</code></pre>
<p>Type this in (<code>i</code> first, <code>Esc</code> and <code>:wq</code> at the end):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb17-1">n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span></span>
<span id="cb17-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb17-3">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(n, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"is even"</span>)</span>
<span id="cb17-4"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb17-5">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(n, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"is odd"</span>)</span></code></pre></div></div>
<p><code>%</code> is the remainder: <code>7 % 2</code> is 1. <code>if</code> runs the indented lines under it when its question is <code>True</code>, otherwise the lines under <code>else:</code>. <strong>Predict</strong>, then run:</p>
<pre class="fish"><code>python3 decide.py</code></pre>
</section>
<section id="indentation-whats-inside-what" class="level2">
<h2 class="anchored" data-anchor-id="indentation-whats-inside-what">Indentation: what’s inside what</h2>
<p>A line ending in <code>:</code> starts a <strong>block</strong>: the lines under it, indented 4 spaces further. The block ends at the first line that steps back out. nvim indents for you after a <code>:</code>, but it can’t know <strong>when a block ends</strong>. That’s you, pressing Backspace, and it’s a reasoning question: does this line belong inside?</p>
</section>
<section id="repeats-for" class="level2">
<h2 class="anchored" data-anchor-id="repeats-for">Repeats: for</h2>
<pre class="fish"><code>nvim loop.py</code></pre>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb20" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb20-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> k <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>):</span>
<span id="cb20-2">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(k, k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> k)</span></code></pre></div></div>
<p><code>for</code> runs the indented line once for each <code>k</code> in <code>range(1, 6)</code>: 1, 2, 3, 4, 5. It stops <em>before</em> 6. <strong>Predict</strong> all five lines, then run:</p>
<pre class="fish"><code>python3 loop.py</code></pre>
<p><strong>Predict</strong> <em>exactly</em> what this prints:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb22" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb22-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> k <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>):</span>
<span id="cb22-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb22-3">        <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(k, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"even"</span>)</span>
<span id="cb22-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb22-5">        <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(k, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"odd"</span>)</span>
<span id="cb22-6">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"done"</span>)</span></code></pre></div></div>
<p>How many times does <code>done</code> appear? What changes if <code>print("done")</code> moves one step left, under <code>for</code>? Try both and check.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Try it yourself
</div>
</div>
<div class="callout-body-container callout-body">
<p>Change <code>loop.py</code> to print only the <strong>even</strong> numbers from 1 to 20. You’ll need an <code>if</code> inside the <code>for</code>.</p>
</div>
</div>
</section>
</section>
<section id="part-3-adding-up" class="level1">
<h1>Part 3: Adding up</h1>
<section id="the-story" class="level2">
<h2 class="anchored" data-anchor-id="the-story">The story</h2>
<p>Around 1785, the story goes, a teacher told his class to add up every number from 1 to 100. A ten-year-old, Carl Friedrich Gauss, wrote the answer almost at once: <strong>5050</strong>.</p>
<p><strong>How might he have done it?</strong> Spend two minutes with a pencil before reading on.</p>
</section>
<section id="the-slow-way-a-loop" class="level2">
<h2 class="anchored" data-anchor-id="the-slow-way-a-loop">The slow way: a loop</h2>
<pre class="fish"><code>cd ~/course
nvim gauss.py</code></pre>
<p>Type it in yourself (typing teaches more than pasting):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb24" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb24-1">total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb24-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> k <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">101</span>):</span>
<span id="cb24-3">    total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> k</span>
<span id="cb24-4">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(k, total)</span></code></pre></div></div>
<p><strong>Predict</strong> the first three lines, then run it:</p>
<pre class="fish"><code>python3 gauss.py</code></pre>
<p>The last line says <code>100 5050</code>.</p>
<p>Now make an error on purpose: delete the spaces in front of <code>total = total + k</code> and run it. Read the error, guess what it means, then paste it to Claude with your guess.</p>
<div class="callout callout-style-default callout-important callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Important</span>Why 101?
</div>
</div>
<div class="callout-body-container callout-body">
<p>Change <code>range(1, 101)</code> to <code>range(1, 100)</code>. <strong>Predict</strong> the last line, then run it. An AI makes exactly this kind of mistake, and you just learned to catch it.</p>
</div>
</div>
</section>
<section id="gausss-trick" class="level2">
<h2 class="anchored" data-anchor-id="gausss-trick">Gauss’s trick</h2>
<p>Write the sum forwards and backwards:</p>
<pre><code>  1 +  2 +  3 + ... +  99 + 100
100 + 99 + 98 + ... +   2 +   1</code></pre>
<p>Each column adds up to <strong>101</strong>, and there are <strong>100</strong> columns. Two copies of the sum make 100 × 101 = 10100, so one copy is <strong>5050</strong>. For any <img src="https://latex.codecogs.com/png.latex?n">:</p>
<p><img src="https://latex.codecogs.com/png.latex?1%20+%202%20+%20%5Ccdots%20+%20n%20=%20%5Cfrac%7Bn(n+1)%7D%7B2%7D"></p>
<p><strong>Explain it to Claude</strong> in your own words, without the picture, and let it look for the hole. (Does your explanation work when <img src="https://latex.codecogs.com/png.latex?n"> is odd?)</p>
</section>
<section id="a-check-inside-the-loop" class="level2">
<h2 class="anchored" data-anchor-id="a-check-inside-the-loop">A check inside the loop</h2>
<pre class="fish"><code>nvim invariant.py</code></pre>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb28" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb28-1">total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb28-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> k <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">101</span>):</span>
<span id="cb28-3">    total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> k</span>
<span id="cb28-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">assert</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb28-5"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(total)</span></code></pre></div></div>
<p><code>assert</code> means “this must be true here”: if it’s false, Python stops with an <code>AssertionError</code>. So this loop checks Gauss’s formula after every step. <strong>Predict</strong>, then run it:</p>
<pre class="fish"><code>python3 invariant.py</code></pre>
<p>It prints <code>5050</code>: no step failed.</p>
<p>Now break the loop on purpose: change <code>total + k</code> to <code>total + k + 1</code>. <strong>Predict:</strong> at which <code>k</code> does the <code>assert</code> stop it? Then change it back.</p>
</section>
<section id="check-lots-of-cases" class="level2">
<h2 class="anchored" data-anchor-id="check-lots-of-cases">Check lots of cases</h2>
<p><code>invariant.py</code> only checks up to 100. To check other <code>n</code>, we turn the adding-up into a <strong>function</strong>, made with <code>def</code>: a recipe with a name. [claude: give more defintion of funcitons and def, its an import basic, and then also introduce what assert does with perhaps a simpler example to try like assert 4 % 2 == 0 verssu assert 4 % 2 == 1, then after the check, perhaps another one to do the n^3 example below]</p>
<p><code>n</code> is its input, and <code>return</code> hands back the answer, so <code>sum_to(100)</code> is 5050.</p>
<pre class="fish"><code>nvim check.py</code></pre>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb31" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb31-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> sum_to(n):</span>
<span id="cb31-2">    total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb31-3">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> k <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):</span>
<span id="cb31-4">        total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> k</span>
<span id="cb31-5">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> total</span>
<span id="cb31-6"></span>
<span id="cb31-7"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> n <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>):</span>
<span id="cb31-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">assert</span> sum_to(n) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb31-9"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"all 1000 agree"</span>)</span></code></pre></div></div>
<p>The first part is the loop from <code>gauss.py</code>, indented under <code>def</code>, with <code>n + 1</code> where 101 was. The second part asks, for every <code>n</code> from 0 to 999, whether the loop and the formula agree. <strong>Predict</strong>, then run it:</p>
<pre class="fish"><code>python3 check.py</code></pre>
<p>It prints <code>all 1000 agree</code>. Is the formula now true for <em>every</em> number? <strong>Decide before reading on.</strong></p>
<p>No.&nbsp;A thousand examples is still just examples. Mathematicians have found patterns that held for millions of cases and then broke.</p>
</section>
<section id="why-it-can-never-fail" class="level2">
<h2 class="anchored" data-anchor-id="why-it-can-never-fail">Why it can never fail</h2>
<p>A claim that stays true after every round is a <strong>loop invariant</strong>, like the <code>assert</code> in <code>invariant.py</code>. Now the big question: if the <code>assert</code> passed in one round, why <em>must</em> it pass in the next? (What does one round add to <code>total</code>?) <strong>Decide before reading on.</strong></p>
<p>Say it passed in the round for <img src="https://latex.codecogs.com/png.latex?k%20-%201">:</p>
<p><img src="https://latex.codecogs.com/png.latex?2%20%5Ccdot%20%5Ctext%7Btotal%7D%20=%20(k-1)k"></p>
<p>The next round, for <img src="https://latex.codecogs.com/png.latex?k">, adds <img src="https://latex.codecogs.com/png.latex?k">, so <img src="https://latex.codecogs.com/png.latex?2%20%5Ccdot%20%5Ctext%7Btotal%7D"> grows by <img src="https://latex.codecogs.com/png.latex?2k">:</p>
<p><img src="https://latex.codecogs.com/png.latex?(k-1)k%20+%202k%20=%20k(k+1)"></p>
<p>which is exactly what the <code>assert</code> checks. It passes in the first round, and each passing round makes the next one pass, so it can never fail, however far the loop runs.</p>
<p>That’s no longer a check. It’s a proof for every <img src="https://latex.codecogs.com/png.latex?n">, and it’s the method from maths class: <strong>induction</strong>. The first round is the first domino, and each round knocks over the next.</p>
<p><strong>Write this proof on paper, in your own words.</strong> You’ll need it in Part 4.</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Try it yourself
</div>
</div>
<div class="callout-body-container callout-body">
<ol type="1">
<li>Add up the odd numbers 1 + 3 + 5 + … and print the running total for the first 10. What pattern do you see? <em>Why</em> would it hold? (Try drawing it with dots.)</li>
<li>Ask Claude: <em>“Write a short Python function that adds up 1 to n, with one hidden bug. Don’t tell me where.”</em> Find the bug by reasoning first, then prove it with a check.</li>
</ol>
</div>
</div>
</section>
</section>
<section id="part-4-lean" class="level1">
<h1>Part 4: Lean</h1>
<section id="why-ai-and-lean-belong-together" class="level2">
<h2 class="anchored" data-anchor-id="why-ai-and-lean-belong-together">Why AI and Lean belong together</h2>
<p>A proof that <em>sounds</em> right can still be wrong, and Claude is very good at sounding right. Lean doesn’t care how convincing a proof sounds: it checks every step, or it refuses. So the AI suggests, and Lean checks.</p>
<p>That leaves you the most important job: <strong>does the claim say what you meant?</strong> Lean checks that the proof proves the claim, not that it’s the claim you wanted.</p>
</section>
<section id="what-lean-is" class="level2">
<h2 class="anchored" data-anchor-id="what-lean-is">What Lean is</h2>
<p>Lean is another programming language. It has boxes and loops, like Python, and it can also check proofs. Seeing the same program in a second language shows which parts are the <em>ideas</em> (a box, a repeat) and which are just <em>spelling</em>.</p>
<p>We’ll use Lean in the browser, with Claude beside it. <strong>Claude in Chrome</strong> is Claude in a side panel of Chrome that can read the page you’re on and type into it. Install the <strong>Claude</strong> extension from the Chrome Web Store, sign in, and pin it (the puzzle-piece icon, then the pin).</p>
<p>Open <a href="https://live.lean-lang.org">live.lean-lang.org</a>, delete what’s there, and paste:</p>
<pre class="lean"><code>def sumLoop (n : Nat) : Nat := Id.run do
  let mut total := 0
  for k in [1:n+1] do
    total := total + k
  return total

#eval sumLoop 100</code></pre>
<p>The panel on the right shows <code>5050</code>. Here it is next to <code>sum_to</code> from <code>check.py</code>:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Python</th>
<th>Lean</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>def sum_to(n):</code></td>
<td><code>def sumLoop (n : Nat) : Nat :=</code></td>
</tr>
<tr class="even">
<td><code>total = 0</code></td>
<td><code>let mut total := 0</code></td>
</tr>
<tr class="odd">
<td><code>for k in range(1, n + 1):</code></td>
<td><code>for k in [1:n+1] do</code></td>
</tr>
<tr class="even">
<td><code>total = total + k</code></td>
<td><code>total := total + k</code></td>
</tr>
<tr class="odd">
<td><code>return total</code></td>
<td><code>return total</code></td>
</tr>
</tbody>
</table>
<ul>
<li><code>Nat</code> is a <strong>natural number</strong> (0, 1, 2, …). <code>(n : Nat) : Nat</code> says <code>n</code> is one, and so is the answer.</li>
<li><code>let mut</code> makes a box you can change (<em>mutable</em>).</li>
<li><code>:=</code> puts something into a box, like Python’s <code>=</code>.</li>
<li><code>Id.run do</code> says “steps, done in order”. Just copy it.</li>
<li><code>#eval</code> runs a line and shows the answer.</li>
</ul>
<p><strong>Explain:</strong> what does Lean make you say that Python doesn’t?</p>
</section>
<section id="two-programs-one-answer" class="level2">
<h2 class="anchored" data-anchor-id="two-programs-one-answer">Two programs, one answer</h2>
<p>Gauss’s formula is a program too, a much faster one. Add it below:</p>
<pre class="lean"><code>def sumFormula (n : Nat) : Nat := n * (n + 1) / 2

#eval sumFormula 100</code></pre>
<p><code>/</code> on natural numbers rounds down, like Python’s <code>//</code>. (Why doesn’t that rounding ever change the answer here?)</p>
</section>
<section id="checking-isnt-proving" class="level2">
<h2 class="anchored" data-anchor-id="checking-isnt-proving">Checking isn’t proving</h2>
<p>Do the two programs agree? Add one check, for <img src="https://latex.codecogs.com/png.latex?n%20=%201000">:</p>
<pre class="lean"><code>#eval sumLoop 1000 == sumFormula 1000</code></pre>
<p>It shows <code>true</code>. Now add the claim for <em>every</em> <img src="https://latex.codecogs.com/png.latex?n">:</p>
<pre class="lean"><code>theorem agree (n : Nat) : sumLoop n = sumFormula n := by
  sorry</code></pre>
<p>Read it out loud: “a claim called <code>agree</code>: for any natural number <img src="https://latex.codecogs.com/png.latex?n">, the loop and the formula give the same answer. Proof: <code>sorry</code>.” This is <code>check.py</code> again, for every <img src="https://latex.codecogs.com/png.latex?n"> instead of a thousand.</p>
<p><code>sorry</code> means “I’ll prove this later”. Lean understands the claim but warns: <code>declaration uses `sorry`</code>. You still owe a proof, and checks like <code>true</code> don’t count. What Lean wants is an argument like your loop invariant.</p>
</section>
<section id="ai-translates-lean-checks" class="level2">
<h2 class="anchored" data-anchor-id="ai-translates-lean-checks">AI translates, Lean checks</h2>
<p>Writing Lean proofs yourself comes later in the course. Today Claude only <em>translates</em> your proof, and you watch what Lean says.</p>
<p>Open Claude in Chrome on the Lean page, type in your paper proof from Part 3, and ask:</p>
<blockquote class="blockquote">
<p>Please prove <code>agree</code> in Lean by translating my proof, and see whether Lean accepts it. Don’t fix any mistakes in my proof, and don’t fix anything Lean complains about. Only translate my proof into Lean, and translate Lean’s answer back into English.</p>
</blockquote>
<p>It may take a few minutes, and then Lean should accept it. Claude may add a smaller claim along the way (something like “one more round adds <img src="https://latex.codecogs.com/png.latex?n%20+%201">”). **Where is that step in your paper proof?</p>
<p>Next, a claim of my own. Before you send it, <strong>predict</strong>: is it true? Try <img src="https://latex.codecogs.com/png.latex?n%20=%200">, 1 and 2 on paper. Then ask:</p>
<blockquote class="blockquote">
<p>Now I want to check whether this also means that sum(n)^2 = n^3. Please convert that to Lean, have Lean check it, and translate only Lean’s answer back into English. Don’t fix the proof.</p>
</blockquote>
<p>What did Lean say? And did Claude do only what you asked, or did it quietly change the claim to one that works?</p>
</section>
<section id="what-we-did-today" class="level2">
<h2 class="anchored" data-anchor-id="what-we-did-today">What we did today</h2>
<ul>
<li>Set up Linux with Claude as a tutor, plus fish, nvim and Python.</li>
<li>Added 1 to 100 with a loop and with Gauss’s trick.</li>
<li>Checked a thousand cases, and saw why that isn’t a proof.</li>
<li>Put a check inside the loop, and saw why it can never fail: induction.</li>
<li>Wrote the same loop in Lean, next to Gauss’s formula, and claimed the two programs always agree.</li>
<li>Had Claude translate your proof for Lean to check.</li>
</ul>
<p>The computer did the adding. You did the reasoning.</p>


</section>
</section>

 ]]></description>
  <category>lessons</category>
  <category>python</category>
  <category>lean</category>
  <guid>https://nealcnotes.com/posts/lesson1-setup-gauss.html</guid>
  <pubDate>Sat, 31 Oct 2026 07:00:00 GMT</pubDate>
</item>
</channel>
</rss>
