Church encoding

Church encoding

In mathematics, Church encoding is a means of embedding data and operators into the lambda calculus, the most familiar form being the Church numerals, a representation of the natural numbers using lambda notation. The method is named for Alonzo Church, who first encoded data in the lambda calculus this way.

Terms that are usually considered primitive in other notations (such as integers, booleans, pairs, lists, and tagged unions) are mapped to higher-order functions under Church encoding; the Church-Turing thesis asserts that any computable operator (and its operands) can be represented under Church encoding.

Many students of mathematics are familiar with Gödel numbering members of a set; Church encoding is an equivalent operation defined on lambda abstractions instead of natural numbers.

Contents

Church numerals

Church numerals are the representations of natural numbers under Church encoding. The higher-order function that represents natural number n is a function that maps any function f to its n-fold composition. In simpler terms, the "value" of the numeral is equivalent to the number of times the function encapsulates its argument.

f^n = f \circ f \circ \cdots \circ f.\,

Definition

All Church numerals are functions that take two parameters. Here f is the successor function and x represents 0. Church numerals 0, 1, 2, ..., are defined as follows in the lambda calculus:

0λf.λx. x
1λf.λx. f x
2λf.λx. f (f x)
3λf.λx. f (f (f x))
...
nλf.λx. fn x
...

That is, the natural number n is represented by the Church numeral n, which has the property that for any lambda-terms F and X,

n F X =β Fn X

Computation with Church numerals

In the lambda calculus, numeric functions are representable by corresponding functions on Church numerals. These functions can be implemented in most functional programming languages (subject to type constraints) by direct translation of lambda terms.

The addition function plus(m,n)=m+n uses the identity f(m + n)(x) = fm(fn(x)).

plusλm.λn.λf.λx. m f (n f x)

The successor function succ(n)=n+1 is β-equivalent to (plus 1).

succλn.λf.λx. f (n f x)

The multiplication function mult(m,n)=m*n uses the identity f(m * n) = (fn)m.

multλm.λn.λf.λx. m (n f) x

The exponentiation function exp(m,n)=m^n is straightforward using the multiplication function defined above.

expλm.λn. n (mult m) 1

The predecessor function \operatorname{pred}(n) = \begin{cases} 0 & \mbox{if }n=0, \\ n-1 & \mbox{otherwise}\end{cases} works by generating an n-fold composition of functions that each apply their argument g to f; the base case discards its copy of f and returns x.

predλn.λf.λx. n (λg.λh. h (g f)) (λu. x) (λu. u)

The subtraction function can be written based on the predecessor function.

subλm.λn. (n pred) m

The zero predicate can be written as:

zero?λn. n (λx.F) T

Now:

zero? n =β T if n =β 0.
zero? n =β F if nβ 0, provided n is a Church numeral and where ≠β is the negation of =β restricted to reducible lambda terms.

T and F can be arbitrary terms, for example the two Booleans as described elsewhere in this article.

Translation with other representations

Most real-world languages have support for machine-native integers; the church and unchurch functions (given here in Haskell) convert between nonnegative integers and their corresponding church numerals. Implementations of these conversions in other languages are similar.


type Church a = (a -> a) -> (a -> a)

church :: Integer -> Church Integer
church 0 = \f -> \x -> x
church n = \f -> \x -> f (church (n-1) f x)

unchurch :: Church Integer -> Integer
unchurch n = n (\x -> x + 1) 0

In Haskell, the \ corresponds to the λ of Lambda calculus.

Church booleans

Church booleans are the Church encoding of the boolean values true and false. Some programming languages use these as an implementation model for boolean arithmetic; examples are Smalltalk and Pico. The boolean values are represented as functions of two values that evaluate to one or the other of their arguments.

Formal definition in lambda calculus:

trueλa.λb. a
falseλa.λb. b

Note that this definition allows predicates (i.e. functions returning logical values) to directly act as if-clauses, e.g. if predicate is a unary predicate,

predicate x then-clause else-clause

evaluates to then-clause if predicate x evaluates to true, and to else-clause if predicate x evaluates to false.

Functions of boolean arithmetic can be derived for Church booleans:

andλm.λn. m n m
orλm.λn. m m n
notλm.λa.λb. m b a
xorλm.λn.λa.λb. m (n b a) (n a b)

Some examples:

and true false(λm.λn. m n m) (λa.λb. a) (λa.λb. b) ≡ (λa.λb. a) (λa.λb. b) (λa.λb. a)(λa.λb. b)false
or true false(λm.λn. m m n) (λa.λb. a) (λa.λb. b)(λa.λb. a) (λa.λb. a) (λa.λb. b)(λa.λb. a)true
not true(λm.λa.λb. m b a) (λa.λb. a)(λa.λb. (λa.λb. a) b a)(λa.λb. b)false

Church pairs

Church pairs are the Church encoding of the pair (two-tuple) type. The pair is represented as a function that takes a function argument. When given its argument it will apply the argument to the two components of the pair.

Formal definition in lambda calculus:

pairλx.λy.λz.z x y
fstλp.p (λx.λy.x)
sndλp.p (λx.λy.y)

An example:

fst (pair a b) ≡ (λp.p (λx.λy.x)) ((λx.λy.λz.z x y) a b) ≡ (λp.p (λx.λy.x)) (λz.z a b) ≡ (λz.z a b) (λx.λy.x) ≡ (λx.λy.x) a b ≡ a

List encodings

An encoding of (immutable) lists of varying length must define a constructor for creating an empty list (nil), an operation testing whether or not a list is empty (isnil), an operation to prepend a given value to a (possibly empty) list (cons), and two operations to determine the first element and the list of the remaining elements of a nonempty list (head and tail).

Church pairs

A nonempty list can basically be encoded by a Church pair with the head of the list stored in the first component of the pair and the tail of the list in the second component. However, special care is needed to unambiguously encode the empty list. This can be achieved by encapsulating any individual list node within the second component of another pair whose first component contains a Church boolean which is true for the empty list and false otherwise, similar to a tagged union. Using this idea the basic list operations can be defined like this:[1]

nilpair true true
isnilfst
cons ≡ λh.λt.pair false (pair h t)
head ≡ λz.fst (snd z)
tail ≡ λz.snd (snd z)

The second component of the pair encoding nil is never used provided that head and tail are only applied to nonempty lists.

Alternatively, one can define [2]

conspair
headfst
tailsnd
nilfalse
isnil ≡ λl.l (λh.λt.λd.false) true

where the last definition is a special case of the general

process-list ≡ λl.l (λh.λt.λd. head-and-tail-clause) nil-clause

Higher-order function

As an alternative to the encoding using Church pairs, a list can be encoded by identifying it with its right fold function. For example, a list of three elements x, y and z can be encoded by a higher-order function which when applied to a combinator c and a value n returns c x (c y (c z n))).

nilλc.λn.n
isnilλl.l (λh.λt.false) true
consλh.λt.λc.λn.c h (t c n)
headλl.l (λh.λt.h) false
tailλl.fst (l (λx.λp.pair (snd p) (cons x (snd p))) (pair nil nil))

See also

References

  1. ^ Pierce, Benjamin C. (2002). Types and Programming Languages. MIT Press. pp. 500. ISBN 978-0262162098. 
  2. ^ John Tromp, Binary Lambda Calculus and Combinatory Logic, in Randomness And Complexity, from Leibniz To Chaitin, ed. Cristian S. Calude, World Scientific Publishing Company, October 2008. (pdf version)

Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Look at other dictionaries:

  • Mogensen–Scott encoding — In computer science, Scott encoding is a way to embed inductive datatypes in the lambda calculus. Mogensen–Scott encoding extends and slightly modifies this to an embedding of all terms of the untyped lambda calculus. Contents 1 Definition 1.1… …   Wikipedia

  • Mogensen-Scott encoding — In computer science, Scott encoding is a way to embed inductive datatypes in the lambda calculus. Mogensen Scott encoding extends and slightly modifies this to an embedding of all terms of the untyped lambda calculus.DefinitionLet D be a datatype …   Wikipedia

  • Alonzo Church — This article is about the mathematician and logician. For the president of the University of Georgia, see Alonzo S. Church. Alonzo Church Alonzo Church (1903–1995) …   Wikipedia

  • Fixed-point combinator — Y combinator redirects here. For the technology venture capital firm, see Y Combinator (company). In computer science, a fixed point combinator (or fixpoint combinator[1] ) is a higher order function that computes a fixed point of other functions …   Wikipedia

  • Lambda calculus — In mathematical logic and computer science, lambda calculus, also written as λ calculus, is a formal system designed to investigate function definition, function application and recursion. It was introduced by Alonzo Church and Stephen Cole… …   Wikipedia

  • Simply typed lambda calculus — The simply typed lambda calculus (lambda^ o) is a typed interpretation of the lambda calculus with only one type combinator: o (function type). It is the canonical and simplest example of a typed lambda calculus. The simply typed lambda calculus… …   Wikipedia

  • Evaluation strategy — Evaluation strategies Strict evaluation Applicative order Call by value Call by reference Call by sharing Call by copy restore Non strict evaluation Normal order Call by name Call by need/Lazy evaluation …   Wikipedia

  • Combinatory logic — Not to be confused with combinational logic, a topic in digital electronics. Combinatory logic is a notation introduced by Moses Schönfinkel and Haskell Curry to eliminate the need for variables in mathematical logic. It has more recently been… …   Wikipedia

  • List of mathematics articles (C) — NOTOC C C closed subgroup C minimal theory C normal subgroup C number C semiring C space C symmetry C* algebra C0 semigroup CA group Cabal (set theory) Cabibbo Kobayashi Maskawa matrix Cabinet projection Cable knot Cabri Geometry Cabtaxi number… …   Wikipedia

  • OCaml — Paradigm(s) multi paradigm: imperative, functional, object oriented Appeared in 1996 Developer INRIA Stable release 3.12.1 (July 4, 2011; 4 months ago ( …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”