module Term.Reduction where
open import Prelude
open import Prelude.Reduction
open import Term
open import Term.Substitution
private
variable
Γ Δ : Context
a : Ty
t t' t'' u u' : Term Γ a
σ σ' : Sub Γ Δ
infix 1 _⟶_
data _⟶_ : (t t' : Term Γ a) → Set where
β : app (abs t) u ⟶ t [ u ]₀
appl : (r : t ⟶ t') → app t u ⟶ app t' u
appr : (r : u ⟶ u') → app t u ⟶ app t u'
abs : (r : t ⟶ t') → abs t ⟶ abs t'
_⟶*_ : (t t' : Term Γ a) → Set
_⟶*_ = Star _⟶_
data _⟶*ˢ_ : (t t' : Term Γ a) → Set where
[] : t ⟶*ˢ t
_▷_ : (rs : t ⟶*ˢ t') (r : t' ⟶ t'') → t ⟶*ˢ t''
consˢ : t ⟶ t' → t' ⟶*ˢ t'' → t ⟶*ˢ t''
consˢ r [] = [] ▷ r
consˢ r (rs ▷ r') = consˢ r rs ▷ r'
reverse* : t ⟶* t' → t ⟶*ˢ t'
reverse* [] = []
reverse* (r ∷ rs) = consˢ r (reverse* rs)
data _⟶*S_ : (σ σ' : Sub Γ Δ) → Set where
ε : (ε {Γ = Γ}) ⟶*S ε
_∙_ : (rσ : σ ⟶*S σ') (rs : t ⟶* t') → (σ ∙ t) ⟶*S (σ' ∙ t')
infix 1 _⟶w_
data _⟶w_ : (t t' : Term Γ a) → Set where
β : app (abs t) u ⟶w t [ u ]₀
appl : (w : t ⟶w t') → app t u ⟶w app t' u
_⟶w*_ : (t t' : Term Γ a) → Set
_⟶w*_ = Star _⟶w_
unfoldW : t ⟶w t' → t ⟶ t'
unfoldW β = β
unfoldW (appl r) = appl (unfoldW r)