<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: Gajurgensen</title><link>https://news.ycombinator.com/user?id=Gajurgensen</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 25 Aug 2026 06:44:38 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=Gajurgensen" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by Gajurgensen in "“We have information that Moonshot distilled Fable for the development of K3”"]]></title><description><![CDATA[
<p>I didn't mean to imply that the US is more likely than elsewhere to responsibly steer AI via policy. But I <i>do</i> think it is easier if it can be done internally as opposed to via international dealmaking.</p>
]]></description><pubDate>Thu, 23 Jul 2026 14:31:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49022291</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=49022291</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49022291</guid></item><item><title><![CDATA[New comment by Gajurgensen in "“We have information that Moonshot distilled Fable for the development of K3”"]]></title><description><![CDATA[
<p>It is incredibly important to whether the US can maintain its AI lead. If foreign competition is closing the gap only by distillation, then the frontier labs can focus on preventing distillation and maintain their lead that way.<p>US dominance is also important for approaches to safety, especially political approaches. If the frontier models are all US-based, safety might be tackled via internal US policy. If other countries can independently train competitive models, international cooperation is required.<p>Edit: It is also important for the business model. Companies won't be able to justify tremendous training costs if competitors can replicate their product much more cheaply via distillation.</p>
]]></description><pubDate>Wed, 22 Jul 2026 19:53:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=49012464</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=49012464</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49012464</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Introduction to Formal Verification with Lean Part 1"]]></title><description><![CDATA[
<p>I'll note that not all segments of a proof are equally interesting. Many steps, perhaps even most when it comes to proofs about programs, are "obvious". I find that tactic-based proofs tend to be more legible than providing very explicit proof objects directly, because it allows the obvious but tedious details to be elided. What you are left with are just the most important high-level steps that the automation couldn't infer (or which we just don't wish to delegate). Things like "induct according to this scheme after generalizing this variable" or "first prove this auxiliary lemma" or "apply this inverse function to both sides so that they cancel".<p>I'd also argue that automation is essential to practical proof engineering. It make the proofs less brittle to minor changes and therefore more maintainable.<p>Edit: a couple more thoughts. First, there is nothing stopping you from defining proof objects directly in Lean without tactics. That flexibility is quite nice -- you can automate as much or as little as you like. Of course, in practice, people almost always use tactics. Second, I use the ACL2 prover quite a bit, which is <i>not</i> tactic-based. Instead, you give high-level "hints" that steer the aggressively-automated prover. Funny enough, I have colleagues that look at Lean proofs and say "these proofs are so verbose, how does anyone understand them!".</p>
]]></description><pubDate>Wed, 22 Jul 2026 15:26:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49008334</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=49008334</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49008334</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Why don't you use dependent types?"]]></title><description><![CDATA[
<p>I was referring to issues that arise around the need for heterogeneous equality.<p>As an example, consider the dependent vector type `Vec n`, which is an array of length `n`. An `append` function would have type `{n m: Nat} -> Vec n -> Vec m -> Vec (n + m)`. That is, it takes an array of length `n`, and array of length `m`, and produces an array of length `n + m`.<p>Now imagine that you want to show that `append` is associative. That is, for all `x: Vec n`, `y: Vec m`, and `z: Vec o`, you have `append (append x y) z = append x (append y z)`. We can't prove this because we can't even state the theorem; it is not well-typed. The left-hand side has type `Vec ((n + m) + o)`, while the right-hand side has type `Vec (n + (m + o))`. Those two length values are of course propositionally equal, but they are not definitionally equal in type theories like Lean or Rocq's. That is, the equality is not immediately apparent to the type checker, and so requires a proof. But even with a proof, the statement is ill-typed (because equality is "intentional", not "extensional"). So you have to use a heterogeneous equality operator which allows you to compare two values whose types are propositionally but not definitionally equal. This equality is generally more difficult to work with.<p>Obviously this whole problem goes away if we use a non-dependent array type, as opposed to something length-indexed like this `Vec` type. So unless there is some reason to use the indexed type (e.g., perhaps the compiler can emit more efficient code), I would just use the non-indexed types and prove separately anything I want to know about the length.</p>
]]></description><pubDate>Mon, 03 Nov 2025 20:52:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=45804291</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=45804291</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45804291</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Why don't you use dependent types?"]]></title><description><![CDATA[
<p>I think the question of "necessity" is interesting, because between establishing that something is necessary vs the best option, I'd say the former is easier. And by agreeing that dependent types are not necessary (at least for certain design goals) we give space to the folks creating new provers to experiment with alternatives, which I think that is a good thing. I have been extremely impressed during my limited interactions with Lean, but I'm also vaguely aware of enough pain points to be interested in what other provers can do without being based on curry-howard.<p>Anyway, for what its worth, I generally agree that static typing is preferable. It is just a little more complicated in the context of theorem provers (as opposed to general-purpose, non-verification programming languages) where, for provers not based on type theory, propositions and proof obligations can be used where we might otherwise use types. This can be nice (generally more flexible, e.g. opportunities for non-tagged sums, easy "subtyping"), but also can be a downside (sometimes significant work reproducing what you get "for free" from a type system).</p>
]]></description><pubDate>Sun, 02 Nov 2025 22:49:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=45794131</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=45794131</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45794131</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Why don't you use dependent types?"]]></title><description><![CDATA[
<p>Very interesting. My takeaway is that Dr. Paulson's answer to the question is that there is not anything necessarily wrong with dependent types, but that he doesn't believe they are necessary.<p>I would have liked to read more about Lean's alleged performance issues, and the issues around intentional equality. For the latter, I understand one can run into the need for heterogeneous equality (<a href="https://lean-lang.org/doc/reference/latest/Basic-Propositions/Propositional-Equality/#HEq" rel="nofollow">https://lean-lang.org/doc/reference/latest/Basic-Proposition...</a>) when types are propositionally equal, but not definitionally equal. It has been some time I worked seriously in a dependently-typed language, but I recall coming to the conclusion that dependent types are best used as little as possible, for exactly this reason. If something may be stated as a theorem after the fact instead of putting it in the type, that was my preference.<p>Certainly there is something strongly aesthetically appealing about dependent type theory. The unification of programs and proofs and the natural emergence of independent proof objects. I am open to the idea that overly-dogmatic insistence on a type-theoretic basis to a theorem prover could lead to pragmatic issues, but I'd need to see more examples to be convinced there is a better foundation.<p>Anyway, I agree with Dr. Paulson's point that dependent types aren't necessary to verify interesting systems. He talked more of pure mathematics, but I am more interested in software verification. I work heavily in ACL2 which, not only does it not have dependent types, it doesn't have static typing at all! It is, however, also a first order logic and the both of these facts can sometimes be frustrating. Various libraries have been introduced to simulate typing and higher-ordered reasoning.</p>
]]></description><pubDate>Sun, 02 Nov 2025 17:09:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=45791772</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=45791772</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45791772</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Propositions as Types (2014) [pdf]"]]></title><description><![CDATA[
<p>Think of higher level specifications which do not imply any details of the implementation.<p>For instance, consider a sorting function. One could write a bubble sort and consider that a spec, but that is far too much detail, much of which you don't actually care about. A much better specification would be "the function takes a list 'l' and produces a sorted list which is also a permutation of 'l'." This is the sort of specification we want, but we have more work to fill in the implementation details.<p>This can get arbitrarily difficult if your specification logic is sufficiently expressive. Imagine the spec is something like "solve this unproven mathematical conjecture."</p>
]]></description><pubDate>Wed, 07 May 2025 18:37:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=43919182</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=43919182</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43919182</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Propositions as Types (2014) [pdf]"]]></title><description><![CDATA[
<p>Program synthesis is of course very difficult in general, especially if you want it to be entirely automated. One option to make it more practical is to have the user drive synthesis from specification to implementation via something which looks like a sequence of tactics.<p>(I'll add a plug to some stuff we are working on at Kestrel: <a href="https://www.cs.utexas.edu/~moore/acl2/manuals/latest/index.html?topic=APT____APT" rel="nofollow">https://www.cs.utexas.edu/~moore/acl2/manuals/latest/index.h...</a>. We've used the APT library to do stepwise refinements from specs ACL2 to C code. Each step is something like "make function tail recursive" or "switch to a new, isomorphic shape of the data").<p>By the way, Curry-Howard offers a compelling insight here: deriving programs from specifications (i.e. types+propositions) may be the same process as deriving proofs from propositions. So the two processes can in principle work the exact same way.</p>
]]></description><pubDate>Tue, 06 May 2025 21:08:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=43909654</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=43909654</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43909654</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Translation of Rust's core and alloc crates to Coq for formal verification"]]></title><description><![CDATA[
<p>Very interesting work! I'm curious how you handle loops/recursion? I imagine the `M` monad seen in the examples has a special primitive for loops?</p>
]]></description><pubDate>Wed, 15 May 2024 18:23:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=40370548</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=40370548</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40370548</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Formalizing 100 Theorems"]]></title><description><![CDATA[
<p>Theorem provers aren't just for mathematicians formalizing mathematics. Although, for that purpose, Lean seems to be very popular these days (perhaps followed by Coq?). Theorem provers are also used to formalize software and hardware systems. The people using theorem provers are diverse in their tasks and priorities.<p>Consider three provers/languages: Coq, ACL2, and Dafny.<p>Coq is a very expressive, dependently-typed, higher-order functional language, much in the spirit of Haskell or SML. It is very powerful for writing specifications due to this expressivity, and is therefore a compelling candidate for formalizing mathematics. It also has a very clean separation between proof search and proof checking, allowing for a smaller trusted kernel in the proof checker. However, due to the complexity of the language, writing proofs tends to be a largely manual task, or require domain-specific automation.<p>ACL2, on the other hand, is simpler in its language. It is a first order logic, built atop a total, untyped (at least logically) lisp. It does not produce proof artifacts like Coq, but proofs are much more automated, consisting of only a handful of hints instead of an entire tactic-tree.<p>Finally, Dafny is an imperative language, very much resembling popular and ubiquitous languages familiar to every programmer. Proofs are managed by adding inline annotations, specifying pre and postconditions, invariants, etc. This does not expose hardly any of the proof internals, and may be difficult for large proofs, but is a relatively friendly interface for the working software engineer.</p>
]]></description><pubDate>Fri, 03 Nov 2023 14:23:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=38129209</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=38129209</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38129209</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Formalizing 100 Theorems"]]></title><description><![CDATA[
<p>Coq is constructive be default, but you can add the axiom of choice and the law of the excluded middle to make it classical (other common axioms are functional extensionality, propositional extensionality, and proof irrelevance).<p>Perhaps you are recalling Godel's incompleteness theorem, which says that for any finite formal system (like Coq) there exists a true theorem it is unable to prove?</p>
]]></description><pubDate>Fri, 03 Nov 2023 14:08:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=38128981</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=38128981</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38128981</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Formalizing 100 Theorems"]]></title><description><![CDATA[
<p>ACL2 has a documentation page for the theorems from this list proved: <a href="https://www.cs.utexas.edu/users/moore/acl2/manuals/latest/index.html?topic=ACL2____100-THEOREMS" rel="nofollow noreferrer">https://www.cs.utexas.edu/users/moore/acl2/manuals/latest/in...</a><p>A couple of theorems have actually been proved but not yet reported/counted.</p>
]]></description><pubDate>Fri, 03 Nov 2023 13:57:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=38128832</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=38128832</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38128832</guid></item><item><title><![CDATA[The Curry-Howard Correspondence]]></title><description><![CDATA[
<p>Article URL: <a href="https://grant.jurgensen.dev/2022/01/08/CurryHoward.html">https://grant.jurgensen.dev/2022/01/08/CurryHoward.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=30029388">https://news.ycombinator.com/item?id=30029388</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 21 Jan 2022 20:17:13 +0000</pubDate><link>https://grant.jurgensen.dev/2022/01/08/CurryHoward.html</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=30029388</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30029388</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Haskell Mini-Patterns Handbook"]]></title><description><![CDATA[
<p>That's an awfully long-winded and confusing way to say you think "Boolean blindness" is too nitpicky. Personally, it seems like a pretty valid idea to keep in mind, especially as developers transition from a conventional imperative language to Haskell. Making frequent boolean checks is pretty normal in that space, and pattern matching is less common, which might lead new Haskell programmers to write unidiomatic code.</p>
]]></description><pubDate>Tue, 18 Aug 2020 22:20:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=24205022</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=24205022</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24205022</guid></item><item><title><![CDATA[New comment by Gajurgensen in "A circuit-like notation for lambda calculus (2015)"]]></title><description><![CDATA[
<p>The encoding of natural numbers in lambda calculus can be mysterious at first glance. I'm surprised the author didn't spend more time on it. No need to be so hostile about it though.<p>Essentially, we represent numbers as functions that will call a function a number of times on a base value. So for `zero = λs. λz. z`, we can see if we gave it a function `s`, and a value `z`, it would apply `s` zero times to `z`. For `one = λs. λz. s z`, clearly `s` is applied once to `z`. I think you can see the rest of the pattern. Its really as simple as that.<p>We can then define the successor function as `suc = λn. λs. λz. s (n s z)` (I'm not sure why the author doesn't write this out. Instead he confuses the successor function with the `s` argument). We can see `suc` behaves as expected with examples. `suc one = (λn. λs. λz. s (n s z)) one = λs. λz. s (one s z) = λs. λz. s ((λs. λz. s z) s z) = λs. λz. s (s z) = two`. All we need is our definition of `zero` and `suc`, and we can define any natural number.<p>Now go back and look at the definition of `plus` and it should make a lot more sense.</p>
]]></description><pubDate>Tue, 18 Aug 2020 02:43:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=24194746</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=24194746</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24194746</guid></item><item><title><![CDATA[New comment by Gajurgensen in "A philosophical difference between Haskell and Lisp (2015)"]]></title><description><![CDATA[
<p>Let's say getting those n and m values has a nasty type like `getNM :: IO (Maybe (Int, Int))`. All you need to do is map twice when using the original function.<p><pre><code>  foo (n, m) = take n . filter p . drop m

  bar = fmap (fmap foo) getNM
</code></pre>
It's a little awkward, but no major refactor. A small price to pay for the nice types we get. I'd argue that if other languages make dealing with IO and optional values easier, its because they don't bother restricting IO (not necessarily criticizing that), or they don't bother checking completeness over optionals (i.e. a stray `null` can show up anywhere and derail the program, which I do think is a bad thing). Overall, Haskell provides many powerful tools for composing complex types, such as the functor/applicative/monad classes.</p>
]]></description><pubDate>Mon, 03 Aug 2020 02:53:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=24033772</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=24033772</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24033772</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Concrete Semantics"]]></title><description><![CDATA[
<p>I highly recommend people interested in Coq start with Pierce's Logical Foundations. It is by far the most accessible introduction to Coq I've found. I'm working through Chlipala's books next. CPDT is a great deep-dive into more advanced use cases of Coq as well as its theoretical underpinnings. I'll be taking a class this semester based on FRAP, my understanding is it hits those formal methods and language topics without specifically emphasizing Coq, except for the exercises.<p>As an aside, since Coq is the only theorem proving language I know well, I am curious what the pros/cons are as compared to Isabelle/HOL, F*, Lean, etc. Coq has been around for a while, but I keep seeing new theorem provers pop up. What are the alleged weaknesses of Coq that other languages are trying to fix?</p>
]]></description><pubDate>Fri, 17 Jan 2020 17:57:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=22077235</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=22077235</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=22077235</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Equifax doesn't want consumers to get their $125"]]></title><description><![CDATA[
<p>I understand that the pervasive cynisicm can be exausting, but in the case of computer security, it really is warranted.</p>
]]></description><pubDate>Tue, 17 Sep 2019 17:24:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=20997720</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=20997720</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20997720</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Elegant Error Handling with the JavaScript “Either” Monad"]]></title><description><![CDATA[
<p>It would be nice if there was a standard type alias for Either which explicitly labeled good/bad values.<p>That being said, I don't think it takes that much energy to remember that the right is the good value. If you are comfortable with monads, just remember that monads must be parameterized over a single type, and for Either that will be the right type (because we must partially apply the type constructor with the left type to get it down to the correct form).</p>
]]></description><pubDate>Wed, 19 Jun 2019 19:12:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=20226377</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=20226377</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20226377</guid></item><item><title><![CDATA[New comment by Gajurgensen in "Use Coq in Your Browser: The Js Coq Theorem Prover Online"]]></title><description><![CDATA[
<p>This is great! It's not going to replace proof general + (evil mode) emacs for me, but this would be a great way to introduce people to Coq without worrying about installation.</p>
]]></description><pubDate>Tue, 18 Jun 2019 14:57:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=20213784</link><dc:creator>Gajurgensen</dc:creator><comments>https://news.ycombinator.com/item?id=20213784</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20213784</guid></item></channel></rss>