------------------------------------------------------------------------
-- Derived rules related to the natural number type
------------------------------------------------------------------------

open import Definition.Typed.Restrictions

module Definition.Typed.Consequences.DerivedRules.Nat
  {a} {M : Set a}
  (R : Type-restrictions M)
  where

open import Definition.Untyped M
open import Definition.Typed R
open import Definition.Typed.Properties R
open import Definition.Typed.Consequences.Syntactic R
open import Definition.Typed.Consequences.Substitution R

open import Tools.Fin
open import Tools.Nat
open import Tools.Product

private
  variable
    n : Nat
    Γ : Con Term n

-- Congruence of the type of the successor case in natrec.
sucCong :  {F G}  Γ    F  G
         Γ    F  F [ suc (var x1) ]↑²  G [ suc (var x1) ]↑²
sucCong F≡G with wfEq F≡G
sucCong F≡G | ⊢Γ  ⊢ℕ =
  let ⊢F , ⊢G = syntacticEq F≡G
  in subst↑²TypeEq ⊢ℕ ⊢F F≡G (refl (sucⱼ (var (⊢Γ  ⊢ℕ  ⊢F) (there here))))

sucCong′ :  {F G}  Γ    F  G
         Γ    G  F [ suc (var x1) ]↑²  G [ suc (var x1) ]↑²
sucCong′ F≡G with wfEq F≡G
sucCong′ F≡G | ⊢Γ  ⊢ℕ =
  let ⊢F , ⊢G = syntacticEq F≡G
  in subst↑²TypeEq ⊢ℕ ⊢G F≡G (refl (sucⱼ (var (⊢Γ  ⊢ℕ  ⊢G) (there here))))