module Type.Equality where

Fixity

infix  1 _≡β_

Imports

open import Type
open import Type.RenamingSubstitution
open import Builtin.Constant.Type

open import Relation.Binary.PropositionalEquality
  using (_≡_; refl; cong; cong₂; trans; sym)

Beta equality relation for types

This serves as a declaritive specification of the semantics of types.

We need to give constructors for reflexivity, symmetry and transitivity as the presence of the beta-rule prevents these properties from being derivable. We have congruence rules for all constructors of type (except variables as this is subsumed by reflexivity). Finally, we have one computation rule: the beta-rule for application.

data _≡β_ : Φ ⊢⋆ J  Φ ⊢⋆ J  Set where

  -- structural rules

  refl≡β : (A : Φ ⊢⋆ J)
           ------------
          A ≡β A
    
  sym≡β : A ≡β B
          ------
         B ≡β A

  trans≡β : A ≡β B
           B ≡β C
            ------
           A ≡β C

  -- congruence rules

  -- (no variable rule is needed)
 
  ⇒≡β : A ≡β A'
       B ≡β B'
        -----------------
       A  B ≡β A'  B'
    
  Π≡β : B ≡β B'
        -----------
       Π B ≡β Π B'
    
  ƛ≡β : B ≡β B'
        -----------
       ƛ B ≡β ƛ B'
    
  ·≡β : A ≡β A'
       B ≡β B'
        --------------------
       A · B ≡β A' · B'
    
  μ≡β : A ≡β A'
       B ≡β B'
        ----------------
       μ A B ≡β μ A' B'
    
  -- computation rule

  β≡β : (B : Φ ,⋆ J ⊢⋆ K)
       (A : Φ ⊢⋆ J)
        ------------------
       ƛ B · A ≡β B [ A ]
    
≡2β : A  A'  A ≡β A'
≡2β refl = refl≡β _

Renaming for proofs of type equality

ren≡β : (ρ : Ren Φ Ψ)
       A ≡β B
        ------------------
       ren ρ A ≡β ren ρ B
ren≡β ρ (refl≡β A)    = refl≡β (ren ρ A)
ren≡β ρ (sym≡β p)     = sym≡β (ren≡β ρ p)
ren≡β ρ (trans≡β p q) = trans≡β (ren≡β ρ p) (ren≡β ρ q)
ren≡β ρ (⇒≡β p q)     = ⇒≡β (ren≡β ρ p) (ren≡β ρ q)
ren≡β ρ (Π≡β p)       = Π≡β (ren≡β (ext ρ) p)
ren≡β ρ (ƛ≡β p)       = ƛ≡β (ren≡β (ext ρ) p)
ren≡β ρ (·≡β p q)     = ·≡β (ren≡β ρ p) (ren≡β ρ q)
ren≡β ρ (μ≡β p q)     = μ≡β (ren≡β ρ p) (ren≡β ρ q)
ren≡β ρ (β≡β B A)     = trans≡β
  (β≡β _ _)
  (≡2β (trans (sym (sub-ren B))
              (trans (sub-cong (ren-sub-cons ρ A) B)
                     (ren-sub B))))

Substitution for proofs of type equality

sub≡β : (σ : Sub Φ Ψ)
       A ≡β B
        ------------------
       sub σ A ≡β sub σ B
sub≡β σ (refl≡β A)    = refl≡β (sub σ A)
sub≡β σ (sym≡β p)     = sym≡β (sub≡β σ p)
sub≡β σ (trans≡β p q) = trans≡β (sub≡β σ p) (sub≡β σ q) 
sub≡β σ (⇒≡β p q)     = ⇒≡β (sub≡β σ p) (sub≡β σ q)
sub≡β σ (Π≡β p)       = Π≡β (sub≡β (exts σ) p)
sub≡β σ (ƛ≡β p)       = ƛ≡β (sub≡β (exts σ) p)
sub≡β σ (·≡β p q)     = ·≡β (sub≡β σ p) (sub≡β σ q)
sub≡β σ (μ≡β p q)     = μ≡β (sub≡β σ p) (sub≡β σ q)
sub≡β σ (β≡β B A)     = trans≡β
  (β≡β _ _)
  (≡2β (trans (trans (sym (sub-comp B))
                     (sub-cong (sub-sub-cons σ A) B))
              (sub-comp B)))