Цей синтаксис, хоча може виглядати складним, насправді досить простий. Основна ідея випливає з формальної логіки: весь вираз є наслідком, причому верхня половина є припущеннями, а нижня половина - результатом. Тобто, якщо ви знаєте, що верхні вирази є істинними, ви можете зробити висновок, що і нижні вирази є істинними.
Символи
Ще одна річ, яку слід пам’ятати, - це те, що деякі букви мають традиційне значення; зокрема, Γ являє собою "контекст", в якому ви знаходитесь - тобто, які типи інших речей ви бачили. Тож щось на кшталт Γ ⊢ ...
означає "вираз, ...
коли ти знаєш типи кожного виразу в Γ
.
⊢
Символ по суті означає , що ви можете що - то довести. Так Γ ⊢ ...
є твердження, яке говорить "Я можу довести ...
в контексті Γ
. Ці твердження також називаються судовими типами.
Ще одна річ, яку слід пам’ятати: математика, як і ML та Scala, x : σ
означає, що x
має тип σ
. Ви можете прочитати його так само, як і Haskell x :: σ
.
Що означає кожне правило
Отже, знаючи це, перший вираз стає зрозумілим легко: якщо ми знаємо, що x : σ ∈ Γ
(тобто x
має певний тип σ
у якомусь контексті Γ
), то ми знаємо, що Γ ⊢ x : σ
(тобто, в Γ
, x
має тип σ
). Так справді, це не говорить вам нічого супер-цікавого; він просто розповідає, як використовувати свій контекст.
Інші правила також прості. Наприклад, візьміть [App]
. Це правило має дві умови: e₀
це функція від якогось типу τ
до певного типу τ'
і e₁
є значенням типу τ
. Тепер ви знаєте, який тип ви отримаєте, звернувшись e₀
до e₁
! Сподіваємось, це не сюрприз :).
Наступне правило має ще якийсь новий синтаксис. Зокрема, Γ, x : τ
просто означає контекст Γ
і судження x : τ
. Отже, якщо ми знаємо, що змінна x
має тип τ
і вираз e
має тип τ'
, ми також знаємо тип функції, яка приймає x
та повертає e
. Це просто говорить нам, що робити, якщо ми з'ясували, який тип приймає функція і який тип вона повертає, тому це також не повинно дивуватися.
Наступний лише розповість, як поводитися з let
твердженнями. Якщо ви знаєте, що деякий вираз e₁
має тип τ
, поки x
має тип σ
, то let
вираз, який локально прив'язується x
до значення типу σ
, зробить e₁
тип τ
. Дійсно, це просто говорить про те, що оператор let по суті дозволяє розширити контекст новою прив'язкою - саме це і let
робить!
[Inst]
Правило стосується суб-друку. Це говорить про те, що якщо у вас є значення типу, σ'
і воно є підтипом σ
( ⊑
представляє часткове відношення впорядкування), то це вираз також має тип σ
.
Заключне правило стосується узагальнюючих типів. Швидкий бік: вільна змінна - це змінна, яка не вводиться оператором let або lambda всередині якогось виразу; цей вираз зараз залежить від значення вільної змінної від її контексту. Правило говорить, що якщо є якась змінна, α
яка не є "вільною" ні в чому у вашому контексті, то можна з упевненістю сказати, що будь-яке вираження, тип якого ви знаєте e : σ
буде мати цей тип для будь-якого значення α
.
Як користуватися правилами
Отже, тепер, коли ви розумієте символи, що ви робите з цими правилами? Ну, ви можете використовувати ці правила, щоб визначити тип різних значень. Для цього подивіться на свій вираз (скажіть f x y
) і знайдіть правило, яке має висновок (нижня частина), що відповідає вашому твердженню. Давайте назвемо те, що ви намагаєтеся знайти свою "мету". У цьому випадку ви подивитесь на правило, яке закінчується e₀ e₁
. Виявивши це, тепер вам доведеться знайти правила, що підтверджують все, що знаходиться вище рядка цього правила. Ці речі, як правило, відповідають типам суб-виразів, тому ви, по суті, повторюєтесь на частини виразу. Ви просто робите це, поки не закінчите своє дерево підтвердження, яке дає вам підтвердження типу вашого вираження.
Отже, усі ці правила - це точно вказати - і у звичайній математично педантичній деталі: P - як визначити типи виразів.
Тепер це має здатися знайомим, якщо ви коли-небудь використовували Prolog - ви по суті обчислюєте дерево доказів, як людський перекладач Prolog. Є причина, яку Prolog називають "логічним програмуванням"! Це також важливо, оскільки першим способом мене познайомили з алгоритмом висновку HM шляхом його впровадження в Prolog. Це насправді напрочуд просто і робить те, що відбувається далі. Вам неодмінно слід спробувати.
Зауважте: я, мабуть, допустив деякі помилки в цьому поясненні, і мені б сподобалося, якщо хтось на них зверне увагу. Я насправді висвітлюю це на уроці через пару тижнів, тож буду впевненішим: P.