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. -}