{-# OPTIONS --cumulativity #-}
module ROmega.Equivalence.Syntax where

open import Agda.Primitive
open import Level

open import ROmega.Types
open import ROmega.Types.Substitution

--------------------------------------------------------------------------------
-- Generalized vars.

private
  variable
    ℓτ ℓΔ ℓκ ℓκ' ℓκ₁ ℓκ₂ : Level
    Δ : KEnv ℓΔ
    κ : Kind ℓκ
    κ' : Kind ℓκ'
    κ₁ : Kind ℓκ₁
    κ₂ : Kind ℓκ₂

--------------------------------------------------------------------------------
-- Type & Predicate equivalence.

data _≡p_ {} : (π₁ π₂ : Pred Δ κ)   Set             
            
data _≡t_ {} : (τ υ : Ty Δ κ)   Set 

infix 0 _≡p_
infix 0 _≡t_

data _≡p_ {} where
  peq-≲ :  {τ₁ τ₂ υ₁ υ₂ : Ty Δ R[ κ ]} 

          τ₁ ≡t υ₁  τ₂ ≡t υ₂ 
          ------------------------
          (τ₁  τ₂) ≡p υ₁  υ₂

  peq-· :  {τ₁ τ₂ τ₃ υ₁ υ₂ υ₃ : Ty Δ R[ κ ]} 

            τ₁ ≡t υ₁  τ₂ ≡t υ₂  τ₃ ≡t υ₃ 
            ----------------------------------
            τ₁ · τ₂ ~ τ₃ ≡p υ₁ · υ₂ ~ υ₃

data _≡t_ {} where            
  teq-refl : {τ : Ty Δ κ} 

             ---------------
             τ ≡t τ

  teq-sym :  {τ₁ τ₂ : Ty Δ κ} 
             
              τ₁ ≡t τ₂ 
              ---------------
              τ₂ ≡t τ₁            

  teq-trans :  {τ₁ τ₂ τ₃ : Ty Δ κ} 
             
                τ₁ ≡t τ₂  τ₂ ≡t τ₃ 
                ----------------------
                τ₁ ≡t τ₃

  teq-⇒ :  {τ₁ τ₂ : Ty Δ ( ℓτ)} {π₁ π₂ : Pred Δ κ} 
             
               π₁ ≡p π₂  τ₁ ≡t τ₂ 
               -----------------------
               π₁  τ₁ ≡t π₂  τ₂

  teq-∀ :  {τ υ : Ty (Δ , κ) ( ℓτ)} 

            τ ≡t υ 
            ----------------
            `∀ κ τ ≡t `∀ κ υ

  teq-β     :  {τ : Ty (Δ , κ) κ'} {υ : Ty Δ κ} 
                
                ------------------------------
                (( κ τ) ·[ υ ]) ≡t (τ β[ υ ])

  teq-· :  {τ₁ υ₁ : Ty Δ (κ `→ κ')} {τ₂ υ₂ : Ty Δ κ}  

           τ₁ ≡t υ₁  τ₂ ≡t υ₂  
           ------------------------
           τ₁ ·[ τ₂ ] ≡t υ₁ ·[ υ₂ ]

  teq-sing :   {l₁ l₂ : Ty Δ L} 
                {τ₁ τ₂ : Ty Δ κ₁} 
                
                l₁ ≡t l₂  τ₁ ≡t τ₂ 
                --------------------------------------
                (l₁ R▹ τ₁) ≡t (l₂ R▹ τ₂)

  teq-lift₁ :  {l : Ty Δ L} {υ : Ty Δ κ} {τ : Ty Δ (κ `→ κ')} 
                
                --------------------------------------
                (l R▹ τ) ·⌈ υ  ≡t (l R▹ (τ ·[ υ ]))


  teq-lift₂ :  {l : Ty Δ L} {υ : Ty Δ (κ₁ `→ κ₂)} {τ : Ty Δ κ₁} 
                
                --------------------------------------
                 υ ⌉· (l R▹ τ) ≡t (l R▹ (υ ·[ τ ]))

  teq-⌊⌋    :  {τ υ : Ty Δ L} 

                τ ≡t υ  
                -------------
                 τ  ≡t  υ 

  teq-Π :  {ρ₁ ρ₂ : Ty Δ R[  ℓκ ] } 
          ρ₁ ≡t ρ₂  
          -------------
          Π ρ₁ ≡t Π ρ₂

  teq-Σ :  {ρ₁ ρ₂ : Ty Δ R[  ℓκ ] } 
          ρ₁ ≡t ρ₂  
          -------------
          Σ ρ₁ ≡t Σ ρ₂