프로그래밍언어 - ropas.snu.ac.krdreameye/PL/slide/PL2.pdf · 프로그래밍언어 모양...
Transcript of 프로그래밍언어 - ropas.snu.ac.krdreameye/PL/slide/PL2.pdf · 프로그래밍언어 모양...
프로그래밍언어
모양Syntax
의미Semantics
구체적 문법Concrete Syntax
요약 문법Abstract Syntax
�
� 정적 의미 Static Semantics
동적 의미 Dynamic Semantics
•문장을 만드는 방법
•프로그램을 만드는 방법
“아버지가방에들어가신다”
구체적 문장Concrete Syntax
요약 문장Abstract Syntax
아버지가 방에 들어가신다주어 목적어 동사
•문장을 읽는 방법
•프로그램을 읽는 방법
+
2 3
4×
“2 + 3 4”×
Concrete
Abstract
Concrete Syntax
•프로그램을 읽는 방법
•프로그램의 구조를 어떻게 다시 만들어 낼 것인가?
“2 + 3 4”×1차원
+
2 3
4×
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
4×
•프로그램을 만드는 방법
•문법 구조의 핵심만!
•불필요한 것들은 모두 제거
“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
4×
정수의 타입 20의 값
Semantics프로그램의 의미는 그 프로그램의 문법구조가
결정되면 혼동없이 결정될 수 있어야.
+
2 3
4×
[[ 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
4×
+ : 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