module Graded.Erasure.Target.Reasoning where
open import Graded.Erasure.Target
open import Graded.Erasure.Target.Properties
open import Tools.Function
open import Tools.Nat
open import Tools.PropositionalEquality as PE using (_≡_)
private variable
n : Nat
u v : Term _
infix -1 _∎⇒
infixr -2 step-⇒ step-⇒* step-≡ step-≡˘ _≡⟨⟩⇒_
step-⇒ : ∀ t → u ⇒* v → t ⇒ u → t ⇒* v
step-⇒ _ = flip trans
syntax step-⇒ t u⇒v t⇒u = t ⇒⟨ t⇒u ⟩ u⇒v
{-# INLINE step-⇒ #-}
step-⇒* : ∀ t → u ⇒* v → t ⇒* u → t ⇒* v
step-⇒* _ = flip red*concat
syntax step-⇒* t u⇒v t⇒u = t ⇒*⟨ t⇒u ⟩ u⇒v
{-# INLINE step-⇒* #-}
step-≡ : ∀ t → u ⇒* v → t ≡ u → t ⇒* v
step-≡ _ u⇒v PE.refl = u⇒v
syntax step-≡ t u⇒v t≡u = t ≡⟨ t≡u ⟩⇒ u⇒v
step-≡˘ : ∀ t → u ⇒* v → u ≡ t → t ⇒* v
step-≡˘ _ u⇒v PE.refl = u⇒v
syntax step-≡˘ t u⇒v u≡t = t ≡˘⟨ u≡t ⟩⇒ u⇒v
_≡⟨⟩⇒_ : ∀ t → t ⇒* u → t ⇒* u
_ ≡⟨⟩⇒ t⇒u = t⇒u
{-# INLINE _≡⟨⟩⇒_ #-}
_∎⇒ : (t : Term n) → t ⇒* t
_ ∎⇒ = refl
{-# INLINE _∎⇒ #-}