module Изоморфизм_Карри-Говарда where
open import Вспомогательные_определения
open import Интуиционистское_Исчисление_Высказываний
open import Просто_типизированное_лямбда_исчисление
Π→Φ : Π → Φ
Π→Φ (тпер x) = ппер x
Π→Φ (φ ⇒ ψ) = (Π→Φ φ) ⊃ (Π→Φ ψ)
Φ→Π : Φ → Π
Φ→Π (ппер x) = тпер x
Φ→Π (φ ⊃ ψ) = (Φ→Π φ) ⇒ (Φ→Π ψ)
Φ→Π→Φ : ∀{φ} → Π→Φ (Φ→Π φ) ≡ φ
Φ→Π→Φ {ппер x} = рефл
Φ→Π→Φ {φ ⊃ ψ} rewrite Φ→Π→Φ {φ} | Φ→Π→Φ {ψ} = рефл
Π→Φ→Π : ∀{τ} → Φ→Π (Π→Φ τ) ≡ τ
Π→Φ→Π {тпер x} = рефл
Π→Φ→Π {τ ⇒ σ} rewrite Π→Φ→Π {τ} | Π→Φ→Π {σ} = рефл
∣_∣ : Список Связка → Список Φ
∣ Γ ∣ = отобразить Π→Φ на (область_значения Γ)
_встроку : Φ → Строка
(ппер x) встроку = x
(φ ⊃ ψ) встроку = ψ встроку конкатенировать " -> " конкатенировать ψ встроку
сделать_Δ_из : Список Φ → Список Связка
сделать_Δ_из формулы =
отобразить (λ φ → ("x_" конкатенировать φ встроку) типа Φ→Π φ) на формулы
Изоморфизм_Карри-Говарда-i : ∀{Γ M φ} →
Γ ⊢ M ∶ φ → ∣ Γ ∣ ⊢ Π→Φ φ
Изоморфизм_Карри-Говарда-i Аксиома = Аксиома
Изоморфизм_Карри-Говарда-i (Абстрагировать p) =
⊃В (Изоморфизм_Карри-Говарда-i p)
Изоморфизм_Карри-Говарда-i (Применить M к N) =
⊃У (Изоморфизм_Карри-Говарда-i M) (Изоморфизм_Карри-Говарда-i N)
Изоморфизм_Карри-Говарда-ii : ∀ {Γ φ} →
Γ ⊢ φ → ∃[ M ∈ Λ ] сделать_Δ_из Γ ⊢ M ∶ Φ→Π φ
Изоморфизм_Карри-Говарда-ii Аксиома = _ , Аксиома
Изоморфизм_Карри-Говарда-ii (⊃В {φ = φ} p) =
ƛ x ! пр₁ p' , Абстрагировать (пр₂ p')
where
p' = Изоморфизм_Карри-Говарда-ii p
x = "x_" конкатенировать φ встроку
Изоморфизм_Карри-Говарда-ii (⊃У p q) =
пр₁ p' $ пр₁ q' , (Применить (пр₂ p') к (пр₂ q'))
where
p' = Изоморфизм_Карри-Говарда-ii p
q' = Изоморфизм_Карри-Говарда-ii q