Цей синтаксис, хоча може виглядати складним, насправді досить простий. Основна ідея випливає з формальної логіки: весь вираз є наслідком, причому верхня половина є припущеннями, а нижня половина - результатом. Тобто, якщо ви знаєте, що верхні вирази є істинними, ви можете зробити висновок, що і нижні вирази є істинними.
Символи
Ще одна річ, яку слід пам’ятати, - це те, що деякі букви мають традиційне значення; зокрема, Γ являє собою "контекст", в якому ви знаходитесь - тобто, які типи інших речей ви бачили. Тож щось на кшталт Γ ⊢ ...означає "вираз, ...коли ти знаєш типи кожного виразу в Γ.
⊢Символ по суті означає , що ви можете що - то довести. Так Γ ⊢ ...є твердження, яке говорить "Я можу довести ...в контексті Γ. Ці твердження також називаються судовими типами.
Ще одна річ, яку слід пам’ятати: математика, як і 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.