20
람다에 기반한 프로그래밍 언어 Exp E x | λx.E | EE 함수정의 함수적용 프로그램에서 함수는 최종 값 몸통의 실행은 호출될 때 λx.x (λx.x (λz.(λx.x) z )) λx.x (λz.(λx.x) z )) λz.(λx.x) z

Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

람다에 기반한 프로그래밍 언어

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

함수정의

함수적용

•프로그램에서 함수는 최종 값

•몸통의 실행은 호출될 때

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 (λz.(λx.x) z))→ λx.x (λz.(λx.x) z))→ λz.(λx.x) 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

3

Page 2: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

136 ! !!! !"

#! !! ! !x.E! !! !canonical term"!" !"!.

$#! !! !canonical term" !"!! !! v(“value”)! !!!#!.

5.2.1 !!!! !!lazy evaluation! !!!! !!eager evaluation

""!!! ##" $!! !"!. ""$ !"" ! "! %!. ##! "!

% ! ##$ !"! !# !!" ""! !"!.

!"" ##$ !"! ! E1 E2, &$ $ E2% !" ""% #!! $"?

"$" #!" '!. (# "!) ""!!! &$ !" &!$ !# &$ $

) ""!!. "%, "!) ""!! $# &$ $) ""%! &$ !) "'

## "!) ""!!.

" !# %"! !!!! "!lazy evaluation, normal-order evaluation "% !"

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 3: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

소극적인/적극적인 실행(lazy/eager evaluation)

•인자식을 계산하는 시점에 따라

•소극적(lazy): 함수몸통을 실행하면서 필요할 때에

•call-by-name, call-by-need

•ex) Haskell

•적극적(eager): 몸통 실행전에 먼저

•call-by-value

•ex) ML

λ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)))

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 4: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

소극적인/적극적인 실행(lazy/eager evaluation)138 ! !!! !"

!!" #! !#$ "!!" %".

lazy evaluation eager evaluation

!x.E !N !x.E !x.E !E !x.E

E1 !N !x.E {x "# E2}E !N vE1 E2 !N v

E1 !E !x.E E2 !E v {x "# v}E !N v!

E1 E2 !E v!

!!!&""#!!!&""'(#""%". !!!)!""!!!

!!& $!!" !! %!!! $!& %", " "!! $!" %". $!"

!!!)! ""!!

(!x.7)((!x.x x)(!x.x x)) !N 7

""#, !!!)! ""!! "#! #".

(!x.7)((!x.x x)(!x.x x))

!E (!x.7)((!x.x x)(!x.x x))

!E

...

#!, $!" !!!)! ""!!

(!x.(x · · ·x))E !N (E · · ·E) !N · · ·

E" " # ""$% !'"#, !!!)! ""!! ### ""!! #".

(!x.(x · · · x))E !"E (!x.(x · · · x))v !E (v · · · v) !E · · · .

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

lazy evaluation eager evaluation

Page 5: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

장단점

•소극적인 실행이 빨리 끝나는 경우

138 ! !!! !"

!!" #! !#$ "!!" %".

lazy evaluation eager evaluation

!x.E !N !x.E !x.E !E !x.E

E1 !N !x.E {x "# E2}E !N vE1 E2 !N v

E1 !E !x.E E2 !E v {x "# v}E !N v!

E1 E2 !E v!

!!!&""#!!!&""'(#""%". !!!)!""!!!

!!& $!!" !! %!!! $!& %", " "!! $!" %". $!"

!!!)! ""!!

(!x.7)((!x.x x)(!x.x x)) !N 7

""#, !!!)! ""!! "#! #".

(!x.7)((!x.x x)(!x.x x))

!E (!x.7)((!x.x x)(!x.x x))

!E

...

#!, $!" !!!)! ""!!

(!x.(x · · ·x))E !N (E · · ·E) !N · · ·

E" " # ""$% !'"#, !!!)! ""!! ### ""!! #".

(!x.(x · · · x))E !"E (!x.(x · · · x))v !E (v · · · v) !E · · · .

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

138 ! !!! !"

!!" #! !#$ "!!" %".

lazy evaluation eager evaluation

!x.E !N !x.E !x.E !E !x.E

E1 !N !x.E {x "# E2}E !N vE1 E2 !N v

E1 !E !x.E E2 !E v {x "# v}E !N v!

E1 E2 !E v!

!!!&""#!!!&""'(#""%". !!!)!""!!!

!!& $!!" !! %!!! $!& %", " "!! $!" %". $!"

!!!)! ""!!

(!x.7)((!x.x x)(!x.x x)) !N 7

""#, !!!)! ""!! "#! #".

(!x.7)((!x.x x)(!x.x x))

!E (!x.7)((!x.x x)(!x.x x))

!E

...

#!, $!" !!!)! ""!!

(!x.(x · · ·x))E !N (E · · ·E) !N · · ·

E" " # ""$% !'"#, !!!)! ""!! ### ""!! #".

(!x.(x · · · x))E !"E (!x.(x · · · x))v !E (v · · · v) !E · · · .

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

138 ! !!! !"

!!" #! !#$ "!!" %".

lazy evaluation eager evaluation

!x.E !N !x.E !x.E !E !x.E

E1 !N !x.E {x "# E2}E !N vE1 E2 !N v

E1 !E !x.E E2 !E v {x "# v}E !N v!

E1 E2 !E v!

!!!&""#!!!&""'(#""%". !!!)!""!!!

!!& $!!" !! %!!! $!& %", " "!! $!" %". $!"

!!!)! ""!!

(!x.7)((!x.x x)(!x.x x)) !N 7

""#, !!!)! ""!! "#! #".

(!x.7)((!x.x x)(!x.x x))

!E (!x.7)((!x.x x)(!x.x x))

!E

...

#!, $!" !!!)! ""!!

(!x.(x · · ·x))E !N (E · · ·E) !N · · ·

E" " # ""$% !'"#, !!!)! ""!! ### ""!! #".

(!x.(x · · · x))E !"E (!x.(x · · · x))v !E (v · · · v) !E · · · .

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

•적극적인 실행이 빠른 경우

138 ! !!! !"

!!" #! !#$ "!!" %".

lazy evaluation eager evaluation

!x.E !N !x.E !x.E !E !x.E

E1 !N !x.E {x "# E2}E !N vE1 E2 !N v

E1 !E !x.E E2 !E v {x "# v}E !N v!

E1 E2 !E v!

!!!&""#!!!&""'(#""%". !!!)!""!!!

!!& $!!" !! %!!! $!& %", " "!! $!" %". $!"

!!!)! ""!!

(!x.7)((!x.x x)(!x.x x)) !N 7

""#, !!!)! ""!! "#! #".

(!x.7)((!x.x x)(!x.x x))

!E (!x.7)((!x.x x)(!x.x x))

!E

...

#!, $!" !!!)! ""!!

(!x.(x · · ·x))E !N (E · · ·E) !N · · ·

E" " # ""$% !'"#, !!!)! ""!! ### ""!! #".

(!x.(x · · · x))E !"E (!x.(x · · · x))v !E (v · · · v) !E · · · .

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 6: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

시작언어: 문법5.2 !" !!! 0: M0 139

5.2.2 !! !": !" !! !"

!! !"! !!"! !#!$.

E ! x variable

| !x.E function

| E E application

% !"#! %! !& " '" !( " !%!. %!& “""”"# !$. "

" x! !!!"scope" ! %!& "( "" !x.E! !! E%!. $ ""%

## "& #!" !", ! """ "( ""% !!! ! !#"" )$ "%

! ""% #!" "% #!.

!$"!" #!!$ "$!" ""!!! $""! "!!$. !&"%

!"! !$"#" "!$& !" '( $"*%!. & E! !$ !$

" " E # v

( #( "#! & E" " v" &!%!, " #%!.

"!environment( ""% #!" "& )"& #!. !$"!#! #(&

"!%!"%+", #!!$&&"(!!!$!!!%!. """!!!

#!!$# !%'"!. #!'% #!!$ %!% "$!#! &% ""!

#!!!" $&% %&!.

"( """ ""!%!. "" "& !!!closure"# !"", "" !x.E

"$! $!" ! !!" "#! !static scoping! #(%!. #(! &'(

!x.E#! $+!$ ""$! "& )"&#!.

" $ Env = Idfin

! Val

v $ Val = Closure

%!x.E,"& $ Closure = Exp ' Env

!$ #!$( !,* '!. #"#$ ""eager evaluation #!& %$!.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 7: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

의미정의

•프로그램 텍스트를 변화시키지 않으면서 정의

•의미판단 (judgement)

5.2 !" !!! 0: M0 139

5.2.2 !! !": !" !! !"

!! !"! !!"! !#!$.

E ! x variable

| !x.E function

| E E application

% !"#! %! !& " '" !( " !%!. %!& “""”"# !$. "

" x! !!!"scope" ! %!& "( "" !x.E! !! E%!. $ ""%

## "& #!" !", ! """ "( ""% !!! ! !#"" )$ "%

! ""% #!" "% #!.

!$"!" #!!$ "$!" ""!!! $""! "!!$. !&"%

!"! !$"#" "!$& !" '( $"*%!. & E! !$ !$

" " E # v

( #( "#! & E" " v" &!%!, " #%!.

"!environment( ""% #!" "& )"& #!. !$"!#! #(&

"!%!"%+", #!!$&&"(!!!$!!!%!. """!!!

#!!$# !%'"!. #!'% #!!$ %!% "$!#! &% ""!

#!!!" $&% %&!.

"( """ ""!%!. "" "& !!!closure"# !"", "" !x.E

"$! $!" ! !!" "#! !static scoping! #(%!. #(! &'(

!x.E#! $+!$ ""$! "& )"&#!.

" $ Env = Idfin

! Val

v $ Val = Closure

%!x.E,"& $ Closure = Exp ' Env

!$ #!$( !,* '!. #"#$ ""eager evaluation #!& %$!.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

•환경 (environment)

•변수가 뜻하는 바를 결정

•프로그램식을 변경시키지 않기 위해 필요

5.2 !" !!! 0: M0 139

5.2.2 !! !": !" !! !"

!! !"! !!"! !#!$.

E ! x variable

| !x.E function

| E E application

% !"#! %! !& " '" !( " !%!. %!& “""”"# !$. "

" x! !!!"scope" ! %!& "( "" !x.E! !! E%!. $ ""%

## "& #!" !", ! """ "( ""% !!! ! !#"" )$ "%

! ""% #!" "% #!.

!$"!" #!!$ "$!" ""!!! $""! "!!$. !&"%

!"! !$"#" "!$& !" '( $"*%!. & E! !$ !$

" " E # v

( #( "#! & E" " v" &!%!, " #%!.

"!environment( ""% #!" "& )"& #!. !$"!#! #(&

"!%!"%+", #!!$&&"(!!!$!!!%!. """!!!

#!!$# !%'"!. #!'% #!!$ %!% "$!#! &% ""!

#!!!" $&% %&!.

"( """ ""!%!. "" "& !!!closure"# !"", "" !x.E

"$! $!" ! !!" "#! !static scoping! #(%!. #(! &'(

!x.E#! $+!$ ""$! "& )"&#!.

" $ Env = Idfin

! Val

v $ Val = Closure

%!x.E,"& $ Closure = Exp ' Env

!$ #!$( !,* '!. #"#$ ""eager evaluation #!& %$!.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

5.2 !" !!! 0: M0 139

5.2.2 !! !": !" !! !"

!! !"! !!"! !#!$.

E ! x variable

| !x.E function

| E E application

% !"#! %! !& " '" !( " !%!. %!& “""”"# !$. "

" x! !!!"scope" ! %!& "( "" !x.E! !! E%!. $ ""%

## "& #!" !", ! """ "( ""% !!! ! !#"" )$ "%

! ""% #!" "% #!.

!$"!" #!!$ "$!" ""!!! $""! "!!$. !&"%

!"! !$"#" "!$& !" '( $"*%!. & E! !$ !$

" " E # v

( #( "#! & E" " v" &!%!, " #%!.

"!environment( ""% #!" "& )"& #!. !$"!#! #(&

"!%!"%+", #!!$&&"(!!!$!!!%!. """!!!

#!!$# !%'"!. #!'% #!!$ %!% "$!#! &% ""!

#!!!" $&% %&!.

"( """ ""!%!. "" "& !!!closure"# !"", "" !x.E

"$! $!" ! !!" "#! !static scoping! #(%!. #(! &'(

!x.E#! $+!$ ""$! "& )"&#!.

" $ Env = Idfin

! Val

v $ Val = Closure

%!x.E,"& $ Closure = Exp ' Env

!$ #!$( !,* '!. #"#$ ""eager evaluation #!& %$!.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 8: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

•값 = 함수

•함수값 = 클로져 (closure)

•함수정의 + 정의될 때의 환경

•static scoping

5.2 !" !!! 0: M0 139

5.2.2 !! !": !" !! !"

!! !"! !!"! !#!$.

E ! x variable

| !x.E function

| E E application

% !"#! %! !& " '" !( " !%!. %!& “""”"# !$. "

" x! !!!"scope" ! %!& "( "" !x.E! !! E%!. $ ""%

## "& #!" !", ! """ "( ""% !!! ! !#"" )$ "%

! ""% #!" "% #!.

!$"!" #!!$ "$!" ""!!! $""! "!!$. !&"%

!"! !$"#" "!$& !" '( $"*%!. & E! !$ !$

" " E # v

( #( "#! & E" " v" &!%!, " #%!.

"!environment( ""% #!" "& )"& #!. !$"!#! #(&

"!%!"%+", #!!$&&"(!!!$!!!%!. """!!!

#!!$# !%'"!. #!'% #!!$ %!% "$!#! &% ""!

#!!!" $&% %&!.

"( """ ""!%!. "" "& !!!closure"# !"", "" !x.E

"$! $!" ! !!" "#! !static scoping! #(%!. #(! &'(

!x.E#! $+!$ ""$! "& )"&#!.

" $ Env = Idfin

! Val

v $ Val = Closure

%!x.E,"& $ Closure = Exp ' Env

!$ #!$( !,* '!. #"#$ ""eager evaluation #!& %$!.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

let y = 1 inlet f = \x.x+y inlet y = 2 in (f 1)

Page 9: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

의미규칙140 ! !!! !"

! ! E " v!(x) = v! ! x " v

! ! "x.E " #"x.E,!$

! ! E1 " #"x.E,!!$ ! ! E2 " v !!{x %& v} ! E " v!

! ! E1 E2 " v!

5.3 !" !!! I: M1

M0! ""# !! !!!!" # " #"" !!"!. M0# $%! $"$

!# !!!!syntactic sugar"", !!!"!! !!! %# !""&.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

dynamic scoping?σ � λx.E ⇒ λx.E

σ � E1 ⇒ λx.E� σ � E2 ⇒ v σ{x �→ v} � E� ⇒ v�

σ � E1 E2 ⇒ v�

λ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

Page 10: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

Examples140 ! !!! !"

! ! E " v!(x) = v! ! x " v

! ! "x.E " #"x.E,!$

! ! E1 " #"x.E,!!$ ! ! E2 " v !!{x %& v} ! E " v!

! ! E1 E2 " v!

5.3 !" !!! I: M1

M0! ""# !! !!!!" # " #"" !!"!. M0# $%! $"$

!# !!!!syntactic sugar"", !!!"!! !!! %# !""&.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

σ � λx.z x ⇒ �λx.z x, σ� σ � λy.y ⇒ �λy.y,σ�

σ{x �→ �λy.y,σ�} � z ⇒ �λk.k, σ��σ{x �→ �λy.y,σ�} � x ⇒ �λy.y,σ�σ�{k �→ �λy.y,σ� � k ⇒ �λy.y,σ�}σ{x �→ �λy.y,σ�} � z x ⇒ �λy.y,σ�

σ(= {z �→ �λk.k, σ��}) � (λx.z x) (λy.y) ⇒ �λy.y,σ�

σ � λx.E ⇒ λx.E

σ � E1 ⇒ λx.E� σ � E2 ⇒ v σ{x �→ v} � E� ⇒ v�

σ � E1 E2 ⇒ v�

λ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

σ � λx.x ⇒ �λx.x, σ� σ � 1 ⇒ 1 σ{x �→ 1} � x ⇒ 1σ � (λx.x) 1 ⇒ 1

σ � λx.z x ⇒ �λx.z x, σ� σ � λy.y ⇒ �λy.y,σ�

σ{x �→ �λy.y,σ�} � z ⇒ �λk.k, σ��σ{x �→ �λy.y,σ�} � x ⇒ �λy.y,σ�σ�{k �→ �λy.y,σ� � k ⇒ �λy.y,σ�}σ{x �→ �λy.y,σ�} � z x ⇒ �λy.y,σ�

σ(= {z �→ �λk.k, σ��}) � (λx.z x) (λy.y) ⇒ �λy.y,σ�

σ � λx.E ⇒ λx.E

σ � E1 ⇒ λx.E� σ � E2 ⇒ v σ{x �→ v} � E� ⇒ v�

σ � E1 E2 ⇒ v�

λ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

Page 11: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

언어키우기 I: M1

5.3 !" !!! I: M1 141

5.3.1 !! !: !!, !/"!

!!, !/!!, !!!! rec f !x.E, """ if E E E, "!# !!" E + E

$ "!" E =E. (!!$ "!! #!! !! %! !" "!# !" !" #

""&"" '"# !$# %$ !"##.)

E !...

| n integer

| true | false

| let x = E in E

| if E E E

| rec f !x.E

| E + E

| E = E

""& "$# !" M0!"! !!% ! '&(!, " )"! "#! #").

!!

let x = E1 in E2

" #*$ """#:

(!x.E2) E1

"# (#+ $ $$) '#: !!($ !! "!# !/!!.

v " Val = Closure + Z + B

z " Z the integer set

b " B = {true, false}

" " Env = Idfin

! Val

&!"#$ !$ "#+ (& *"##. $! #"#+

" # E $ v

" # n $ n

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

5.3 !" !!! I: M1 141

5.3.1 !! !: !!, !/"!

!!, !/!!, !!!! rec f !x.E, """ if E E E, "!# !!" E + E

$ "!" E =E. (!!$ "!! #!! !! %! !" "!# !" !" #

""&"" '"# !$# %$ !"##.)

E !...

| n integer

| true | false

| let x = E in E

| if E E E

| rec f !x.E

| E + E

| E = E

""& "$# !" M0!"! !!% ! '&(!, " )"! "#! #").

!!

let x = E1 in E2

" #*$ """#:

(!x.E2) E1

"# (#+ $ $$) '#: !!($ !! "!# !/!!.

v " Val = Closure + Z + B

z " Z the integer set

b " B = {true, false}

" " Env = Idfin

! Val

&!"#$ !$ "#+ (& *"##. $! #"#+

" # E $ v

" # n $ n

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

+정수, 참/거짓, let식, 재귀함수, 조건식,덧셈식,동치식

Page 12: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

의미규칙

5.3 !" !!! I: M1 141

5.3.1 !! !: !!, !/"!

!!, !/!!, !!!! rec f !x.E, """ if E E E, "!# !!" E + E

$ "!" E =E. (!!$ "!! #!! !! %! !" "!# !" !" #

""&"" '"# !$# %$ !"##.)

E !...

| n integer

| true | false

| let x = E in E

| if E E E

| rec f !x.E

| E + E

| E = E

""& "$# !" M0!"! !!% ! '&(!, " )"! "#! #").

!!

let x = E1 in E2

" #*$ """#:

(!x.E2) E1

"# (#+ $ $$) '#: !!($ !! "!# !/!!.

v " Val = Closure + Z + B

z " Z the integer set

b " B = {true, false}

" " Env = Idfin

! Val

&!"#$ !$ "#+ (& *"##. $! #"#+

" # E $ v

" # n $ n

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

5.3 !" !!! I: M1 141

5.3.1 !! !: !!, !/"!

!!, !/!!, !!!! rec f !x.E, """ if E E E, "!# !!" E + E

$ "!" E =E. (!!$ "!! #!! !! %! !" "!# !" !" #

""&"" '"# !$# %$ !"##.)

E !...

| n integer

| true | false

| let x = E in E

| if E E E

| rec f !x.E

| E + E

| E = E

""& "$# !" M0!"! !!% ! '&(!, " )"! "#! #").

!!

let x = E1 in E2

" #*$ """#:

(!x.E2) E1

"# (#+ $ $$) '#: !!($ !! "!# !/!!.

v " Val = Closure + Z + B

z " Z the integer set

b " B = {true, false}

" " Env = Idfin

! Val

&!"#$ !$ "#+ (& *"##. $! #"#+

" # E $ v

" # n $ n

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

142 ! !!! !"

! ! true " true

! ! false " false

! ! E1 " v1 !{x #$ v1} ! E2 " v! ! let x = E1 in E2 " v

! ! E1 " true ! ! E2 " v! ! if E1 E2 E3 " v

! ! E1 " false ! ! E3 " v! ! if E1 E2 E3 " v

! ! rec f "x.E " %rec f "x.E,!&

! ! E1 " z1 ! ! E2 " z2

! ! E1 + E2 " z1 + z2

! ! E1 " v1 ! ! E2 " v2

! ! E1 = E2 " v1 = v2

!!" !"! !!#! !! "!# "#!"! #!$ ""#!.

! ! E1 " %rec f "x.E,!!& ! ! E2 " v !!{f #$ %rec f "x.E,!!&}{x #$ v} ! E " v!

! ! E1 E2 " v!

z1 + z2" !"#! !!! !"#!. v1 = v2" ""$" $#"" %!$!.

#! vi"% !# !"&! !/&# !#"% $!. !" !"$ #! """

!$% " &!. &!"'! # !"" "" '% $(# #&! '% ()"

'""!"!"$""!%"'!!$!$%#!. $%#!"!*)#

#&!!!!!!Halting Problem"!"(!!!)!!%"*!!"#!.

5.4 !" !!! II: M2

5.4.1 !!! !! ": !pair

$#"$$$#!"(!!!#!$+#(. !)#""###"##)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 13: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

의미규칙

142 ! !!! !"

! ! true " true

! ! false " false

! ! E1 " v1 !{x #$ v1} ! E2 " v! ! let x = E1 in E2 " v

! ! E1 " true ! ! E2 " v! ! if E1 E2 E3 " v

! ! E1 " false ! ! E3 " v! ! if E1 E2 E3 " v

! ! rec f "x.E " %rec f "x.E,!&

! ! E1 " z1 ! ! E2 " z2

! ! E1 + E2 " z1 + z2

! ! E1 " v1 ! ! E2 " v2

! ! E1 = E2 " v1 = v2

!!" !"! !!#! !! "!# "#!"! #!$ ""#!.

! ! E1 " %rec f "x.E,!!& ! ! E2 " v !!{f #$ %rec f "x.E,!!&}{x #$ v} ! E " v!

! ! E1 E2 " v!

z1 + z2" !"#! !!! !"#!. v1 = v2" ""$" $#"" %!$!.

#! vi"% !# !"&! !/&# !#"% $!. !" !"$ #! """

!$% " &!. &!"'! # !"" "" '% $(# #&! '% ()"

'""!"!"$""!%"'!!$!$%#!. $%#!"!*)#

#&!!!!!!Halting Problem"!"(!!!)!!%"*!!"#!.

5.4 !" !!! II: M2

5.4.1 !!! !! ": !pair

$#"$$$#!"(!!!#!$+#(. !)#""###"##)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

142 ! !!! !"

! ! true " true

! ! false " false

! ! E1 " v1 !{x #$ v1} ! E2 " v! ! let x = E1 in E2 " v

! ! E1 " true ! ! E2 " v! ! if E1 E2 E3 " v

! ! E1 " false ! ! E3 " v! ! if E1 E2 E3 " v

! ! rec f "x.E " %rec f "x.E,!&

! ! E1 " z1 ! ! E2 " z2

! ! E1 + E2 " z1 + z2

! ! E1 " v1 ! ! E2 " v2

! ! E1 = E2 " v1 = v2

!!" !"! !!#! !! "!# "#!"! #!$ ""#!.

! ! E1 " %rec f "x.E,!!& ! ! E2 " v !!{f #$ %rec f "x.E,!!&}{x #$ v} ! E " v!

! ! E1 E2 " v!

z1 + z2" !"#! !!! !"#!. v1 = v2" ""$" $#"" %!$!.

#! vi"% !# !"&! !/&# !#"% $!. !" !"$ #! """

!$% " &!. &!"'! # !"" "" '% $(# #&! '% ()"

'""!"!"$""!%"'!!$!$%#!. $%#!"!*)#

#&!!!!!!Halting Problem"!"(!!!)!!%"*!!"#!.

5.4 !" !!! II: M2

5.4.1 !!! !! ": !pair

$#"$$$#!"(!!!#!$+#(. !)#""###"##)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 14: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

Examples

σ � 1 ⇒ 1· · ·

σ{x �→ 1} � x + 2 ⇒ 3σ � let x = 1 in x + 2 ⇒ 3

σ � λx.x ⇒ �λx.x, σ� σ � 1 ⇒ 1 σ{x �→ 1} � x ⇒ 1σ � (λx.x) 1 ⇒ 1

σ � λx.z x ⇒ �λx.z x, σ� σ � λy.y ⇒ �λy.y,σ�

σ{x �→ �λy.y,σ�} � z ⇒ �λk.k, σ��σ{x �→ �λy.y,σ�} � x ⇒ �λy.y,σ�σ�{k �→ �λy.y,σ� � k ⇒ �λy.y,σ�}σ{x �→ �λy.y,σ�} � z x ⇒ �λy.y,σ�

σ(= {z �→ �λk.k, σ��}) � (λx.z x) (λy.y) ⇒ �λy.y,σ�

σ � λx.E ⇒ λx.E

σ � E1 ⇒ λx.E� σ � E2 ⇒ v σ{x �→ v} � E� ⇒ v�

σ � E1 E2 ⇒ v�

λ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

· · ·let fac = rec f λn.if n = 0 then 1 else n ∗ (f (n− 1)) in (fac 2)

σ � 1 ⇒ 1· · ·

σ{x �→ 1} � x + 2 ⇒ 3σ � let x = 1 in x + 2 ⇒ 3

σ � λx.x ⇒ �λx.x, σ� σ � 1 ⇒ 1 σ{x �→ 1} � x ⇒ 1σ � (λx.x) 1 ⇒ 1

σ � λx.z x ⇒ �λx.z x, σ� σ � λy.y ⇒ �λy.y,σ�

σ{x �→ �λy.y,σ�} � z ⇒ �λk.k, σ��σ{x �→ �λy.y,σ�} � x ⇒ �λy.y,σ�σ�{k �→ �λy.y,σ� � k ⇒ �λy.y,σ�}σ{x �→ �λy.y,σ�} � z x ⇒ �λy.y,σ�

σ(= {z �→ �λk.k, σ��}) � (λx.z x) (λy.y) ⇒ �λy.y,σ�

σ � λx.E ⇒ λx.E

σ � E1 ⇒ λx.E� σ � E2 ⇒ v σ{x �→ v} � E� ⇒ v�

σ � E1 E2 ⇒ v�

λ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

Page 15: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

언어키우기 II: M25.4 !" !!! II: M2 143

!!!!. ""!! !""!! !#!!.

E !...

| (E,E)

| E.1

| E.2

"! $!# "#! ""# $!: "!$, #!, "/%", !# " $% !.

v " Val = Closure + Z + B + Pair

#v, v!$ " Pair = Val % Val

! " Env = Idfin

! Val

(&", '% Val ##%#%# "!!!. Val"!! !"( #!& #%##

!: Val = · · ·Val % Val . !! ## Val# !! $)$!. !##! $". #

!"# X = Xfin

! X# !%!# !##" $" ## X! $)$!.)

%""!# !*" !#$!.

! & E ' v! & E1 ' v1 ! & E2 ' v2

! & (E1,E2) ' #v1, v2$

! & E ' #v1, v2$! & E.1 ' v1

! & E ' #v1, v2$! & E.2 ' v2

!( !!& ! ! $!" !# '% "!# !" !""!. "!' !+

!$(#? "!'(#+(!#%#!"( M0#!&!!!$(#? !

* #% E "# E# !+ ! $!:

(E1,E2) = "m.(m E1) E2

E.1 = E("x."y.x)

E.2 = E("x."y.y)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

5.4 !" !!! II: M2 143

!!!!. ""!! !""!! !#!!.

E !...

| (E,E)

| E.1

| E.2

"! $!# "#! ""# $!: "!$, #!, "/%", !# " $% !.

v " Val = Closure + Z + B + Pair

#v, v!$ " Pair = Val % Val

! " Env = Idfin

! Val

(&", '% Val ##%#%# "!!!. Val"!! !"( #!& #%##

!: Val = · · ·Val % Val . !! ## Val# !! $)$!. !##! $". #

!"# X = Xfin

! X# !%!# !##" $" ## X! $)$!.)

%""!# !*" !#$!.

! & E ' v! & E1 ' v1 ! & E2 ' v2

! & (E1,E2) ' #v1, v2$

! & E ' #v1, v2$! & E.1 ' v1

! & E ' #v1, v2$! & E.2 ' v2

!( !!& ! ! $!" !# '% "!# !" !""!. "!' !+

!$(#? "!'(#+(!#%#!"( M0#!&!!!$(#? !

* #% E "# E# !+ ! $!:

(E1,E2) = "m.(m E1) E2

E.1 = E("x."y.x)

E.2 = E("x."y.y)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

5.4 !" !!! II: M2 143

!!!!. ""!! !""!! !#!!.

E !...

| (E,E)

| E.1

| E.2

"! $!# "#! ""# $!: "!$, #!, "/%", !# " $% !.

v " Val = Closure + Z + B + Pair

#v, v!$ " Pair = Val % Val

! " Env = Idfin

! Val

(&", '% Val ##%#%# "!!!. Val"!! !"( #!& #%##

!: Val = · · ·Val % Val . !! ## Val# !! $)$!. !##! $". #

!"# X = Xfin

! X# !%!# !##" $" ## X! $)$!.)

%""!# !*" !#$!.

! & E ' v! & E1 ' v1 ! & E2 ' v2

! & (E1,E2) ' #v1, v2$

! & E ' #v1, v2$! & E.1 ' v1

! & E ' #v1, v2$! & E.2 ' v2

!( !!& ! ! $!" !# '% "!# !" !""!. "!' !+

!$(#? "!'(#+(!#%#!"( M0#!&!!!$(#? !

* #% E "# E# !+ ! $!:

(E1,E2) = "m.(m E1) E2

E.1 = E("x."y.x)

E.2 = E("x."y.y)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 16: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

예) 리스트 구현

만드는 방법

사용하는 방법

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

144 ! !!! !"

!!"#!$!!!!!%!!""!. "#!!!!!""",!"!

!! !!! " "", "!"! !!! " "", #"! !&!! !!! " "

!.

Example 26 !# !", "#!# !!$ !'. "! "#!"! " #"!

"#! !! " "!: " "#!" "#! #$ %! " !% !!# "#!

# !#" "#. & " $# %% nil& link"" %'. nil( 0#! "!%

'. ("#!! $!! 0& "%$" &"!" #"&!). link"!)! #"

! "!%':

!x.!lst.(x,lst)

"#! “link 1 nil” ( 1 %! "" "#! [1]#, “link 1 (link 2 nil)”(

[1, 2]* "#!# !%!.

"%%" "##!" "#!# #""" " !#%" "# isNil?& "#

!!!)$!"!""$!#'#%"#"! head" tail!"#!&!.

!)& (& %% "!%! &!.

isNil? head tail

!lst.(lst = nil) !lst.(lst.1) !lst.(lst.2)

!

Example 27 !!$!!,! !! !!!!binary tree#!!$!'. !#"

"#("#": empty, leaf, node. "%%""#("#": isEmpty?, left,

right. !)& (& "!! " "!.

empty leaf node

0 !x.x !lt.!rt.(link lt rt)

isEmpty? left right

!t.(t = empty) !t.(t.1) !t.(t.2)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 17: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

언어 키우기 III: M3

5.5 !" !!! III: M3 145

!

5.5 !" !!! III: M3

5.5.1 !"! !! !: #!! !"! "!

!!! !"!" !"!! !!! !"! "!imperative features! !"# !!

!". !"#!# !!"". #!!!! !$" %$".

E !...

| malloc E

| !E

| E := E

| E ; E

"!# !"! !#" %#"", !"! !## "&! #' (", !"! !

## #' !$ !". !"!" !!#", #!!" !& ""# !#" "$

%&" '#!$ " # !". !## !"!" ($", ("!" !$"# !

#.

## #$ ()#! !"! !#! "'!":

v " Val = Closure + Z + B + Pair + Loc

! " Loc an infinite coutable set

" " Env = Idfin

! Val

!"! !#! ## ##", #!!" $$ $! #%#! !"!! ($!".

!"!#! #!!"$ $$# '###" )"# #*$# '$ !$)".

$! #%

",M # E $ v,M !

+ $ E! !* "% !"! M#" v" '#!" %& !"!! M ! #".

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

5.5 !" !!! III: M3 145

!

5.5 !" !!! III: M3

5.5.1 !"! !! !: #!! !"! "!

!!! !"!" !"!! !!! !"! "!imperative features! !"# !!

!". !"#!# !!"". #!!!! !$" %$".

E !...

| malloc E

| !E

| E := E

| E ; E

"!# !"! !#" %#"", !"! !## "&! #' (", !"! !

## #' !$ !". !"!" !!#", #!!" !& ""# !#" "$

%&" '#!$ " # !". !## !"!" ($", ("!" !$"# !

#.

## #$ ()#! !"! !#! "'!":

v " Val = Closure + Z + B + Pair + Loc

! " Loc an infinite coutable set

" " Env = Idfin

! Val

!"! !#! ## ##", #!!" $$ $! #%#! !"!! ($!".

!"!#! #!!"$ $$# '###" )"# #*$# '$ !$)".

$! #%

",M # E $ v,M !

+ $ E! !* "% !"! M#" v" '#!" %& !"!! M ! #".

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

146 ! !!! !"

!"!! !!#" !"! "! #! """.

M ! Memory = Locfin

" Val

!! !!$ "%# $".

!,M # E $ v,M !

!,M # E $ n,M !

!,M # malloc E $ ",M ! n > 0, {", " + 1, · · · , " + n % 1} &' Dom M !

!,M # E $ ",M !

!,M # !E $ M !("),M !

!,M # E1 $ ",M1 !,M1 # E2 $ v2,M2

!,M # E1 := E2 $ v2,M2{" (" v2}" ! Dom M2

!,M # E1 $ M1 !,M1 # E2 $ M2

!,M # E1 ; E2 $ M2

"" "! #"! !!!!#! !"! !&' !$"! %' !!#% #

%'". !#"",

!,M # E1 $ )#x.E,!!*,M1 ! # E2,M1 $ v,M2 !!{x (" v},M2 # E $ v!,M3

!,M # E1 E2 $ v!,M3

Exercise 2 !"!#""!%"'"$#!(")". "!& M0!"#

!* !( " )*!?

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

Page 18: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

의미규칙

146 ! !!! !"

!"!! !!#" !"! "! #! """.

M ! Memory = Locfin

" Val

!! !!$ "%# $".

!,M # E $ v,M !

!,M # E $ n,M !

!,M # malloc E $ ",M ! n > 0, {", " + 1, · · · , " + n % 1} &' Dom M !

!,M # E $ ",M !

!,M # !E $ M !("),M !

!,M # E1 $ ",M1 !,M1 # E2 $ v2,M2

!,M # E1 := E2 $ v2,M2{" (" v2}" ! Dom M2

!,M # E1 $ M1 !,M1 # E2 $ M2

!,M # E1 ; E2 $ M2

"" "! #"! !!!!#! !"! !&' !$"! %' !!#% #

%'". !#"",

!,M # E1 $ )#x.E,!!*,M1 ! # E2,M1 $ v,M2 !!{x (" v},M2 # E $ v!,M3

!,M # E1 E2 $ v!,M3

Exercise 2 !"!#""!%"'"$#!(")". "!& M0!"#

!* !( " )*!?

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

146 ! !!! !"

!"!! !!#" !"! "! #! """.

M ! Memory = Locfin

" Val

!! !!$ "%# $".

!,M # E $ v,M !

!,M # E $ n,M !

!,M # malloc E $ ",M ! n > 0, {", " + 1, · · · , " + n % 1} &' Dom M !

!,M # E $ ",M !

!,M # !E $ M !("),M !

!,M # E1 $ ",M1 !,M1 # E2 $ v2,M2

!,M # E1 := E2 $ v2,M2{" (" v2}" ! Dom M2

!,M # E1 $ M1 !,M1 # E2 $ M2

!,M # E1 ; E2 $ M2

"" "! #"! !!!!#! !"! !&' !$"! %' !!#% #

%'". !#"",

!,M # E1 $ )#x.E,!!*,M1 ! # E2,M1 $ v,M2 !!{x (" v},M2 # E $ v!,M3

!,M # E1 E2 $ v!,M3

Exercise 2 !"!#""!%"'"$#!(")". "!& M0!"#

!* !( " )*!?

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

다른 식들의 의미규칙에도 메모리 반응이 쌓여가도록...

Page 19: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

우리의 언어: M35.6 !" !!! III: M3 147

M3! !!" !! !!!!:

E ! x variable

| !x.E function

| E E application

| n integer

| true | false boolean

| let x = E in E

| if E E E

| rec f !x.E

| E + E

| E = E

| (E,E)

| E.1

| E.2

| malloc E

| !E

| E := E

| E ; E

"! !# ! 3" "#! !!" !"#!", #!!!"! !! (!$ #!!

!" ""!%, !$ !&! #!!!")" &$! ""'! "###!. #

" ! %"" !"# (!! !"!$ ""'! "%$& # (" !#!.

Exercise 3 #$! while E do E " ""#!. !# M3! !) # (!.

M3" "$ M0! !" # (#'"!, '"$" M0! !$%!.

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008

람다계산법에 기반정수참/거짓조건식재귀호출짝

메모리 반응

Page 20: Lambda Calculus ! 람다에 기반한 프로그래밍 언어dreameye/PL/slide/PL8.pdf · 2011. 4. 7. · 람다에 기반한 프로그래밍 언어 5.1 !"! !! 125! "!. ! !!# "$!%!

람다에 기반하면 좋은점

•값 중심의 프로그래밍

•[읽기] http://ropas.snu.ac.kr/~kwang/paper/maso/1.pdf

•안전한 타입 시스템