module Term.CallByValue where
open import Prelude
open import Prelude.Reduction
open import Term
open import Term.Substitution as Sub
open import Term.Weakening
private
variable
Γ Δ : Context
a : Ty
x : a ∈ Γ
t t' t'' u u' : Term Γ a
σ σ' : Sub Γ Δ
data Value : (t : Term Γ a) → Set where
var : Value (var x)
abs : Value (abs t)
data Values : (σ : Sub Γ Δ) → Set where
ε : Values (ε {Γ = Γ})
_∙_ : (vs : Values σ) (v : Value t) → Values (σ ∙ t)
wkValue : (ρ : Wk Γ Δ) (v : Value t) → Value (wk ρ t)
wkValue ρ var = var
wkValue ρ abs = abs
wkValues : (ρ : Wk Γ Δ) (vs : Values σ) → Values (compWS ρ σ)
wkValues ρ ε = ε
wkValues ρ (vs ∙ v) = wkValues ρ vs ∙ wkValue ρ v
lookupValue : (vs : Values σ) (x : a ∈ Γ) → Value (Sub.lookup σ x)
lookupValue (vs ∙ v) zero = v
lookupValue (vs ∙ v) (suc x) = lookupValue vs x
subValue : (vs : Values σ) (v : Value t) → Value (sub σ t)
subValue vs var = lookupValue vs _
subValue vs abs = abs
subValues : (vs : Values σ) (vs' : Values σ') → Values (compSS σ σ')
subValues vs ε = ε
subValues vs (vs' ∙ v) = subValues vs vs' ∙ subValue vs v
infix 4 _⟶ᵥ_
data _⟶ᵥ_ : (t t : Term Γ a) → Set where
βᵥ : (v : Value u) → app (abs t) u ⟶ᵥ t [ u ]₀
abs : (r : t ⟶ᵥ t') → abs t ⟶ᵥ abs t'
appl : (r : t ⟶ᵥ t') → app t u ⟶ᵥ app t' u
appr : (r : u ⟶ᵥ u') → app t u ⟶ᵥ app t u'
infix 4 _⟶ᵥ*_
_⟶ᵥ*_ : (t t' : Term Γ a) → Set
_⟶ᵥ*_ = Star _⟶ᵥ_
infix 4 _⟶v_
data _⟶v_ : (t t : Term Γ a) → Set where
βᵥ : (v : Value u) → app (abs t) u ⟶v t [ u ]₀
appl : (r : t ⟶v t') → app t u ⟶v app t' u
appr : (r : u ⟶v u') → app (abs t) u ⟶v app (abs t) u'
infix 4 _⟶v*_
_⟶v*_ : (t t' : Term Γ a) → Set
_⟶v*_ = Star _⟶v_