De Bruijn index
From Wikipedia, the free encyclopedia
- The correct title of this article is de Bruijn index. It appears incorrectly here because of technical restrictions.
In mathematical logic, the de Bruijn index is a notation invented by the Dutch mathematician Nicolaas Govert de Bruijn (IPA: [dɪ bʁœyn]) for representing terms in the λ calculus.[1] Terms written using these indexes are invariant with respect to α conversion, so the check for α-equivalence is the same as that for syntactic equality. Each de Bruijn index is a natural numbers that represents an occurrence of a variable in a λ-term, and denotes the number of binders that are in scope between that occurrence and its corresponding binder. The following are some examples:
- The term , sometimes called the K combinator, is written as with de Bruijn indexes. The binder for the occurrence x is the second λ in scope.
- The term (the S combinator), with de Bruijn indexes, is .
- The term is .
De Bruijn indexes are commonly used in higher-order reasoning systems such as automated theorem provers and logic programming systems.[citation needed]
Contents |
[edit] Formal definition
Formally, λ-terms () written using de Bruijn indexes have the following syntax (parentheses allowed freely):
where n — natural numbers greater than 0 — are the variables. A variable n is bound if it is in the scope of at least n binders (λ); otherwise it is free. The binding site for a variable n is the nth binder it is in the scope of, starting from the innermost binder.
The most primitive operation on λ-terms is substitution: replacing free variables in a term with other terms. In the β-reduction , for example, we must:
- find the variables in M that are bound by the λ in λM,
- decrease the free variables of M to match the removal of the outer λ-binder, and
- replace with B, suitably increasing its free variables each time to match the number of λ-binders the correponding variable occurs under.
To illustrate, consider the application
which might correspond to the following term written in the usual notation
- .
After step 1, we obtain the term , where the variables that are substituted for are replaced with boxes. Step 2 lowers the free variables, giving . Finally, in step 3 we replace the boxes with the argument; the first box is under one binder, so we replace it with (which is with the free variables increased by 1); the second is under two binders, so we replace it with . The final result is .
Formally, a substitution is an unbounded list of term replacements for the free variables, written , where Mi is the replacement for the ith free variable. The increasing operation in step 3 is sometimes called shift and written where k is a natural number indicating the amount to increase the variables; is thus a shorthand for the substitution . Ths identity substitution that leaves a term unchanged is , i.e., .
The application of a substitution s to a term M is written M[s]. The sequencing of two substitions s1 and s2 is written simply , with
- .
The rules for application are as follows:
The steps outlined for the β-reduction above are thus more concisely expressed as:
- .
[edit] Alternatives to de Bruijn indexes
When using the standard "named" representation of λ-terms, where variables are treated as labels or strings, one has to explicitly handle ά-conversion when defining any operation on the terms. The standard Variable Convention[2] of Barendregt is one such approach where ά-conversion is applied as needed to ensure that:
- bound variables are distinct from free variables, and
- all binders bind variables not already in scope.
In practice this is cumbersome, inefficient, and often error-prone. It has therefore led to the search for different representations of such terms. On the other hand, the named representation of λ-terms is more pervasive and can be more immediately understandable by others because the variables can be given descriptive names. Thus, even if a system uses de Bruijn indexes internally, it will present a user interface with names.
De Bruijn indexes are not the only representation of λ-terms that obviates the problem of ά-conversion. Among named representations, the nominal logic of Pitts is one approach, where the representation of a λ-term is treated as an equivalence class of all terms rewritable to it using variable permutations.[3] This approach is taken by the Nominal Datatype Package of Isabelle/HOL.[4]
Another common alternative is an appeal to higher-order representations where the λ-binder is treated as a true function. In such representations, the issues of ά-equivalence, substitution, etc. are identified with the same operations in a meta-logic.
[edit] See also
- The de Bruijn notation for λ-terms. This notation has little to do with de Bruijn indexes, but the name "de Bruijn notation" is often (erroneously) used to stand for it.
[edit] References
- ^ De Bruijn, Nicolaas Govert (1972). "Lambda Calculus Notation with Nameless Dummies: A Tool for Automatic Formula Manipulation, with Application to the Church-Rosser Theorem". Indagationes Mathematicae 34: 381–392. ISSN 0019-3577.
- ^ Barendregt, Henk P. (1984). The Lambda Calculus: Its Syntax and Semantics. North Holland. ISBN 0-444-87508-5.
- ^ Pitts, Andy M. (2003). "Nominal Logic: A First Order Theory of Names and Binding". Information and Computation 186: 165–193. ISSN 0890-5401.
- ^ Nominal Isabelle web-site. Retrieved on 2007-03-28.