TheSKI combinator calculus is acombinatory logic system and acomputational system. It can be thought of as a computer programming language, though it is not convenient for writing software.[citation needed] Instead, it is important in the mathematical theory ofalgorithms because it is an extremely simpleTuring complete language. It can be likened to a reduced version of the untypedlambda calculus. It was introduced byMoses Schönfinkel[1] andHaskell Curry.[2]
All operations in lambda calculus can be encoded viaabstraction elimination into the SKI calculus asbinary trees whose leaves are one of the three symbolsS,K, andI (calledcombinators).
Although the most formal representation of the objects in this system requires binary trees, for simpler typesetting they are often represented as parenthesized expressions, as a shorthand for the tree they represent. Any subtrees may be parenthesized, but often only the right-side subtrees are parenthesized, with left associativity implied for any unparenthesized applications. For example,ISK means ((IS)K). Using this notation, a tree whose left subtree is the treeKS and whose right subtree is the treeSK can be written asKS(SK). If more explicitness is desired, the implied parentheses can be included as well: ((KS)(SK)).
Informally, and using programming language jargon, a tree (xy) can be thought of as an application of the functionx to an argumenty. When evaluated (i.e., when the "function" is "applied" to the argument), the tree "returns a value",i.e., transforms into another tree. The "function", "argument" and the "value" are either combinators or binary trees with application nodes. If they are binary trees, they may be thought of as functions too, if needed.
Theevaluation operation is defined as follows:
(x,y, andz represent expressions made from the combinatorsS,K, andI, and possibly variables standing for some as yet unspecifiedSKI expressions):
I returns its argument:
K, when applied to any argumentx, yields a one-argument constant functionKx, which, when applied to any argumenty, returnsx:
S is a substitution operator. It takes three arguments and then returns the first argument applied to the third, which is then applied to the result of the second argument applied to the third. More clearly:
Example computation:SKSK evaluates toKK(SK) by theS-rule. Then if we evaluateKK(SK), we getK by theK-rule. As no further rule can be applied, the computation halts here.
For all treesx and all treesy,SKxy will always evaluate toy in two steps,Ky(xy) =y, so the ultimate result of evaluatingSKxy will always be the same as the result of evaluatingy. We say thatSKx andI are "functionally equivalent" for anyx, because they always yield the same result when applied to anyy.
From these definitions it can be shown that SKI calculus, while being a minimalistic system, can fully perform any computations of the lambda calculus. All occurrences ofI in any expression can be replaced by (SKK) or (SKS) or (SKx) for anyx, and the resulting expression will yield the same result. So the "I" is merelysyntactic sugar. SinceI is optional, the system is also referred to asSK calculus orSK combinator calculus.
It is possible to define a complete system using only one (improper) combinator. An example is Chris Barker'siota combinator, which can be expressed in terms ofS andK as follows:
It is possible to reconstructS,K, andI from the iota combinator. Applying ι to itself gives ιι = ιSK =SSKK =SK(KK) which is functionally equivalent toI.K can be constructed by applying ι twice toI (which is equivalent to application of ι to itself): ι(ι(ιι)) = ι(ιιSK) = ι(ISK) = ι(SK) =SKSK =K. Applying ι one more time gives ι(ι(ι(ιι))) = ιK =KSK =S.
The simplest possible term forming a basis is X = λf.f (λxyz.x z (y z)) (λxyz.x), which satisfies X X =K, and X (X X) =S.
The terms and derivations in this system can also be more formally defined:
Terms:The setT of terms is defined recursively by the following rules.
Derivations:A derivation is a finite sequence of terms defined recursively by the following rules (where α and ι are words over the alphabet {S,K,I, (, )} while β, γ and δ are terms):
Assuming a sequence is a valid derivation to begin with, it can be extended using these rules. All derivations of length 1 are valid derivations.
An expression in the lambda calculus can be converted into an SKI combinator calculus expression in accordance with the following rules:
SII is an expression that takes an argument and applies that argument to itself:
This is also known asU combinator,Ux =xx. One interesting property of it is that its self-application is irreducible:
Or, using the equation as its definition directly, we immediately getUU =UU.
Another thing is that it allows one to write a function that applies one thing to the self application of another thing:
or it can be seen as defining yet another combinator directly,Hxy =x(yy).
This function can be used to achieverecursion. If β is the function that applies α to the self application of something else,
then the self-application of this β is the fixed point of that α:
Or, directly again from the derived definition,Hα(Hα) = α(Hα(Hα)).
If α expresses a "computational step" computed by αρν for some ρ and ν, that assumes ρν' expresses "the rest of the computation" (for some ν' that α will "compute" from ν), then its fixed point ββ expresses the whole recursive computation, since usingthe same function ββ for the "rest of computation" call (with ββν = α(ββ)ν) is the very definition of recursion: ρν' = ββν' = α(ββ)ν' = ... . α will have to employ some kind of conditional to stop at some "base case" and not make the recursive call then, to avoid divergence.
This can be formalized, with
as
which gives usone possible encoding of theY combinator. A shorter variation replaces its two leading subterms with justSSI, sinceHα(Hα) =SHHα =SSIHα.
This becomes much shorter with the use of theB,C,W combinators, asthe equivalent
And with a pseudo-Haskell syntax it becomes the exceptionally shortY =U . (.U).
Following this approach, other fixpoint combinator definitions are possible. Thus,
In astrict programming language theY combinator will expand untilstack overflow, or never halt in case oftail call optimization.[6] TheZ combinator will work instrict languages (also called eager languages), where the applicative evaluation order is in effect.
Its difference from theY combinator is that it is using as the-expanded form ofY's plain. WhereasY =BU(CBU), we haveZ =BU(CBQ) =S(KU)(SB(KQ)):
S(K(SI))K reverses the two terms following it:
It is thus equivalent toCI. And in general,S(K(Sf))K is equivalent toCf, for anyf.
SKI combinator calculus can also implementBoolean logic in the form of anif-then-else structure. Anif-then-else structure consists of aBoolean expression that is either true (T) or false (F) and two arguments, such that:
and
The key is in defining the two Boolean expressions. The first works just like one of our basic combinators:
The second is also fairly simple:
Once true and false are defined, all Boolean logic can be implemented in terms of Booleans acting asif-then-else structures.
BooleanNOT (which returns the opposite of a given Boolean) works the same as theif-then-else structure, withF andT as the second and third values:
If this is put in anif-then-else structure, it has the expected result:
BooleanOR (which returnsT if either of its two Boolean argument values isT) works the same as anif-then-else structure withT as the second value:
If this is put in anif-then-else structure, it has the expected result:
BooleanAND (which returnsT if both its Boolean argument values areT) works the same as anif-then-else structure withF as the third value:
If this is put in anif-then-else structure, it has the expected result:
This proves that the SKI system can fully express Boolean logic.
SKI calculus iscomplete, so any other logical combinator can be expressed in it as well, like, e.g.,
so that
as well as
The combinatorsK andS correspond to two well-known axioms ofsentential logic:
Function application corresponds to the rulemodus ponens:
The axiomsAK andAS, and the ruleMP are complete for the implicational fragment ofintuitionistic logic. In order for combinatory logic to have as a model:
This connection between the types of combinators and the corresponding logical axioms is an instance of theCurry–Howard isomorphism.
There usually are multiple ways to do a reduction. If the term has the normal form, it is unique, hence the same result will be reached in such a case whatever theorder of operations.