<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=Lean_theorem_prover%2FExplainers%2FChecking_instead_of_convincing</id>
	<title>Lean theorem prover/Explainers/Checking instead of convincing - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=Lean_theorem_prover%2FExplainers%2FChecking_instead_of_convincing"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Checking_instead_of_convincing&amp;action=history"/>
	<updated>2026-10-21T08:23:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Checking_instead_of_convincing&amp;diff=6753&amp;oldid=prev</id>
		<title>PMA Publisher: Published from the Principia Machina source</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Checking_instead_of_convincing&amp;diff=6753&amp;oldid=prev"/>
		<updated>2026-10-15T19:34:20Z</updated>

		<summary type="html">&lt;p&gt;Published from the Principia Machina source&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:34, 15 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{DISPLAYTITLE:Checking instead of convincing}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{DISPLAYTITLE:Checking instead of convincing}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Technical|Lean theorem prover/Foundations/Terms, types and judgments|Lean theorem prover/System/The Lean kernel}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Technical|Lean theorem prover/Foundations/Terms, types and judgments|Lean theorem prover/System/The Lean kernel}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Lean theorem prover map}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Mathematics accepts a proof when the people competent to judge it are convinced.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Mathematics accepts a proof when the people competent to judge it are convinced.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key pma_cutover_20261020t051351z-soft_:diff:1.41:old-6546:rev-6753:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>PMA Publisher</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Checking_instead_of_convincing&amp;diff=6546&amp;oldid=prev</id>
		<title>PMA Publisher: Published from the Principia Machina source</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Checking_instead_of_convincing&amp;diff=6546&amp;oldid=prev"/>
		<updated>2026-10-14T18:00:45Z</updated>

		<summary type="html">&lt;p&gt;Published from the Principia Machina source&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Checking instead of convincing}}&lt;br /&gt;
{{Technical|Lean theorem prover/Foundations/Terms, types and judgments|Lean theorem prover/System/The Lean kernel}}&lt;br /&gt;
&lt;br /&gt;
Mathematics accepts a proof when the people competent to judge it are convinced.&lt;br /&gt;
This page describes how that works, two well-documented cases in which it came&lt;br /&gt;
under strain, what a mechanical check adds to it, and the principle, known as&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;de Bruijn&amp;#039;s criterion&amp;#039;&amp;#039;&amp;#039;, that keeps a mechanical checker small enough to be&lt;br /&gt;
trusted itself.&lt;br /&gt;
&lt;br /&gt;
== How a proof is accepted ==&lt;br /&gt;
&lt;br /&gt;
A proof written for a journal does two jobs at once. It &amp;#039;&amp;#039;&amp;#039;convinces&amp;#039;&amp;#039;&amp;#039;: it gives&lt;br /&gt;
enough steps for a reader to verify, one by one, that the statement holds. And it&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;explains&amp;#039;&amp;#039;&amp;#039;: it shows why the statement is true, and how one might have found&lt;br /&gt;
the argument.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot;&amp;gt;Herman Geuvers, &amp;quot;Proof assistants: history, ideas and future&amp;quot;, &amp;#039;&amp;#039;Sādhanā&amp;#039;&amp;#039; 34 (1), 2009, pp. 3–25. [https://doi.org/10.1007/s12046-009-0001-5 doi:10.1007/s12046-009-0001-5]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acceptance runs through people. A journal sends the paper to experts, the&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;referees&amp;#039;&amp;#039;&amp;#039;, who read it, test the steps they doubt, and report. If they are&lt;br /&gt;
satisfied, the paper is published, and other mathematicians read it, use it and&lt;br /&gt;
sometimes find faults later. The arrangement rests on a reasonable bet: one reader&lt;br /&gt;
may overlook a mistake, but many readers are unlikely to overlook the same&lt;br /&gt;
one.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For most proofs this works well. It strains when a proof is too long or too&lt;br /&gt;
computational for a person to read in full, or when too few people have read it at&lt;br /&gt;
all.&lt;br /&gt;
&lt;br /&gt;
== The Kepler conjecture ==&lt;br /&gt;
&lt;br /&gt;
In 1611 Johannes Kepler stated that no way of packing equal balls in space is&lt;br /&gt;
denser than the familiar stack in which greengrocers pile oranges, the&lt;br /&gt;
face-centred cubic packing. Thomas Hales, working with Samuel Ferguson, settled&lt;br /&gt;
the question in 1998.&amp;lt;ref name=&amp;quot;flyspeck&amp;quot;&amp;gt;Thomas Hales and 21 co-authors, &amp;quot;A formal proof of the Kepler conjecture&amp;quot;, &amp;#039;&amp;#039;Forum of Mathematics, Pi&amp;#039;&amp;#039; 5, e2, 2017. [https://doi.org/10.1017/fmp.2017.1 doi:10.1017/fmp.2017.1]; preprint [https://arxiv.org/abs/1501.02155 arXiv:1501.02155].&amp;lt;/ref&amp;gt; The argument reduced the problem to&lt;br /&gt;
about a thousand complicated inequalities, which Hales checked with computer&lt;br /&gt;
programs.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The referees were in a difficult position. Checking the inequalities by hand was&lt;br /&gt;
out of reach, and checking the programs themselves was never&lt;br /&gt;
attempted.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt; After years of work they reported a strong&lt;br /&gt;
conviction that the approach was essentially correct, having found the specific&lt;br /&gt;
claims they examined to be right; but they could not certify every step. The proof&lt;br /&gt;
was published without that certification.&amp;lt;ref name=&amp;quot;flyspeck&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;hales2005&amp;quot;&amp;gt;Thomas C. Hales, &amp;quot;A proof of the Kepler conjecture&amp;quot;, &amp;#039;&amp;#039;Annals of Mathematics&amp;#039;&amp;#039; 162 (3), 2005, pp. 1065–1185. [https://doi.org/10.4007/annals.2005.162.1065 doi:10.4007/annals.2005.162.1065]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hales answered by setting out to check the whole proof by machine. He announced&lt;br /&gt;
the &amp;#039;&amp;#039;&amp;#039;Flyspeck&amp;#039;&amp;#039;&amp;#039; project in 2003. It used two proof assistants, HOL Light and&lt;br /&gt;
Isabelle, and formalised both the written argument and the computer&lt;br /&gt;
calculations. The nonlinear inequalities were checked with HOL Light in July and&lt;br /&gt;
August 2014, and checked again that October on different machines, with identical&lt;br /&gt;
results.&amp;lt;ref name=&amp;quot;flyspeck&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A proof only its authors had read ==&lt;br /&gt;
&lt;br /&gt;
In December 2020 Peter Scholze asked for a theorem of his and Dustin Clausen&amp;#039;s to&lt;br /&gt;
be checked in Lean. He counted it among his most important results, others&lt;br /&gt;
would rely on it without rereading it, and nobody besides its authors had gone&lt;br /&gt;
through the details; he wrote that he still had small doubts.&amp;lt;ref name=&amp;quot;scholze2020&amp;quot;&amp;gt;Peter Scholze, &amp;quot;Liquid tensor experiment&amp;quot;, guest post on the &amp;#039;&amp;#039;Xena&amp;#039;&amp;#039; blog, 5 December 2020. [https://xenaproject.wordpress.com/2020/12/05/liquid-tensor-experiment/ xenaproject.wordpress.com] (accessed 13 October 2026).&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A group led by Johan Commelin completed the check of the main proof on 28 May&lt;br /&gt;
2021. The work found some imprecisions and oversights, each repaired with minor changes, and Scholze&lt;br /&gt;
wrote afterwards that he had no remaining doubts about the main&lt;br /&gt;
proof.&amp;lt;ref name=&amp;quot;scholze2021&amp;quot;&amp;gt;Peter Scholze, &amp;quot;Half a year of the Liquid Tensor Experiment: amazing developments&amp;quot;, guest post on the &amp;#039;&amp;#039;Xena&amp;#039;&amp;#039; blog, 5 June 2021. [https://xenaproject.wordpress.com/2021/06/05/half-a-year-of-the-liquid-tensor-experiment-amazing-developments/ xenaproject.wordpress.com] (accessed 13 October 2026).&amp;lt;/ref&amp;gt; The history page on&lt;br /&gt;
[[Lean theorem prover/History/The Liquid Tensor Experiment|the Liquid Tensor Experiment]]&lt;br /&gt;
tells the story.&lt;br /&gt;
&lt;br /&gt;
== What a mechanical check adds ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Every step, not a sample.&amp;#039;&amp;#039;&amp;#039; A referee reads with judgement and tests what looks&lt;br /&gt;
doubtful. A proof assistant checks every step, including the dull ones, and&lt;br /&gt;
cannot be tired or hurried.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The same verdict for every reader.&amp;#039;&amp;#039;&amp;#039; Anyone can run the check again and get&lt;br /&gt;
the same answer. The verdict does not depend on who wrote the proof, how famous&lt;br /&gt;
they are, or how patient the reader is.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A smaller question for people.&amp;#039;&amp;#039;&amp;#039; Once the steps are checked, specialist&lt;br /&gt;
judgement is needed for a much smaller part of the work. The Flyspeck authors put&lt;br /&gt;
it this way: a proof assistant largely takes the mathematical referees out of the&lt;br /&gt;
verification, but someone must still confirm that the statement proved is the&lt;br /&gt;
theorem everyone means, and that no unapproved axioms were&lt;br /&gt;
added.&amp;lt;ref name=&amp;quot;flyspeck&amp;quot; /&amp;gt; The page on&lt;br /&gt;
[[Lean theorem prover/Explainers/Stating the right thing|stating the right thing]]&lt;br /&gt;
is about that remaining question.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What it does not add.&amp;#039;&amp;#039;&amp;#039; A mechanical check convinces; it does not explain. Its&lt;br /&gt;
level of detail is usually a hindrance to understanding why a theorem&lt;br /&gt;
holds.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt; Nor does it end doubt for ever. A checker is a&lt;br /&gt;
program, and a machine-checked proof may still be faulty; the most that can be&lt;br /&gt;
done is to make that as unlikely as possible.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== De Bruijn&amp;#039;s criterion ==&lt;br /&gt;
&lt;br /&gt;
That last point raises an obvious objection. If the checker is a large and&lt;br /&gt;
complicated program, there is no clear reason to trust it more than a careful&lt;br /&gt;
referee.&lt;br /&gt;
&lt;br /&gt;
An answer goes back to &amp;#039;&amp;#039;&amp;#039;Automath&amp;#039;&amp;#039;&amp;#039;, a project begun by Nicolaas de Bruijn in&lt;br /&gt;
1967.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt; The idea is to separate the work in two. The large,&lt;br /&gt;
clever program that helps a person write a proof should also produce a complete&lt;br /&gt;
record of it, a &amp;#039;&amp;#039;&amp;#039;proof object&amp;#039;&amp;#039;&amp;#039; in which every step is explicit. A second&lt;br /&gt;
program, small and simple, then checks that record. It should be simple enough&lt;br /&gt;
that a sceptical reader could write such a checker for themselves. Henk Barendregt&lt;br /&gt;
named this requirement the &amp;#039;&amp;#039;&amp;#039;de Bruijn criterion&amp;#039;&amp;#039;&amp;#039;.&amp;lt;ref name=&amp;quot;geuvers2009&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The effect is that trust no longer depends on the size of the system. The parts&lt;br /&gt;
that search, guess and automate may be large and may contain faults; a fault there&lt;br /&gt;
can stop a proof from being found, but whatever they produce is checked by the&lt;br /&gt;
small program before it is accepted.&lt;br /&gt;
&lt;br /&gt;
Lean is built this way. A finished Lean proof is a term that records the whole&lt;br /&gt;
argument, enough to be checked independently.&amp;lt;ref name=&amp;quot;ref-types&amp;quot;&amp;gt;The Lean Developers, &amp;quot;The type system&amp;quot;, &amp;#039;&amp;#039;The Lean Language Reference&amp;#039;&amp;#039;, for Lean 4.35.0. [https://lean-lang.org/doc/reference/4.35.0/The-Type-System/ lean-lang.org/doc/reference/4.35.0/The-Type-System/] (accessed 13 October 2026).&amp;lt;/ref&amp;gt; The part of&lt;br /&gt;
Lean that has the last word, Lean&amp;#039;s kernel, was meant from the start to be small&lt;br /&gt;
and independently implementable, and independent implementations of it&lt;br /&gt;
exist.&amp;lt;ref name=&amp;quot;ref-intro&amp;quot;&amp;gt;The Lean Developers, &amp;quot;Introduction&amp;quot;, &amp;#039;&amp;#039;The Lean Language Reference&amp;#039;&amp;#039;, for Lean 4.35.0, section 1.1, &amp;quot;History&amp;quot;. [https://lean-lang.org/doc/reference/4.35.0/Introduction/ lean-lang.org/doc/reference/4.35.0/Introduction/] (accessed 13 October 2026).&amp;lt;/ref&amp;gt; The pages on&lt;br /&gt;
[[Lean theorem prover/Explainers/The small trusted core|the small trusted core]] and&lt;br /&gt;
[[Lean theorem prover/Explainers/Checking a proof again later|checking a proof again later]]&lt;br /&gt;
describe both.&lt;br /&gt;
&lt;br /&gt;
What the small checker checks is a proof written in a particular logic. The next&lt;br /&gt;
page describes the idea at the centre of that logic: that a statement can be&lt;br /&gt;
treated as a type, and its proof as a thing of that type.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
&lt;br /&gt;
* [[Lean theorem prover/Explainers/Propositions as types|Propositions as types]]: the idea that makes a proof something a program can check.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>PMA Publisher</name></author>
	</entry>
</feed>