module Просто_типизированное_лямбда_исчисление where

{- Часть 2 | Просто типизированное лямбда исчисление -}

open import Вспомогательные_определения


{-
Определение 2.1. Множество простых типов Π задается индуктивно.
                 Пусть V - некоторое бесконечное множество переменных
                 (в нашем случае множество строк String).
                 ∙ Всякая переменная является типом
                 ∙ Если σ, τ - типы, то σ ⇒ τ - тип
-}

infixr 30 _⇒_

data Π : Множество where
  тпер : Строка  Π
  _⇒_ : Π  Π  Π

{-
Определение 2.2. Множество безтиповых лямбда-термов Λ задается по индукции.
                 ∙ Все переменные x ∈ V - термы
                 ∙ Если M, N - термы, то их применение (M N) - терм
                 ∙ Если x - переменная, M - терм, то абстракция λx.M - терм
-}

data Λ : Множество where
  λпер : Строка  Λ
  _$_ : Λ  Λ  Λ
  ƛ_!_ : Строка  Λ  Λ

{-
Определение 2.3. Множество связок - V × Π.
                 Элемент этого множества обозначается x : τ
-}

{- Примечание. Чтобы избежать конфликта имен назовем x : τ как x of τ -}

infixl 10 _типа_

data Связка : Множество where
  _типа_ : Строка  Π  Связка

{-

Определение 2.4. Контекст - список связок. Обозначается Γ, Δ, .. .

Определение 2.5. Область определения (domain) контекста Γ -
                 список [x | (x ∶ _) ∈ Γ ] переменных, входящих в этот контекст.

Определение 2.6. Область значения (range) контекста Γ -
                 список [τ | (_ ∶ τ) ∈ Γ ] типов, входящих в этот контекст.

-}

λКонтекст = Список Связка

область_определения : λКонтекст  Список Строка
область_определения Γ = отобразить  { (x типа _)  x}) на Γ

область_значения : λКонтекст  Список Π
область_значения Γ = отобразить  { (_ типа τ)  τ}) на Γ

{-
Определение 2.7. Отношение типизации ‌⊢ ⊆ L(Binding) × Λ × Π
                 задется индуктивно правилами вывода.
-}

infixr 50 ƛ_!_
infixl 80 _$_
infix 4 _⊢_∶_
infix 4 Применить_к_

data _⊢_∶_ : λКонтекст  Λ  Π  Set where
  Аксиома :  {Γ x τ}  x типа τ  Γ  λпер x  τ
  Абстрагировать :  {Γ x τ M σ}  x типа σ  Γ  M  τ  Γ  ƛ x ! M  σ  τ
  Применить_к_ :  {Γ τ M σ N}  Γ  M  σ  τ  Γ  N  σ  Γ  (M $ N)  τ

{- Комментарий. Сравните определения 1.1 и 2.1, 1.2 и 2.4, 1.4 и 2.7. -}