<expression> := <name> | <function> | <application>
<function> := λ <name>.<expression>
<application> := <expression><expression>
(λx.x)y // function에 y를 적용
= [y/x]x // [y/x]는 정의역 x에 대해 y로 치환되는 것을 나타내기 위해 사용한다
= y
(λz.z) ≡ (λy.y) ≡ (λt.t) ≡ (λu.u) // ≡은 동의어임을 표시하기 위해 사용한다
- <name>은 <name> expression에서 free 변수이다
- 만약 <name> ≠ <name1>이면 λ<name1>에서 <name>은 free 변수이다
- 만약 A, B에서 <name>이 free라면 <name>은 A.B에서 free이다
- 만약 <name> = <name1>이면 λ<name1>에서 <name>은 bound 변수이다
- 만약 A나 B에서 <name>이 bound라면 <name>은 A.B에서 bound이다
I ≡ (λx.x)
II ≡ (λx.x)(λz.z)
[λz.z/x]x = λz.z ≡ I
(λx.(λy.xy))y
= (λx.(λt.xt))y
= (λt.yt)
0 = zero ≡ λs.(λz.z) = λsz.z
1 = suc(zero) ≡ λsz.s(z)
2 = suc(suc(zero)) ≡ λsz.s(s(z))
S0 ≡ (λwyx.y(wyx))(λsz.z) // w에 λsz.z 대입
= λyx.y((λsz.z)yx) // s, z에 y, x를 대입
= λyx.y(x)
≡ 1
2S3 ≡ (λsz.s(sz))(λwyx.y(wyx))(λuv.u(u(uv)))
= (λwyx.y(wyx))((λwyx.y(wyx))(λuv.u(u(uv))))
= (λwyx.y(wyx))(λyx.y((λuv.u(u(uv)))yx))
= (λwyx.y(wyx))(λyx.y(y(y(yx))))
= λyx.y((λyx.y(y(y(yx))))(yx))
= λyx.y(y(y(yy(yx))))
≡ 5
λxyz.x(yz)
2 * 2 ≡ (λxyz.x(yz))22
= λz.2(2z)
= λz.2(2z)
= λz.(λuv.u(uv))(λuv.u(uv))z
= λz.(λuv.u(uv))(λv.z(zv))
= λz.(λv.(λv.z(zv))((λv.z(zv))v)
= λz.(λv.(λv.z(zv))(z(zv))
= λz.(λv.z(z(z(zv))))
= λzv.z(z(z(zv))))
≡ 4
∧ ≡ λxy.xy(λuv.v) ≡ λxy.x(F)
∨ ≡ λxy.xy(λuv.u)y ≡ λxy.xTy
ㄱ ≡ λx.x(λuv.v)(λab.a) ≡ λx.xFT
ㄱT ≡ λx.x(λuv.v)(λab.a)(λcd.c)
= (λcd.c)(λuv.v)(λab.a)
= λuv.v
≡ F
Z ≡ λx.xFㄱF
cf )
0fa ≡ (λsz.z)fa = a // a에 함수 f를 0번 적용하면 자기자신 a가 결과값이 된다
Fa ≡ (λxy.y)a = λy.y ≡ I // F(false)에는 어떠한 값을 적용하더라도 I(항등함수)가 된다
Z0 ≡ (λx.xFㄱF)0 = 0FㄱF = ㄱF = T
(λz.zab)T = Tab = a // 첫번째 요소를 선택, pair에 T(true)함수를 적용한다
(λz.zab)F = Fab = b // 두번째 요소를 선택, pair에 F(false)함수를 적용한다
∮ ≡ (λpz.z(S(pT)(pT))
∮(n, n-1) ≡ (λpz.z(S(pT)(pT))(n, n-1)
= λz.z(S((n, n-1)T)((n, n-1)T))
= λz.z(n+1, n)
= (n+1, n)
Y ≡ (λy.(λx.y(xx))(λx.y(xx)))
YR ≡ (λy.(λx.y(xx))(λx.y(xx)))R
= (λx.R(xx))(λx.R(xx))
= R((λx.R(xx))(λx.R(xx)))
= R(YR)