|--------------| AST → | Type Checker | → ok / error |--------------|
|--------------| AST → | Type Checker | → error |--------------|
|--------------| AST → | Type Checker | → ok |--------------|
------------------------ ------------------------ Γ[x:int][y:int] ⊢ y:int Γ[x:int][y:int] ⊢ x:int ------------------------------------------------------- Γ[x:int][y:int] ⊢ y = x; ------------------------------ Γ[x:int] ⊢ int y; y = x; ------------------------------ Γ ⊢ int x; int y; y = x;
Γ ⊢ J
Γ
J
Γ ⊢ int x; x = 0; # int x; x = 0; is well-typed in Γ Γ ⊢ x:int # x has an int type in Γ
Γ ⊢ I:τ Γ ⊢ E:τ # premises ---------------------- Γ ⊢ I = E # conclusion
Γ[I:int] ⊢ S ---------------------- Γ ⊢ int I; S
# When S1 is not a variable declaration Γ ⊢ S1 Γ ⊢ S2 ---------------------- Γ ⊢ S1; S2
-------------- Γ[x:τ] ⊢ x:τ
Γ ⊢ E: boolean Γ ⊢ S -------------------------- Γ ⊢ if (E) S
Γ ⊢ E: boolean Γ ⊢ S -------------------------- Γ ⊢ while (E) S
Γ ⊢ E1: int Γ ⊢ E2: int ------------------------------ Γ ⊢ E1 + E2: int
Γ ⊢ E1: τ Γ ⊢ E2: τ ------------------------------ Γ ⊢ E1 == E2: boolean
Γ ⊢ P: τ_1 × τ_2 × ... × τ_n → τ Γ ⊢ E_k: τ_k (for k = 1, ..., n) ----------------------------------------------------------------------- Γ ⊢ P(E1, E2, ..., En): τ
----------------- Γ ⊢ n: int # n is an integer constant
----------------- -------------------- Γ[x:int] ⊢ x:int Γ[x:int] ⊢ 10:int ------------------------------------------- Γ[x:int] ⊢ x = 10; ------------------------------ Γ ⊢ int x; x = 10;
package main import "fmt" type foo interface {} func main() { var i foo = "hello" s := i.(string) // check if i is a string at runtime fmt.Println(s) f = i.(float64) // runtime error fmt.Println(f) }
int x; x = 10; if (false) x = true;
Γ[x:int] ⊢ x:int Γ[x:int] ⊢ true: boolean # wrong premise --------------------------- --------------------------------------------- Γ[x:int] ⊢ false: boolean Γ[x:int] ⊢ x = true ---------------------------------------------------- Γ[x:int] ⊢ if (false) x = true; ---------------------------------------------- Γ ⊢ int x; if (false) x = true;
false