더 높은 눈높이 - seoul national universitydreameye/pl/slide/pl7.pdf · 2011-04-05 · 더...
TRANSCRIPT
더 높은 눈높이
•“기계의 편리한 사용” 말고.
•Computer science is no more about computers than astronomy is about telescope. -Dijkstra
•소프트웨어 문제를 해결해주는 프로그래밍 언어
•작성한 프로그램에 오류가 있는지를 미리 자동으로 검증할 수 있어야. 안전하게.
•e.g., ML, Haskell, F#, Scala, ...
계산가능한 함수들(computable functions)•계산 가능한 (computable) 함수?
•[Gӧdel] 부분재귀함수로 정의되는 함수
•[Church] 람다계산법으로 계산되는 것들
•[Turing] 튜링기계가 실행할 수 있는 것들
•(증명된것) 위 세가지가 모두 같은 정의
•(추측) 계산 가능한 함수는 이것들이 전부
•Turing-Church Thesis
람다계산법(lambda calculus)
•값 중심 언어의 모델 (Lisp, ML, Haskell, ...)
•문법 + 의미정의
•표현력이 완전
•“Turing complete”
functional lang. = lambda-calculus + sugars
문법 (syntax)
함수적용은 왼쪽으로 결합
t → terms| x variable| λx.t abstraction| t t application
s t u = (s t) u
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
if call f(10) then f(20)else not (10 = 10)
let x := 0in
while true do x := x + 1
let x := {name := 1, age := 2}in
&x.name
int x = 1;
1
함수바디는 오른쪽으로 최대한 묶기
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
if call f(10) then f(20)else not (10 = 10)
let x := 0in
while true do x := x + 1
let x := {name := 1, age := 2}in
&x.name
1
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
if call f(10) then f(20)else not (10 = 10)
1
예제 관례
5.1 !"! !! 125
! "!. ! !!# "$!%! "!! "!# #! !!! #& "%! !"
". #"' “Turing-Church Thesis”"! !"!.
# " "$# !! !!!Lambda Calculus# !"! !!' $!! "!. !
!syntax# "! !"!!semantics$ "!.
5.1.1 !! !!!Lambda Calculus
!! !!!Lambda Calculus#"" !"# !!! "!"#! !"# !$(#
$" ""$!. " !"! !!## !#$! ""#!. !%!%! %"$
#!!""# (!"!!#$"""!""!"$#)"!"!"!)$
#""#"!%&!!"%$. #$'!%%&#!%!(%"!!""
' !!% " "" !"# “Turing-complete $!”! !!.
'%!!! !!!Lambda Calculus'!"#&%!(%! “!!”"!!!
)!.
!!! !!!"syntax" (%$!:
Exp E ! x variable
| !x.E abstraction
| E E application
x" #&#!. !x.E" &"# &!!. x" &"! ($! E" &"! #"
#!. x!*"#+" E#!. !x.E" E$!!!" x# “#!bind#!”!!
!. E1 E2" &"# !"$" ##!. E1& %"$" &" !x.E$ #($!
E2" " &"! ($ x! $!$ $!.
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
묶인변수/자유변수(bound/free variables)
binder
bound variable
scope
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
if call f(10) then f(20)else not (10 = 10)
let x := 0in
while true do x := x + 1
1
5.1 !"! !! 125
! "!. ! !!# "$!%! "!! "!# #! !!! #& "%! !"
". #"' “Turing-Church Thesis”"! !"!.
# " "$# !! !!!Lambda Calculus# !"! !!' $!! "!. !
!syntax# "! !"!!semantics$ "!.
5.1.1 !! !!!Lambda Calculus
!! !!!Lambda Calculus#"" !"# !!! "!"#! !"# !$(#
$" ""$!. " !"! !!## !#$! ""#!. !%!%! %"$
#!!""# (!"!!#$"""!""!"$#)"!"!"!)$
#""#"!%&!!"%$. #$'!%%&#!%!(%"!!""
' !!% " "" !"# “Turing-complete $!”! !!.
'%!!! !!!Lambda Calculus'!"#&%!(%! “!!”"!!!
)!.
!!! !!!"syntax" (%$!:
Exp E ! x variable
| !x.E abstraction
| E E application
x" #&#!. !x.E" &"# &!!. x" &"! ($! E" &"! #"
#!. x!*"#+" E#!. !x.E" E$!!!" x# “#!bind#!”!!
!. E1 E2" &"# !"$" ##!. E1& %"$" &" !x.E$ #($!
E2" " &"! ($ x! $!$ $!.
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
126 ! !!! !"
!!! !!!!semantics! ""!!. !!" !!!" "! #!$.
Notation 3 E! "# !!free variable! FV (E)% E#" !-"&! !$'"
%% "#!(!.
FV (x) = {x}
FV (!x.E) = FV (E) \ {x}
FV (E1 E2) = FV (E1) ! FV (E2)
!
Notation 4 !!substitution% "#! !" #&! #!!# &"(!. !!
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
FV(E): E 안의 자유변수들
치환 (Substitution)
S = {x1 �→ Y1, . . . , xn �→ Yn}
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
if call f(10) then f(20)
1
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
1
: 치환 S를 E에 적용S = {x1 �→ Y1, . . . , xn �→ Yn}
S E
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
1
5.1 !"! !! 127
S! !! xi! Yi! "!! #"! xi !" Yi!! !!"".
{x1 !" Y1, · · · , xn !" Yn}
!" xi!# #!$ "".
Supp(S) (support set of S)! S! "!! !!! {x | S(x) #= x}"".
!! x $ A! Y $ B! ""!! !!!! !!$
Afin
!" B
! !""".
!!! """%! "!! !! S $ Idfin
!" Exp% "#!, FV (S)! ""!
"" "!! &'!!!! !!!"":
FV (S) =!
1!i!n
FV (Ei)
!
Notation 5 !! S! """ E% "!$! #$ S E! !!# "($ %"
#!#":
S x =
"
#
$
E if x !" E $ S
x otherwise
S ("x.E) = "y.(S {x !" y} E) (new y)
S (E1 E2) = (S E1)(S E2)
)%! “new y”# !!" "" &! !! y$! %"":
y #$ {x} % FV ("x.E) % FV (S).
!
Notation 6 $ &! !! S, T! !#! S T $' !", T! "!'!! S!
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
묶인 변수가 치환되지 않게
치환되는 변수가 묶이지 않게
5.1 !"! !! 127
S! !! xi! Yi! "!! #"! xi !" Yi!! !!"".
{x1 !" Y1, · · · , xn !" Yn}
!" xi!# #!$ "".
Supp(S) (support set of S)! S! "!! !!! {x | S(x) #= x}"".
!! x $ A! Y $ B! ""!! !!!! !!$
Afin
!" B
! !""".
!!! """%! "!! !! S $ Idfin
!" Exp% "#!, FV (S)! ""!
"" "!! &'!!!! !!!"":
FV (S) =!
1!i!n
FV (Ei)
!
Notation 5 !! S! """ E% "!$! #$ S E! !!# "($ %"
#!#":
S x =
"
#
$
E if x !" E $ S
x otherwise
S ("x.E) = "y.(S {x !" y} E) (new y)
S (E1 E2) = (S E1)(S E2)
)%! “new y”# !!" "" &! !! y$! %"":
y #$ {x} % FV ("x.E) % FV (S).
!
Notation 6 $ &! !! S, T! !#! S T $' !", T! "!'!! S!
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
치환 (Substitution)
S = {x1 �→ Y1, . . . , xn �→ Yn}
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
if call f(10) then f(20)
1
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
(if E then true else 1) + 2
let x : = 1in x + 10
let procedure f(x) = x < 10in
1
: 치환 S를 E에 적용S = {x1 �→ Y1, . . . , xn �→ Yn}
S E
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
Γ � n : int Γ � true : bool Γ � () : unit
Γ � E1 : int Γ � E2 : intΓ � E1 + E2 : int
Γ � E1 : τ1 Γ � E2 : τ2
Γ � E1;E2 : τ2
Γ � E1 : bool Γ � E2 : unitΓ � while E1 do E2 : unit
Γ � E1 : bool Γ � E2 : τ Γ � E3 : τΓ � if E1 then E2 else E3 : τ
Γ � E1 : τ1 Γ[τ1 loc/x] � E2 : τ2
Γ � let x := E1 in E2 : τ2
Γ � E : τ Γ(x) = τ loc
Γ � x := E : unit
Γ(x) = τ loc
Γ � x : τ Γ � &x : Γ(x)Γ � E : τ loc
Γ � ∗E : τ
Γ � E : τ1 Γ(f) = τ1 → τ2
Γ � call f(E) : τ2
Γ[τ1 loc/y][τ1 → τ2/f ] � E1 : τ2 Γ[τ1 → τ2/f ] � E2 : τ3
Γ � let procedure f(y) = E1 in E2 : τ3
Γ � E1 : τ1 ... Γ � Ek : τk
Γ � x1 := E1, .., xk := Ek : {x1 �→ τ1 loc, ..., xk �→ τk loc}Γ � E : τ τ(x) = τ � loc
Γ � E.x : τ �
τ → int| bool| unit| {x1 �→ τ, ..., xn �→ τ}| τ → τ| τ loc
1
5.1 !"! !! 127
S! !! xi! Yi! "!! #"! xi !" Yi!! !!"".
{x1 !" Y1, · · · , xn !" Yn}
!" xi!# #!$ "".
Supp(S) (support set of S)! S! "!! !!! {x | S(x) #= x}"".
!! x $ A! Y $ B! ""!! !!!! !!$
Afin
!" B
! !""".
!!! """%! "!! !! S $ Idfin
!" Exp% "#!, FV (S)! ""!
"" "!! &'!!!! !!!"":
FV (S) =!
1!i!n
FV (Ei)
!
Notation 5 !! S! """ E% "!$! #$ S E! !!# "($ %"
#!#":
S x =
"
#
$
E if x !" E $ S
x otherwise
S ("x.E) = "y.(S {x !" y} E) (new y)
S (E1 E2) = (S E1)(S E2)
)%! “new y”# !!" "" &! !! y$! %"":
y #$ {x} % FV ("x.E) % FV (S).
!
Notation 6 $ &! !! S, T! !#! S T $' !", T! "!'!! S!
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
묶인 변수가 치환되지 않게
치환되는 변수가 묶이지 않게
5.1 !"! !! 127
S! !! xi! Yi! "!! #"! xi !" Yi!! !!"".
{x1 !" Y1, · · · , xn !" Yn}
!" xi!# #!$ "".
Supp(S) (support set of S)! S! "!! !!! {x | S(x) #= x}"".
!! x $ A! Y $ B! ""!! !!!! !!$
Afin
!" B
! !""".
!!! """%! "!! !! S $ Idfin
!" Exp% "#!, FV (S)! ""!
"" "!! &'!!!! !!!"":
FV (S) =!
1!i!n
FV (Ei)
!
Notation 5 !! S! """ E% "!$! #$ S E! !!# "($ %"
#!#":
S x =
"
#
$
E if x !" E $ S
x otherwise
S ("x.E) = "y.(S {x !" y} E) (new y)
S (E1 E2) = (S E1)(S E2)
)%! “new y”# !!" "" &! !! y$! %"":
y #$ {x} % FV ("x.E) % FV (S).
!
Notation 6 $ &! !! S, T! !#! S T $' !", T! "!'!! S!
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
계산(reduction)
5.1 !"! !! 129
!"!!!!!#!!!!$!!!""%!!#!%!. !!!!& 3$
!.
(!-reduction) ("x.E1) E2 !" {x #" E2}E1
(#-reduction)
x! $% FV ("x.E)
"x.E !" "x!.{x #" x!}E
E1 !" E2
C[E1] !" C[E2]
#-!!!-reduction& !! !"! '( %!$ !!"!" "!. !!)" !!
& ##!.
!!)" !! #!& !! #!!. !-!!"-reduction !!%!. !!!$
! !-%! %$" !"$ !# !# !&, !# " '#$! !-%! %$" !
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
레덱스 redex (“reducible expression”)
•다음 두 과정을 반복
•람다식에서 계산할 곳(redex)을 찾기
•그 부분을 다시쓰기
Examples
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
무한히 도는 경우
계산순서에 따라 다른 경우
정상식 (normal terms)
•더 이상 계산불가 (레덱스가 없는)
•정상식을 가지고 있는 람다식
•정상식에 도달하는, 정상식으로 끝낼 수 있는
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
X
O
계산 순서
•어느 레덱스부터 바꾸느냐에 따라 계산과정이 달라진다
•[Confluence Theorem] 람다식이 계산이 끝난다면 그 결과는 오직 한가지
(λx.x)(λy.y z) → (λy.y z)→ z(λx.x)(λy.y z) → (λx.x) z → z
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
어떤 순서로 계산해야 정상식에 도달할까?
정상 순서 (normal-order)
•가장 왼쪽, 가장 바깥쪽의 레덱스부터 계산
•정상식이 있는 람다식은 항상 그 정상식에 도달
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)(λx.x x)(λx.x x) → y
(λx.y)(λx.x x)(λx.x x) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
1
cf) 문맥구조를 통해서
(λx.x)(λy.y z) → (λy.y z)→ z(λx.x)(λy.y z) → (λx.x) z → z
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
•프로그램 실행을 다시쓰기 과정으로 정의하기
•어느 부분을 다시 쓸 것인지
•실행문맥에 의해서 정의
•실행문맥의 (문법적) 정의대로 프로그램 구성
•어떻게 다시 쓸 것인지
•다시쓰기 규칙
•문맥구조: 빈칸(실행문맥)을 하나 품은 람다식
128 ! !!! !"
!!! !!" !!":
S T = {x !" S (T (x)) | x # Supp(T )} $ {x !" S(x) | x # Supp(T ) \ Supp(S)}
!
Notation 7 !!!!context C! !" []" ! "! !" #! """$".
Context C " [] | C E | E C | !x.C
!"" !% """" #!"! &# “C[]”#" !", ! !"# !"#! ("
# !$$) """ E "" "$"" “C[E]”#" ""!". !# """%
“C[E]”"! ""$! !, ! """! !!'! E$ #"! %" !!". !
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
e
C
C[]
C
C[e]
1. 다시 쓸 곳을 표현
cf) 문맥구조를 통해서
1 + 2 + 3 → 3 + 3 → 6
(λx.x)(λy.y z) → (λy.y z)→ z(λx.x)(λy.y z) → (λx.x) z → z
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x [] λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
λx.λy.x y x = λx.(λy.((x y) x))s t u = (s t) u
λy.x yλx.x
λz.λx.λx (y z)(λx.x) x
2
1 + 2 + 3 → 3 + 3 → 6
(λx.x)(λy.y z) → (λy.y z)→ z(λx.x)(λy.y z) → (λx.x) z → z
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)((λx.x x)(λx.x x)) → y
(λx.y)((λx.x x)(λx.x x)) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x [] λx.(x []) (λx.x y)(y []) (λx. []) []
C[] = (λz.z [])C[(λx.x y)] = (λz.z [λx.x y])
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
2
2. 다시 쓰는 방법
•다시쓰기 규칙 (rewriting rule)으로 표현
cf) 문맥구조를 통해서
5.1 !"! !! 129
!"!!!!!#!!!!$!!!""%!!#!%!. !!!!& 3$
!.
(!-reduction) ("x.E1) E2 !" {x #" E2}E1
(#-reduction)
x! $% FV ("x.E)
"x.E !" "x!.{x #" x!}E
E1 !" E2
C[E1] !" C[E2]
#-!!!-reduction& !! !"! '( %!$ !!"!" "!. !!)" !!
& ##!.
!!)" !! #!& !! #!!. !-!!"-reduction !!%!. !!!$
! !-%! %$" !"$ !# !# !&, !# " '#$! !-%! %$" !
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
5.1 !"! !! 129
!"!!!!!#!!!!$!!!""%!!#!%!. !!!!& 3$
!.
(!-reduction) ("x.E1) E2 !" {x #" E2}E1
(#-reduction)
x! $% FV ("x.E)
"x.E !" "x!.{x #" x!}E
E1 !" E2
C[E1] !" C[E2]
#-!!!-reduction& !! !"! '( %!$ !!"!" "!. !!)" !!
& ##!.
!!)" !! #!& !! #!!. !-!!"-reduction !!%!. !!!$
! !-%! %$" !"$ !# !# !&, !# " '#$! !-%! %$" !
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
람다로 프로그램하기
참/거짓 (Church Booleans)S = {x1 �→ Y1, . . . , xn �→ Yn}
S E
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)(λx.x x)(λx.x x) → y
(λx.y)(λx.x x)(λx.x x) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
t → terms| x variable| λx.t abstraction| t t application
1
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
(λx.x) y → y
(λx.x(λx.x))(u r) → u r (λx.x)
(λx.y)(λz.z) → y
(λx.(λy.y x) z)(z w) → (λy.y (z w)) z→ z (z w)
(λx.x x)(λx.x x) → (λx.x x)(λx.x x)→ · · ·
(λx.y)(λx.x x)(λx.x x) → y
(λx.y)(λx.x x)(λx.x x) → (λx.y)(λx.x x)(λx.x x)→ · · ·
λx.x (λx.x (λz.λx.x z))→ λx.x (λz.λx.x z))→ λz.λx.x z→ λz.z
[] x λx.(x []) (λx.x y)(y []) (λx. []) []
{x �→ y, y �→ z} x y �= z z= y z
{x �→ y} λx.x �= λx.y= λz.{x �→ y}{x �→ z}x= λz.z
{y �→ x}λx.y �= λx.x= λz.{y �→ x){x �→ z}y= λz.x
x y zλx.x λx.y λx.λy.x
x y λx.y z x λy.z λx.x y
1
정수 (Church Numerals)
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
1
λx.E
E1 E2
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
• N = {0} ∪ {n + 1 | n ∈ N}N = fixλX.{0} ∪ {n + 1 | n ∈ X}
• fac(n) = if n=0 1 else n*fac(n-1)fac = fixλf.(λn.if n = 0 1 else n× f(n− 1))
• Y = λf.(λx.f(xx))(λx.f(xx))
• fac = Y (λf.(λn.if n = 0 1 else n× f(n− 1)))
mult �= λm.λn.λs.λz.m (n s) z
succ �= λn.λs.λz.n s (s z)
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
1
λx.E
E1 E2
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
• N = {0} ∪ {n + 1 | n ∈ N}N = fixλX.{0} ∪ {n + 1 | n ∈ X}
• fac(n) = if n=0 1 else n*fac(n-1)fac = fixλf.(λn.if n = 0 1 else n× f(n− 1))
• Y = λf.(λx.f(xx))(λx.f(xx))
• fac = Y (λf.(λn.if n = 0 1 else n× f(n− 1)))
mult �= λm.λn.λs.λz.m (n s) z
succ �= λn.λs.λz.n s (s z)
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
1
짝 (Pair)
(E1, E2)�= λm.m E1 E2
E.1�= E (λx.λy.x)
E.2�= E (λx.λy.y)
(1, 2) = λm.m 1 2(1, 2).1 = (λm.m 1 2) (λx.λy.x)
= (λx.λy.x) 1 2 = 1(1, 2).2 = (λm.m 1 2) (λx.λy.y)
= (λx.λy.y) 1 2 = 2
mult �= λm.λn.λs.λz.m (n s) z
succ �= λn.λs.λz.n s (s z)
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
2
재귀함수
•함수 F의 고정점 (fixpoint)
•방정식 X = F(X)의 해
•귀납적/재귀적으로 정의되는 것 = 최소고정점
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
• N = {0} ∪ {n + 1 | n ∈ N}N = fixλX.{0} ∪ {n + 1 | n ∈ X}
• fac(n) = if n=0 1 else n*fac(n-1)fac = fixλf.(λn.if n = 0 1 else n× f(n− 1))
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
1
재귀함수
•fixpoint combinator = 고정점을 계산하는 함수
•(타입이 없는) 람다계산법에서는 무한히 많음
•예) Y-combinator
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
• N = {0} ∪ {n + 1 | n ∈ N}N = fixλX.{0} ∪ {n + 1 | n ∈ X}
• fac(n) = if n=0 1 else n*fac(n-1)fac = fixλf.(λn.if n = 0 1 else n× f(n− 1))
• Y = λf.(λx.f(xx))(λx.f(xx))
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
1
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
• N = {0} ∪ {n + 1 | n ∈ N}N = fixλX.{0} ∪ {n + 1 | n ∈ X}
• fac(n) = if n=0 1 else n*fac(n-1)fac = fixλf.(λn.if n = 0 1 else n× f(n− 1))
• Y = λf.(λx.f(xx))(λx.f(xx))
• fac = Y (λf.(λn.if n = 0 1 else n× f(n− 1)))
true �= λt.λf.t
false �= λt.λf.f
if e1 e2 e3�= e1 e2 e3
and �= λb.λc.b c falseor �= ?
not �= ?if true true false
and true true
and true false
0 �= λs.λz.z
1 �= λs.λz.s z
2 �= λs.λz.s (s z)n
�= λs.λz.sn z
succ �= λn.λs.λz.s (n s z)add �= λm.λn.λs.λz.m s (n s z)
mult �= λm.λn.m (add n) 0iszero �= λm.m (λx.false) true
1
예)
λx.E
E1 E2
S = {x1 �→ Y1, . . . , xn �→ Yn}S E
• N = {0} ∪ {n + 1 | n ∈ N}N = fixλX.{0} ∪ {n + 1 | n ∈ X}
• fac(n) = if n=0 1 else n*fac(n-1)fac = fixλf.(λn.if n = 0 1 else n× f(n− 1))
• Y = λf.(λx.f(xx))(λx.f(xx))
• Y F = F (Y F )Y F
β= (λx.F (xx))(λx.F (xx)) β= F ((λx.F (xx))(λx.F (xx))) = f(Y f)
• fac = Y (λf.(λn.if n = 0 1 else n× f(n− 1)))
1
증명: YF는 F의 고정점
정리
•모든 계산가능한 함수를 람다로 표현가능
•“Turing-complete”
•놀랄만큼 간단한 계산(beta-reduction) 방식
함수가 자유자제로 정의되고, 함수가 적용되면서 함수가, 전
달되고 결과로 나오고, 하는 등의 일이 계산의 모든 것이구나
“higher-order computation”