<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: momentoftop</title><link>https://news.ycombinator.com/user?id=momentoftop</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 28 Jul 2026 23:27:46 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=momentoftop" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by momentoftop in "We have proof automation now"]]></title><description><![CDATA[
<p>Converting natural language steps to a formal language isn't too challenging. But basically none of those steps will follow directly from the previous steps by any primitive deduction rule of any formal system. From the perspective of formal logic, there are massive gaps in the reasoning, and these need to be filled to pass the verifier. And they <i>are</i> absolutely massive, so massive that it would be completely intractable to fill them in manually.<p>That's where most of the tech in a theorem prover exists: its tooling to automatically fill in the gaps so your proof can pass the verifier. The tools and automation here are genuinely great, but you still end up having to write way more steps and inferences than you'd see in any maths textbook, and the details are far more fiddly because the formal verification is not very forgiving.<p>As an illustration, consider how you get from:<p><pre><code>  X = (x + y)(z + w)
</code></pre>
to<p><pre><code>  X = xz + xw + yz + yw
</code></pre>
The second equation doesn't follow directly from the first in any logical system. Instead, it follows by the distributive law, commutativity and associativity of addition, commutativity of multiplication, symmetry and transitivity of equality, and you'll need to have some means to specialise these universal statements and reason about term substitution.<p>A modern prover will do simple algebra like this for you, but the tooling had to be built to do it. In other domains, the tooling just dies trying to connect what an average working mathematician or even a mathematics undergraduate would consider obvious, and you're stuck either having to elaborate massive tedium, manually guiding the automation, or having to write new bespoke tooling to fill the gaps.</p>
]]></description><pubDate>Mon, 27 Jul 2026 16:21:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49071840</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=49071840</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49071840</guid></item><item><title><![CDATA[New comment by momentoftop in "We have proof automation now"]]></title><description><![CDATA[
<p>Theorem provers have always made extensive use of AI and automation. Formal logic is insanely laborious, and it took Russell a monumental effort to not get very far with his manual verifications in Principia Mathematica, working out all the details by hand. In 1956, Newell came up with the Logic Theorist which was able to prove a decent chunk of the Principia automatically. When Newell informed him, Russell conceded that his manual efforts had turned out to be wasted effort.<p>I used HOL Light about 15 years ago. The vast majority of the proof details are done by a machine, generally split between term rewriting and then offloads to a  generic automated prover for first-order logic. Your job then is formalising the theorem statements and orchestrating the automation, and the latter still takes an enormous amount of labour.<p>Around this time, we were getting excited about recommender systems for lemma selection. The idea was that you turn every theorem into a bunch of features and train a recommender system against the lemma needed to prove it. Then when you face a new problem, you use its features to recommend which lemmas are likely to be needed. You then throw those lemmas and your conjecture at a bunch of industrial strength automated provers, get the provers to come back with a minimal set of necessary lemmas, and then use your verified automated prover to do the real proof with a tractable set of inputs. It first got implemented in Isabelle/HOL as Sledgehammer, and was a massive improvement to tooling.<p>Now LLMs are here and the game looks completely different. I went back over some verification I spent a week on about 5 years ago, in a pretty obscure formal verifier called HOL Light, on a problem of my own making. I'd seen how terrible ChatGPT was at propositional logic a few years back, so this is the sort of thing I'd had in my back-pocket as an "impossible benchmark" for LLMs. So as a half-joke, I gave Claude the main theorem I wanted proving, hoping to watch it embarrass itself.<p>In a minute or two, it has come up with the same proof strategy I had used, proving four lemmas to get to the main theorem. This was impressive, but that's not the laborious part, and I was pretty confident it would die trying to prove just the first lemma. It has its four lemmas enumerated and goes to thinking, while I go off for a cup of tea.<p>I come back five minutes later and it has scratched off the first goal. I'm pretty shaken, and go off again trying to process that. Come back, the second goal has gone. And then the third. And then the fourth. And then, after just fifteen minutes, it's pulled off a week of my work, done it more efficiently, and near enough one-shotted each proof. That took me a while to process. I realised that if I had this 15 years ago, it would have done 95% of my PhD, which is to say that 15 years ago, I would have done a 20x more ambitious thesis.<p>I contacted my old supervisor, who said the theorem proving community are all on top of this, including the creator of HOL Light, now at AWS. HOL Light, incidentally, was used on what I still believe is the most ambitious mathematical theorem proving project to date, the verification of the Kepler Conjecture. The lead on that project recruited a team to get the proof through over about 5 years. Today, I wouldn't be surprised if he could have solo'd it in 6 months. The same goes for another extremely ambitious project, the verification of the seL4 microkernel. And for another open problem, I know there are people seriously wanting to get a verification of Fermat's Last Theorem, which sounded delusional 15 years ago, but sounds pretty plausible now.<p>Exactly where this goes, I am not sure. I suspect we can now start on verification projects that would have been insane to contemplate. But a few things concern me. One is that Lean seems to have all the mind-share. Maybe it deserves it, but there are very major and mature theorem proving technologies such as Coq (now Rocq), Isabelle, HOL Light, ACL2 and Mizar that I believe still win in terms of having the largest verification libraries and the biggest verified projects. These should not be forgotten about, since they will also probably have the most training data, having been going for many decades now.<p>The second is that verifying our crappy human specifications probably isn't going to fly. As the creator of HOL Light says, representation (how you formalise your problem domain) is still where it all matters, and the LLMs aren't very good at this. And neither are the writers of our current specs. Verifying that a piece of software meets the HTTP spec will be considered an achievement, but it's the wrong goal.<p>We'll need specifications that are modular and composable, that mesh together so that each piece is sanity checking the others. This is how we build mathematics, and it's how we'd need to build software. Specs need to be short and comprehensible, so that a human can verify them. If your spec is as long and complex as the implementation, it's worthless.<p>But I believe it is possible to design software from the ground up where the motivation is specification engineering rather than code engineering, and thereby the specifications become the only human-facing understandable part of software. The implementation is just some artifact that an LLM generates that nobody looks at unless they are curious. And I think LLMS today mean that "build the world over again" isn't as mad a thought as it used to be.</p>
]]></description><pubDate>Mon, 27 Jul 2026 06:16:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=49065741</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=49065741</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49065741</guid></item><item><title><![CDATA[New comment by momentoftop in "No Stack Overflow, No Autocomplete: What Coding Felt Like in the 80s"]]></title><description><![CDATA[
<p>Those manuals were fantastic. I was still coding on our Beeb in the early 90s and I wanted the assembly manual. My dad ordered it from Acorn but it never arrived. Ended up going to the small claims court to get our money back.<p>In the late 90s, I wanted to learn x86 assembly and sent an email to Intel asking for their reference manuals. They sent four huge volumes to me for free. I've no idea whether that was a mistake, but I was very grateful.<p>I still can't believe any of us were able to write programs just from reading books, and I'm not sure to what extent that's even possible today. Even online documentation now seems really crappy compared to those old manuals.</p>
]]></description><pubDate>Sun, 26 Jul 2026 11:04:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=49056828</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=49056828</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49056828</guid></item><item><title><![CDATA[New comment by momentoftop in "Poly/ML – A Standard ML Implementation"]]></title><description><![CDATA[
<p>I understood that MLton was mostly about performance. It does whole program optimisation and is prepared (or does?) monomorphise just about everything, and applies all of your functors at compile time, so that you've got something more like C++ templates but well-typed.<p>> SML/NJ's heap2exec was a bit clunky compared to the others.<p>Unlike the others, SML/NJ implements call/cc, so it's going to need to do something funkier.<p><pre><code>   SMLofNJ.Cont.callcc

   > val it = fn : ('a ?.Cont.cont -> 'a) -> 'a</code></pre></p>
]]></description><pubDate>Tue, 07 Jul 2026 06:18:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=48814248</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=48814248</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48814248</guid></item><item><title><![CDATA[New comment by momentoftop in "Poly/ML – A Standard ML Implementation"]]></title><description><![CDATA[
<p>Isabelle is still a very active LCF proof assistant, and it's still written in Poly/ML. It's pretty aggressively concurrent under the bonnet, and leverages Poly/ML well for that. There's still HOL4, which predates Isabelle and is still going, and it also recommends using Poly/ML.<p>I mostly worked with HOL Light which started as a CAML project and now runs on OCaml.</p>
]]></description><pubDate>Tue, 07 Jul 2026 06:10:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48814199</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=48814199</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48814199</guid></item><item><title><![CDATA[New comment by momentoftop in "Accelerando (2005)"]]></title><description><![CDATA[
<p>I also loved:<p>"It looks like they're doing something purposeful and coordinated, something vast --- a timing channel attack on the virtual machine that's running the universe, ..."</p>
]]></description><pubDate>Sun, 17 May 2026 13:06:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=48168596</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=48168596</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48168596</guid></item><item><title><![CDATA[New comment by momentoftop in "Combinators"]]></title><description><![CDATA[
<p>Most of them have simple types and are easy to define in ML or Haskell.<p><pre><code>   I : a -> a
   I x = x

   K : a -> b -> a
   K x y = x

   W : (a -> a -> b) -> a -> b
   W f x = f x x

   C : (a -> b -> c) -> b -> a -> c
   C f x y = f y x

   B : (a -> b) -> (c -> a) -> c -> b
   B f g x = f (g x)

   Q : (a -> b) -> (b -> c) -> a -> c
   Q f g x = g (f x)
</code></pre>
There are, however, combinators that do self-application (crucially used in the definition of the Y combinator) and these do not have simple types.</p>
]]></description><pubDate>Tue, 31 Mar 2026 17:39:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47590888</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47590888</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47590888</guid></item><item><title><![CDATA[New comment by momentoftop in "Combinators"]]></title><description><![CDATA[
<p>Combinators were an attempt to do logic (and computation falls out) without having to mess around with variables and variable substitution, which is annoying and inelegant because you have to worry about syntax issues like variable capture. Combinators were an attempt to do logic with a much simpler and cleaner syntax.<p>So combinator logic starts with a really simple language, based on a small alphabet of primitive combinators. You can see a bunch listed on the webpage:<p><pre><code>   I, K, W, C, B, Q, ....
</code></pre>
These are the primitive bits of syntax. The only other feature in the language is the ability to apply one combinator to another combinator. You write an application of a combinator "x" to another combinator "y" as "x y", and for convenience, you treat these applications as left associative, so "x y z" means "(x y) z": that is, first apply y to x, and then apply z to the resulting combinator.<p>Two typical combinators are K and S, with which you can form more complex combinators like<p><pre><code>   K K
   S K
   K K K
   K (K K)
   K (S K)</code></pre>
...<p>Combinators generally come with simplification rules, and the ones for K and S are:<p><pre><code>   K x y = x
   S f g x = f x (g x)
</code></pre>
With these, we can start doing interesting reductions like:<p><pre><code>   S K K x = K x (K x) = x
</code></pre>
Now the weird fact: we're suddenly Turing Complete. It turns out that every possible computation is expressible just by building a big combinator out of K and S and applying those two simplification rules. No other machinery is needed.<p>K and S are not the only combinators with this property, and others form an adequate Turing Complete basis.<p>If you've heard of the Curry-Howard correspondence (Curry was responsible for combinatory logic), then combinators provide probably the simplest example of it, since if you give combinators types, you realise you are working with what's called a "Hilbert style" deduction system for propositional logic, which is the simplest sort of formal logical system. Indeed:<p><pre><code>   1. Hilbert's first two axioms for his version of the calculus are exactly the types for K and S above
   2. K and S are invocations of these axioms
   3. Application is modus ponens
   4. The combinator S K K above corresponds to the proof that p → p.
   5. The simplification of S K K x is proof normalisation (if you ever see the proof S K K x for some proof x, you should simplify it to just the proof x).</code></pre></p>
]]></description><pubDate>Tue, 31 Mar 2026 17:25:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=47590673</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47590673</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47590673</guid></item><item><title><![CDATA[New comment by momentoftop in "Combinators"]]></title><description><![CDATA[
<p>Or better yet, the y combinator is this: W S (Q (S I I))<p>The whole point is that we don't need no stinking variables.</p>
]]></description><pubDate>Tue, 31 Mar 2026 16:48:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47590125</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47590125</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47590125</guid></item><item><title><![CDATA[New comment by momentoftop in "A case against currying"]]></title><description><![CDATA[
<p>> It's extremely rare that you need to (printf "%d %d" foo)<p>I write stuff like `map (printf "%d %d" m) ns` all the time. I daresay I even do the map as a partial application, so double currying.</p>
]]></description><pubDate>Sun, 22 Mar 2026 21:21:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47482287</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47482287</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47482287</guid></item><item><title><![CDATA[New comment by momentoftop in "What does " 2>&1 " mean?"]]></title><description><![CDATA[
<p>Ah, thanks, didn't realise they put the whole manual into the manpage. For other tools (e.g. make), the info manual is complete but the manpage is just a summary.</p>
]]></description><pubDate>Fri, 27 Feb 2026 15:43:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47181825</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47181825</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47181825</guid></item><item><title><![CDATA[New comment by momentoftop in "What does " 2>&1 " mean?"]]></title><description><![CDATA[
<p>Try "info bash" on your system. It's the same manual.<p>In Emacs, when I hit C-h i I get a menu of all my info manuals and I first read the bash one there.</p>
]]></description><pubDate>Fri, 27 Feb 2026 15:32:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47181696</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47181696</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47181696</guid></item><item><title><![CDATA[New comment by momentoftop in "What does " 2>&1 " mean?"]]></title><description><![CDATA[
<p>> The pipe operator works similarly, though it's a combination of fork and dup'ing<p>Any time the shell executes a program it forks, not just for redirections. Redirections will use dup before exec on the child process. Piping will be two forks and obviously the `pipe` syscall, with one process having its stdout dup'd to the input end of the pipe, and the other process having its stdin dup'd to the output end.<p>Honestly, I find the BASH manual to be excellently written, and it's probably available on your system even without an internet connection. I'd always go there than rely on stack overflow or an LLM.<p><a href="https://www.gnu.org/software/bash/manual/bash.html#Redirections" rel="nofollow">https://www.gnu.org/software/bash/manual/bash.html#Redirecti...</a></p>
]]></description><pubDate>Fri, 27 Feb 2026 14:39:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47180988</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=47180988</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47180988</guid></item><item><title><![CDATA[New comment by momentoftop in "Does current AI represent a dead end?"]]></title><description><![CDATA[
<p>Yes, as I said: systems such as Russell's encoded "1", "2" and "+" in such a way that the theorem "1 + 1 = 2" is non-trivial to prove. This doesn't say anything about the difficulty of proving that 1 + 1 = 2, but merely the difficulty of proving it in a particular logical encoding. Poincare ridiculed the Principia on this point almost immediately.<p>And had Russell failed to prove that 1 + 1 = 2 in his system, it would not have cast one jot of doubt on the fact that 1 + 1 = 2. It would only have pointed to the inadequacy of the Principia.</p>
]]></description><pubDate>Sun, 29 Dec 2024 00:33:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=42536248</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=42536248</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42536248</guid></item><item><title><![CDATA[New comment by momentoftop in "Does current AI represent a dead end?"]]></title><description><![CDATA[
<p>> Anyone who says AI is useless never had to do the old method of cobbling together git and ffmpeg commands from StackOverflow answers.<p>It's useful for that yes, but I'd rather just live in a world where we didn't have such disasters of CLI that are git and ffmpeg.<p>LLMs are very useful for generating the obscure boilerplate needed because the underlying design is horrible. Relying on it means acquiescing to those terrible designs rather than figuring out redesigns that don't need the LLMs. For comparison, IntelliJ is very good at automating all the boilerplate generation that Java imposes on me, but I'd rather we didn't have boilerplate languages like Java, and I'd rather that IntelliJ's boilerplate generation didn't exist.<p>I fear in many cases that if an LLM is solving your problem, you are solving the wrong problem.</p>
]]></description><pubDate>Fri, 27 Dec 2024 21:44:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=42526319</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=42526319</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42526319</guid></item><item><title><![CDATA[New comment by momentoftop in "Does current AI represent a dead end?"]]></title><description><![CDATA[
<p>There isn't a serious proof that 1+1=2, because it's near enough axiomatic. In the last 150 years or so, we've been trying to find very general logical systems in which we can encode "1", "2" and "+" and for which 1+1=2 is a theorem, and the derivations are sometimes non-trivial, but they are ultimately mere sanity checks that the logical system can capture basic arithmetic.</p>
]]></description><pubDate>Fri, 27 Dec 2024 21:30:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=42526218</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=42526218</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42526218</guid></item><item><title><![CDATA[New comment by momentoftop in "Monads are like burritos (2009)"]]></title><description><![CDATA[
<p>There's no point as such. They are a natural (non-leaky) generalisation of a recurring pattern in mathematics and software over which you can build some general theory and, in the case of programming languages such as Haskell, a general purpose library.<p>Haskell is one of the few languages that lets you write those general purpose libraries. In other languages, there's really no point talking about monads.</p>
]]></description><pubDate>Sun, 02 Jun 2024 19:16:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=40556547</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=40556547</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40556547</guid></item><item><title><![CDATA[New comment by momentoftop in "Lisp: Icing or Cake?"]]></title><description><![CDATA[
<p>Playing "This thing all things devours" is one of the most profound gaming experiences I have had, and I happened to use Malyon. Why wouldn't I use the best text editor to play an inform game?</p>
]]></description><pubDate>Sun, 02 Jun 2024 15:00:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=40554738</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=40554738</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40554738</guid></item><item><title><![CDATA[New comment by momentoftop in "How a software glitch at the UK Post Office ruined lives"]]></title><description><![CDATA[
<p>"Tuttle? His name's Buttle. There must be some mistake."<p>"Mistake? Ha! We don't make mistakes."<p>Proceeds to drop ceiling plug through ceiling.<p>"That's bloody typical. They've gone back to metric without telling us."</p>
]]></description><pubDate>Tue, 16 Jan 2024 08:12:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=39010753</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=39010753</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39010753</guid></item><item><title><![CDATA[New comment by momentoftop in "Lovecraft and Me – How cosmic horror gave me hope (2020)"]]></title><description><![CDATA[
<p>I love the idea of hanging by a thread, of complete existential and cosmic precarity. To again quote the opening of Call of Cthulhu, science will reveal "our frightful position [in reality]". I like the fact that, for Lovecraft, the answer to such terrifying revelations is mostly to draw the curtains and ideally brick up the window and insist "nothing to see here." The opening quote offers that as one solution, but it's recurrent in his stories. It's what the protagonists end up doing in the Dunwich horror mentioned in the blogpost.</p>
]]></description><pubDate>Sun, 12 Nov 2023 19:19:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=38243252</link><dc:creator>momentoftop</dc:creator><comments>https://news.ycombinator.com/item?id=38243252</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38243252</guid></item></channel></rss>