<?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%2FAutomation_and_its_limits</id>
	<title>Lean theorem prover/Explainers/Automation and its limits - 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%2FAutomation_and_its_limits"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Automation_and_its_limits&amp;action=history"/>
	<updated>2026-10-21T09:20:22Z</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/Automation_and_its_limits&amp;diff=6764&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/Automation_and_its_limits&amp;diff=6764&amp;oldid=prev"/>
		<updated>2026-10-15T19:34:34Z</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:Automation and its limits}}&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:Automation and its limits}}&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/System/Decision procedures}}&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/System/Decision procedures}}&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;Some tactics do not wait to be told each step. Given a goal, they search for a proof&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;Some tactics do not wait to be told each step. Given a goal, they search for a proof&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PMA Publisher</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=Lean_theorem_prover/Explainers/Automation_and_its_limits&amp;diff=6557&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/Automation_and_its_limits&amp;diff=6557&amp;oldid=prev"/>
		<updated>2026-10-14T18:00:52Z</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:Automation and its limits}}&lt;br /&gt;
{{Technical|Lean theorem prover/System/Decision procedures}}&lt;br /&gt;
&lt;br /&gt;
Some tactics do not wait to be told each step. Given a goal, they search for a proof&lt;br /&gt;
themselves. This page describes four such tactics, says what each one searches, explains why&lt;br /&gt;
no procedure can settle every question, and shows why a proof found by search is checked like&lt;br /&gt;
any other.&lt;br /&gt;
&lt;br /&gt;
== Four searching tactics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
theorem by_simp (xs : List Nat) : (xs ++ []).length = xs.length := by simp&lt;br /&gt;
&lt;br /&gt;
theorem by_omega (x y : Nat) (h1 : x + 2 * y = 10) (h2 : 3 ≤ y) : x ≤ 4 := by omega&lt;br /&gt;
&lt;br /&gt;
theorem by_decide : ∀ n : Fin 8, n.val * n.val % 8 ≠ 2 := by decide&lt;br /&gt;
&lt;br /&gt;
theorem by_grind (f : Nat → Nat) (a b : Nat) (h1 : a = b) (h2 : f a = 3) :&lt;br /&gt;
    f b = 3 := by grind&lt;br /&gt;
&lt;br /&gt;
#print axioms by_simp&lt;br /&gt;
#print axioms by_omega&lt;br /&gt;
#print axioms by_decide&lt;br /&gt;
#print axioms by_grind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each theorem is proved by a single word, and Lean accepts all four.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;simp&amp;#039;&amp;#039;&amp;#039;, the &amp;#039;&amp;#039;&amp;#039;simplifier&amp;#039;&amp;#039;&amp;#039;, rewrites the goal with a large stock of equations marked as&lt;br /&gt;
simplification rules, working from the inside of an expression outwards, until no rule&lt;br /&gt;
applies.&amp;lt;ref name=&amp;quot;ref-simp&amp;quot;&amp;gt;&amp;#039;&amp;#039;The Lean Language Reference&amp;#039;&amp;#039;, version for Lean 4.34.0&lt;br /&gt;
(lean-lang.org, 2026), chapter 15, &amp;quot;The Simplifier&amp;quot;.&lt;br /&gt;
https://lean-lang.org/doc/reference/4.34.0/The-Simplifier/&amp;lt;/ref&amp;gt; Here it knows that&lt;br /&gt;
appending the empty list changes nothing, and the two sides become the same. It searches for&lt;br /&gt;
places where a known equation applies. It cannot prove what does not follow by such&lt;br /&gt;
rewriting.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;omega&amp;#039;&amp;#039;&amp;#039; settles problems of linear arithmetic over whole numbers: equations and&lt;br /&gt;
inequalities built from unknowns, addition, and multiplication by fixed numbers, with&lt;br /&gt;
division and remainder by fixed numbers. The reference manual calls it not yet a full&lt;br /&gt;
decision procedure, but effective on many problems.&amp;lt;ref name=&amp;quot;ref-tacref&amp;quot;&amp;gt;&amp;#039;&amp;#039;The Lean&lt;br /&gt;
Language Reference&amp;#039;&amp;#039;, version for Lean 4.34.0 (lean-lang.org, 2026), section 14.5, &amp;quot;Tactic&lt;br /&gt;
Reference&amp;quot;: entries for &amp;lt;code&amp;gt;omega&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;decide&amp;lt;/code&amp;gt;.&lt;br /&gt;
https://lean-lang.org/doc/reference/4.34.0/Tactic-Proofs/Tactic-Reference/&amp;lt;/ref&amp;gt; In the&lt;br /&gt;
example, x + 2y = 10 and y of at least 3 force x to be at most 4.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;decide&amp;#039;&amp;#039;&amp;#039; computes. It finds a procedure that decides the statement, runs it, and if the&lt;br /&gt;
answer is &amp;quot;true&amp;quot;, the run is the proof.&amp;lt;ref name=&amp;quot;ref-tacref&amp;quot; /&amp;gt; The example checks the eight&lt;br /&gt;
numbers from 0 to 7 and finds that none has a square leaving remainder 2 on division by 8. It&lt;br /&gt;
works only when the statement contains no unknowns and a deciding procedure is available;&lt;br /&gt;
[[Lean theorem prover/Explainers/Computation inside proofs|computation inside proofs]] says&lt;br /&gt;
more.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;grind&amp;#039;&amp;#039;&amp;#039; gathers facts and works on them with several methods at once. The reference&lt;br /&gt;
manual pictures a shared whiteboard: each new equation or inequality is written on it, terms&lt;br /&gt;
known to be equal are grouped together, and each method reads from the board and adds to it.&lt;br /&gt;
The methods include merging equals (if a = b, then f a = f b), using known theorems that fit,&lt;br /&gt;
splitting into cases, and solvers for linear arithmetic over the integers and for algebra.&lt;br /&gt;
It always argues by contradiction: it assumes the goal is false and looks for an&lt;br /&gt;
impossibility. It is not designed for problems whose cases multiply out of control, such as&lt;br /&gt;
large instances of the pigeonhole principle.&amp;lt;ref name=&amp;quot;ref-grind&amp;quot;&amp;gt;&amp;#039;&amp;#039;The Lean Language&lt;br /&gt;
Reference&amp;#039;&amp;#039;, version for Lean 4.34.0 (lean-lang.org, 2026), chapter 16, &amp;quot;The grind tactic&amp;quot;.&lt;br /&gt;
https://lean-lang.org/doc/reference/4.34.0/The--grind--tactic/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== When the search fails ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean lean-fails&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
example (x y : Nat) (h : x * y = 6) : y ≤ 6 := by omega&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The statement is true: if x times y is 6, then y divides 6, so y is at most 6. But a product&lt;br /&gt;
of two unknowns lies outside linear arithmetic. Lean 4.34.1 answers &amp;lt;code&amp;gt;omega could not&lt;br /&gt;
prove the goal:&amp;lt;/code&amp;gt; and offers &amp;quot;a possible counterexample&amp;quot; in which &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; is at&lt;br /&gt;
least 7. The counterexample is only possible. It solves the simplified problem that omega&lt;br /&gt;
could see, in which the product says nothing about y, not the real one. A failed search is&lt;br /&gt;
information, not a verdict: the statement may still be true, and this procedure cannot see&lt;br /&gt;
why.&lt;br /&gt;
&lt;br /&gt;
== Why no procedure does everything ==&lt;br /&gt;
&lt;br /&gt;
Two results from the 1930s mark the limit, and they are different results.&lt;br /&gt;
&lt;br /&gt;
The first concerns what can be proved at all. Kurt Gödel showed in 1931, in a form that&lt;br /&gt;
J. Barkley Rosser strengthened in 1936, that any consistent formal system in which a certain&lt;br /&gt;
amount of elementary arithmetic can be carried out contains statements that it can neither&lt;br /&gt;
prove nor disprove.&amp;lt;ref name=&amp;quot;godel&amp;quot;&amp;gt;Kurt Gödel, &amp;quot;Über formal&lt;br /&gt;
unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I&amp;quot;, &amp;#039;&amp;#039;Monatshefte für&lt;br /&gt;
Mathematik und Physik&amp;#039;&amp;#039; 38 (1931), pp. 173–198. doi:10.1007/BF01700692&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;raatikainen&amp;quot;&amp;gt;Panu&lt;br /&gt;
Raatikainen, &amp;quot;Gödel&amp;#039;s Incompleteness Theorems&amp;quot;, &amp;#039;&amp;#039;The Stanford Encyclopedia of Philosophy&amp;#039;&amp;#039;&lt;br /&gt;
(first published 2013, substantive revision 8 October 2025), sections 1 and 4.2.&lt;br /&gt;
https://plato.stanford.edu/entries/goedel-incompleteness/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second concerns what a machine can decide. Alonzo Church and Alan Turing showed&lt;br /&gt;
independently in 1936 that there is no mechanical method which decides, for every formula of&lt;br /&gt;
first-order logic, whether it can be proved.&amp;lt;ref name=&amp;quot;church&amp;quot;&amp;gt;Alonzo Church, &amp;quot;A note on the&lt;br /&gt;
Entscheidungsproblem&amp;quot;, &amp;#039;&amp;#039;Journal of Symbolic Logic&amp;#039;&amp;#039; 1 (1936), pp. 40–41.&lt;br /&gt;
doi:10.2307/2269326&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;turing&amp;quot;&amp;gt;A. M. Turing, &amp;quot;On Computable Numbers, with an&lt;br /&gt;
Application to the Entscheidungsproblem&amp;quot;, &amp;#039;&amp;#039;Proceedings of the London Mathematical Society&amp;#039;&amp;#039;,&lt;br /&gt;
series 2, vol. 42 (1936–37), pp. 230–265. doi:10.1112/plms/s2-42.1.230&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;copeland&amp;quot;&amp;gt;B.&lt;br /&gt;
Jack Copeland, &amp;quot;The Church-Turing Thesis&amp;quot;, &amp;#039;&amp;#039;The Stanford Encyclopedia of Philosophy&amp;#039;&amp;#039; (first&lt;br /&gt;
published 1997, substantive revision 18 December 2023), section 1.7.&lt;br /&gt;
https://plato.stanford.edu/entries/church-turing/&amp;lt;/ref&amp;gt; The same holds for every consistent&lt;br /&gt;
system that contains, or can interpret, a weak theory of arithmetic called Robinson&lt;br /&gt;
arithmetic: there is no mechanical way to tell its theorems from its other&lt;br /&gt;
statements.&amp;lt;ref name=&amp;quot;raatikainen&amp;quot; /&amp;gt; Robinson arithmetic has seven axioms, simple facts about&lt;br /&gt;
zero, the next number, addition and multiplication.&amp;lt;ref name=&amp;quot;raatikainen&amp;quot; /&amp;gt; Every statement&lt;br /&gt;
of arithmetic can be read as a Lean statement about Lean&amp;#039;s natural numbers, and read that way&lt;br /&gt;
all seven axioms are theorems of Lean; the block below proves each in one line, where&lt;br /&gt;
&amp;lt;code&amp;gt;Nat.succ x&amp;lt;/code&amp;gt; is the number after x and the last four hold by calculation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lean&amp;quot; style=&amp;quot;background: #f8f9fa; border: 1px solid #c8ccd1; padding: 0.6em; margin: 0.3em 0; font-size: 0.85em; line-height: 1.35; overflow-x: auto; white-space: pre;&amp;quot;&amp;gt;&lt;br /&gt;
-- 1. Zero is not the number after any number.&lt;br /&gt;
theorem q1 (x : Nat) : Nat.succ x ≠ 0 := Nat.succ_ne_zero x&lt;br /&gt;
-- 2. Different numbers have different numbers after them.&lt;br /&gt;
theorem q2 (x y : Nat) (h : Nat.succ x = Nat.succ y) : x = y := Nat.succ.inj h&lt;br /&gt;
-- 3. Every number other than zero is the number after some number.&lt;br /&gt;
theorem q3 (x : Nat) (h : x ≠ 0) : ∃ y, x = Nat.succ y := Nat.exists_eq_succ_of_ne_zero h&lt;br /&gt;
-- 4 to 7. Addition and multiplication, by recursion on the second number.&lt;br /&gt;
theorem q4 (x : Nat) : x + 0 = x := rfl&lt;br /&gt;
theorem q5 (x y : Nat) : x + Nat.succ y = Nat.succ (x + y) := rfl&lt;br /&gt;
theorem q6 (x : Nat) : x * 0 = 0 := rfl&lt;br /&gt;
theorem q7 (x y : Nat) : x * Nat.succ y = x * y + x := rfl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lean 4.34.1 accepts all seven. A procedure that decided provability in Lean would&lt;br /&gt;
therefore also decide which statements of arithmetic Lean proves. Those statements form a&lt;br /&gt;
system that contains Robinson arithmetic and is consistent if Lean&amp;#039;s logic is, so the result&lt;br /&gt;
just stated rules such a procedure out. If Lean&amp;#039;s logic is consistent, then, no tactic,&lt;br /&gt;
however clever, can decide for every statement whether Lean can prove it.&lt;br /&gt;
&lt;br /&gt;
The word &amp;quot;undecidable&amp;quot; is used for both results, in two senses: a single statement that a&lt;br /&gt;
system can neither prove nor disprove, and a whole class of questions that no machine can&lt;br /&gt;
answer.&amp;lt;ref name=&amp;quot;raatikainen&amp;quot; /&amp;gt; In practice the limit means that some procedures in Lean&lt;br /&gt;
work within a class of statements chosen so that a method exists, as &amp;lt;code&amp;gt;decide&amp;lt;/code&amp;gt;&lt;br /&gt;
does for finite checks, while others, such as &amp;lt;code&amp;gt;simp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;grind&amp;lt;/code&amp;gt;, are&lt;br /&gt;
searches that often succeed and sometimes give up. Beyond them, a person still has to find&lt;br /&gt;
the idea.&lt;br /&gt;
&lt;br /&gt;
== Found by search, checked by the Lean kernel ==&lt;br /&gt;
&lt;br /&gt;
However a tactic finds its proof, what it hands over is an ordinary proof term, and the Lean&lt;br /&gt;
kernel checks that term like any other. The manual says of &amp;lt;code&amp;gt;grind&amp;lt;/code&amp;gt; that it&lt;br /&gt;
produces ordinary proof terms for every fact it adds.&amp;lt;ref name=&amp;quot;ref-grind&amp;quot; /&amp;gt; A bug in&lt;br /&gt;
automation can therefore cost time or produce a confusing message; it cannot make Lean accept&lt;br /&gt;
a false theorem.&amp;lt;ref name=&amp;quot;ref-tactics&amp;quot;&amp;gt;&amp;#039;&amp;#039;The Lean Language Reference&amp;#039;&amp;#039;, version for Lean&lt;br /&gt;
4.34.0 (lean-lang.org, 2026), chapter 14, &amp;quot;Tactic Proofs&amp;quot;.&lt;br /&gt;
https://lean-lang.org/doc/reference/4.34.0/Tactic-Proofs/&amp;lt;/ref&amp;gt; Keeping the search for a&lt;br /&gt;
proof apart from its checking is an established technique in the LCF tradition from which tactics&lt;br /&gt;
come.&amp;lt;ref name=&amp;quot;gordon&amp;quot;&amp;gt;Michael J. C. Gordon, &amp;quot;From LCF to HOL: a short history&amp;quot;, in Gordon&lt;br /&gt;
Plotkin, Colin Stirling and Mads Tofte (eds), &amp;#039;&amp;#039;Proof, Language, and Interaction: Essays in&lt;br /&gt;
Honour of Robin Milner&amp;#039;&amp;#039;, MIT Press, 2000.&lt;br /&gt;
https://www.cl.cam.ac.uk/~mjcg/papers/HolHistory.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;#print axioms&amp;lt;/code&amp;gt; lines above show what the four proofs rest on. Lean 4.34.1&lt;br /&gt;
answers that &amp;lt;code&amp;gt;by_decide&amp;lt;/code&amp;gt; does not depend on any axioms, that&lt;br /&gt;
&amp;lt;code&amp;gt;by_simp&amp;lt;/code&amp;gt; depends on &amp;lt;code&amp;gt;propext&amp;lt;/code&amp;gt;, that &amp;lt;code&amp;gt;by_omega&amp;lt;/code&amp;gt; depends on&lt;br /&gt;
&amp;lt;code&amp;gt;propext&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Quot.sound&amp;lt;/code&amp;gt;, and that &amp;lt;code&amp;gt;by_grind&amp;lt;/code&amp;gt; depends on&lt;br /&gt;
those two and &amp;lt;code&amp;gt;Classical.choice&amp;lt;/code&amp;gt;. These are Lean&amp;#039;s three standard axioms,&lt;br /&gt;
described in [[Lean theorem prover/Explainers/What the axioms are|what the axioms are]].&lt;br /&gt;
Nothing was added by the search.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
&lt;br /&gt;
* [[Lean theorem prover/Explainers/When Lean says no|When Lean says no]]: reading the messages of a failed check.&lt;br /&gt;
* [[Lean theorem prover/System/Decision procedures|Decision procedures]]: the technical treatment.&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>