Download as pdf or txt
Download as pdf or txt
You are on page 1of 14

Lambda calculus

Lambda calculus (also written as -calculus) is a formal has begun to enjoy a respectable place in linguistics[13]
system in mathematical logic for expressing computation and computer science, too.[14]
based on function abstraction and application using vari-
able binding and substitution. It is a universal model of
computation that can be used to simulate any single-taped 3 Informal description
Turing machine and was rst introduced by mathemati-
cian Alonzo Church in the 1930s as part of an investiga-
tion into the foundations of mathematics. 3.1 Motivation
Computable functions are a fundamental concept within
computer science and mathematics. The -calculus pro-
1 Explanation and applications vides a simple semantics for computation, enabling prop-
erties of computation to be studied formally. The -
Lambda calculus is Turing complete, that is, it is a uni- calculus incorporates two simplications that make this
versal model of computation that can be used to simu- semantics simple. The rst simplication is that the -
late any single-taped Turing machine.[1] Its namesake, the calculus treats functions anonymously, without giving
Greek letter lambda (), is used in lambda expressions them explicit names. For example, the function
and lambda terms to denote binding a variable in a func-
tion.
square_sum(x, y) = x2 + y 2
Lambda calculus may be typed and untyped. In typed
lambda calculus, functions can be applied only if they are can be rewritten in anonymous form as
capable of accepting the given inputs type of data.
Lambda calculus has applications in many dierent ar-
eas in mathematics, philosophy,[2] linguistics,[3][4] and (x, y) 7 x2 + y 2
computer science.[5] Lambda calculus has played an im- (read as the pair of x and y is mapped to x2 + y 2 ").
portant role in the development of the theory of program- Similarly,
ming languages. Functional programming languages im-
plement the lambda calculus. Lambda calculus also is a
current research topic in Category theory.[6] id(x) = x
can be rewritten in anonymous form as

2 History
x 7 x
The lambda calculus was introduced by mathematician
Alonzo Church in the 1930s as part of an investigation where the input is simply mapped to itself.
into the foundations of mathematics.[7][8] The original The second simplication is that the -calculus only uses
system was shown to be logically inconsistent in 1935 functions of a single input. An ordinary function that re-
when Stephen Kleene and J. B. Rosser developed the quires two inputs, for instance the square_sum function,
KleeneRosser paradox.[9][10] can be reworked into an equivalent function that accepts
Subsequently, in 1936 Church isolated and published just a single input, and as output returns another function, that
the portion relevant to computation, what is now called in turn accepts a single input. For example,
the untyped lambda calculus.[11] In 1940, he also intro-
duced a computationally weaker, but logically consistent
system, known as the simply typed lambda calculus.[12] (x, y) 7 x2 + y 2

Until the 1960s when its relation to programming lan- can be reworked into
guages was claried, the -calculus was only a formalism.
Thanks to Richard Montague and other linguists applica-
tions in the semantics of natural language, the -calculus x 7 (y 7 x2 + y 2 )

1
2 3 INFORMAL DESCRIPTION

This method, known as currying, transforms a function Nothing else is a lambda term. Thus a lambda term is
that takes multiple arguments into a chain of functions valid if and only if it can be obtained by repeated appli-
each with a single argument. cation of these three rules. However, some parentheses
Function application of the square_sum function to the can be omitted according to certain rules. For example,
arguments (5, 2), yields at once the outermost parentheses are usually not written. See
Notation, below.
A lambda abstraction x.t is a denition of an anony-
((x, y) 7 x + y )(5, 2)
2 2 mous function that is capable of taking a single input x
and substituting it into the expression t . It thus denes an
2
=5 +2 2 anonymous function that takes x and returns t . For ex-
ample, x.x2 + 2 is a lambda abstraction for the function
= 29 f (x) = x2 + 2 using the term x2 + 2 for t . The deni-
whereas evaluation of the curried version requires one tion of a function with a lambda abstraction merely sets
more step up the function but does not invoke it. The abstraction
binds the variable x in the term t .
An application ts represents the application of a function
((x 7 (y 7 x + y ))(5))(2)
2 2 t to an input s , that is, it represents the act of calling
function t on input s to produce t(s) .
= (y 7 52 + y 2 )(2)
There is no concept in lambda calculus of variable decla-
= 52 + 22 ration. In a denition such as x.x+y (i.e. f (x) = x+y
), the lambda calculus treats y as a variable that is not yet
= 29 dened. The lambda abstraction x.x + y is syntactically
to arrive at the same result. valid, and represents a function that adds its input to the
yet-unknown y .
Bracketing may be used and may be needed to dis-
3.2 The lambda calculus ambiguate terms. For example, x.((x.x)x) and
(x.(x.x))x denote dierent terms (although they co-
The lambda calculus consists of a language of lambda incidentally reduce to the same value). Here the rst ex-
terms, which is dened by a certain formal syntax, and ample denes a function that denes a function and re-
a set of transformation rules, which allow manipulation turns the result of applying x to the child-function (apply
of the lambda terms. These transformation rules can be function then return), while the second example denes
viewed as an equational theory or as an operational de- a function that returns a function for any input and then
nition. returns it on application of x (return function then apply).
As described above, all functions in the lambda calculus
are anonymous functions, having no names. They only
accept one input variable, with currying used to imple- 3.2.2 Functions that operate on functions
ment functions with several variables.
In lambda calculus, functions are taken to be 'rst class
values', so functions may be used as the inputs, or be re-
3.2.1 Lambda terms turned as outputs from other functions.

The syntax of the lambda calculus denes some expres- For example, x.x represents the identity function, x 7
sions as valid lambda calculus expressions and some as x , and (x.x)y represents the identity function applied
invalid, just as some strings of characters are valid C pro- to y . Further, (x.y) represents the constant function
grams and some are not. A valid lambda calculus expres- x 7 y , the function that always returns y , no matter
sion is called a lambda term. the input. In lambda calculus, function application is re-
garded as left-associative, so that stx means (st)x .
The following three rules give an inductive denition
that can be applied to build all syntactically valid lambda There are several notions of equivalence and reduc-
terms: tion that allow lambda terms to be reduced to equiv-
alent lambda terms.
a variable, x , is itself a valid lambda term

if t is a lambda term, and x is a variable, then (x.t) 3.2.3 Alpha equivalence


is a lambda term (called a lambda abstraction);
A basic form of equivalence, denable on lambda terms,
if t and s are lambda terms, then (ts) is a lambda is alpha equivalence. It captures the intuition that the
term (called an application). particular choice of a bound variable, in a lambda ab-
3

straction, does not (usually) matter. For instance, x.x In general, failure to meet the freshness condition can be
and y.y are alpha-equivalent lambda terms, and they remedied by alpha-renaming with a suitable fresh vari-
both represent the same function (the identity function). able. For example, switching back to our correct notion
The terms x and y are not alpha-equivalent, because they of substitution, in (x.y)[y := x] the lambda abstrac-
are not bound in a lambda abstraction. In many pre- tion can be renamed with a fresh variable z , to obtain
sentations, it is usual to identify alpha-equivalent lambda (z.y)[y := x] = z.(y[y := x]) = z.x , and the
terms. meaning of the function is preserved by substitution.
The following denitions are necessary in order to be able
to dene beta reduction: 3.2.6 Beta reduction

The beta reduction rule states that an application of the


3.2.4 Free variables
form (x.t)s reduces to the term t[x := s] . The notation
The free variables of a term are those variables not (x.t)s t[x := s] is used to indicate that (x.t)s
bound by a lambda abstraction. The set of free variables beta reduces to t[x := s] . For example, for every s ,
of an expression is dened inductively: (x.x)s x[x := s] = s . This demonstrates that x.x
really is the identity. Similarly, (x.y)s y[x := s] =
y , which demonstrates that x.y is a constant function.
The free variables of x are just x
The lambda calculus may be seen as an idealised ver-
The set of free variables of x.t is the set of free sion of a functional programming language, like Haskell
variables of t , but with x removed or Standard ML. Under this view, beta reduction cor-
responds to a computational step. This step can be re-
The set of free variables of ts is the union of the set
peated by additional beta conversions until there are no
of free variables of t and the set of free variables of
more applications left to reduce. In the untyped lambda
s.
calculus, as presented here, this reduction process may
not terminate. For instance, consider the term =
For example, the lambda term representing the identity (x.xx)(x.xx) . Here (x.xx)(x.xx) (xx)[x :=
x.x has no free variables, but the function x.yx has a x.xx] = (x[x := x.xx])(x[x := x.xx]) =
single free variable, y . (x.xx)(x.xx) . That is, the term reduces to itself in a
single beta reduction, and therefore the reduction process
3.2.5 Capture-avoiding substitutions will never terminate.
Another aspect of the untyped lambda calculus is that it
Suppose t , s and r are lambda terms and x and y are does not distinguish between dierent kinds of data. For
variables. The notation t[x := r] indicates substitution of instance, it may be desirable to write a function that only
r for x in t in a capture-avoiding manner. This is dened operates on numbers. However, in the untyped lambda
so that: calculus, there is no way to prevent a function from be-
ing applied to truth values, strings, or other non-number
x[x := r] = r ; objects.
y[x := r] = y if x = y ;
(ts)[x := r] = (t[x := r])(s[x := r]) ; 4 Formal denition
(x.t)[x := r] = x.t ;
Main article: Lambda calculus denition
(y.t)[x := r] = y.(t[x := r]) if x = y and y is
not in the free variables of r . The variable y is said
to be fresh for r .
4.1 Denition
For example, (x.x)[y := y] = x.(x[y := y]) = x.x
, and ((x.y)x)[x := y] = ((x.y)[x := y])(x[x := Lambda expressions are composed of:
y]) = (x.y)y .
variables v1 , v2 , ..., v , ...
The freshness condition (requiring that y is not in the free
variables of r ) is crucial in order to ensure that substitu- the abstraction symbols lambda '' and dot '.'
tion does not change the meaning of functions. For ex-
ample, a substitution is made that ignores the freshness parentheses ( )
condition: (x.y)[y := x] = x.(y[y := x]) = x.x
. This substitution turns the constant function x.y into The set of lambda expressions, , can be dened induc-
the identity x.x by substitution. tively:
4 5 REDUCTION

1. If x is a variable, then x 5 Reduction


2. If x is a variable and M , then (x.M) The meaning of lambda expressions is dened by how
expressions can be reduced.[20]
3. If M, N , then (M N)
There are three kinds of reduction:

Instances of rule 2 are known as abstractions and in- -conversion: changing bound variables (alpha);
stances of rule 3 are known as applications.[15]
-reduction: applying functions to their arguments
(beta);
4.2 Notation
-conversion: which captures a notion of exten-
To keep the notation of lambda expressions uncluttered, sionality (eta).
the following conventions are usually applied:
We also speak of the resulting equivalences: two expres-
sions are -equivalent, if they can be -converted into the
Outermost parentheses are dropped: M N instead of
same expression, and /-equivalence are dened simi-
(M N)
larly.
Applications are assumed to be left associative: M The term redex, short for reducible expression, refers to
N P may be written instead of ((M N) P)[16] subterms that can be reduced by one of the reduction
rules. For example, (x.M) N is a beta-redex in express-
The body of an abstraction extends as far right as ing the substitution of N for x in M; if x is not free in M,
possible: x.M N means x.(M N) and not (x.M) x.M x is also an eta-redex. The expression to which a
N redex reduces is called its reduct; using the previous ex-
ample, the reducts of these expressions are respectively
M[x:=N] and M.
A sequence of abstractions is contracted:
x.y.z.N is abbreviated as xyz.N[17][18]
5.1 -conversion
4.3 Free and bound variables Alpha-conversion, sometimes known as alpha-
renaming,[21] allows bound variable names to be
The abstraction operator, , is said to bind its variable changed. For example, alpha-conversion of x.x might
wherever it occurs in the body of the abstraction. Vari- yield y.y. Terms that dier only by alpha-conversion
ables that fall within the scope of an abstraction are said are called -equivalent. Frequently, in uses of lambda
to be bound. All other variables are called free. For ex- calculus, -equivalent terms are considered to be
ample, in the following expression y is a bound variable equivalent.
and x is free: y.x x y. Also note that a variable is bound
by its nearest abstraction. In the following example the The precise rules for alpha-conversion are not completely
single occurrence of x in the expression is bound by the trivial. First, when alpha-converting an abstraction, the
second lambda: x.y (x.z x) only variable occurrences that are renamed are those that
are bound to the same abstraction. For example, an alpha-
The set of free variables of a lambda expression, M, is de- conversion of x.x.x could result in y.x.x, but it could
noted as FV(M) and is dened by recursion on the struc- not result in y.x.y. The latter has a dierent meaning
ture of the terms, as follows: from the original.
Second, alpha-conversion is not possible if it would result
1. FV(x) = {x}, where x is a variable in a variable getting captured by a dierent abstraction.
For example, if we replace x with y in x.y.x, we get
2. FV(x.M) = FV(M) \ {x} y.y.y, which is not at all the same.
In programming languages with static scope, alpha-
3. FV(M N) = FV(M) FV(N)[19] conversion can be used to make name resolution simpler
by ensuring that no variable name masks a name in a con-
An expression that contains no free variables is said to taining scope (see alpha renaming to make name resolu-
be closed. Closed lambda expressions are also known as tion trivial).
combinators and are equivalent to terms in combinatory In the De Bruijn index notation, any two alpha-equivalent
logic. terms are literally identical.
5

5.1.1 Substitution 7 Encoding datatypes


Substitution, written E[V := R], is the process of replac- Main articles: Church encoding and MogensenScott
ing all free occurrences of the variable V in the expres- encoding
sion E with expression R. Substitution on terms of the -
calculus is dened by recursion on the structure of terms,
as follows (note: x and y are only variables while M and The basic lambda calculus may be used to model
N are any expression). booleans, arithmetic, data structures and recursion, as il-
lustrated in the following sub-sections.
x[x := N] N y[x := N] y, if x y (M1 M2 )[x := N]
(M1 [x := N]) (M2 [x := N]) (x.M)[x := N] x.M
(y.M)[x := N] y.(M[x := N]), if x y, provided y 7.1 Arithmetic in lambda calculus
FV(N)
To substitute into a lambda abstraction, it is sometimes There are several possible ways to dene the natural num-
necessary to -convert the expression. For example, it is bers in lambda calculus, but by far the most common are
not correct for (x.y)[y := x] to result in (x.x), because the Church numerals, which can be dened as follows:
the substituted x was supposed to be free but ended up be-
ing bound. The correct substitution in this case is (z.x), 0 := f.x.x
up to -equivalence. Notice that substitution is dened 1 := f.x.f x
uniquely up to -equivalence. 2 := f.x.f (f x)
3 := f.x.f (f (f x))
5.2 -reduction
and so on. Or using the alternative syntax presented above
Beta-reduction captures the idea of function application. in Notation:
Beta-reduction is dened in terms of substitution: the
beta-reduction of ((V.E) E ) is E[V := E ]. 0 := fx.x
For example, assuming some encoding of 2, 7, , we have 1 := fx.f x
the following -reduction: ((n.n2) 7) 72. 2 := fx.f (f x)
3 := fx.f (f (f x))
5.3 -conversion
A Church numeral is a higher-order functionit takes a
Eta-conversion expresses the idea of extensionality, single-argument function f, and returns another single-
which in this context is that two functions are the same argument function. The Church numeral n is a function
if and only if they give the same result for all arguments. that takes a function f as argument and returns the n-th
Eta-conversion converts between x.(f x) and f whenever composition of f, i.e. the function f composed with it-
x does not appear free in f. self n times. This is denoted f (n) and is in fact the n-th
power of f (considered as an operator); f (0) is dened to
be the identity function. Such repeated compositions (of
6 Normal forms and conuence a single function f) obey the laws of exponents, which
is why these numerals can be used for arithmetic. (In
Churchs original lambda calculus, the formal parameter
Main article: Normalization property (abstract rewriting)
of a lambda expression was required to occur at least once
in the function body, which made the above denition of
For the untyped lambda calculus, -reduction as a 0 impossible.)
rewriting rule is neither strongly normalising nor weakly
We can dene a successor function, which takes a num-
normalising.
ber n and returns n + 1 by adding another application of
However, it can be shown that -reduction is conuent. f,where '(mf)x' means the function 'f' is applied 'm' times
(Of course, we are working up to -conversion, i.e. we on 'x':
consider two normal forms to be equal, if it is possible to
-convert one into the other.) SUCC := n.f.x.f (n f x)
Therefore, both strongly normalising terms and weakly
normalising terms have a unique normal form. For Because the m-th composition of f composed with the n-
strongly normalising terms, any reduction strategy is th composition of f gives the m+n-th composition of f,
guaranteed to yield the normal form, whereas for weakly addition can be dened as follows:
normalising terms, some reduction strategies may fail to
nd it. PLUS := m.n.f.x.m f (n f x)
6 7 ENCODING DATATYPES

PLUS can be thought of as a function taking two natural TRUE := x.y.x


numbers as arguments and returning a natural number; it FALSE := x.y.y
can be veried that
(Note that FALSE is equivalent to
PLUS 2 3 the Church numeral zero dened
above)
and
Then, with these two -terms, we can dene some logic
5 operators (these are just possible formulations; other ex-
pressions are equally correct):
are -equivalent lambda expressions. Since adding m to
a number n can be accomplished by adding 1 m times, an AND := p.q.p q p
equivalent denition is: OR := p.q.p p q
NOT := p.p FALSE TRUE
PLUS := m.n.m SUCC n [22]
IFTHENELSE := p.a.b.p a b
Similarly, multiplication can be dened as
We are now able to compute some logic functions, for
example:
MULT := m.n.f.m (n f)[17]

Alternatively AND TRUE FALSE

(p.q.p q p) TRUE FALSE


MULT := m.n.m (PLUS n) 0 TRUE FALSE TRUE
(x.y.x) FALSE TRUE
since multiplying m and n is the same as repeating the add FALSE
n function m times and then applying it to zero. Exponen-
tiation has a rather simple rendering in Church numerals,
and we see that AND TRUE FALSE is equivalent to
namely
FALSE.

POW := b.e.e b A predicate is a function that returns a boolean value.


The most fundamental predicate is ISZERO, which re-
turns TRUE if its argument is the Church numeral 0, and
The predecessor function dened by PRED n = n 1 for FALSE if its argument is any other Church numeral:
a positive integer n and PRED 0 = 0 is considerably more
dicult. The formula
ISZERO := n.n (x.FALSE) TRUE
PRED := n.f.x.n (g.h.h (g f)) (u.x)
(u.u) The following predicate tests whether the rst argument
is less-than-or-equal-to the second:
can be validated by showing inductively that if T denotes
(g.h.h (g f)), then T(n) (u.x) = (h.h(f (n1) (x))) for n LEQ := m.n.ISZERO (SUB m n),
> 0. Two other denitions of PRED are given below,
one using conditionals and the other using pairs. With and since m = n, if LEQ m n and LEQ n m, it is straight-
the predecessor function, subtraction is straightforward. forward to build a predicate for numerical equality.
Dening
The availability of predicates and the above denition of
TRUE and FALSE make it convenient to write if-then-
SUB := m.n.n PRED m, else expressions in lambda calculus. For example, the
predecessor function can be dened as:
SUB m n yields m n when m > n and 0 otherwise.
PRED := n.n (g.k.ISZERO (g 1) k (PLUS
7.2 Logic and predicates (g k) 1)) (v.0) 0

By convention, the following two denitions (known as which can be veried by showing inductively that n
Church booleans) are used for the boolean values TRUE (g.k.ISZERO (g 1) k (PLUS (g k) 1)) (v.0) is the add
and FALSE: n 1 function for n > 0.
7.4 Recursion and xed points 7

7.3 Pairs G := r. n.(1, if n = 0; else n (r r (n1)))

A pair (2-tuple) can be dened in terms of TRUE and with r r x = F x = G r x to


FALSE, by using the Church encoding for pairs. For ex- hold, so r = G and
ample, PAIR encapsulates the pair (x,y), FIRST returns
F := G G = (x.x x) G
the rst element of the pair, and SECOND returns the
second.
The self-application achieves replication here, passing the
PAIR := x.y.f.f x y functions lambda expression on to the next invocation as
FIRST := p.p TRUE an argument value, making it available to be referenced
and called there.
SECOND := p.p FALSE
This solves it but requires re-writing each recursive call as
NIL := x.TRUE
self-application. We would like to have a generic solution,
NULL := p.p (x.y.FALSE) without a need for any re-writes:
A linked list can be dened as either NIL for the
empty list, or the PAIR of an element and a smaller G := r. n.(1, if n = 0; else n (r (n1)))
list. The predicate NULL tests for the value NIL.
with r x = F x = G r x to
(Alternatively, with NIL := FALSE, the construct l
hold, so r = G r =: FIX G
(h.t.z.deal_with_head_h_and_tail_t) (deal_with_nil)
and
obviates the need for an explicit NULL test).
As an example of the use of pairs, the shift-and-increment F := FIX G where FIX g := (r where r = g r) =
function that maps (m, n) to (n, n + 1) can be dened as g (FIX g)

:= x.PAIR (SECOND x) (SUCC (SEC- so that FIX G = G (FIX


OND x)) G) = (n.(1, if n = 0; else
n ((FIX G) (n1))))
which allows us to give perhaps the most transparent ver-
sion of the predecessor function: Given a lambda term with rst argument representing re-
cursive call (e.g. G here), the xed-point combinator FIX
PRED := n.FIRST (n (PAIR 0 0)). will return a self-replicating lambda expression represent-
ing the recursive function (here, F). The function does
not need to be explicitly passed to itself at any point, for
7.4 Recursion and xed points the self-replication is arranged in advance, when it is cre-
ated, to be done each time it is called. Thus the original
Main article: Fixed-point combinator lambda expression (FIX G) is re-created inside itself, at
See also: SKI combinator calculus Self- call-point, achieving self-reference.
application_and_recursion
In fact, there are many possible denitions for this FIX
operator, the simplest of them being:
Recursion is the denition of a function using the func-
tion itself. Lambda calculus cannot express this as di-
rectly as some other notations: all functions are anony- Y := g.(x.g (x x)) (x.g (x x))
mous in lambda calculus, so we can't refer to a value
which is yet to be dened, inside the lambda term dening In the lambda calculus, Y g is a xed-point of g, as it
that same value. However, recursion can still be achieved expands to:
by arranging for a lambda expression to receive itself as
its argument value, for example in (x.x x) E. Yg
Consider the factorial function F(n) recursively dened by (h.(x.h (x x)) (x.h (x x))) g
F(n) = 1, if n = 0; else n F(n 1). (x.g (x x)) (x.g (x x))
g ((x.g (x x)) (x.g (x x)))
In the lambda expression which is to represent this func-
tion, a parameter (typically the rst one) will be assumed g (Y g)
to receive the lambda expression itself as its value, so that
calling it applying it to an argument will amount to Now, to perform our recursive call to the factorial func-
recursion. Thus to achieve recursion, the intended-as- tion, we would simply call (Y G) n, where n is the number
self-referencing argument (called r here) must always be we are calculating the factorial of. Given n = 4, for ex-
passed to itself within the function body, at a call point: ample, this gives:
8 10 UNDECIDABILITY OF EQUIVALENCE

(Y G) 4 8 Typed lambda calculus


G (Y G) 4
(r.n.(1, if n = 0; else n (r (n1)))) (Y G) 4 Main article: Typed lambda calculus

(n.(1, if n = 0; else n ((Y G) (n1)))) 4


A typed lambda calculus is a typed formalism that uses
1, if 4 = 0; else 4 ((Y G) (41)) the lambda-symbol ( ) to denote anonymous function
4 (G (Y G) (41)) abstraction. In this context, types are usually objects of
4 ((n.(1, if n = 0; else n ((Y G) (n1)))) a syntactic nature that are assigned to lambda terms; the
(41)) exact nature of a type depends on the calculus consid-
ered (see kinds below). From a certain point of view,
4 (1, if 3 = 0; else 3 ((Y G) (31))) typed lambda calculi can be seen as renements of the
4 (3 (G (Y G) (31))) untyped lambda calculus but from another point of view,
4 (3 ((n.(1, if n = 0; else n ((Y G) they can also be considered the more fundamental theory
(n1)))) (31))) and untyped lambda calculus a special case with only one
type.[23]
4 (3 (1, if 2 = 0; else 2 ((Y G) (21))))
Typed lambda calculi are foundational programming lan-
4 (3 (2 (G (Y G) (21)))) guages and are the base of typed functional program-
4 (3 (2 ((n.(1, if n = 0; else n ((Y G) ming languages such as ML and Haskell and, more indi-
(n1)))) (21)))) rectly, typed imperative programming languages. Typed
4 (3 (2 (1, if 1 = 0; else 1 ((Y G) lambda calculi play an important role in the design of type
(11))))) systems for programming languages; here typability usu-
ally captures desirable properties of the program, e.g. the
4 (3 (2 (1 (G (Y G) (11))))) program will not cause a memory access violation.
4 (3 (2 (1 ((n.(1, if n = 0; else n ((Y Typed lambda calculi are closely related to mathematical
G) (n1)))) (11))))) logic and proof theory via the CurryHoward isomor-
4 (3 (2 (1 (1, if 0 = 0; else 0 ((Y G) phism and they can be considered as the internal language
(01)))))) of classes of categories, e.g. the simply typed lambda
4 (3 (2 (1 (1)))) calculus is the language of Cartesian closed categories
(CCCs).
24

Every recursively dened function can be seen as a xed 9 Computable functions and
point of some suitably dened function closing over the
recursive call with an extra argument, and therefore, lambda calculus
using Y, every recursively dened function can be ex-
pressed as a lambda expression. In particular, we can now A function F: N N of natural numbers is a computable
cleanly dene the subtraction, multiplication and compar- function if and only if there exists a lambda expression f
ison predicate of natural numbers recursively. such that for every pair of x, y in N, F(x)=y if and only
if f x = y, where x and y are the Church numerals corre-
sponding to x and y, respectively and = meaning equiva-
7.5 Standard terms lence with beta reduction. This is one of the many ways
to dene computability; see the Church-Turing thesis for
Certain terms have commonly accepted names: a discussion of other approaches and their equivalence.

I := x.x
K := x.y.x 10 Undecidability of equivalence
S := x.y.z.x z (y z)
B := x.y.z.x (y z) There is no algorithm that takes as input two lambda ex-
pressions and outputs TRUE or FALSE depending on
C := x.y.z.x z y whether or not the two expressions are equivalent. This
W := x.y.x y y was historically the rst problem for which undecidability
U := x.y.y (x x y) could be proven. As is common for a proof of undecid-
ability, the proof shows that no computable function can
:= x.x x decide the equivalence. Churchs thesis is then invoked
:= to show that no algorithm can do so.
Y := g.(x.g (x x)) (x.g (x x)) Churchs proof rst reduces the problem to determining
11.2 Reduction strategies 9

whether a given lambda expression has a normal form. A 11.2 Reduction strategies
normal form is an equivalent expression that cannot be
reduced any further under the rules imposed by the form. For more details on this topic, see Evaluation strategy.
Then he assumes that this predicate is computable, and
can hence be expressed in lambda calculus. Building on Whether a term is normalising or not, and how much
earlier work by Kleene and constructing a Gdel number- work needs to be done in normalising it if it is, depends to
ing for lambda expressions, he constructs a lambda ex- a large extent on the reduction strategy used. The distinc-
pression e that closely follows the proof of Gdels rst tion between reduction strategies relates to the distinction
incompleteness theorem. If e is applied to its own Gdel in functional programming languages between eager eval-
number, a contradiction results. uation and lazy evaluation.

Full beta reductions Any redex can be reduced at any


time. This means essentially the lack of any partic-
ular reduction strategywith regard to reducibility,
11 Lambda calculus and program- all bets are o.
ming languages Applicative order The rightmost, innermost redex is al-
ways reduced rst. Intuitively this means a func-
As pointed out by Peter Landin's 1965 paper A Corre- tions arguments are always reduced before the func-
spondence between ALGOL 60 and Churchs Lambda- tion itself. Applicative order always attempts to ap-
notation, sequential procedural programming languages ply functions to normal forms, even when this is not
can be understood in terms of the lambda calculus, which possible.
provides the basic mechanisms for procedural abstraction
Most programming languages (including Lisp, ML and
and procedure (subprogram) application.
imperative languages like C and Java) are described
Lambda calculus reies functions and makes them rst- as strict, meaning that functions applied to non-
class objects, which raises implementation complexity normalising arguments are non-normalising. This is
when it is implemented. done essentially using applicative order, call by value
reduction (see below), but usually called eager eval-
uation.
Normal order The leftmost, outermost redex is always
11.1 Anonymous functions reduced rst. That is, whenever possible the argu-
ments are substituted into the body of an abstraction
Main article: Anonymous function before the arguments are reduced.
Call by name As normal order, but no reductions
For example, in Lisp the 'square' function can be ex- are performed inside abstractions. For example,
pressed as a lambda expression as follows: x.(x.x)x is in normal form according to this strat-
egy, although it contains the redex (x.x)x.
(lambda (x) (* x x))
Call by value Only the outermost redexes are reduced:
The above example is an expression that evaluates to a a redex is reduced only when its right hand side has
rst-class function. The symbol lambda creates an anony- reduced to a value (variable or lambda abstraction).
mous function, given a list of parameter names, (x) Call by need As normal order, but function applications
just a single argument in this case, and an expression that that would duplicate terms instead name the ar-
is evaluated as the body of the function, (* x x). Anony- gument, which is then reduced only when it is
mous functions are sometimes called lambda expressions. needed. Called in practical contexts lazy evalu-
For example, Pascal and many other imperative lan- ation. In implementations this name takes the
guages have long supported passing subprograms as form of a pointer, with the redex represented by a
arguments to other subprograms through the mechanism thunk.
of function pointers. However, function pointers are
not a sucient condition for functions to be rst class Applicative order is not a normalising strategy. The usual
datatypes, because a function is a rst class datatype if counterexample is as follows: dene = where
and only if new instances of the function can be cre- = x.xx. This entire expression contains only one redex,
ated at run-time. And this run-time creation of functions namely the whole expression; its reduct is again . Since
is supported in Smalltalk, JavaScript, and more recently this is the only available reduction, has no normal form
in Scala, Eiel (agents), C# (delegates) and C++11, (under any evaluation strategy). Using applicative order,
among others. the expression KI = (x.y.x) (x.x) is reduced by rst
10 13 SEE ALSO

reducing to normal form (since it is the rightmost re- have been developed for describing communication and
dex), but since has no normal form, applicative order concurrency.
fails to nd a normal form for KI.
In contrast, normal order is so called because it always
nds a normalising reduction, if one exists. In the above 12 Semantics
example, KI reduces under normal order to I, a normal
form. A drawback is that redexes in the arguments may The fact that lambda calculus terms act as functions on
be copied, resulting in duplicated computation (for exam- other lambda calculus terms, and even on themselves, led
ple, (x.xx) ((x.x)y) reduces to ((x.x)y) ((x.x)y) using to questions about the semantics of the lambda calculus.
this strategy; now there are two redexes, so full evalua- Could a sensible meaning be assigned to lambda calculus
tion needs two more steps, but if the argument had been terms? The natural semantics was to nd a set D isomor-
reduced rst, there would now be none). phic to the function space D D, of functions on itself.
The positive tradeo of using applicative order is that it However, no nontrivial such D can exist, by cardinality
does not cause unnecessary computation, if all arguments constraints because the set of all functions from D to D
are used, because it never substitutes arguments contain- has greater cardinality than D, unless D is a singleton set.
ing redexes and hence never needs to copy them (which In the 1970s, Dana Scott showed that, if only continuous
would duplicate work). In the above example, in applica- functions were considered, a set or domain D with the
tive order (x.xx) ((x.x)y) reduces rst to (x.xx)y and required property could be found, thus providing a model
then to the normal order yy, taking two steps instead of for the lambda calculus.
three.
This work also formed the basis for the denotational se-
Most purely functional programming languages (notably mantics of programming languages.
Miranda and its descendents, including Haskell), and the
proof languages of theorem provers, use lazy evaluation,
which is essentially the same as call by need. This is like 13 See also
normal order reduction, but call by need manages to avoid
the duplication of work inherent in normal order reduc-
Applicative computing systems Treatment of
tion using sharing. In the example given above, (x.xx)
objects in the style of the lambda calculus
((x.x)y) reduces to ((x.x)y) ((x.x)y), which has two re-
dexes, but in call by need they are represented using the Binary lambda calculus A version of lambda cal-
same object rather than copied, so when one is reduced culus with binary I/O, a binary encoding of terms,
the other is too. and a designated universal machine.
Calculus of constructions A typed lambda calculus
11.3 A note about complexity with types as rst-class values
Cartesian closed category A setting for lambda cal-
While the idea of beta reduction seems simple enough, culus in category theory
it is not an atomic step, in that it must have a non-trivial
cost when estimating computational complexity.[24] To be Categorical abstract machine A model of compu-
precise, one must somehow nd the location of all of the tation applicable to lambda calculus
occurrences of the bound variable V in the expression E, Combinatory logic A notation for mathematical
implying a time cost, or one must keep track of these loca- logic without variables
tions in some way, implying a space cost. A nave search
for the locations of V in E is O(n) in the length n of E. This Curry-Howard isomorphism The formal corre-
has led to the study of systems that use explicit substitu- spondence between programs and proofs
tion. Sinots director strings[25] oer a way of tracking
the locations of free variables in expressions. Deductive lambda calculus The consideration of
the problems associated with considering lambda
calculus as a Deductive system.
11.4 Parallelism and concurrency Domain theory Study of certain posets giving
denotational semantics for lambda calculus
The ChurchRosser property of the lambda calculus
means that evaluation (-reduction) can be carried out Evaluation strategy Rules for the evaluation of ex-
in any order, even in parallel. This means that various pressions in programming languages
nondeterministic evaluation strategies are relevant. How- Explicit substitution The theory of substitution, as
ever, the lambda calculus does not oer any explicit con- used in -reduction
structs for parallelism. One can add constructs such as
Futures to the lambda calculus. Other process calculi Functional programming
11

Harrop formula A kind of constructive logical for- Barendregt, Hendrik Pieter, The Type Free Lambda
mula such that proofs are lambda terms Calculus pp10911132 of Handbook of Mathemat-
ical Logic, North-Holland (1977) ISBN 0-7204-
Kappa calculus A rst-order analogue of lambda 2285-X
calculus
Cardone and Hindley, 2006. History of Lambda-
Kleene-Rosser paradox A demonstration that calculus and Combinatory Logic. In Gabbay and
some form of lambda calculus is inconsistent Woods (eds.), Handbook of the History of Logic, vol.
5. Elsevier.
Knights of the Lambda Calculus A semi-ctional
organization of LISP and Scheme hackers Church, Alonzo, An unsolvable problem of elemen-
tary number theory, American Journal of Mathe-
Lambda calculus denition - Formal denition of the
matics, 58 (1936), pp. 345363. This paper con-
lambda calculus.
tains the proof that the equivalence of lambda ex-
Lambda cube A framework for some extensions pressions is in general not decidable.
of typed lambda calculus Alonzo Church, The Calculi of Lambda-Conversion
Lambda-mu calculus An extension of the lambda (ISBN 978-0-691-08394-0)[26]
calculus for treating classical logic Kleene, Stephen, A theory of positive integers in for-
Let expression An expression closely related to a mal logic, American Journal of Mathematics, 57
lambda abstraction. (1935), pp. 153173 and 219244. Contains the
lambda calculus denitions of several familiar func-
Minimalism (computing) tions.

Rewriting Transformation of formul in formal Landin, Peter, A Correspondence Between


systems ALGOL 60 and Churchs Lambda-Notation,
Communications of the ACM, vol. 8, no. 2 (1965),
SECD machine A virtual machine designed for the pages 89101. Available from the ACM site. A
lambda calculus classic paper highlighting the importance of lambda
calculus as a basis for programming languages.
Simply typed lambda calculus - Version(s) with a
single type constructor Larson, Jim, An Introduction to Lambda Calculus
and Scheme. A gentle introduction for program-
SKI combinator calculus A computational system mers.
based on the S, K and I combinators
Schalk, A. and Simmons, H. (2005) An introduc-
System F A typed lambda calculus with type- tion to -calculi and arithmetic with a decent selection
variables of exercises. Notes for a course in the Mathematical
Logic MSc at Manchester University.
Typed lambda calculus Lambda calculus with
typed variables (and functions) de Queiroz, Ruy J.G.B. (2008) On Reduction
Rules, Meaning-as-Use and Proof-Theoretic Seman-
Universal Turing machine A formal computing
tics. Studia Logica, 90(2):211-247. A paper giving
machine that is equivalent to lambda calculus
a formal underpinning to the idea of 'meaning-is-
Unlambda An esoteric functional programming use' which, even if based on proofs, it is dierent
language based on combinatory logic from proof-theoretic semantics as in the Dummett
Prawitz tradition since it takes reduction as the rules
giving meaning.
14 Further reading Hankin, Chris, An Introduction to Lambda Calculi
for Computer Scientists, ISBN 0954300653
Abelson, Harold & Gerald Jay Sussman. Structure
and Interpretation of Computer Programs. The MIT Monographs/textbooks for graduate students:
Press. ISBN 0-262-51087-1.

Hendrik Pieter Barendregt Introduction to Lambda Morten Heine Srensen, Pawe Urzyczyn, Lectures
Calculus. on the Curry-Howard isomorphism, Elsevier, 2006,
ISBN 0-444-52077-5 is a recent monograph that
Henk Barendregt, The Impact of the Lambda Calcu- covers the main topics of lambda calculus from the
lus in Logic and Computer Science. The Bulletin of type-free variety, to most typed lambda calculi, in-
Symbolic Logic, Volume 3, Number 2, June 1997. cluding more recent developments like pure type
12 16 REFERENCES

systems and the lambda cube. It does not cover evaluating lambda expressions and discusses the ap-
subtyping extensions. plicability of lambda calculus for distributed com-
puting (due to the ChurchRosser property, which
Pierce, Benjamin (2002), Types and Programming enables parallel graph reduction for lambda expres-
Languages, MIT Press, ISBN 0-262-16209-1 cov- sions).
ers lambda calculi from a practical type system per-
spective; some topics like dependent types are only Shane Steinert-Threlkeld, Lambda Calculi,
mentioned, but subtyping is an important topic. Internet Encyclopedia of Philosophy

Some parts of this article are based on material from


FOLDOC, used with permission. 16 References
[1] Turing, A. M. (December 1937). Computability and -
Denability. The Journal of Symbolic Logic. 2 (4): 153
15 External links 163. doi:10.2307/2268280. JSTOR 2268280.

Hazewinkel, Michiel, ed. (2001), Lambda- [2] Coquand, Thierry, Type Theory, The Stanford Encyclo-
calculus, Encyclopedia of Mathematics, Springer, pedia of Philosophy (Summer 2013 Edition), Edward N.
ISBN 978-1-55608-010-4 Zalta (ed.).

[3] Categorial Investigations: Logical and Linguistic Aspects of


Achim Jung, A Short Introduction to the Lambda
the Lambek Calculus - Michael Moortgat - Google Books,
Calculus-(PDF) Books.google.co.uk, 1988-01-01, ISBN 9789067653879,
retrieved 2013-09-15
Dana Scott, A timeline of lambda calculus-(PDF)
[4] Computing Meaning - Google Books, Books.google.co.uk,
David C. Keenan, To Dissect a Mockingbird: A 2008-07-02, ISBN 9781402059575, retrieved 2013-09-
Graphical Notation for the Lambda Calculus with 15
Animated Reduction
[5] Mitchell, John C. (2003), Concepts in Programming
Ral Rojas, A Tutorial Introduction to the Lambda Languages, Cambridge University Press, p. 57, ISBN
Calculus-(PDF) 9780521780988.

Peter Selinger, Lecture Notes on the Lambda Calcu- [6] Basic Category Theory for Computer Scientists, p. 53,
lus-(PDF) Benjamin C. Pierce

[7] A. Church, A set of postulates for the foundation of


L. Allison, Some executable -calculus examples
logic, Annals of Mathematics, Series 2, 33:346366
(1932).
Georg P. Loczewski, The Lambda Calculus and
A++ [8] For a full history, see Cardone and Hindleys History of
Lambda-calculus and Combinatory Logic (2006).
Bret Victor, Alligator Eggs: A Puzzle Game Based
on Lambda Calculus [9] Kleene, S. C.; Rosser, J. B. (July 1935). The Inconsis-
tency of Certain Formal Logics. The Annals of Mathe-
Lambda Calculus on Safalras Website matics. 36 (3): 630. doi:10.2307/1968646.

Lambda Calculus. PlanetMath. [10] Church, Alonzo; Curry, Haskell B. (December 1942).
The Inconsistency of Certain Formal Logics.. The Jour-
LCI Lambda Interpreter a simple yet powerful pure nal of Symbolic Logic. 7 (4): 170. doi:10.2307/2268117.
calculus interpreter
[11] A. Church, An unsolvable problem of elementary num-
Lambda Calculus links on Lambda-the-Ultimate ber theory, American Journal of Mathematics, Volume
58, No. 2. (April 1936), pp. 345-363.
Mike Thyer, Lambda Animator, a graphical Java ap-
[12] Church, A. A Formulation of the Simple Theory
plet demonstrating alternative reduction strategies.
of Types. Journal of Symbolic Logic. 5: 1940.
Implementing the Lambda calculus using C++ Tem- doi:10.2307/2266170.
plates [13] Partee, B. B. H.; Meulen, A. G.; Wall, R. (1990).
Mathematical Methods in Linguistics. Springer. Retrieved
Marius Buliga, Graphic lambda calculus 29 Dec 2016.
Lambda Calculus as a Workow Model by Peter [14] Alama, Jesse The Lambda Calculus, The Stanford Ency-
Kelly, Paul Coddington, and Andrew Wendelborn; clopedia of Philosophy (Summer 2013 Edition), Edward
mentions graph reduction as a common means of N. Zalta (ed.).
13

[15] Barendregt, Hendrik Pieter (1984), The Lambda Calcu-


lus: Its Syntax and Semantics, Studies in Logic and the
Foundations of Mathematics, 103 (Revised ed.), North
Holland, Amsterdam. Corrections, ISBN 0-444-87508-
5, archived from the original on 2004-08-23 External link
in |publisher= (help)

[16] Example for Rules of Associativity. Lambda-


bound.com. Retrieved 2012-06-18.

[17] Selinger, Peter (2008), Lecture Notes on the Lambda


Calculus (PDF), 0804 (class: cs.LO), Department of
Mathematics and Statistics, University of Ottawa, p. 9,
arXiv:0804.3434 , Bibcode:2008arXiv0804.3434S

[18] Example for Rule of Associativity. Lambda-


bound.com. Retrieved 2012-06-18.

[19] Barendregt, Henk; Barendsen, Erik (March 2000),


Introduction to Lambda Calculus (PDF)

[20] de Queiroz, Ruy J.G.B. "A Proof-Theoretic Account of


Programming and the Role of Reduction Rules." Dialec-
tica 42(4), pages 265-282, 1988.

[21] Turbak, Franklyn; Giord, David (2008), Design concepts


in programming languages, MIT press, p. 251, ISBN 978-
0-262-20175-9

[22] Felleisen, Matthias; Flatt, Matthew (2006), Programming


Languages and Lambda Calculi (PDF), p. 26

[23] Types and Programming Languages, p. 273, Benjamin C.


Pierce

[24] R. Statman, "The typed -calculus is not elementary re-


cursive." Theoretical Computer Science, (1979) 9 pp73-81.

[25] F.-R. Sinot. "Director Strings Revisited: A Generic Ap-


proach to the Ecient Representation of Free Variables
in Higher-order Rewriting." Journal of Logic and Compu-
tation 15(2), pages 201-218, 2005.

[26] Frink Jr., Orrin (1944). Review: The Calculi of Lambda-


Conversion by Alonzo Church (PDF). Bull. Amer. Math.
Soc. 50 (3): 169172. doi:10.1090/s0002-9904-1944-
08090-7.
14 17 TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

17 Text and image sources, contributors, and licenses


17.1 Text
Lambda calculus Source: https://en.wikipedia.org/wiki/Lambda_calculus?oldid=762446738 Contributors: AxelBoldt, Tobias Ho-
evekamp, General Wesc, Dreamyshade, Derek Ross, Vulture, LC~enwiki, CYD, Bryan Derksen, The Anome, Jan Hidders, Andre En-
gels, Arvindn, Fubar Obfusco, Spi~enwiki, Michael Hardy, Dominus, GTBacchus, Eric119, Minesweeper, Cyp, Nanshu, Glenn, AugPi,
Tim Retout, Smack, Charles Matthews, Timwi, Dysprosia, Malcohol, Greenrd, Markhurd, Furrykef, Populus, Shizhao, Kwantus, Joy,
MH~enwiki, Robbot, Lloyd~enwiki, Tomchiukc, Kowey, MathMartin, Jleedev, Tea2min, David Gerard, Ancheta Wis, Gploc, Centrx,
Giftlite, Paul Richter, MathKnight, Herbee, Everyking, Jonabbey, Dratman, Esap, Jorend, Jason Quinn, Neilc, Nomeata, Vadmium,
PenguiN42, James Crippen, Sarex, Urhixidur, Bbpen, Karl Dickman, Corti, Mormegil, R, Pyrop, Zaheen, Rich Farmbrough, Guan-
abot, Leibniz, FiP, ArnoldReinhold, Smyth, Slipstream, Bender235, ZeroOne, Elwikipedista~enwiki, MBisanz, Chalst, Tjic, Idmillington,
Blonkm, John Vandenberg, Cmdrjameson, Jjk, Lance Williams, Kensai, Chbarts, Matt McIrvin, Tromp, Zygmunt lozinski, Hooperbloob,
Diego Moya, Keenan Pepper, Sligocki, Evil Monkey, Tony Sidaway, Gpvos, TenOfAllTrades, Bfreis, LunaticFringe, Oleg Alexandrov,
Siafu, Thryduulf, Pekinensis, Wedesoft, Linas, Jyavner, LOL, MattGiuca, Ruud Koot, Gruu, Apokrif, GregorB, Palica, Marudubshinki,
BD2412, Qwertyus, Jacob Finn, Rjwilmsi, MarSch, Venullian, Vegaswikian, Husky, Titoxd, VKokielov, EvanSeeds, John Baez, Mathbot,
GrdScarabe~enwiki, Lexspoon, Makkuro, StevenDaryl, Natkuhn, Vonkje, Chobot, Bgwhite, YurikBot, Wavelength, Hairy Dude, D.keenan,
RussBot, Michael Slone, Koeyahoo, Jtbandes, BlakeStone, CarlHewitt, Thunderforge, R.e.s., Joel7687, Kliph, Jpbowen, JulesH, Beas-
tRHIT, Bota47, Hakeem.gadi, CLW, Wknight94, Ms2ger, Saric, Liyang, Thnidu, Cedar101, Donhalcon, JLaTondre, GrinBot~enwiki,
Owl-syme, SmackBot, Pintman, TobyK, Ariovistus, Atomota, BiT, Sam Pointon, Mcld, Hmains, PJTraill, Serhei Makarov, Chris the
speller, Optikos, Theone256, Jyossarian, Jimmyzimms, Mcaruso, Javalenok, Detter, Khukri, Derek R Bullamore, Iridescence, JamieVi-
cary, Daniel.Cardenas, OlegAndreev, Lambiam, Antonielly, Physis, Mets501, Kripkenstein, Iridescent, JMK, Gabn1, Zero sharp, Tawker-
bot2, Nerfer, Wafulz, CBM, Nczempin, Neelix, Sanspeur, Gregbard, Cydebot, Krauss, Illpoint, Sam Staton, Blaisorblade, Julian Mendez,
Msreeharsha, Torc2, Nowhere man, Roccorossi, Bsmntbombdood, Morgaladh, Kirk Hilliard, Wikid77, Henk Barendregt, N5iln, Pjvpjv,
Hjoab, Escarbot, KrakatoaKatie, AntiVandalBot, Whiteknox, Gioto, Kba, MBParker, Dougher, JAnDbot, The Transhumanist, Rearete,
Workaphobia, Magioladitis, Abcarter, Fuchsias, Xb2u7Zjzc32, TehKeg, A3nm, David Eppstein, Shredderyin, Micahcowan, Tigrisek, Gw-
ern, John Millikin, R'n'B, GoatGuy, Daniel5Ko, CeilingCrash, Raise exception, NewEnglandYankee, Policron, ScottBurson, Largoplazo,
Potatoswatter, Ultra two, Adam1729, Pborenstein, The enemies of god, Meiskam, DPMulligan, LokiClock, TXiKiBoT, Mattc58, Mar-
cosaedro, Shades79, Softtest123, TelecomNut, Jesin, GlassFET, Aeris-chan, Radagast3, AmigoNico, SieBot, Equilibrioception, Gerakibot,
Toddst1, Evaluist, Dddenton, Ctxppc, DancingPhilosopher, Valeria.depaiva, Dcattell, Longratana, Classicalecon, ClueBot, The Thing That
Should Not Be, Dented42, DavisSta, EoGuy, Maniac18, Nonlinear149, HowardBGolden, Adrianwn, Ironrange, Hyh1048576, UKoch,
Cinayakoshka, Alexbot, Pmronchi, Numl0k, Rhododendrites, Hans Adler, Alexey Muranov, Awegmann, Dwiddows, AndreasBWagner,
Afarnen, Hugo Herbelin, StevenDH, Qwfp, Joswig, Brianpeiris, Dreblen, Kizeral, Addbot, Trueyoutrueme, Some jerk on the Internet,
Landon1980, Punto7, AnnaFrance, Roaryk, Numbo3-bot, Lightbot, Jarble, Pedzsan, Luckas-bot, Yobot, Ht686rg90, Pcap, AnomieBOT,
Enisbayramoglu, Royote, Karun.mahajan, , Citation bot, Charlieegan3, Xqbot, Jebdm, YBG, Jonas AGX, Omnipaedista,
Noamz, Stratocracy, CLeJ37, Aaditya 7, Bstarynk, Adamuu, FrescoBot, Util PM, ComputScientist, Artem M. Pelenitsyn, Sae1962, Demos-
thenes2k8, Umawera, Kallocain, Citation bot 1, Pinethicket, Sherjilozair, WLoku, WaddSpoiley, CodeBlock, RedBot, WuTheFWasThat,
Burritoburritoburrito, Lueckless, Lotje, Holoed, Edinwiki, Mrout, WillNess, LoStrangolatore, Martin Bjeldbak, Vcunat, FalseAxiom,
Bgeron, Wgunther, KHamsun, Grondilu, ZroBot, ArachanoxReal, D.Lazard, Future ahead, Stanmanish, ResearchRave, ClueBot NG,
Piast93, Ghartshaw, Frietjes, Thepigdog, Nullzero, Helpful Pixie Bot, J.Dong820, Wbm1058, BG19bot, Lawandeconomics1, Tokoro14,
Halfb1t, TypesGuy1234, Wolfgang42, Glacialfox, ChrisGualtieri, Pintoch, Sean htx, Dtm1234, Splendor78, Paul1andrews, TheKing44,
Mgns51, Jochen Burghardt, Dschslava, Alinsoar, Pdecalculus, Melonkelon, BeastCCT, Julia Abril, Glassbreaker, EXist73, MergerDude,
Paul2520, Aubreybardo, Ordnungswidrig, Jayaguru-Shishya, OMPIRE, Zeiimer, Axiarchist, Aasasd, Wombur, Psychoceramicist, Mikhdm,
Shubhamsoumit, Spli Joint Blunt, Iglpdc, Matrix1919, WikipediaIsAwesome9999, InternetArchiveBot, Oknaye, Paxwell, Toku Jin, Olrik
113, Camaiocco, WallyWinker, JiapengZhang and Anonymous: 453

17.2 Images
File:Edit-clear.svg Source: https://upload.wikimedia.org/wikipedia/en/f/f2/Edit-clear.svg License: Public domain Contributors: The
Tango! Desktop Project. Original artist:
The people from the Tango! project. And according to the meta-data in the le, specically: Andreas Nilsson, and Jakub Steiner (although
minimally).
File:Lock-green.svg Source: https://upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg License: CC0 Contributors: en:File:
Free-to-read_lock_75.svg Original artist: User:Trappist the monk
File:Nuvola_apps_edu_mathematics_blue-p.svg Source: https://upload.wikimedia.org/wikipedia/commons/3/3e/Nuvola_apps_edu_
mathematics_blue-p.svg License: GPL Contributors: Derivative work from Image:Nuvola apps edu mathematics.png and Image:Nuvola
apps edu mathematics-p.svg Original artist: David Vignoni (original icon); Flamurai (SVG convertion); bayo (color)
File:Text_document_with_red_question_mark.svg Source: https://upload.wikimedia.org/wikipedia/commons/a/a4/Text_document_
with_red_question_mark.svg License: Public domain Contributors: Created by bdesham with Inkscape; based upon Text-x-generic.svg
from the Tango project. Original artist: Benjamin D. Esham (bdesham)

17.3 Content license


Creative Commons Attribution-Share Alike 3.0

You might also like