c₀ ≡ fls
.plus tru c₂
true
и false
, и конструкцией if ... then ... else
.t ::= # терм
x # переменная
λx. t # λ-абстракция
t t # применение
if t then t else t # условный оператор
v ::= # значение
λx. t # значение-абстракция
true # значение-истина
false # значение-ложь
t₁ → t₁'
―――――――――――――――
t₁ t₂ → t₁' t₂
t₂ → t₂'
―――――――――――――――
v₁ t₂ → v₁ t₂'
t₀ → t₀'
――――――――――――――――――――――――――
if t₀ then t₁ else t₂
→ if t₀' then t₁ else t₂
t₁ → t₁'
――――――――――――――――――――――――――
if v₀ then t₁ else t₂
→ if v₀ then t₁' else t₂
t₂ → t₂'
――――――――――――――――――――――――――
if v₀ then v₁ else t₂
→ if v₀ then v₁ else t₂'
if true then v₁ else v₂ → v₁
if false then v₁ else v₂ → v₂
(λx. t) v → [x → v]t
Соответствует денотационной с бестиповым λ-исчислением при вычислении в порядке вызова по значению:
# термы
[[x]] = x # переменная
[[λx. t]] = λx. [[t]]
[[t₁ t₂]] = [[t₁]] [[t₂]]
[[if t₁ then t₂ else t₃]] = ifThenElse [[t₁]] [[t₂]] [[t₃]]
# значения
[[true]] = tru
[[false]] = fls
if (λx. x) then true else false
, не производя самого вычисления.if
должен быть булевским значением, чтобы выражение имело смыслt : T
или t ∈ T
, читается как “терм t
имеет тип T
” или “терм t
принадлежит типу T
”.
t
называется типизируемым или корректно типизированным, если существует тип T
, такой, что t : T
.
Новые синтаксические формы:
T ::= # Типы
Bool # Булевские значения
и правила типизации
true : Bool
false : Bool
t₁ : Bool, t₂ : T, t₃ : T
――――――――――――――――――――――――――
if t₁ then t₂ else t₃ : T
if false then (λx. true) else true
if <...> then (λx. true) else true
, не вычисляя <...>
, не получится типизироватьF
для всех λ-абстракций, λx. t : F
λx. x : F
, и if true then (λx. true) else (λx.λy.y) : F
(if true then (λx. true) else (λx.λy.y)) x : ???
Bool? F?
F
на семейство типов T₁ → T₂
T₁ → T₂
описывает функции, аргумент типа T₁
и результат типа T₂
Синтаксис типов примет вид:
T ::= # Типы
Bool # Булевские значения
T → T # Функции
→
– конструктор типа функцииT₁ → T₂ → T₃
\(\equiv\) T₁ → (T₂ → T₃)
x : T₁ ⊢ t₂ : T₂
―――――――――――――――――――――
λx: T₁. t₂ : T₁ → T₂
x : T₁
может быть несколькоΓ
, контекст типизацииΓ
– множество предположений о типах свободных переменныхΓ
имели имена, не присутствующие ещё в Γ
Γ
– функция, переводящая имена переменных в их типыΓ
обозначим как dom(Γ)
.Правило типизации для абстракции в общем виде тогда:
Γ, x : T₁ ⊢ t₂ : T₂
――――――――――――――――――――――――――
Γ ⊢ λx: T₁. t₂ : T₁ → T₂
Правило типизации переменных тогда тривиально
x : T ∈ Γ
――――――――――
Γ ⊢ x : T
Наконец, можем сформулировать правило типизации для применений:
Γ ⊢ t₁ : T₁₁ → T₁₂ ; Γ ⊢ t₂ : T₁₁
――――――――――――――――――――――――――――――――――
Γ ⊢ t₁ t₂ : T₁₂
Синтаксис:
t ::= # терм
x # переменная
λx:T. t # λ-абстракция
t t # применение
if t then t else t
# условный оператор
v ::= # значение
λx:T. t # значение-абстракция
true # значение-истина
false # значение-ложь
T ::= # Типы
Bool # Булевское значение
T → T # Абстракция (функция)
Γ ::= # Контексты
∅ # Пустой контекст
Γ, x: T # Связывание переменной
Операционная семантика:
t₁ → t₁'
―――――――――――――――
t₁ t₂ → t₁' t₂
t₂ → t₂'
―――――――――――――――
v₁ t₂ → v₁ t₂'
t₀ → t₀'
――――――――――――――――――――――――――
if t₀ then t₁ else t₂
→ if t₀' then t₁ else t₂
t₁ → t₁'
――――――――――――――――――――――――――
if v₀ then t₁ else t₂
→ if v₀ then t₁' else t₂
t₂ → t₂'
――――――――――――――――――――――――――
if v₀ then v₁ else t₂
→ if v₀ then v₁ else t₂'
if true then v₁ else v₂ → v₁
if false then v₁ else v₂ → v₂
(λx:T. t) v → [x → v]t
# ^^ единственное отличие
Правила типизации:
true : Bool
false : Bool
Γ ⊢ t₁ : Bool; Γ ⊢ t₂ : T;
Γ ⊢ t₃ : T
――――――――――――――――――――――――――――――
Γ ⊢ if t₁ then t₂ else t₃ : T
x : T ∈ Γ
―――――――――
Γ ⊢ x : T
Γ, x : T₁ ⊢ t₂ : T₂
―――――――――――――――――――――――――
Γ ⊢ λx: T₁. t₂ : T₁ → T₂
Γ ⊢ t₁ : T₁₁ → T₁₂ ; Γ ⊢ t₂ : T₁₁
――――――――――――――――――――――――――――――――――
Γ ⊢ t₁ t₂ : T₁₂
Из правил типизации – деревья вывода типа – формальные индуктивные построения, показывающие, что терм имеет корректный тип. Например (λx:Bool. x) true
в пустом контексте:
x : Bool ∈ {x : Bool}
―――――――――――――――――――――
x : Bool ⊢ x : Bool
――――――――――――――――――――――――――
(λx:Bool. x) : Bool → Bool ; true : Bool
―――――――――――――――――――――――――――――――――――――――――
Γ ⊢ (λx:Bool. x) true : Bool
Упражнение Покажите (построением деревьев вывода), что следующие термы имеют заявленные типы:
f: Bool → Bool ⊢ f (if false then true else false) : Bool
f: Bool → Bool ⊢ λx:Bool. f (if x then false else x) : Bool → Bool
Упражнение Найдите контекст Γ
, в котором терм f x y
имеет тип Bool
. Можно ли описать множество всех таких контекстов?
Конструктору типов →
соответствуют два вида правил:
Правило введения, которое показывает, как элементы типа могут создаваться:
Γ, x : T₁ ⊢ t₂ : T₂
――――――――――――――――――――――――
Γ ⊢ λx: T₁. t₂ : T₁ → T₂
Правило устранения, которое показывает, как элементы типа могут использоваться:
Γ ⊢ t₁ : T₁₁ → T₁₂ ; Γ ⊢ t₂ : T₁₁
――――――――――――――――――――――――――――――――――
Γ ⊢ t₁ t₂ : T₁₂
P
состоит в демонстрации конкретного свидетельства в пользу P
P
Например
Логика | Теория типов |
---|---|
утверждение P ⊃ Q | тип P → Q |
утверждение P ∧ Q | тип P×Q |
доказательство P | терм t : P |
утверждение P доказуемо |
существуют термы типа P |
В этом смысле, терм является доказательством соответствующего его типу логического утверждения
Вычисление (редукция) соответствует упрощению доказательств методом устранения сечений.
Определим функцию стирания типов:
erase(x) = x
erase(λx:T. t) = λx. erase(t)
erase(t₁ t₂) = erase(t₁) erase(t₂)
erase
здесь играет роль денотационных скобок erase(x) ≈ [[x]]
.