<?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%2FHistory%2FLCF_and_the_tactic_idea</id>
	<title>Lean theorem prover/History/LCF and the tactic idea - 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%2FHistory%2FLCF_and_the_tactic_idea"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=Lean_theorem_prover/History/LCF_and_the_tactic_idea&amp;action=history"/>
	<updated>2026-10-21T07:33:55Z</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/History/LCF_and_the_tactic_idea&amp;diff=6799&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/History/LCF_and_the_tactic_idea&amp;diff=6799&amp;oldid=prev"/>
		<updated>2026-10-15T19:35:25Z</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:35, 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:LCF and the tactic idea}}&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:LCF and the tactic idea}}&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;div&gt;LCF was a proof checker built by Robin Milner, first at Stanford in 1972 and then, in a new design, at Edinburgh. Two ideas from the Edinburgh design run through many proof assistants since: a protected type of theorems, so that only the rules of the logic can produce one, and tactics, programs that reduce a goal to simpler goals. To make tactics programmable, Milner and his colleagues designed a programming language, ML. This page follows those ideas from 1972 to Lean.&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;LCF was a proof checker built by Robin Milner, first at Stanford in 1972 and then, in a new design, at Edinburgh. Two ideas from the Edinburgh design run through many proof assistants since: a protected type of theorems, so that only the rules of the logic can produce one, and tactics, programs that reduce a goal to simpler goals. To make tactics programmable, Milner and his colleagues designed a programming language, ML. This page follows those ideas from 1972 to Lean.&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;!-- diff cache key pma_cutover_20261020t051351z-soft_:diff:1.41:old-6592:rev-6799: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/History/LCF_and_the_tactic_idea&amp;diff=6592&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/History/LCF_and_the_tactic_idea&amp;diff=6592&amp;oldid=prev"/>
		<updated>2026-10-14T18:01:12Z</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:LCF and the tactic idea}}&lt;br /&gt;
LCF was a proof checker built by Robin Milner, first at Stanford in 1972 and then, in a new design, at Edinburgh. Two ideas from the Edinburgh design run through many proof assistants since: a protected type of theorems, so that only the rules of the logic can produce one, and tactics, programs that reduce a goal to simpler goals. To make tactics programmable, Milner and his colleagues designed a programming language, ML. This page follows those ideas from 1972 to Lean.&lt;br /&gt;
&lt;br /&gt;
== Stanford LCF ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;LCF&amp;quot; stands for Logic for Computable Functions, Milner&amp;#039;s name for a logic Dana Scott devised in 1969 for reasoning about recursively defined functions; Scott&amp;#039;s manuscript was not published until 1993.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot;&amp;gt;Mike Gordon, &amp;quot;From LCF to HOL: a short history&amp;quot;, in G. Plotkin, C. Stirling and M. Tofte (eds.), &amp;#039;&amp;#039;Proof, Language, and Interaction: Essays in Honour of Robin Milner&amp;#039;&amp;#039;, MIT Press, 2000. Author&amp;#039;s copy: https://www.cl.cam.ac.uk/~mjcg/papers/HolHistory.pdf&amp;lt;/ref&amp;gt; Milner built the first checker for it at Stanford in 1972, with Whitfield Diffie, Richard Weyhrauch and Malcolm Newey. His report of that year describes it as an interactive program for generating formal proofs about computable functions, helped by a subgoaling facility and a simplifier.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;milner1972&amp;quot;&amp;gt;Robin Milner, &amp;#039;&amp;#039;Logic for Computable Functions: Description of a Machine Implementation&amp;#039;&amp;#039;, Stanford Artificial Intelligence Memo AIM-169, Computer Science Report STAN-CS-72-288, Stanford University, May 1972. http://i.stanford.edu/pub/cstr/reports/cs/tr/72/288/CS-TR-72-288.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user stated a goal and split it into subgoals with a fixed set of commands, such as induction, until the simplifier could finish each one. Gordon names two limits of the system. The proofs it stored filled the available memory, and its fixed set of proof commands could not easily be extended.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Edinburgh LCF and the type of theorems ==&lt;br /&gt;
&lt;br /&gt;
Around 1973 Milner moved to Edinburgh and began a successor, Edinburgh LCF, first with Lockwood Morris and Malcolm Newey, and from 1975 with Christopher Wadsworth and Mike Gordon.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The answer to the first limit was to keep theorems and discard proofs. To keep that safe, Milner made &amp;#039;&amp;#039;&amp;#039;theorem&amp;#039;&amp;#039;&amp;#039; an abstract data type. Its only given values were instances of the axioms, and its only operations were the rules of inference. A program could hold a value of type theorem only if it had obtained it from axioms by applying rules, so type checking alone guaranteed that every such value was a theorem of the logic.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt; The steps of a proof were carried out but not recorded. The guarantee lies in the programming language, not in a stored proof that someone else could check later.&lt;br /&gt;
&lt;br /&gt;
== ML, tactics and tacticals ==&lt;br /&gt;
&lt;br /&gt;
The answer to the second limit was a programming language in which users could write their own proof procedures. Milner, with Morris and Newey, designed &amp;#039;&amp;#039;&amp;#039;ML&amp;#039;&amp;#039;&amp;#039;, the &amp;quot;Meta Language&amp;quot;, strictly typed so that the abstract type of theorems could not be circumvented.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt; It was described at the 1978 Symposium on Principles of Programming Languages.&amp;lt;ref name=&amp;quot;popl1978&amp;quot;&amp;gt;M. Gordon, R. Milner, L. Morris, M. Newey and C. Wadsworth, &amp;quot;A metalanguage for interactive proof in LCF&amp;quot;, in &amp;#039;&amp;#039;Proceedings of the 5th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages (POPL &amp;#039;78)&amp;#039;&amp;#039;, ACM, 1978, pp. 119–130. doi:10.1145/512760.512773&amp;lt;/ref&amp;gt; Milner&amp;#039;s account of ML&amp;#039;s polymorphic type inference appeared the same year.&amp;lt;ref name=&amp;quot;milner1978&amp;quot;&amp;gt;Robin Milner, &amp;quot;A theory of type polymorphism in programming&amp;quot;, &amp;#039;&amp;#039;Journal of Computer and System Sciences&amp;#039;&amp;#039; 17 (3), 1978, pp. 348–375. doi:10.1016/0022-0000(78)90014-4&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In ML a strategy for reducing a goal to subgoals is a function, which Milner called a &amp;#039;&amp;#039;&amp;#039;tactic&amp;#039;&amp;#039;&amp;#039;. Operations that combine strategies, taking tactics as arguments and returning tactics, are higher-order functions, which he called &amp;#039;&amp;#039;&amp;#039;tacticals&amp;#039;&amp;#039;&amp;#039;. Since a tactic may be applied to a goal it cannot handle, ML was given exceptions, so that a failing tactic could signal failure and another be tried. Gordon records that the needs of theorem proving shaped the first ML in detail.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The work was written up as &amp;#039;&amp;#039;Edinburgh LCF&amp;#039;&amp;#039; by Gordon, Milner and Wadsworth in 1979.&amp;lt;ref name=&amp;quot;lcf1979&amp;quot;&amp;gt;Michael J. Gordon, Robin Milner and Christopher P. Wadsworth, &amp;#039;&amp;#039;Edinburgh LCF: A Mechanised Logic of Computation&amp;#039;&amp;#039;, Lecture Notes in Computer Science 78, Springer, 1979. doi:10.1007/3-540-09724-4&amp;lt;/ref&amp;gt; In 1991 Milner received the ACM Turing Award; the citation names LCF, &amp;quot;probably the first theoretically based yet practical tool for machine-assisted proof construction&amp;quot;, and ML among his achievements.&amp;lt;ref name=&amp;quot;turing1991&amp;quot;&amp;gt;Announcement of the 1991 ACM Turing Award to Robin Milner, with the short citation, forwarded to the TYPES mailing list, 1 November 1991. https://www.engineering.upenn.edu/~sweirich/types/archive/1991/msg00062.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Descendants ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cambridge LCF.&amp;#039;&amp;#039;&amp;#039; In the early 1980s Lawrence Paulson at Cambridge and Gérard Huet in France reworked the system together. Huet improved and extended ML, and his group went on to develop Caml. Paulson&amp;#039;s version, Cambridge LCF, was completed around 1985 and described in his 1987 book &amp;#039;&amp;#039;Logic and Computation&amp;#039;&amp;#039;.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;HOL.&amp;#039;&amp;#039;&amp;#039; Gordon adapted Cambridge LCF to classical higher-order logic for verifying hardware. HOL kept LCF&amp;#039;s syntax, its abstract type of theorems and its tactics, but read types as ordinary sets. A stable version, HOL88, appeared in about 1988. Reimplementations followed: HOL90, in Standard ML, by Konrad Slind, and HOL Light, in Caml Light, by John Harrison and Konrad Slind.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt; In 2017 Ebner and colleagues noted that HOL4 and HOL Light still work in the original LCF manner, with the user interacting directly in ML.&amp;lt;ref name=&amp;quot;ebner2017&amp;quot;&amp;gt;Gabriel Ebner, Sebastian Ullrich, Jared Roesch, Jeremy Avigad and Leonardo de Moura, &amp;quot;A metaprogramming framework for formal verification&amp;quot;, &amp;#039;&amp;#039;Proceedings of the ACM on Programming Languages&amp;#039;&amp;#039; 1 (ICFP), article 34, 2017. doi:10.1145/3110278. Author&amp;#039;s copy: https://lean-lang.org/papers/tactic.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Isabelle.&amp;#039;&amp;#039;&amp;#039; Paulson then built Isabelle, a generic prover in which the rules of many logics are stated declaratively in a common metalogic and combined by higher-order unification.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;paulson1989&amp;quot;&amp;gt;Lawrence C. Paulson, &amp;quot;The foundation of a generic theorem prover&amp;quot;, &amp;#039;&amp;#039;Journal of Automated Reasoning&amp;#039;&amp;#039; 5 (3), 1989, pp. 363–397. doi:10.1007/BF00248324. Preprint: https://arxiv.org/abs/cs/9301105&amp;lt;/ref&amp;gt; Gordon notes that Isabelle keeps Milner&amp;#039;s key idea, the abstract type of theorems, and lifts it to the metalogic.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Type theories.&amp;#039;&amp;#039;&amp;#039; The LCF method, with ML as its metalanguage, was also applied to logics quite unlike Scott&amp;#039;s. Gordon lists Nuprl, a proof system for Martin-Löf type theory, and one for the Calculus of Constructions among the LCF-style systems.&amp;lt;ref name=&amp;quot;gordon2000&amp;quot; /&amp;gt; Those are the subjects of [[Lean theorem prover/History/Martin-Löf type theory|Martin-Löf type theory]] and [[Lean theorem prover/History/The Calculus of Constructions|The Calculus of Constructions]].&lt;br /&gt;
&lt;br /&gt;
== The line to Lean ==&lt;br /&gt;
&lt;br /&gt;
Lean took the tactic idea and changed where the guarantee lies. In Lean, as in Automath, a proof is a term of the type that states the theorem. Tactics are instructions that describe how to construct such a term, and they support writing a proof incrementally, one step at a time.&amp;lt;ref name=&amp;quot;tpil&amp;quot;&amp;gt;Jeremy Avigad, Leonardo de Moura, Soonho Kong and Sebastian Ullrich, &amp;#039;&amp;#039;Theorem Proving in Lean 4&amp;#039;&amp;#039;, chapter &amp;quot;Tactics&amp;quot;. https://lean-lang.org/theorem_proving_in_lean4/tactics.html&amp;lt;/ref&amp;gt; The first description of Lean, in 2015, presents tactics as one way, beside writing terms directly, of constructing proof terms, as in Coq, HOL Light, Isabelle and PVS, and describes Lean&amp;#039;s small trusted kernel and proof terms that can be checked independently.&amp;lt;ref name=&amp;quot;lean2015&amp;quot;&amp;gt;Leonardo de Moura, Soonho Kong, Jeremy Avigad, Floris van Doorn and Jakob von Raumer, &amp;quot;The Lean Theorem Prover (system description)&amp;quot;, in &amp;#039;&amp;#039;Automated Deduction – CADE-25&amp;#039;&amp;#039;, Lecture Notes in Computer Science 9195, Springer, 2015, pp. 378–388. doi:10.1007/978-3-319-21401-6_26. Author&amp;#039;s copy: https://lean-lang.org/papers/system.pdf&amp;lt;/ref&amp;gt; In LCF a faulty tactic is stopped by the type discipline of ML; in Lean whatever term a tactic produces must still pass Lean&amp;#039;s kernel. The two arrangements are compared at [[Lean theorem prover/Explainers/What has to be trusted|What has to be trusted]].&lt;br /&gt;
&lt;br /&gt;
Lean also took the metalanguage idea, but made the metalanguage Lean itself. The 2017 paper on Lean 3&amp;#039;s metaprogramming framework recalls that ML was designed as the metalanguage for LCF, and describes tactics written in Lean, in the same files and with the same library as the mathematics they serve.&amp;lt;ref name=&amp;quot;ebner2017&amp;quot; /&amp;gt; Lean 4 goes further: it is implemented largely in Lean, and users can extend its parser, elaborator and tactics in Lean.&amp;lt;ref name=&amp;quot;lean4&amp;quot;&amp;gt;Leonardo de Moura and Sebastian Ullrich, &amp;quot;The Lean 4 Theorem Prover and Programming Language (System Description)&amp;quot;, in &amp;#039;&amp;#039;Automated Deduction – CADE 28&amp;#039;&amp;#039;, Lecture Notes in Computer Science 12699, Springer, 2021, pp. 625–635. doi:10.1007/978-3-030-79876-5_37. Author&amp;#039;s copy: https://lean-lang.org/papers/lean4.pdf&amp;lt;/ref&amp;gt; How tactics work in Lean today is described at [[Lean theorem prover/Explainers/Tactics|Tactics]] and [[Lean theorem prover/System/The tactic framework|The tactic framework]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Provenance: Gordon&amp;#039;s 2000 history, the Lean papers of 2015, 2017 and 2021 and the tactics chapter of &amp;#039;&amp;#039;Theorem Proving in Lean 4&amp;#039;&amp;#039; were read for this page. Milner&amp;#039;s 1972 report was read in its opening pages only. Milner&amp;#039;s 1978 paper was read in its opening pages, and Paulson&amp;#039;s 1989 paper in its preprint (abstract and history). The 1978 POPL paper and the 1979 book were not opened; their details come from Gordon&amp;#039;s reference list and the publishers&amp;#039; records. The account of Stanford and Edinburgh LCF follows Gordon, a participant from 1975.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
&lt;br /&gt;
[[Lean theorem prover/History/Martin-Löf type theory|Martin-Löf type theory]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>PMA Publisher</name></author>
	</entry>
</feed>