프로그래밍언어 - Seoul National Universityropas.snu.ac.kr/~dreameye/PL/slide/PL2.pdf ·...

Preview:

Citation preview

프로그래밍언어

모양Syntax

의미Semantics

구체적 문법Concrete Syntax

요약 문법Abstract Syntax

� 정적 의미 Static Semantics

동적 의미 Dynamic Semantics

•문장을 만드는 방법

•프로그램을 만드는 방법

“아버지가방에들어가신다”

구체적 문장Concrete Syntax

요약 문장Abstract Syntax

아버지가 방에 들어가신다주어 목적어 동사

•문장을 읽는 방법

•프로그램을 읽는 방법

+

2 3

“2 + 3 4”×

Concrete

Abstract

Concrete Syntax

•프로그램을 읽는 방법

•프로그램의 구조를 어떻게 다시 만들어 낼 것인가?

“2 + 3 4”×1차원

+

2 3

2차원

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E × T | T × E | TT → Z | T + T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

G = (N,E)

s

F (X) = {s} ∪X ∪ {b | ∀a ∈ X, (a, b) ∈ E}

ax2 + x+ 1 = 0

x =−1±

√1− 4a

2a

append(l, [], c)

{P ⇒ Q,R ⇒ ¬Q,P ∧R} � S

2

프로그램

Concrete Syntax

•프로그램의 문법 구조를 혼동없이 결정

“2 + 3 4”×

+

23 4

×

방향성associativity

우선순위precedence

“2 + 3 + 4”

+

2 3

4+

어디부터 묶을지

어떤 연산자가 먼저 계산될지

Abstract Syntax

+

2 3

•프로그램을 만드는 방법

•문법 구조의 핵심만!

•불필요한 것들은 모두 제거

“2 더하기 3을 하고, 그 결과에 4를 곱하기”

N → zero| succ(N )

[[ zero ]] = 0[[ succ(N ) ]] = [[ N ]] + 1

T → empty| node(T, T )

T → node(T, T )

[[ empty ]] =[[ node(T1, T2) ]] = [[ T1 ]] [[ T2 ]]

L → nil| cons(N ;L)

[[ nil ]] =[[ cons(N ;L) ]] = [[ N ]] [[ L ]]

n�

i=0

i =n(n+ 1)

2

Base case: zero, 0 =0 ∗ (0 + 1)

2

Inductive case: succ(n),we have the induction hypothesisn�

i=0

i =n(n+ 1)

2.

We want to shown+1�

i=0

i =(n+ 1)(n+ 2)

2.

n+1�

i=0

i =n�

i=0

i+ (n+ 1) =n(n+ 1)

2+ (n+ 1) =

(n+ 1)(n+ 2)

2.

Base case: empty, e = 1, n = 0Inductive case: node(T1, T2),we have the induction hypothesis e1 = n1 + 1 and e2 = n2 + 1.

We want to show e = n+ 1.e = e1 + e2 = n1 + 1 + n2 + 1 and n = n1 + n2 + 1.

E → Z| E + E| E − E| E × E| E % E

3

Semantics정적 의미

Static Semantics동적 의미

Dynamic Semantics

실행 전에 알 수 있는 실행해야 알 수 있는타입, 변수의 범위 값, 메모리 상태

+

2 3

정수의 타입 20의 값

Semantics프로그램의 의미는 그 프로그램의 문법구조가

결정되면 혼동없이 결정될 수 있어야.

+

2 3

[[ Z ]] = Z[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

...

...

[[ E1 % E2 ]] = [[ E1 ]] mod [[ E2 ]]

9 ∗ 2 + 10/2 ∗ 7 + 3 % 2

4

[[ Z ]] = Z[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

...

...

[[ E1 % E2 ]] = [[ E1 ]] mod [[ E2 ]]

9 ∗ 2 + 10/2 ∗ 7 + 3 % 2

4

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

G = (N,E)

s

F (X) = {s} ∪X ∪ {b | ∀a ∈ X, (a, b) ∈ E}

ax2 + x+ 1 = 0

x =−1±

√1− 4a

2a

append(l, [], c)

{P ⇒ Q,R ⇒ ¬Q,P ∧R} � S

{g1, ..., gn} � f

[[ g1 ∧ .... ∧ gn ⇒ f ]] = true

∀x ∈ S.P (x)

(∀Ji.P (Ji)) ⇒ P (J)

JP (J)

J1 ... JnJ

∈ R, J1 ... Jn ∈ S ⇒ J ∈ S

F (X) = {J | J1 ... JnJ

∈ R, J1 ... Jn ∈ X}

1

+

2 3

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

G = (N,E)

s

F (X) = {s} ∪X ∪ {b | ∀a ∈ X, (a, b) ∈ E}

ax2 + x+ 1 = 0

x =−1±

√1− 4a

2a

append(l, [], c)

{P ⇒ Q,R ⇒ ¬Q,P ∧R} � S

{g1, ..., gn} � f

[[ g1 ∧ .... ∧ gn ⇒ f ]] = true

∀x ∈ S.P (x)

(∀Ji.P (Ji)) ⇒ P (J)

JP (J)

J1 ... JnJ

∈ R, J1 ... Jn ∈ S ⇒ J ∈ S

1

왜?+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

G = (N,E)

s

F (X) = {s} ∪X ∪ {b | ∀a ∈ X, (a, b) ∈ E}

ax2 + x+ 1 = 0

x =−1±

√1− 4a

2a

append(l, [], c)

{P ⇒ Q,R ⇒ ¬Q,P ∧R} � S

{g1, ..., gn} � f

[[ g1 ∧ .... ∧ gn ⇒ f ]] = true

∀x ∈ S.P (x)

(∀Ji.P (Ji)) ⇒ P (J)

JP (J)

J1 ... JnJ

∈ R, J1 ... Jn ∈ S ⇒ J ∈ S

1

문법과 의미의 귀납적 정의Inductive Definition

문법과 의미의 귀납적 정의Inductive Definition

문법과 의미의 귀납적 정의Inductive Definition

문법과 의미의 귀납적 정의Inductive Definition

문법과 의미의 귀납적 정의Inductive Definition

선언논리+

[[ · ]] : E → Z[[ · ]] : A → bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

[[ E ]] : Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

[[ E ]] : Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

expression assertion

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

선언문의 의미

��� ��

��� �� compositional definition

[[T ]] = true

[[F ]] = false

[[¬f ]] = not[[f ]]

[[f1 ∧ f2]] = [[f1]] andalso [[f2]]

[[f1 ∨ f2]] = [[f1]] orelse [[f2]]

[[f1 ⇒ f2]] = [[f1]] implies [[f2]]

��� ��� f� ��� �� � �.

assertion[[ E ]] : Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

궁극을 드러내는denotational semantics

프로그램 식의 의미

변수의 의미를 어떻게 정의하지?

[[ E ]] : Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

expressionσ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

환경의 필요성!Environment

[[ E ]] : Env → Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

1

환경의 필요성!Environment

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

1

닫혀 있는 프로그램 = 빈 환경에서 안전하게 실행된다.

프로그램 식의 타입Γ ∈ TypeEnv = Id → Type

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

1

Γ ∈ TypeEnv = Id → Type

Type := τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

1

함수 타입정의

S

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

T [[ E ]] : Env → Z[[ A ]] : bool

1

선언문의 의미��� ��

��� �� compositional definition

[[T ]] = true

[[F ]] = false

[[¬f ]] = not[[f ]]

[[f1 ∧ f2]] = [[f1]] andalso [[f2]]

[[f1 ∨ f2]] = [[f1]] orelse [[f2]]

[[f1 ⇒ f2]] = [[f1]] implies [[f2]]

��� ��� f� ��� �� � �.

assertion

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

1

[[ E ]] : Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

E → Z| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

환경이 굳이필요하지 않다.

프로그램 식의 타입Γ ∈ TypeEnv = Id → Type

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

1

함수 타입정의

사실 여기서도 환경이 꼭 필요하지는 않다.

Γ ∈ TypeEnv = Id → Type

Type := τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

1

S

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

T [[ E ]] : Env → Z[[ A ]] : bool

1

안전한 프로그래밍

프로그램이 제대로 생겼나?parser1 + x +

프로그램의 타입이 올바른가?

type checkingtype inference

let x := 1 in x + “y”

프로그램의 값, 메모리가 올바른가?

static analyzer, model checking,formal verification

...

y / (x - 2*z + 10)

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ Z ]] = Z[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

F 0 = {s}F 1 = {zero}F 1 = {zero, succ(zero)}F 2 = {zero, succ(zero), succ(succ(zero))}

...

1

요약 문법 Γ ∈ TypeEnv = Id → Type

Type := τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

[[ let x := 2 in let y:= x + 3 in x + y ]]∅= [[ let y:= x + 3 in x + y ]]{x �→ 2}= [[ x + y ]]{x �→ 2, y �→ 5}= 7

let x := 2 in let y:= 3 in x + y

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

1

타입

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

σ ∈ Env = Id → Int

[[ E ]] : Env → Z[[ A ]] : bool

[[ n ]] = n[[ x ]] = ?

[[ let x := E1 in E2 ]] = ?[[ −E ]] = −[[ E ]]

[[ E1 + E2 ]] = [[ E1 ]] + [[ E2 ]]

[[ E1 = E2 ]] = [[ E1 ]]eq[[ E2 ]][[ E1 ≤ E2 ]] = [[ E1 ]]le[[ E2 ]]

E → n| x| let x := E in E| −E| E + E

A → T| F| E = E| E ≤ E| ¬ A| A ∨A| A ∧A| A ⇒ A

+ : Z → Z → Z× : Z → Z → Z

= [[ 2 + 3 ]]× [[ 4 ]]= ([[ 2 ]] + [[ 3 ]])× 4= (2 + 3)× 4= 20

E → Z | E + T | T + ET → Z | T × T

1

실행 의미

프로그램의 구조, 의미귀납적 정의법, 추론 규칙

시작의 시작

앞으로 배울 것들

•기계 중심의 언어 imperative language

•값 중심의 언어 applicative language

•물건 중심의 언어 object-oriented language

syntax, semantics, motivations for various features, implementations, issues, ...

기계 중심의 언어•제어 흐름 control flow

•명령문 statement

•기계상태 memory + cpu + keyboard + monitor

Imperative Language: SyntaxProgram

P → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

[[ n ]]σ = n[[ x ]]σ = σ(x)

[[ let x := E1 in E2 ]]σ = [[ E2 ]]σ{x �→ [[ E1 ]]σ}[[ −E ]]σ = −[[ E ]]σ

[[ E1 + E2 ]]σ = [[ E1 ]]σ + [[ E2 ]]σ

[[ E1 = E2 ]] = [[ E1 ]]∅eq[[ E2 ]]∅[[ E1 ≤ E2 ]] = [[ E1 ]]∅le[[ E2 ]]∅

1

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

1

55

•Statement S: 프로그램 명령문은 기계의 상태 / 메모리를 변화시킴

•Expression E: 프로그램식은 값을 계산

Imperative Language: Semantics

M � E ⇓ v

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

1

M � E ⇓ vM � S ⇓ M �

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 do

y := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

1

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

1

집합을 만드는 방법

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

1

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

f ∈ A → B iff dom(f) is a finite subset of A.

f [b/a](x) =

�b if x = a

f(x) otherwise

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

1

의미 표현Semantic Objects

메모리

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

1

이것들이 돌아다니는 공간을 정의

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

f ∈ A → B iff dom(f) is a finite subset of A.

f [b/a](x) =

�b if x = a

f(x) otherwise

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

1

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

f ∈ A → B iff dom(f) is a finite subset of A.

f [b/a](x) =

�b if x = a

f(x) otherwise

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

1

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

f ∈ A → B iff dom(f) is a finite subset of A.

f [b/a](x) =

�b if x = a

f(x) otherwise

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

1

정수

참거짓

주소

프로그램식의 의미M � n ⇓ n

M � true ⇓ T

M � false ⇓ F

M(x) = v

M � x ⇓ v

M � E1 ⇓ v1 M � E2 ⇓ v2 v = v1 + v2M � E1 + E2 ⇓ v

M � E1 ⇓ v M � E2 ⇓ vM � E1 = E2 ⇓ T

M � E1 ⇓ v1 M � E2 ⇓ v2 v1 �= v2M � E1 = E2 ⇓ F

M � E ⇓ vM � S ⇓ M �

E and S are syntactic objects

v and M are semantic objects

v ∈ Val = Z + B

M ∈ Memory = Addr → Val

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

1

M � E ⇓ v

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

1

프로그램식이 메모리를 가지고 값을 계산

큰 보폭으로big-step operational

semantics

명령문의 의미

M � n ⇓ n

M � true ⇓ T

M � false ⇓ F

M(x) = v

M � x ⇓ v

M � E1 ⇓ v1 M � E2 ⇓ v2 v = v1 + v2M � E1 + E2 ⇓ v

M � E1 ⇓ v M � E2 ⇓ vM � E1 = E2 ⇓ T

M � E1 ⇓ v1 M � E2 ⇓ v2 v1 �= v2M � E1 = E2 ⇓ F

M � E ⇓ v

M � x := E ⇓ M [v/x]

M � S1 ⇓ M1 M1 � S2 ⇓ M2

M � S1;S2 ⇓ M2

Read nM � read x ⇓ M [n/x]

Read n

M � E ⇓ v Write vM � write E ⇓ M

Write v

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

1

명령문은 메모리를 변화시킴

M � E ⇓ vM � S ⇓ M �

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 do

y := y + x;x := x + 1;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

Γ � n : Int (constant)

Γ(x) = τ

Γ � x : τ (variable)

Γ � E1 : τ1 Γ, x : τ1 � E2 : τ2Γ � let x := E1 in E2 : τ2 (letin)

Γ � E : IntΓ � −E : Int

Γ � E1 : Int Γ � E2 : IntΓ � E1 + E2 : Int

1

명령문의 의미M � E ⇓ T M � S1 ⇓ M1

M � if E then S1 else S2 ⇓ M1

M � E ⇓ F M � S2 ⇓ M2

M � if E then S1 else S2 ⇓ M2

M � E ⇓ FM � while E do S ⇓ M

M � E ⇓ T M � S ⇓ M1 M1 � while E do S ⇓ M2

M � while E do S ⇓ M2

M � E1 ⇓ v1 M � E2 ⇓ v2 v1 > v2M � for x := E1 to E2 do S ⇓ M

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

f ∈ A → B iff dom(f) is a finite subset of A.

f [b/a](x) =

�b if x = a

f(x) otherwise

2

응? 제대로 정의한 것 맞아?

명령문의 의미

M � E ⇓ T M � S1 ⇓ M1

M � if E then S1 else S2 ⇓ M1

M � E ⇓ F M � S2 ⇓ M2

M � if E then S1 else S2 ⇓ M2

M � E ⇓ FM � while E do S ⇓ M

M � E ⇓ T M � S ⇓ M1 M1 � while E do S ⇓ M2

M � while E do S ⇓ M2

M � E1 ⇓ v1 M � E2 ⇓ v2 v1 > v2M � for x := E1 to E2 do S ⇓ M

M � E1 ⇓ v1 M � E2 ⇓ v2 v1 ≤ v2 k = v2 − v1M [v1/x] � S ⇓ M1

M1[v1 + 1/x] � S ⇓ M2...

Mk[v1 + k/x] � S ⇓ Mk+1

M � for x := E1 to E2 do S ⇓ Mk+1

n ∈ Z

b ∈ B = {T, F}

x ∈ Addr = Id

A+B separated sum {a, b, ...}

A×B cartesian product {�a, b�, ...}

A → B finite functions {f, g, ..}

f ∈ A → B iff dom(f) is a finite subset of A.

f [b/a](x) =

�b if x = a

f(x) otherwise

2

ProgramP → S

StatementS → x := E

| S;S| if E then S else S| while E do S| for x := E to E do S| read x| write E| skip

ExpressionE → n | true | false | x

| E + E | E − E | E ∗ E | E/E| E = E | E < E | not E

x := 0;y := 0;while x < 11 doy := y + x;x := x + 1;

write y

for x:= 0 to 10 doy := y + x;

write y

Γ ∈ TypeEnv = Id → Type

Type → τ | Int | Bool | Type → Type

3

Recommended