it-swarm.com.ru

"Какую часть Хиндли-Мильнера ты не понимаешь?"

Я клянусь , раньше продавалась футболка с бессмертными словами:


Какая часть

Hindley-Milner

ты не не понимаешь?


В моем случае ответ будет ... все это!

В частности, я часто вижу подобные обозначения в документах на Haskell, но я понятия не имею, что это означает. Я понятия не имею, какой отраслью математики она должна быть.

Разумеется, я распознаю буквы греческого алфавита и такие символы, как "∉" (что обычно означает, что что-то не является элементом набора).

С другой стороны, я никогда раньше не видел "⊢" ( Википедия утверждает, что это может означать "раздел" ). Я также незнаком с использованием винкулюма здесь. (Обычно это обозначает дробь, но это не выглядит в данном случае.)

Если бы кто-нибудь мог хотя бы сказать мне, с чего начать поиск, чтобы понять, что означает это море символов, это было бы полезно.

817
MathematicalOrchid
  • Горизонтальная черта означает, что "[выше] подразумевается [ниже]".
  • Если в [выше] есть несколько выражений , рассмотрите их anded вместе; все [выше] должно быть верно, чтобы гарантировать [ниже].
  • : означает имеет тип
  • означает находится в. (Точно так же означает "не в".)
  • Γ обычно используется для ссылки на среду или контекст; в этом случае его можно рассматривать как набор аннотаций типов, связывающих идентификатор с его типом. Поэтому x : σ ∈ Γ означает, что среда Γ включает в себя тот факт, что x имеет тип σ.
  • может читаться как доказывает или определяет. Γ ⊢ x : σ означает, что среда Γ определяет, что x имеет тип σ.
  • , - это способ включая конкретных дополнительных допущений в среде Γ.
    Следовательно, Γ, x : τ ⊢ e : τ' означает, что среда Γ, с дополнительным, преобладающим предположением, что x имеет тип τ, доказывает, что e имеет тип τ'.

По запросу: приоритет оператора, от наивысшего к низшему:

  • Специфичные для языка инфиксные и смешанные операторы, такие как λ x . e, ∀ α . σ и τ → τ', let x = e0 in e1 и пробельные символы для приложения функции.
  • :
  • и
  • , (ассоциативно слева)
  • пробел, разделяющий несколько предложений (ассоциативный)
  • турник
618
Dan Burton

если бы кто-нибудь мог хотя бы сказать мне, где начать искать, чтобы понять, что означает это море символов

См. " Практические основы языков программирования. ", главы 2 и 3, о стиле логики посредством суждений и выводов. Вся книга теперь доступна на Amazon.

Глава 2

Индуктивные определения

Индуктивные определения являются незаменимым инструментом в изучении языков программирования. В этой главе мы разработаем основные рамки индуктивных определений и приведем несколько примеров их использования. Индуктивное определение состоит из набора правил для получения суждений или утверждений , из множества форм. Суждения - это утверждения об одном или нескольких синтаксических объектах указанного вида. Правила определяют необходимые и достаточные условия для действительности решения и, следовательно, полностью определяют его значение.

2.1 Суждения

Мы начнем с понятия суждения или утверждения о синтаксическом объекте. Мы будем использовать многие формы суждения, включая такие примеры:

  • n nat - n - натуральное число
  • n = n1 + n2 - n является суммой n1 и n2
  • τ тип - τ является типом
  • e : τ - выражение e имеет тип τ
  • e v - выражение e имеет значение v

Суждение гласит, что один или несколько синтаксических объектов имеют свойство или стоят в некотором отношении друг к другу. Само свойство или отношение называется формой суждения , и суждение о том, что объект или объекты имеют это свойство или позицию в этом отношении, называется экземпляр этой формы суждения. Форма суждения также называется предикатом , а объекты, составляющие экземпляр, являются его субъектами . Мы пишем a J для суждения, утверждающего, что J содержит a . Когда не важно подчеркнуть предмет суждения (текст обрывается здесь)

70
Don Stewart

Обозначение происходит от естественное вычитание .

⊢ символ называется турникет .

6 правил очень просты.

Правило Var является довольно тривиальным правилом - оно говорит, что если тип для идентификатора уже присутствует в вашей среде типов, то для вывода типа вы просто берете его из среды как есть.

Правило App гласит, что если у вас есть два идентификатора e0 и e1 и вы можете определить их типы, вы можете определить тип приложения e0 e1. Правило читается так, если вы знаете, что e0 :: t0 -> t1 и e1 :: t0 (один и тот же t0!), Тогда приложение хорошо набрано, а тип t1.

Abs и Let - это правила для вывода типов для лямбда-абстракции и ввода.

Правило Inst говорит, что вы можете заменить тип менее общим.

48
nponeccop

Как я понимаю правила Хиндли-Милнера?

Хиндли-Милнер - это набор правил в форме последовательное исчисление (не естественное вычитание), который говорит, что вы можете вывести (наиболее общий) тип программы из конструкции программы без явных объявлений типов ,.

Символы и обозначения

Во-первых, давайте объясним символы

  • ???? - это идентификатор (неофициально, имя переменной).
  • : означает, что это тип (неформально, экземпляр или "is-a").
  • ???? (sigma) - это выражение, которое является либо переменной, либо функцией.
  • ∈ означает элемент
  • ???? (Гамма) это среда.
  • (знак подтверждения) означает подтверждает (или доказывает, но в контексте "утверждает" читается лучше.)
  • ???? ⊦ ???? : ???? , таким образом, читается ???? утверждает ????, ????
  • ???? является фактическим экземпляром (элементом) типа ???? .
  • ???? (tau) - это тип: либо базовый, либо переменный ( ???? ), функциональный ???? → ???? ' или продукт ? ??? ???? × '
  • ???? → ???? ' - это функциональный тип, где ???? и ???? ' являются типами.
  • ????????. ???? означает ???? (лямбда) является анонимной функцией, которая принимает аргумент ???? и возвращает выражение ???? .
  • let ???? = ???? ₀ в ???? ₁ означает в выражении, ???? ₁ , заменить ???? ₀ везде, где ???? .
  • означает, что предыдущий элемент является подтипом (неофициально - подкласс) последнего элемента.
  • ???? является переменной типа.
  • ????. ???? - это тип, ∀ (для всех) переменных аргумента, ? ??? , возвращая ???? выражение
  • free (????) означает не элемент переменных свободного типа в ???? определяется во внешнем контексте. (Связанные переменные являются заменяемыми.)

Все, что выше линии, является предпосылкой, все, что ниже, - это заключение ( Per Martin-Löf )

Далее следуют английские интерпретации логических утверждений, за которыми следует свободная переформулировка и объяснение.

Переменная

VAR Logic Diagram

Дано ???? это тип ???? (сигма), элемент ???? (Гамма),
заключить ???? утверждает ???? это ????.

Другими словами, в ???? мы знаем ???? имеет тип ???? так как ???? имеет тип ???? в ????.

Это в основном тавтология. Имя идентификатора - это переменная или функция.

Функция Применение

APP Logic Diagram

Дано ???? утверждает ???? это функциональный тип и ???? утверждает ???? ₁ является ????
заключить ???? утверждает, что применение функции ???? ₀ к ???? ???? является типом ???? '

Чтобы переформулировать правило, мы знаем, что приложение-функция возвращает тип ???? ' потому что функция имеет тип ???? → ???? ' и получает аргумент типа ????.

Это означает, что если мы знаем, что функция возвращает тип, и мы применяем его к аргументу, результатом будет экземпляр возвращаемого нами типа.

Функция Абстракция

ABS Logic Diagram

Дано ???? а также ???? типа ???? утверждает ???? это тип, ???? '
заключить ???? утверждает анонимную функцию, ???? из ???? возвращающееся выражение, ???? имеет тип ???? → ???? '.

Опять же, когда мы видим функцию, которая принимает ???? и возвращает выражение ????, мы знаем, что оно имеет тип ???? → ???? ' так как ???? (????) утверждает, что ???? это ????'.

Если мы знаем ???? имеет тип ???? и, таким образом, выражение ???? имеет тип ???? ', то функция ???? возвращающее выражение ???? имеет тип ???? → ???? '.

Пусть объявление переменной

LET Logic Diagram

Дано ???? утверждает ???? ₀, типа ????, и ???? и ????, типа ????, утверждает ???? ₁ типа ????
заключить ???? утверждает let ???? = ???? ₀ in ???? type типа ????

Слабо, ???? связан с ???? ₀ в ???? ₁ (a ????), потому что ???? ₀ является ????, и ???? это ???? что утверждает ???? ???? является ????.

Это означает, что если у нас есть выражение ???? (будучи переменной или функцией), и некоторое имя, ????, также ????, и выражение ???? type типа ????, тогда мы можем заменить ???? ???? где бы он ни находился внутри ???? ₁.

Конкретизация

INST Logic Diagram

Дано ???? утверждает ???? типа ???? ' а также ????' это подтип ????
заключить ???? утверждает ???? имеет тип ????

Выражение, ???? имеет родительский тип ???? потому что выражение ???? это подтип ???? ', а ???? является родительским типом ???? '.

Если экземпляр имеет тип, который является подтипом другого типа, то он также является экземпляром этого супертипа - более общего типа.

Обобщение

GEN Logic Diagram

Дано ???? утверждает ???? это ???? и ???? не является элементом свободных переменных ????,
заключить ???? утверждает ????, типа для всех выражений аргумента ???? возвращая ???? выражение

Так в общем ???? набирается ???? для всех переменных аргумента (????), возвращающих ????, потому что мы знаем, что ???? это ???? а также ???? не является свободной переменной.

Это означает, что мы можем обобщить программу для принятия всех типов для аргументов, которые еще не связаны в содержащей области (переменные, которые не являются нелокальными). Эти связанные переменные являются заменяемыми.

Собираем все вместе

Учитывая определенные предположения (такие как отсутствие свободных/неопределенных переменных, известная среда), мы знаем типы:

  • атомарные элементы наших программ (переменные),
  • значения, возвращаемые функциями (Function Application),
  • функциональные конструкции (Function Abstraction),
  • пусть привязки (пусть объявления переменных),
  • родительские типы экземпляров (Instantiation) и
  • все выражения (обобщение).

Заключение

Объединение этих правил позволяет нам доказать наиболее общий тип утвержденной программы, не требуя аннотаций типов.

43
Aaron Hall

Есть два способа думать о е: σ. Одним из них является "выражение e имеет тип σ", другим является "упорядоченная пара выражения e и тип σ".

Рассматривайте Γ как знания о типах выражений, реализованные как набор пар выражений и типов, e: σ.

Турникет ⊢ означает, что из знания слева мы можем сделать вывод, что справа.

Таким образом, первое правило [Var] можно прочитать:
Если наше знание Γ содержит пару e: σ, то мы можем вывести из Γ, что e имеет тип σ.

Второе правило [App] можно прочитать:
Если мы из Γ можем сделать вывод, что e_0 имеет тип τ → τ ', и мы из Γ можем сделать вывод, что e_1 имеет тип τ, то мы из Γ можем сделать вывод, что e_0 e_1 имеет тип τ'.

Обычно пишут Γ, e: σ вместо Γ ∪ {e: σ}.

Таким образом, третье правило [Abs] можно прочитать:
Если мы из Γ, расширенного с помощью x: τ, можем вывести, что e имеет тип τ ', то мы из Γ можем сделать вывод, что λx.e имеет тип τ → τ'.

Четвертое правило [Позвольте] оставлено в качестве упражнения. :-)

Пятое правило [Inst] можно прочитать:
Если мы из Γ можем вывести, что e имеет тип σ ', а σ' является подтипом σ, то мы из Γ можем вывести, что e имеет тип σ.

Шестое и последнее правило [Gen] можно прочитать:
Если мы из Γ можем сделать вывод, что e имеет тип σ, и α не является переменной свободного типа ни в одном из типов в Γ, то мы из Γ можем сделать вывод, что e имеет тип ∀α σ.

16
Per Persson