Fact-checked by Grok 2 weeks ago

SKI combinator calculus

SKI combinator calculus is a minimal system within that employs three fundamental combinators—S, K, and I—to perform computations without the use of variables or lambda abstraction, providing a Turing-complete alternative to . Introduced by Moses Schönfinkel in 1924 as part of early efforts to formalize logic without variables, it was further developed and popularized by in the 1920s and , building on Schönfinkel's foundational work to address foundational issues in such as . The combinators are defined by their reduction rules: the I () combinator satisfies I x ≡ x; the K () combinator satisfies K x y ≡ x; and the S () combinator satisfies S x y z ≡ (x z)(y z), where terms are combined via application and reduced by applying these rules from left to right. These rules enable the encoding of arbitrary terms into SKI expressions through bracket abstraction, allowing full simulation of functionality, including recursion via fixed-point combinators like the . Notably, the I combinator is redundant, as it can be derived from S and K alone (I ≡ S K K), making SK combinator calculus sufficient for , though the inclusion of I simplifies practical implementations. Beyond its theoretical foundations, SKI combinator calculus has influenced languages and esoteric programming systems, such as , by demonstrating how complex computations can emerge from a sparse set of primitives, and it underscores the Church-Turing thesis through its equivalence to other models of computation. Variants like BCI and BCK logics extend or restrict the basis for studying resource-sensitive computations, such as in linear and affine logic.

Fundamentals

Notation and Combinators

The SKI combinator calculus employs a minimalist notation for , where expressions are built from variables and the primitive combinators S, K, and I using to denote application. For instance, the expression xy represents the application of x to y, and longer expressions associate to the left by default, so xyz parses as (xy)z. Parentheses are used to override this associativity and ensure unambiguous grouping, such as in (x(yz)). The identity combinator I is defined by I x = x, serving as a projection that returns its argument unchanged. The constant combinator K selects its first argument while discarding the second, given by K x y = x. The substitution combinator S distributes application over two functions, defined as S x y z = x z (y z). The S and K combinators originated in Moses Schönfinkel's 1924 work on eliminating variables from logical expressions, where he introduced primitive combinators to build functions without abstraction. The I combinator was introduced by Alonzo Church in 1940, though it is definable from S and K (I \equiv S K K). Haskell Curry refined and expanded this framework in the 1930s, establishing combinatory logic as a foundation for functional computation. The completeness of the S and K combinators as a basis for combinatory logic was established by Curry in the 1930s, with the SKI set detailed as a minimal complete basis in Curry and Feys' 1958 comprehensive treatment.

Informal Semantics

The I combinator functions as the in SKI combinator calculus, accepting a single argument and returning it without alteration, much like a mirror that reflects its input unchanged or a simple copy mechanism in programming that passes data through unaltered. This "do nothing" role makes I essential for preserving arguments in larger expressions, serving as a basic building block for maintaining structural integrity during computation. The K combinator operates as a constant selector or canceller, taking two arguments but disregarding the second and yielding only the first, analogous to choosing a favorite item from a pair and discarding the other, as if "forgetting" irrelevant information to focus on a fixed value. In this way, K enables the simulation of functions, allowing expressions to ignore extraneous inputs while retaining core elements. The combinator acts as a or applicator, receiving three arguments and applying the first to the third while composing the second with the third, effectively sharing the final argument across two subcomputations to produce a combined result, similar to beta-reduction in but achieved without variable binding. This distribution mechanism, akin to assigning a shared task to two helpers who each process it independently before their outputs are integrated, facilitates efficient argument reuse and enables the construction of higher-order functions through . For example, S allows basic combinations to express operations like applying multiple transformations to the same input, promoting computation sharing without explicit duplication. Together, the combinators form a minimal basis for computation, offering a variable-free alternative to that eliminates issues with substitution and scoping while fully preserving expressive power for defining any . This minimality, rooted in the work of Schönfinkel and , underscores SKI's role in providing an elegant, notationally simplified framework for logic and .

Formal Framework

Syntax

The syntax of the SKI combinator calculus defines the structure of expressions using a small set of primitive elements and a single for combining them. Atomic terms in SKI consist of the three base combinators: , , and I. These serve as the foundational symbols from which all expressions are constructed. Compound terms are formed via application, a that combines two terms M and N into (M N), where juxtaposition denotes the application of M to N. The complete grammar for SKI terms can be specified in Backus-Naur Form (BNF) as follows:
<term> ::= 'S' | 'K' | 'I' | '(' <term> <term> ')'
This recursive definition allows for nested applications, with parentheses ensuring explicit grouping. By convention, applications are left-associative, so an expression like XYZ parses as (X Y) Z, and outermost parentheses are typically omitted for brevity, as in SKI rather than ((S K) I). Pure combinator calculus contains no free variables; all terms are built exclusively from the combinators S, K, and I via application. Well-formed SKI expressions must feature balanced parentheses and valid nesting to avoid ambiguity in the hierarchical structure of applications.

Reduction Rules

The reduction rules of the SKI combinator calculus constitute the axiomatic basis for , specifying how expressions are rewritten through successive applications of combinators. These rules enable the of functional without variables, mirroring beta-reduction in the . The fundamental rewrite axioms are defined as follows: \begin{align*} I x &\to x, \\ K x y &\to x, \\ S x y z &\to x z (y z). \end{align*} These axioms capture the essential behaviors of the combinators: the I combinator performs , the K combinator discards its second argument to return the first, and the S combinator applies its first argument to a common second argument composed with the third. Reduction is extended to arbitrary contexts via , ensuring that simplifications can occur within subexpressions. Specifically, if N \to N', then for any terms E_1 and E_2, the following hold:
  • E_1 E_2 \to E_1' E_2 if E_1 \to E_1',
  • E_1 E_2 \to E_1 E_2' if E_2 \to E_2'.
This contextual allows reductions to propagate through applications, treating expressions as trees where inner nodes can be rewritten independently. An expression reaches its normal form when no further reductions are possible, i.e., it contains no subexpression matching the left-hand side of any . The system satisfies the Church-Rosser theorem, implying : distinct reduction paths from a common expression lead to equivalent normal forms. For , the leftmost-outermost strategy systematically selects the outermost (non-embedded) redex farthest to the left, ensuring progress toward the unique normal form when one exists.

Equivalence to Lambda Calculus

Translation from Lambda Terms

The translation from lambda calculus to SKI combinator calculus proceeds via abstraction elimination, a systematic replacement of lambda abstractions with equivalent expressions built from the S, K, and I combinators. This process, known as bracket abstraction, defines for a lambda abstraction \lambda x.M a combinator term denoted .M such that the application (.M) N reduces to M[x := N], mirroring the beta-reduction semantics of lambda calculus. The full translation function C on lambda terms is then given recursively: C(x) = x for variables x, C(M N) = C(M) C(N) for applications, and C(\lambda x.M) = .C(M) for abstractions. The core of bracket abstraction lies in the recursive computation of .M, defined by structural induction on M with the following rules:
  • If x does not occur free in M, then .M = K\, M. This leverages the constant function behavior of K, ignoring the argument x.
  • If M = x, then .x = I, capturing the identity function.
  • If M = N\, P, then .(N\, P) = S\, (.N)\, (.P). This distributes the argument x to both subterms via the S combinator's substitution rule S\, f\, g\, x = f\, x\, (g\, x).
These rules ensure the resulting SKI term preserves the computational behavior of the original lambda term without relying on variable binding. For lambda terms with multiple abstractions, such as \lambda x.\lambda y.M, the translation nests the bracket abstractions: C(\lambda x.\lambda y.M) = .(.C(M)). This composition handles curried functions naturally, building the equivalent SKI expression layer by layer. For instance, consider \lambda x.\lambda y.x. The inner abstraction yields .x = K\, x (since y is not free in x). The outer then computes .(K\, x) = S\, (.K)\, (.x) = S\, (K\, K)\, I, as x is not free in K and .x = I. The resulting term S\, (K\, K)\, I applied to arguments a\, b reduces to a, matching the original term's semantics. To scale to terms with many variables while avoiding explicit checks for free occurrences, the algorithm can be generalized using de Bruijn indices, which represent variables by their binding depth rather than names. This representation facilitates a more efficient, substitution-free implementation of bracket abstraction, often achieving linear in the term size.

Completeness and Church-Rosser Theorem

The SKI combinator calculus is Turing-complete, meaning it can simulate any partial recursive function. This universality follows from its equivalence to the untyped , which has been proven to represent all computable functions via encodings of Turing machines and μ-recursive functions. Specifically, theorems establish that every partial recursive function is representable in both systems, with SKI terms constructed to mimic lambda encodings of arithmetic, , and fixed points. The Church-Rosser theorem holds for the reduction relation in SKI combinator calculus, ensuring : if a M reduces in zero or more steps to A and B (denoted M \to^* A and M \to^* B), then there exists a C such that A \to^* C and B \to^* C. This implies that if a has a normal form, it is unique up to the definable of the system. A proceeds indirectly via simultaneous contractions (multi-step parallel reductions), which satisfy the diamond property—allowing divergent reductions to reconverge—rather than one-step reductions, which do not. theorems further guarantee that normal forms are reachable via leftmost outermost reductions, mirroring the case. Completeness of SKI with respect to is established by the existence of a translation algorithm (bracket abstraction) that maps every term to an equivalent SKI term, preserving the beta-normal form. Formally, for any term M, its SKI translation H(M) satisfies H(M) \to^* N if and only if M \to_\beta^* N' where N and N' are equivalent under definable ; moreover, the translation is injective, ensuring no loss of expressiveness. This equivalence confirms that SKI can define all -definable functions, with the retraction property H(L(U)) = U and L(H(M)) =_\beta M (where L is the inverse mapping) upholding computational fidelity. In SKI, weak equality is defined as conversion under the reduction relation (i.e., terms are equal if they reduce to a common form via the Church-Rosser property), while strong equality preserves alpha-equivalence from the source lambda terms, accounting for variable renaming in the translation. These equalities align with those in combinatory logic, where extensionality ensures functional equivalence. Despite its completeness, SKI combinator calculus has limitations as a pure functional system without built-in types, polymorphism, or control structures like conditionals (though these are encodable via combinators such as SS(KS)K for booleans). This untyped nature enables universality but introduces risks like non-termination and the inability to enforce computational bounds without external mechanisms.

Combinatory Expressions

Fixed Points and Recursion

In the SKI combinator calculus, recursion is facilitated by fixed-point combinators, which permit the definition of self-referential functions without variables. The serves as such a device, satisfying the fixed-point equation Y f = f (Y f) for any combinator f, thereby allowing a non-recursive functional description to be extended into a recursive one through self-application. This property ensures that applying Y to a function yields a version that can invoke itself in its body, modeling recursive processes like or in pure applicative terms. The Y combinator is expressible within the SKI basis as
Y = S \left( K \left( S I I \right) \right) \left( S \left( S \left( K S \right) K \right) \left( K \left( S I I \right) \right) \right).
To verify the fixed-point property, consider Y g x for arbitrary combinators g and x. The reduction proceeds as follows:
Y g x = \left[ S \left( K \left( S I I \right) \right) \left( S \left( S \left( K S \right) K \right) \left( K \left( S I I \right) \right) \right) g \right] x = \left( S I I \right) \left[ S \left( S \left( K S \right) K \right) \left( S I I \right) g \right] x,
where S I I z = z z for any z. Let u = S \left( S \left( K S \right) K \right) \left( S I I \right) g; then Y g x = u u x. Further reduction of u yields u = g \left( S \left( K \left( S I I \right) \right) \left( S \left( S \left( K S \right) K \right) \left( K \left( S I I \right) \right) g \right) = g (Y g), so Y g x = g (Y g) x, confirming the equation.
A simpler self-applicator is the ω combinator, defined as \omega = S I I, which reduces to \omega z = z z for any z. While \omega \omega reduces to itself indefinitely, producing an infinite loop, the Y combinator avoids this by structuring self-application to support terminating recursive computations when paired with appropriate base functions. As an example, the factorial function can be constructed by applying Y to a step combinator g that encodes the recursive rule: for input n, return 1 if n is zero, otherwise multiply n by the factorial of its predecessor. Here, zero-testing, multiplication, and predecessor are themselves defined via SKI combinators (e.g., using Church numeral encodings abstracted from numerical literals), yielding \text{fact} = Y g where g n = \text{if-zero } n \ 1 \ (\times n (g (\text{pred } n))). This demonstrates how Y transforms the iterative step into a fully recursive function. The fixed-point of Y is crucial for defining inherently recursive operations in pure combinators, such as the predecessor in a Peano-style system, where repeated application of a successor-inverse step is needed to decrement without direct subtraction .

Boolean Operations

In the SKI combinator calculus, values are encoded as combinators that as selectors, allowing the of truth values and enabling conditional branching without built-in . This encoding leverages the application to simulate behavior, where a B applied to two branches t and f reduces to t if B is true and f if B is false. The true value T is the combinator , which discards the second argument and returns the first: T t f → t. The false value F is the combinator S , which discards the first argument and returns the second: F t f → f. These encodings are derived from the Church representations in , translated to SKI via bracket abstraction, and form the foundation for all operations. Logical operators are defined by their action on these booleans, mirroring their counterparts. The negation operator NOT is given by the expression p F T, which applies the boolean p to F and T, swapping the values: if p is T, it selects F; if p is F, it selects T. The full SKI term for the NOT combinator (λp. p F T) is obtained through bracket abstraction as S (S I (K (S K))) (K K). The conjunction AND is encoded as λp λq. p q F, so AND p q reduces to q if p is T (since T q F → q) and to F if p is F (since F q F → F). Substituting the encodings, this becomes the application p q (S K). The disjunction OR is λp λq. p T q, reducing to T if p is T and to q if p is F, expressed in SKI as p K q. These operators allow the construction of arbitrary propositional expressions by composition with the SKI combinators. The conditional construct if B then t else f is directly the application B t f, inheriting the selector behavior of the boolean encoding. This approach demonstrates the expressive power of SKI calculus for propositional logic, where all operations emerge from the core combinators S, K, and I without additional structure.

List Processing Examples

In SKI combinator calculus, list processing is facilitated by translating Church encodings of lists from into combinator expressions via bracket abstraction algorithms. The empty list nil is encoded as the lambda term \lambda b.\lambda c.c, which corresponds to the SKI term KI since KI\, b\, c \to I\, c \to c. A non-empty list is formed using the cons constructor, defined as \lambda h.\lambda t.\lambda b.\lambda c.\, b\, h\, (t\, b\, c), where h is the head element and t is the tail list; this term can be translated to a pure SKI expression using bracket abstraction, enabling lists to act as folds over their elements with a binary operator b and base case c. This encoding allows pure functional manipulation of sequential data without primitive data types. The operation applies a f to every element of l, yielding a new list with transformed elements while preserving structure. In terms, it is given by M = \lambda f.\lambda l.\, l\, (\lambda h.\lambda t.\, \mathrm{[cons](/page/Cons)}\, (f\, h)\, (t\, f))\, \mathrm{nil}, where the recursive application of f to the ensures uniform transformation; the form of M is derived by successive bracket abstractions, resulting in a involving multiple [S](/page/%s) and [K](/page/K) applications to handle the higher-order . For example, mapping the over representing [1,2,3] produces [2,3,4], demonstrating how combinators enable without explicit loops. List reversal rearranges elements from tail to head, accumulating via an auxiliary constructor and base. The reversal combinator is R = \lambda l.\lambda c.\lambda n.\, l\, (\lambda h.\lambda t.\lambda c.\lambda n.\, t\, (\lambda u.\lambda v.\, c\, u\, (h\, v))\, n)\, (\lambda u.\lambda v.\, n), where c serves as the accumulating cons and n as nil; applying R to a list l yields the reversed list when provided with cons and nil. The SKI translation of R involves nested S and K structures to capture the recursive accumulation, allowing efficient reordering in combinator terms. For a list [a,b,c], R\, l\, \mathrm{cons}\, \mathrm{nil} reduces to [c,b,a]. Recursive operations like folding enable aggregation over lists, with the fixed-point combinator Y supporting definitions such as list length. The length function is \lambda l.\, Y\, (\lambda \mathrm{len}.\lambda l.\, l\, (\lambda h.\lambda t.\, \mathrm{succ}\, (\mathrm{len}\, t))\, \mathrm{zero}), where \mathrm{succ} increments a Church numeral and \mathrm{zero} = \lambda f.\lambda x.\, x; in SKI, this embeds Y within the abstracted term to compute the numeral encoding the list's size. For the list [a,b,c], it yields the Church numeral $3. Basic pairing in lists is inherent to cons, which pairs head and tail as S(K,\mathrm{cons})(K,\mathrm{nil})$ applied appropriately to build structures. Booleans from prior encodings support conditional list operations, such as emptiness checks.

Logical and Philosophical Connections

Curry-Howard Isomorphism

The Curry-Howard isomorphism provides a deep connection between typed combinatory logic, such as the SKI system, and intuitionistic logic, where propositions are interpreted as types and proofs as terms inhabiting those types. In this correspondence, the basic combinators S, K, and I are assigned types that mirror logical connectives: the K combinator has type A \to B \to A, corresponding to the logical axiom A \to (B \to A) by allowing a term of type A to ignore an unused assumption of type B while preserving type A; the I combinator has type A \to A, embodying the identity axiom; and the S combinator has type (A \to B \to C) \to (A \to B) \to A \to C, facilitating the substitution or composition of proofs. In typed combinatory logic, SKI expressions serve as proof terms for intuitionistic propositions, where the type system ensures that every valid term constructs a proof via natural deduction rules, such as elimination and introduction for implications. For instance, applying a term of type A \to B to one of type A yields a term of type B, paralleling the modus ponens rule in logic, thus linking computational reduction to proof normalization. This isomorphism highlights how SKI terms "inhabit" types, providing explicit constructions for theorems in intuitionistic propositional logic. Haskell Curry first observed aspects of this correspondence in his 1934 work on formalist , interpreting functional types as implications, and later formalized it for in collaboration with Robert Feys in the 1950s. Their 1958 volume explicitly relates the arrow in types to logical implication, establishing combinators as realizers of proofs. In the untyped SKI calculus, fixed-point combinators like the enable for terms of type A \to A, which can relate to certain non-standard logical constructions, but in the typed setting of the Curry-Howard isomorphism, general is not available.

Relation to Intuitionistic Logic

The SKI combinator calculus embodies the Brouwer-Heyting-Kolmogorov (BHK) interpretation of by treating proofs as constructive functions, where a proof of A \to B is realized as a computational construction that transforms any proof of A into a proof of B. In this framework, SKI terms serve as explicit function abstractions without variables, aligning with the BHK requirement for verifiable, step-by-step constructions rather than mere assertions of truth. This correspondence arises because SKI reductions preserve the constructive content of proofs, ensuring that every inhabitable type corresponds to a buildable proof object. Implication in SKI directly corresponds to constructive implications through the typed combinators K and S, where K, typed as A \to B \to A, acts as a constant function that ignores extraneous inputs to deliver a fixed output, mirroring the abstraction of a proof independent of unnecessary assumptions. The S combinator, typed as (A \to B \to C) \to (A \to B) \to A \to C, facilitates distributed application, allowing a proof of A \to (B \to C) to be applied constructively by substituting arguments in a way that builds the required witness for C from proofs of A and B. These combinators generate the implicational fragment of intuitionistic propositional logic (IPC→), ensuring that every theorem has a corresponding normal-form SKI term as its proof. Negation and falsity in SKI are encoded intuitionistically as to a base \bot, defined via an empty type with no inhabitants, without assuming the ; thus, a proof of \neg A is a that maps any supposed proof of A to , but elimination (\neg\neg A \to A) is not generally provable, preserving the constructive restraint. Disjunction and require explicit constructive witnesses, achieved through S-distributed applications that branch on cases, providing either a left or right proof as evidence rather than assuming a disjunctive fact without . Unlike , SKI combinator calculus lacks global choice axioms or non-constructive principles, inherently favoring intuitionistic proofs by restricting inhabitation to computable constructions verifiable via reduction; this excludes proofs relying on the , emphasizing BHK-style over existential postulation. As a brief note, this aligns with the broader Curry-Howard isomorphism, where terms inhabit types corresponding to intuitionistic propositions.

Computational Examples

Reduction Sequences

Reduction sequences in SKI combinator calculus demonstrate the application of the I-, K-, and S-rules to simplify expressions step by step, often leading to where no further reductions are possible. These sequences illustrate how combinatory s evaluate without variables, relying solely on the three primitive combinators and their interaction rules. The process is deterministic in the sense that, under the Church-Rosser theorem, any sequence of valid reductions from a given will converge to the same normal form if one exists. A simple example of reduction using the I-rule involves applying the identity combinator to a complex term. Consider the expression I (S K K). By the I-rule, I x \to x, this reduces directly to S K K. This showcases the identity's role in stripping away unnecessary layers without altering the underlying structure. For the S-rule, which handles the substitution-like behavior, a more involved sequence is S (S K K) K I. First, note that S K K itself reduces to I via S K K x \to K x (K x) \to x, but to trace the full application: S (S K K) K I \to (S K K) I (K I) by the S-rule S a b c \to a c (b c), where a = S K K, b = K, c = I. Next, S K K I \to K I (K I) \to I by successive K- and I-rules, and K I = K I, yielding I (K I). Finally, I (K I) \to K I by the I-rule. The result K I is the standard encoding of false in SKI booleans. This multi-step reduction highlights how S enables branching computations. Boolean evaluation provides another clear illustration of reduction sequences. The true combinator T is encoded as K, so T x y = K x y \to x by the K-rule, selecting the first argument. Similarly, false F is K I, and F x y = K I x y \to I y \to y by K- and I-rules, selecting the second argument. These sequences mimic conditional branching in a pure functional style. Fixed-point combinators enable recursion through self-application, with the Y combinator providing a canonical example. In SKI, Y is defined as Y = S (K (S I I)) (S (S (K S) K) (K (S I I))), and its key property is Y f \to f (Y f). Starting from the structure, the outer S-application propagates the fixed-point equation, allowing recursive definitions like factorial without explicit loops. This reduction traces the unfolding of recursion in a single step, foundational for expressing higher-order functions. Non-terminating sequences demonstrate divergence, where reductions cycle indefinitely. Define \omega = S I I; then \omega \omega = S I I (S I I) \to I (S I I) (I (S I I)) by S-rule, simplifies to (S I I) (I (S I I)) via I, and further to (S I I) (S I I) = \omega \omega via another I. This loop illustrates terms without normal forms, underscoring the importance of termination analysis in combinatory logic.

Applications in Programming

Combinatory logic, including the SKI basis, has influenced practical implementations in languages, particularly through the Y-combinator, which facilitates anonymous . In languages like and , where early dialects lacked built-in support for recursive definitions without named functions, the Y-combinator allows programmers to achieve by applying a fixed-point operator to a that simulates . This approach transforms non-recursive lambda terms into equivalent recursive ones, enabling computations such as or functions in a purely functional style without relying on language-specific primitives. The technique draws directly from fixed-point encodings in , providing a variable-free alternative to traditional lambda-based . In proof assistants such as , combinators are formalized to support de Bruijn-style representations of bound variables within , aiding in the mechanized verification of properties and . This integration allows for concise encoding of terms without explicit variable names, reducing issues like variable capture during proofs of or . For instance, libraries in implement reduction rules alongside de Bruijn indices to model type systems and facilitate automated theorem proving in constructive logics. SKI reductions have been applied in hardware and optimization contexts through graph reduction machines, notably the G-machine, which compiles functional programs into super-combinator graphs for efficient evaluation. The G-machine extends basic combinators with macros to minimize graph copying during reduction, achieving better performance in systems compared to naive implementations. This design influenced runtime systems for languages like , where graph reduction optimizes memory usage by sharing subexpressions in applicative-order computations. SKI principles appear in minimal language designs, particularly esoteric programming languages (esolangs) that demonstrate Turing completeness using only S and K combinators. Languages like Lazy K employ for purely functional, without variables, serving as educational tools for understanding reduction strategies and as testbeds for theoretical computations. These esolangs underscore the compactness of SKI for encoding complex behaviors in resource-constrained environments, such as systems or theoretical simulations. Despite these applications, combinators face practical limitations in efficiency compared to direct implementations, primarily due to term expansion during translation, which increases graph size and steps. Empirical studies indicate that combinator-based evaluators require more operations for equivalent computations, though optimizations like super-combinators mitigate this in production systems. Nonetheless, the variable-free nature of remains valuable for applications demanding strict avoidance of , such as secure or parallel .

References

  1. [1]
    combinatory logic in nLab
    ### Summary of Combinatory Logic from nLab
  2. [2]
    None
    ### Summary of Combinatory Logic and SKI Combinators
  3. [3]
  4. [4]
  5. [5]
    [PDF] Appendix A A Tutorial on Combinator Graph Reduction
    SK-combinators are a small set of simple transformation rules for functions. Each combinator has associated with it a runtime action and a definition. The ...Missing: explanation | Show results with:explanation
  6. [6]
    [PDF] THE 𝜆-CALCULUS - Imperial College London
    This is called the SKI-combinator calculus. Combinators: closed 𝜆-terms. T ≝ 𝜆xy.yx. C ≝ 𝜆xyz.xzy. V ...
  7. [7]
    [PDF] Formal Systems: Combinatory Logic and -calculus
    Sep 30, 2009 · We present the foundations of Combinatory Logic and the λ-calculus. We mean to precisely demonstrate their similarities and differences. CURRY ...
  8. [8]
    Combinatory logic (Chapter 2) - Lambda-Calculus and Combinators
    Roger Hindley and Jonathan P. Seldin; Journal: Lambda-Calculus and Combinators. Published online: 5 June 2012. Simple typing, Church-style. Type: Chapter; Title ...
  9. [9]
    [PDF] Homework 1: Substitution and Combinators 1 The substitution theorem
    The first two rules allow for reductions in an application. ... In this exercise, we will investigate one such calculus, the SKI combinator calculus. ... We define ...
  10. [10]
    [PDF] Combinator Calculus
    Rewrite Rules. • The three rules of the SKI calculus are an example of a rewrite system. • Any expression (or subexpression) that matches the left-hand side ...
  11. [11]
    Lambda-Calculus and Combinators
    Lambda-Calculus and Combinators. Lambda-Calculus and Combinators. Lambda ... Roger Hindley, University of Wales, Swansea, Jonathan P. Seldin, University ...
  12. [12]
    [PDF] Categorical Combinators
    Essays on Combinatory Logic, Lambda-calculus and Formalism" (J. P. Seldin and. J. R. Hindley, Eds.), Academic Press, New York/London. LAMBEK, J. (1980b) ...
  13. [13]
    Combinatory Logic II | SoftOption ®
    There are Church-Rosser theorems which tell us that if there is a normal form, that normal form is unique and normal order reduction will find that normal form ...
  14. [14]
    [PDF] λ to SKI, Semantically - okmij.org
    We present a technique for compiling lambda-calculus ex- pressions into SKI combinators. Unlike the well-known bracket abstrac- tion based on (syntactic) term ...
  15. [15]
  16. [16]
    [PDF] Lambda-Calculus and Combinators, an Introduction
    The grammar and basic properties of both combinatory logic and λ-calculus are discussed, followed by an introduction to type-theory. Typed and untyped versions ...Missing: SKI | Show results with:SKI
  17. [17]
    [PDF] Category Theory and Lambda Calculus - Mario Román
    ... SKI-term U. Theorem 1.23 (SKI combinators and lambda terms). The SKI-abstraction is a retraction of the Lambda-transform of the term, that is, for any SKI ...
  18. [18]
    Many faces of the fixed-point combinator - okmij.org
    Dec 7, 2024 · A polyvariadic fixpoint combinator expresses mutual recursion, obtaining a mutual least fixed point of several terms. We systematically derive a ...
  19. [19]
    [PDF] Lecture 15 De Bruijn, Combinators, Encodings
    Informally, you can think of it as a curried function that takes two arguments, one after the other. But that's just a way to get intuition. The λ-calculus only ...
  20. [20]
    [PDF] A Combinator Processor
    The conversion process makes use of the Y combinator accordingly and is further explained in section 3.1.4. ML is a eager language, whereas combinators are ...
  21. [21]
    None
    Below is a merged summary of list processing in combinatory logic and SKI from the provided segments. To retain all information in a dense and organized manner, I will use a combination of narrative text and tables in CSV format where appropriate. The response consolidates details on list encodings, functions, lambda-to-combinator translations, examples, and useful URLs, while addressing the lack of content in some segments.
  22. [22]
    [PDF] Lectures on the Curry Ho ard &somorphism
    The Curry-Howard isomorphism states an amazing correspondence between systems of formal logic as encountered in proof theory and computational.
  23. [23]
    [PDF] Curry-Howard Isomorphism
    The Curry-Howard isomorphism states an amazing correspondence between systems of formal logic as encountered in proof theory and computational.
  24. [24]
    [PDF] the Curry-Howard correspondence, 1930–1970 - Xavier Leroy
    As early as 1930, Curry studies combinatory logic: a variant of the λ ... An isomorphism between simply-typed λ-calculus and intuitionistic logic that equates.
  25. [25]
    [PDF] a new interpretation of the Curry-Howard isomorphism for ... - HAL
    In the literature this logic is called SKI(SK) Combinatorial Calculus. The following sections present the features of this logical framework. 4.1 Presentation.
  26. [26]
    [PDF] Lambda Calculus
    • Note that our definitions of True and False are combinators. • They have no free variables. • So we can just reuse the SKI encoding of the Boolean operations.<|control11|><|separator|>
  27. [27]
    An investigation of the relative efficiencies of combinators and ...
    Recursion in the functional expressions is handled by using the Y operator (defned by Y f = f (Y f)) rather than by static loops in the expression. 2.2 ...
  28. [28]
    Conception, Evolution, and Application of Functional Programming ...
    This surprising theorem (and equally surprising simple proof) is what has earned Y the name “paradoxical combinator”. The theorem is quite significant-it means ...
  29. [29]
    markisus/coq-ski: Coq Library for SKI Combinatory Logic - GitHub
    Coq Library for SKI Combinatory Logic. Contribute to markisus/coq-ski development by creating an account on GitHub.Missing: proof assistant
  30. [30]
    [PDF] A Formal Proof of the Strong Normalization Theorem for System T in ...
    We present a framework for the formal meta-theory of lambda calculi in first-order syntax, with two sorts of names, one to represent both free and bound ...Missing: SKI | Show results with:SKI
  31. [31]
    A fresh look at combinator graph reduction
    The idea is based on the observation that all of the variables in a functional program can be removed by transforming it into a sequence of combinators which ...Missing: fixed | Show results with:fixed
  32. [32]
    Lazy K - Esolang
    Jul 22, 2025 · Lazy K, designed by Ben Rudiak-Gould, is a Turing tarpit based on combinatory logic. It is lazily evaluated and purely functional.