더 높은 눈높이 - seoul national universitydreameye/pl/slide/pl7.pdf · 2011-04-05 · 더...

23
더 높은 눈높이 “기계의 편리한 사용” 말고. Computer science is no more about computers than astronomy is about telescope. -Dijkstra 소프트웨어 문제를 해결해주는 프로그래밍 언어 작성한 프로그램에 오류가 있는지를 미리 자동 으로 검증할 수 있어야. 안전하게. e.g., ML, Haskell, F#, Scala, ...

Upload: others

Post on 06-Mar-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

더 높은 눈높이

•“기계의 편리한 사용” 말고.

•Computer science is no more about computers than astronomy is about telescope. -Dijkstra

•소프트웨어 문제를 해결해주는 프로그래밍 언어

•작성한 프로그램에 오류가 있는지를 미리 자동으로 검증할 수 있어야. 안전하게.

•e.g., ML, Haskell, F#, Scala, ...

Page 2: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

계산가능한 함수들(computable functions)•계산 가능한 (computable) 함수?

•[Gӧdel] 부분재귀함수로 정의되는 함수

•[Church] 람다계산법으로 계산되는 것들

•[Turing] 튜링기계가 실행할 수 있는 것들

•(증명된것) 위 세가지가 모두 같은 정의

•(추측) 계산 가능한 함수는 이것들이 전부

•Turing-Church Thesis

Page 3: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

람다계산법(lambda calculus)

•값 중심 언어의 모델 (Lisp, ML, Haskell, ...)

•문법 + 의미정의

•표현력이 완전

•“Turing complete”

functional lang. = lambda-calculus + sugars

Page 4: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

문법 (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

Page 5: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is
Page 6: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

묶인변수/자유변수(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 안의 자유변수들

Page 7: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

치환 (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

Page 8: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

치환 (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

Page 9: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

계산(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)을 찾기

•그 부분을 다시쓰기

Page 10: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

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

무한히 도는 경우

계산순서에 따라 다른 경우

Page 11: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

정상식 (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

Page 12: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

계산 순서

•어느 레덱스부터 바꾸느냐에 따라 계산과정이 달라진다

•[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

어떤 순서로 계산해야 정상식에 도달할까?

Page 13: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

정상 순서 (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

Page 14: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

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

•프로그램 실행을 다시쓰기 과정으로 정의하기

•어느 부분을 다시 쓸 것인지

•실행문맥에 의해서 정의

•실행문맥의 (문법적) 정의대로 프로그램 구성

•어떻게 다시 쓸 것인지

•다시쓰기 규칙

Page 15: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

•문맥구조: 빈칸(실행문맥)을 하나 품은 람다식

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

Page 16: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

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

Page 17: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

람다로 프로그램하기

Page 18: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

참/거짓 (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

Page 19: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

정수 (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

Page 20: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

짝 (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

Page 21: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

재귀함수

•함수 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

Page 22: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

재귀함수

•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의 고정점

Page 23: 더 높은 눈높이 - Seoul National Universitydreameye/PL/slide/PL7.pdf · 2011-04-05 · 더 높은 눈높이 •“기계의 편리한 사용” 말고. •Computer science is

정리

•모든 계산가능한 함수를 람다로 표현가능

•“Turing-complete”

•놀랄만큼 간단한 계산(beta-reduction) 방식

함수가 자유자제로 정의되고, 함수가 적용되면서 함수가, 전

달되고 결과로 나오고, 하는 등의 일이 계산의 모든 것이구나

“higher-order computation”