Lambda calculus (also written as λ-calculus) is a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution. It is a universal model of computation that can be used to simulate any Turing machine. It was introduced by the mathematician Alonzo Church in the 1930s as part of his research into the foundations of mathematics.
Lambda calculus consists of constructing lambda terms and performing reduction operations on them. In the simplest form of lambda calculus, terms are built using only the following rules:
|x||Variable||A character or string representing a parameter or mathematical/logical value.|
|(λx.M)||Abstraction||Function definition (M is a lambda term). The variable x becomes bound in the expression.|
|(M N)||Application||Applying a function to an argument. M and N are lambda terms.|
producing expressions such as: (λx.λy.(λz.(λx.z x) (λy.z y)) (x y)). Parentheses can be dropped if the expression is unambiguous. For some applications, terms for logical and mathematical constants and operations may be included.
The reduction operations include:
|(λx.M[x]) → (λy.M[y])||α-conversion||Renaming the bound variables in the expression. Used to avoid name collisions.|
|((λx.M) E) → (M[x := E])||β-reduction||Replacing the bound variables with the argument expression in the body of the abstraction.|
If De Bruijn indexing is used, then α-conversion is no longer required as there will be no name collisions. If repeated application of the reduction steps eventually terminates, then by the Church–Rosser theorem it will produce a β-normal form.
Variable names are not needed if using a universal lambda function, such as Iota and Jot, which can create any function behavior by calling it on itself in various combinations.
Explanation and applications
Lambda calculus is Turing complete, that is, it is a universal model of computation that can be used to simulate any Turing machine. Its namesake, the Greek letter lambda (λ), is used in lambda expressions and lambda terms to denote binding a variable in a function.
Lambda calculus may be untyped or typed. In typed lambda calculus, functions can be applied only if they are capable of accepting the given input’s “type” of data. Typed lambda calculi are weaker than the untyped lambda calculus, which is the primary subject of this article, in the sense that typed lambda calculi can express less than the untyped calculus can, but on the other hand typed lambda calculi allow more things to be proven; in the simply typed lambda calculus it is, for example, a theorem that every evaluation strategy terminates for every simply typed lambda-term, whereas evaluation of untyped lambda-terms need not terminate. One reason there are many different typed lambda calculi has been the desire to do more (of what the untyped calculus can do) without giving up on being able to prove strong theorems about the calculus.
Lambda calculus has applications in many different areas in mathematics, philosophy, linguistics, and computer science. Lambda calculus has played an important role in the development of the theory of programming languages. Functional programming languages implement the lambda calculus. Lambda calculus is also a current research topic in Category theory.
The lambda calculus was introduced by mathematician Alonzo Church in the 1930s as part of an investigation into the foundations of mathematics.[a] The original system was shown to be logically inconsistent in 1935 when Stephen Kleene and J. B. Rosser developed the Kleene–Rosser paradox.
Subsequently, in 1936 Church isolated and published just the portion relevant to computation, what is now called the untyped lambda calculus. In 1940, he also introduced a computationally weaker, but logically consistent system, known as the simply typed lambda calculus.
Until the 1960s when its relation to programming languages was clarified, the lambda calculus was only a formalism. Thanks to Richard Montague and other linguists’ applications in the semantics of natural language, the lambda calculus has begun to enjoy a respectable place in both linguistics and computer science.
- ^Turing, Alan M. (December 1937). “Computability and λ-Definability”. The Journal of Symbolic Logic. 2 (4): 153–163. doi:10.2307/2268280. JSTOR 2268280.
- ^Coquand, Thierry. Zalta, Edward N. (ed.). “Type Theory”. The Stanford Encyclopedia of Philosophy (Summer 2013 ed.). Retrieved November 17, 2020.
- ^Moortgat, Michael (1988). Categorial Investigations: Logical and Linguistic Aspects of the Lambek Calculus. Foris Publications. ISBN 9789067653879.
- ^Bunt, Harry; Muskens, Reinhard, eds. (2008). Computing Meaning. Springer. ISBN 978-1-4020-5957-5.
- ^Mitchell, John C. (2003). Concepts in Programming Languages. Cambridge University Press. p. 57. ISBN 978-0-521-78098-8..
- ^Pierce, Benjamin C. Basic Category Theory for Computer Scientists. p. 53.
- ^Church, Alonzo (1932). “A set of postulates for the foundation of logic”. Annals of Mathematics. Series 2. 33 (2): 346–366. doi:10.2307/1968337. JSTOR 1968337.
- ^Kleene, Stephen C.; Rosser, J. B. (July 1935). “The Inconsistency of Certain Formal Logics”. The Annals of Mathematics. 36 (3): 630. doi:10.2307/1968646. JSTOR 1968646.
- ^Church, Alonzo (December 1942). “Review of Haskell B. Curry, The Inconsistency of Certain Formal Logics”. The Journal of Symbolic Logic. 7 (4): 170–171. doi:10.2307/2268117. JSTOR 2268117.
- ^ Jump up to:abChurch, Alonzo (1936). “An unsolvable problem of elementary number theory”. American Journal of Mathematics. 58(2): 345–363. doi:10.2307/2371045. JSTOR 2371045.
- ^Church, Alonzo (1940). “A Formulation of the Simple Theory of Types”. Journal of Symbolic Logic. 5(2): 56–68. doi:10.2307/2266170. JSTOR 2266170.
- ^Partee, B. B. H.; ter Meulen, A.; Wall, R. E. (1990). Mathematical Methods in Linguistics. Springer. ISBN 9789027722454. Retrieved 29 Dec 2016.
- ^Alma, Jesse. Zalta, Edward N. (ed.). “The Lambda Calculus”. The Stanford Encyclopedia of Philosophy (Summer 2013 ed.). Retrieved November 17, 2020.