12
프로그램 실행 실행기 만들기 interpreter 실행기가 있는 다른 언어로 번역하기 compiler M0 lambda calculus K- interpreter

프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

프로그램 실행

•실행기 만들기 interpreter

•실행기가 있는 다른 언어로 번역하기 compiler

M0 lambda calculus

K- interpreter

Page 2: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

SM5가상 머신

Virtual Machine

202 !!! !!

!" !!# $"!!. !!" E1" !! "!% C1! !!"! E1 " ##

#! !" !! $#!. ##$ E2" !! "!% C2! !!"! E2" "!%

#! !" !%!. #! #!" !!! " &" E2" E1" "!##!. '#

" add "!& !!"! “E1 + E2”" "!% #! !" !!$#!.

Exercise 8 #%" !%$ $#'!. E1 + E2! !!# $ C1.C2! !!"!,

#!" !!!"" E2" ## !%!. !"(, ! "" %!% E1" ##$&

#!. #!" !% E1! E2" # !#" !# ## !''" $%&, !" !

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

6.4 !!! !"virtual machine

“!!!!"”virtual machine"($(!#!. $ “!)”%%? !($%!*

“!)$”$$)"!!!!#!. $ “%"”%%? !!)$"!!!interpreter%

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

!! !"virtual machine" &"" "*%%? %"!!# ($! """"

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

+. #$'"""!"!"!)$ Z"!!'&#!. X! Z"'""!

!"!" ! !#% !" #!. (, #)" ($ Y ! %$'" ! -& .$

"+. X "" Y " !!"(, Y "" Z " !!"+. ,- !#! /!" !

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

Example 35 6.3$" #! #'- %"" !)#!.!

Example 36 !." !)" K--" K- %"!#& !!"" # $&" )&

($! %"#!.

SM5"( !&+. “SM”- “Stack Machine”& $"(, “5”" ! !)" !

!# 5&#! !!#!:

(S,M,E,C,K)

SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008스택, 메모리, 환경, 명령어, 남은 할 일

continuation

Page 3: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

구성 요소6.4 !!! !"virtual machine 203

S!!!, M!!"!, E!!!, C!#!!, K!!!!"(“continuation”#

!" !")$ """ "% !#!& !!#":

S ! Stack = Svalue list

M ! Memory = Loc " Value

E ! Environment = (Var # (Loc + Proc)) list

C ! Command = Cmd list

K ! Continuation = (Command # Environment) list

v ! Value = Integer + Bool + Unit + Record + Loc

x ! Var

$b, o%, l ! Loc = Base # O!set

O!set = Integer

z ! Integer

b ! Bool

r ! Record = (Var # Loc) list

w ! Svalue = Value + Proc + (Var # Loc) (* stackable values *)

p ! Proc = Var # Command # Environment

Cmd = {push v, push x, push(x,C),

pop, store, load, jtr(C,C),

malloc, box z, unbox x, bind x, unbind, get, put, call,

add, sub, mul, div, eq, less, not}

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

(S,M,E,C,K) & (S !,M !, E !, C !,K !)

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

Page 4: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

Domain

6.4 !!! !"virtual machine 203

S!!!, M!!"!, E!!!, C!#!!, K!!!!"(“continuation”#

!" !")$ """ "% !#!& !!#":

S ! Stack = Svalue list

M ! Memory = Loc " Value

E ! Environment = (Var # (Loc + Proc)) list

C ! Command = Cmd list

K ! Continuation = (Command # Environment) list

v ! Value = Integer + Bool + Unit + Record + Loc

x ! Var

$b, o%, l ! Loc = Base # O!set

O!set = Integer

z ! Integer

b ! Bool

r ! Record = (Var # Loc) list

w ! Svalue = Value + Proc + (Var # Loc) (* stackable values *)

p ! Proc = Var # Command # Environment

Cmd = {push v, push x, push(x,C),

pop, store, load, jtr(C,C),

malloc, box z, unbox x, bind x, unbind, get, put, call,

add, sub, mul, div, eq, less, not}

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

(S,M,E,C,K) & (S !,M !, E !, C !,K !)

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

Page 5: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

실행 과정 1

v ! Value = Integer + Bool + {·} + Record + Loc

x ! Var

"a, o#, l ! Loc = Base $ O!set

O!set = Integer

z ! Integer

b ! Bool

r ! Record = (Var $ Loc) list

w ! Svalue = Value + Proc + (Var $ Loc) (* stackable values *)

p ! Proc = Var $ Command $ Environment

Cmd = {push v, push x, push(x,C),

pop, store, load, jtr(C,C),

malloc, box z, unbox x, bind x, unbind, get, put, call,

add, sub, mul, div, eq, less, not}

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

(S,M,E,C,K) % (S!,M !, E!, C !,K !)

!" "!% (! !!"!! # "!(%)% )"!" !" !$" #!:

(S, M, E, push v :: C, K)

% (v :: S, M, E, C, K)

(S, M, E, push x :: C, K)

% (w :: S, M, E, C, K) if (x,w) is the first such entry in E

(S, M, E, push (x,C !) :: C, K)

% ((x,C !, E) :: S, M, E, C, K)

(w :: S, M, E, pop :: C, K)

% (S, M, E, C, K)

(l :: v :: S, M, E, store :: C, K)

% (S, M{l &' v}, E, C, K)

(l :: S, M, E, load :: C, K)

% (M(l) :: S, M, E, C, K)

2

v ! Value = Integer + Bool + {·} + Record + Loc

x ! Var

"a, o#, l ! Loc = Base $ O!set

O!set = Integer

z ! Integer

b ! Bool

r ! Record = (Var $ Loc) list

w ! Svalue = Value + Proc + (Var $ Loc) (* stackable values *)

p ! Proc = Var $ Command $ Environment

Cmd = {push v, push x, push(x,C),

pop, store, load, jtr(C,C),

malloc, box z, unbox x, bind x, unbind, get, put, call,

add, sub, mul, div, eq, less, not}

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

(S,M,E,C,K) % (S!,M !, E!, C !,K !)

!" "!% (! !!"!! # "!(%)% )"!" !" !$" #!:

(S, M, E, push v :: C, K)

% (v :: S, M, E, C, K)

(S, M, E, push x :: C, K)

% (w :: S, M, E, C, K) if (x,w) is the first such entry in E

(S, M, E, push (x,C !) :: C, K)

% ((x,C !, E) :: S, M, E, C, K)

(w :: S, M, E, pop :: C, K)

% (S, M, E, C, K)

(l :: v :: S, M, E, store :: C, K)

% (S, M{l &' v}, E, C, K)

(l :: S, M, E, load :: C, K)

% (M(l) :: S, M, E, C, K)

2

Page 6: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

실행 과정 2

(true :: S, M, E, jtr(C1, C2) :: C, K)

! (S, M, E, C1 :: C, K)

(false :: S, M, E, jtr(C1, C2) :: C, K)

! (S, M, E, C2 :: C, K)

(S, M, E, malloc :: C, K)

! ("a, 0# :: S, M, E, C, K) new a

(w1 :: · · · :: wz :: S, M, E, box z :: C, K)

! ([w1, · · · , wz] :: S, M, E, C, K)

([w1, · · · , wz] :: S, M, E, unbox x :: C, K)

! (v :: S, M, E, C, K) wk = (x, v), 1 $ k $ z

(w :: S, M, E, bind x :: C, K)

! (S, M, (x,w) :: E, C, K)

(S, M, (x,w) :: E, unbind :: C, K)

! ((x,w) :: S, M, E, C, K)

(l :: v :: (x,C !, E!) :: S, M, E, call :: C, K)

! (S, M{l %& v}, (x, l) :: E!, C !, (C,E) :: K)

(S, M, E, empty , (C,E!) :: K)

! (S, M, E!, C, K)

(S, M, E, get :: C, K)

! (z :: S, M, E, C, K) read z from outside

(z :: S, M, E, put :: C, K)

! (S, M, E, C, K) print z and newline

3

레코드 만들기

레코드 필드 접근

Page 7: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

실행 과정 3

(true :: S, M, E, jtr(C1, C2) :: C, K)

! (S, M, E, C1 :: C, K)

(false :: S, M, E, jtr(C1, C2) :: C, K)

! (S, M, E, C2 :: C, K)

(S, M, E, malloc :: C, K)

! ("a, 0# :: S, M, E, C, K) new a

(w1 :: · · · :: wz :: S, M, E, box z :: C, K)

! ([w1, · · · , wz] :: S, M, E, C, K)

([w1, · · · , wz] :: S, M, E, unbox x :: C, K)

! (v :: S, M, E, C, K) wk = (x, v), 1 $ k $ z

(w :: S, M, E, bind x :: C, K)

! (S, M, (x,w) :: E, C, K)

(S, M, (x,w) :: E, unbind :: C, K)

! ((x,w) :: S, M, E, C, K)

(l :: v :: (x,C !, E!) :: S, M, E, call :: C, K)

! (S, M{l %& v}, (x, l) :: E!, C !, (C,E) :: K)

(S, M, E, empty , (C,E!) :: K)

! (S, M, E!, C, K)

(S, M, E, get :: C, K)

! (z :: S, M, E, C, K) read z from outside

(z :: S, M, E, put :: C, K)

! (S, M, E, C, K) print z and newline

3

Page 8: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

실행 과정 4(v2 :: v1 :: S, M, E, add :: C, K)

! (plus(v1, v2) :: S, M, E, C, K)

(v2 :: v1 :: S, M, E, sub :: C, K)

! (minus(v1, v2) :: S, M, E, C, K)

(z2 :: z1 :: S, M, E, mul :: C, K)

! ((z1 " z2) :: S, M, E, C, K) similar for div

(v2 :: v1 :: S, M, E, eq :: C, K)

! (equal(v1, v2) :: S, M, E, C, K)

(v2 :: v1 :: S, M, E, less :: C, K)

! (less(v1, v2) :: S, M, E, C, K)

(b :: S, M, E, not :: C, K)

! (¬b :: S, M, E, C, K)

less(z1, z2) = z1 < z2

plus(z1, z2) = z1 + z2

plus(#a, z1$, z2) = #a, z1 + z2$ if z1 + z2 % 0

plus(z1, #a, z2$) = #a, z1 + z2$ if z1 + z2 % 0

minus(z1, z2) = z1 & z2

minus(#a, z1$, z2) = #a, z1 & z2$ if z1 & z2 % 0

equal(z1, z2) = z1 = z2

equal(b1, b2) = b1 = b2

equal(·, ·) = true

equal(r1, r2) = ('#x, l$ ( r1 : #x, l$ ( r2) ) ('#x, l$ ( r2 : #x, l$ ( r1)

equal(#a1, z1$, #a2, z2$) = a1 = a2 ) z1 = z2

equal( , ) = false

SM5! !!!! C! !"#!" !", C" "!# #" ! !$!!! $

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

(empty , empty , empty , C, empty) ! · · · ! · · ·

4

Page 9: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

프로그램 실행

(v2 :: v1 :: S, M, E, add :: C, K)

! (plus(v1, v2) :: S, M, E, C, K)

(v2 :: v1 :: S, M, E, sub :: C, K)

! (minus(v1, v2) :: S, M, E, C, K)

(z2 :: z1 :: S, M, E, mul :: C, K)

! ((z1 " z2) :: S, M, E, C, K) similar for div

(v2 :: v1 :: S, M, E, eq :: C, K)

! (equal(v1, v2) :: S, M, E, C, K)

(v2 :: v1 :: S, M, E, less :: C, K)

! (less(v1, v2) :: S, M, E, C, K)

(b :: S, M, E, not :: C, K)

! (¬b :: S, M, E, C, K)

less(z1, z2) = z1 < z2

plus(z1, z2) = z1 + z2

plus(#a, z1$, z2) = #a, z1 + z2$ if z1 + z2 % 0

plus(z1, #a, z2$) = #a, z1 + z2$ if z1 + z2 % 0

minus(z1, z2) = z1 & z2

minus(#a, z1$, z2) = #a, z1 & z2$ if z1 & z2 % 0

equal(z1, z2) = z1 = z2

equal(b1, b2) = b1 = b2

equal(·, ·) = true

equal(r1, r2) = ('#x, l$ ( r1 : #x, l$ ( r2) ) ('#x, l$ ( r2 : #x, l$ ( r1)

equal(#a1, z1$, #a2, z2$) = a1 = a2 ) z1 = z2

equal( , ) = false

SM5! !!!! C! !"#!" !", C" "!# #" ! !$!!! $

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

(empty , empty , empty , C, empty) ! · · · ! · · ·

4

!!!!,

push 1 :: push 2 :: add :: put :: empty

! K-- !!!! write 1+2! "! "# "# "".

""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "

# "! SM5 !!!!'! "!"! $!

trans: K.program -> Sm5.command

! (""! $$".

trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"

Sm5.run(trans(E))# "&%! "*# ! +# $$".

!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !

Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”

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

$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#

!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##

"! $! gc! /#"$. #,

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l

$ #%" "$ ")% $$":

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213

(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213

,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#

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

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

!

5

!!!!,

push 1 :: push 2 :: add :: put :: empty

! K-- !!!! write 1+2! "! "# "# "".

""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "

# "! SM5 !!!!'! "!"! $!

trans: K.program -> Sm5.command

! (""! $$".

trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"

Sm5.run(trans(E))# "&%! "*# ! +# $$".

!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !

Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”

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

$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#

!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##

"! $! gc! /#"$. #,

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l

$ #%" "$ ")% $$":

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213

(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213

,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#

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

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

!

5

!!!!,

push 1 :: push 2 :: add :: put :: empty

! K-- !!!! write 1+2! "! "# "# "".

""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "

# "! SM5 !!!!'! "!"! $!

trans: K.program -> Sm5.command

! (""! $$".

trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"

Sm5.run(trans(E))# "&%! "*# ! +# $$".

!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !

Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”

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

$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#

!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##

"! $! gc! /#"$. #,

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l

$ #%" "$ ")% $$":

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213

(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213

,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#

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

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

!

5

번역기 작성

Bonus 점수 30점

!!!!,

push 1 :: push 2 :: add :: put :: empty

! K-- !!!! write 1+2! "! "# "# "".

""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "

# "! SM5 !!!!'! "!"! $!

trans: K.program -> Sm5.command

! (""! $$".

trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"

Sm5.run(trans(E))# "&%! "*# ! +# $$".

!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !

Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”

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

$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#

!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##

"! $! gc! /#"$. #,

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l

$ #%" "$ ")% $$":

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213

(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213

,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#

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

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

!

5

!!!!,

push 1 :: push 2 :: add :: put :: empty

! K-- !!!! write 1+2! "! "# "# "".

""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "

# "! SM5 !!!!'! "!"! $!

trans: K.program -> Sm5.command

! (""! $$".

trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"

Sm5.run(trans(E))# "&%! "*# ! +# $$".

!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !

Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”

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

$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#

!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##

"! $! gc! /#"$. #,

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l

$ #%" "$ ")% $$":

(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213

(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213

,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#

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

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

!

5

=

Page 10: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

CPSContinuation Passing Style

•다음의 할 일 (continuation)을 명시적으로 표현하는 방식

•모든 함수는 다음의 할 일을 인자로 받는다.

•함수 호출의 인자는 모두 값이거나 lambda expression 이다.

Page 11: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

CPS Transformation

λx.λy.x+ y

let rec fac = λn. if n then 1 else n ∗ (fac(n− 1))

let rec faccps = λn.λκ. if n then (κ 1) else faccps(n− 1)(λres.κ(res ∗ n))else faccps(n− 1)(λr.κ (r ∗ n))

λx.λy.λκ.κ (x+ y)

Page 12: 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. · 프로그램 실행 •실행기 만들기 interpreter •실행기가 있는 다른 언어로

let rec faccps = λn.λκ. if n then (κ 1) else faccps(n− 1)(λres.κ(res ∗ n))else faccps(n− 1)(λr.κ (r ∗ n))

faccps 2 (λx.x)

faccps 1 (λr.(λx.x)(r ∗ 2))

faccps 0 (λr.(λr.(λx.x)(r ∗ 2)) (r ∗ 1))

(λr.(λr.(λx.x)(r ∗ 2)) (r ∗ 1)) 1

(λr.(λx.x)(r ∗ 2)) (1 ∗ 1)

(λx.x) (1 ∗ 2)