----------------------------------------------------------------------------------------------------

-- normalization-by-evaluation to β-short η-long normal forms, after Abel

module A202401.STLC-Naturals2-NF-NBE where

open import A202401.STLC-Naturals2-NF public
open import A202401.Kit4 public


----------------------------------------------------------------------------------------------------

infix 3 _⊩_
_⊩_ : Ctx → Ty → Set
W ⊩ A ⌜⊃⌝ B = ∀ {W′} → W ⊑ W′ → W′ ⊩ A → W′ ⊩ B
W ⊩ ⌜ℕ⌝     = W ⊢≪ ⌜ℕ⌝

vren : ∀ {A W W′} → W ⊑ W′ → W ⊩ A → W′ ⊩ A
vren {A ⌜⊃⌝ B} ϱ v = λ ϱ′ → v (trans⊑ ϱ ϱ′)
vren {⌜ℕ⌝}     ϱ v = ren≪ ϱ v

open ValKit (kit _⊩_ vren) public


----------------------------------------------------------------------------------------------------

mutual
  ↑ : ∀ {A Γ} → Γ ⊢≫ A → Γ ⊩ A
  ↑ {A ⌜⊃⌝ B} t = λ ϱ v → ↑ (ren≫ ϱ t ⌜$⌝ ↓ v)
  ↑ {⌜ℕ⌝}     t = nnf t

  ↓ : ∀ {A Γ} → Γ ⊩ A → Γ ⊢≪ A
  ↓ {A ⌜⊃⌝ B} v = ⌜λ⌝ (↓ (v (wk⊑ id⊑) (↑ (var zero))))
  ↓ {⌜ℕ⌝}     v = v

vid§ : ∀ {Γ} → Γ ⊩§ Γ
vid§ {∙}     = ∙
vid§ {Γ , A} = vren§ (wk⊑ id⊑) vid§ , ↑ (var zero)

⟦_⟧⁻¹ : ∀ {Γ A} → Γ ⊨ A → Γ ⊢≪ A
⟦ v ⟧⁻¹ = ↓ (v vid§)


----------------------------------------------------------------------------------------------------

⟦zero⟧ : ∀ {Γ} → Γ ⊩ ⌜ℕ⌝
⟦zero⟧ = ⌜zero⌝

⟦suc⟧ : ∀ {Γ} → Γ ⊩ ⌜ℕ⌝ ⌜⊃⌝ ⌜ℕ⌝
⟦suc⟧ ϱ v = ⌜suc⌝ v

-- TODO: typo in Abel p.11
⟦rec⟧ : ∀ {Γ A} → Γ ⊩ ⌜ℕ⌝ ⌜⊃⌝ A ⌜⊃⌝ (⌜ℕ⌝ ⌜⊃⌝ A ⌜⊃⌝ A) ⌜⊃⌝ A
⟦rec⟧ ϱ ⌜zero⌝     ϱ′ v₀ ϱ″ vₛ = vren ϱ″ v₀
⟦rec⟧ ϱ (⌜suc⌝ vₙ) ϱ′ v₀ ϱ″ vₛ = vₛ id⊑ (ren≪ (trans⊑ ϱ′ ϱ″) vₙ) id⊑ (⟦rec⟧ ϱ vₙ ϱ′ v₀ ϱ″ vₛ)
⟦rec⟧ ϱ (nnf tₙ)   ϱ′ v₀ ϱ″ vₛ = ↑ (⌜rec⌝ (ren≫ (trans⊑ ϱ′ ϱ″) tₙ) (ren≪ ϱ″ (↓ v₀)) (↓ vₛ))

⟦_⟧Con : ∀ {Γ A} → Con A → Γ ⊨ A
⟦ ⌜zero⌝ ⟧Con γ = ⟦zero⟧
⟦ ⌜suc⌝  ⟧Con γ = ⟦suc⟧
⟦ ⌜rec⌝  ⟧Con γ = ⟦rec⟧

⟦_⟧ : ∀ {Γ A} → Γ ⊢ A → Γ ⊨ A
⟦ con k     ⟧ γ = ⟦ k ⟧Con γ
⟦ var i     ⟧ γ = ⟦ i ⟧∋ γ
⟦ ⌜λ⌝ t     ⟧ γ = λ ϱ v → ⟦ t ⟧ (vren§ ϱ γ , v)
⟦ t₁ ⌜$⌝ t₂ ⟧ γ = ⟦ t₁ ⟧ γ id⊑ $ ⟦ t₂ ⟧ γ

nbe : ∀ {Γ A} → Γ ⊢ A → Γ ⊢≪ A
nbe t = ⟦ ⟦ t ⟧ ⟧⁻¹


----------------------------------------------------------------------------------------------------