8. Church Numerals in Lambda
●
●
●
●
●
0 ≡ λ f (λ
1 ≡ λ f (λ
2 ≡ λ f (λ
etc
S(n) ≡ λ f
x x)
x (f x))
x (f (f x)))
(λ x (f ((n f) x)))
f taken (n+1) times
9. Church Numerals in Javascript
c0=function(f){return function(x){return x}}
c1=function(f){return function(x){return f(x)}}
c2=function(f){return function(x){return f(f(x))}}
// or just
def times(n)=function(f){ return n ? times(n-1)(f) : c0 }
//…
c1=times(1); c2=times(2) etc
//or
def next(n) = function(f) {
return function(x) { return f(n(f)(x)) }
}
10. Define addition in Lambda
f taken n times
f taken m times
add ≡ λ n λ m λ f λ x ((n f) ((m f) x)))
Let’s try 2+2=4...
11. Proof that 1+3=3+1, in plain Peano
According to the definition of the successor function s, we have that
s(0)=1, s(s(0))=2, s(s(s(0)))=3, s(s(s(s(0))))=4 and so forth. Then we have
3+1 = s(s(s(0))) + s(0)
= s(s(s(s(0))) + 0) by axiom x+s(y)=s(x+y)
= s(s(s(s(0))))
by axiom x+0=x
= 4
1+3 = s(0) + s(s(s(0)))
= s(s(0) + s(s(0))) by axiom x+s(y)=s(x+y)
= s(s(s(0) + s(0))) by axiom x+s(y)=s(x+y)
= s(s(s(s(0) + 0))) by axiom x+s(y)=s(x+y)
= s(s(s(s(0))))
by axiom x+0=x
=4
Hence we have proved that 3+1=1+3=4
12. Proof that 1+3=3+1, λ, page 1
S :⇔ λ abc.b(abc)
S0 = λ abc.b(abc) (λ sz.z)
= λ bc.b((λ sz.z) bc)
= λ bc.b((λ z.z) c)
= λ bc.b(c)
λ bc.b(c) = λ sz.s(z) = 1
S1 = λ abc.b(abc) (λ sz.s(z))
= λ bc.b((λ sz.s(z)) bc)
= λ bc.b((λ z.b(z)) c)
= λ bc.b(b(c))
λ bc.b(b(c)) = λ sz.s(s(z)) = 2
Thus, we have the following derivations for the successor function. It does exactly what it is supposed to do: starting from 0, it can produce any natural
number.
0 = 0
S0 = 1
S1 = SS0 = 2
S2 = SS1 = SSS0 = 3
S3 = SS2 = SSS1 = SSSS0 = 4
...
Now, let's prove 3+1 = 1+3.
13. Proof that 1+3=3+1, λ, page 2
Now, let's prove 3+1 = 1+3.
3+1 = 3S1 = (λsz.s(s(s(z))))(λabc.b(abc))(λxy.x(y))
= (λz.(λabc.b(abc)(λabc.b(abc)(λabc.b(abc)(z)))))(λxy.x(y))
= (λabc.b(abc)(λabc.b(abc)(λabc.b(abc))))(λxy.x(y)))
= SSS1 = 4
We can continue to tediously reduce the expression further instead of using the quick solution by reference above to get 3+1 = SSS1 = 4
3+1 = (λabc.b(abc)(λabc.b(abc)(λabc.b(abc))))(λxy.x(y)))
= (λabc.b(abc)(λabc.b(abc)(λbc.b((λxy.x(y))bc))))
= (λabc.b(abc)(λabc.b(abc)(λbc.b((λy.b(y))c))))
= (λabc.b(abc)(λabc.b(abc)(λbc.b(b(c)))))
= (λabc.b(abc)(λbc.b((λbc.b(b(c))bc)))
= (λabc.b(abc)(λbc.b((λc.b(b(c))c)))
= (λabc.b(abc)(λbc.b(b(b(c))))
= (λbc.b((λbc.b(b(b(c))bc))))
= (λbc.b((λc.b(b(b(c)c))))
= (λbc.b(b(b(b(c)))))
= 4
1+3 = 1S3 = (λsz.s(z))(λabc.b(abc))(λxy.x(x(x(y))))
= (λz.((λabc.b(abc))(z)))(λxy.x(x(x(y))))
= (λabc.b(abc))(λxy.x(x(x(y))))
= S3 = 4
We can continue to tediously reduce the expression further instead of using the quick solution by reference above to get 1+3 = S3 = 4
14. Proof that 1+3=3+1, λ, page 3
We can continue to tediously reduce the expression further instead of using the quick solution by reference above to get 1+3 = S3 = 4
1+3 = (λabc.b(abc))(λxy.x(x(x(y))))
= (λbc.b((λxy.x(x(x(y)))))bc)
= (λbc.b((λy.b(b(b(y)))))c)
= (λbc.b(b(b(b(c)))))
= 4
Hence, it's mathematically proven that 3+1 = 1+3 = 4 in Lambda calculus
15. Proof that 1+3=3+1, in JavaScript
// define
var zero = function(f){ return function(x){return x}}
var succ = function(n){return function(f){return function(x){return f(n(f)(x))}}}
var add = function(m){ return function(n){
return function(f){
return function(x){
return m(f)(n(f)(x))}}}}
// execute
function $(id){ return document.getElementById(id)}
var one
= succ(zero)
var two
= succ(one)
var three
= succ (two)
var four
= add(two)(two)
var three_plus_one
= add(three)(one)
var one_plus_three
= add(one)(three)
var numbers = [one, two, three, four, three_plus_one, one_plus_three,]
$('result').innerHTML = ''
for (var i = 0; i < numbers.length; i++){
var n = numbers[i];
$('result').innerHTML += numbers[i](function(n){return 1+n})(0);
$('result').innerHTML += ' = ';
$('result').innerHTML += numbers[i](function(n){return '(1+' + n + ')'})(0);
$('result').innerHTML += '<br />;
}
16. Proof that 1+3=3+1, in JavaScript
$('result').innerHTML = ''
for (var i = 0; i < numbers.length; i++){
var n = numbers[i];
$('result').innerHTML += numbers[i](function(n){return 1+n})(0);
$('result').innerHTML += ' = ';
$('result').innerHTML += numbers[i](function(n){return '(1+' + n + ')'})(0);
$('result').innerHTML += '<br />;
}
The following result can be obtained from onclick="eval(document.getElementById ("lambda").firstChild.nodeValue)".
1 = (1+0)
2 = (1+(1+0))
3 = (1+(1+(1+0)))
4 = (1+(1+(1+(1+0))))
4 = (1+(1+(1+(1+0))))
4 = (1+(1+(1+(1+0))))
17. Multiplication in Lambda
take it n times
f taken m times
mult ≡ λ n λ m λ f λ x (n (m f)) x)))
How about 2*2=4?
http://dankogai.typepad.com/blog/2006/03/lambda_calculus.html
19. Can we have booleans?
●
●
●
●
●
●
true
false
and
or
not
cond
≡
≡
≡
≡
≡
≡
λ
λ
λ
λ
λ
λ
x
x
x
x
x
c
λ y x
λ y y
λ y ((x
λ y ((x
(x (λ a
λ t λ f
y) x)
x) y)
λ c c) (λ a λc a))
((c t) f)
Try It!!!
20. λ Booleans in Javascript?
●
●
●
●
●
True=function(x){return function(y){return x}}
False=function(x){return function(y){return y}}
And=function(x){return function(y){return x(y)(x)}}
Or =function(x){return function(y){return x(x)(y)}}
Cond = function(c){
return function(t){
return function(f){
return cond(t)(f)
}}}
Try It!!!
you may need this:
function p(f) {println(f == True ? "TRUE" : f == False ? "FALSE" : f)}
21. Or we can try to reduce
1.
2.
3.
4.
5.
and true false =
(λ x λ y (x y x)) true false =
true false true =
(λ x λ y x) false true =
false
22. How cond works
1.
2.
3.
4.
cond true
λ c λ t λ
((true A)
((λ x λ y
A B =
f ((c t) f) true A B =
B) =
x) A) B = A
5.
6.
7.
8.
cond false A B =
λ c λ t λ f ((c t) f) false A B =
((false A) B) =
((λ x λ y y) A) B = B
23. Can we check a number for zero?
is_zero ≡ λ n n (λ x false) true
in Javascript:
is_zero=function(n){
return n(function(x){return false})(true)
}
24. Pair
● pair
≡ λ x λ y λ f (f x y)
● first ≡ λ p (p true)
● second ≡ λ p (p false)
27. Combinators
● I ≡ λx x
● K ≡ λx (λy x)
● S ≡ λx λ y λ z ((x z) (y z))
28. Combinator I
● I ≡ λx x
It is identity function;
in Javascript:
I = function(x) { return x }
29. Combinator K
● K ≡ λx (λy x)
It builds a constant function;
in Javascript:
K = function(x) {
return function(y){return x}
}
30. Combinator S
● S ≡ λx λ y λ z ((x z) (y z))
It expresses the idea of substitution;
in Javascript:
S = function(x) {
return function(y) {
return function(z) {
return x(z)(y(z))
}
}}
31. Using Combinators
● ((S K K) x) = (S K K x) = (K x (K x)) = x
So I = SKK
● true=K
● false=KI
● numbers?
32. Translating λ to Combinators
To convert an expression e in the lambda calculus to an
expression in SKI, define a function ϕ(e):
e
ϕ(e)
λx x
I
λx c
Kc
λx (α β) (S(λx ϕ(α))(λx ϕ(β)))
Now try Church Numerals...