namespace latin:/powertypes

fixmeta ur:?LF

theory CongruenceTypes =
  include ☞latin:/?TypedEquality
  include ☞latin:/?EquivalenceND
  
  Cong : tp ⟶ tp# Cong 1 prec 100
  is_cong : {A} tm Cong A  ⟶ tm A ⟶ tm A ⟶ prop# 3  4 mod 2 prec 30
  cong  : {A} (tm A ⟶ tm A ⟶ prop) ⟶ tm Cong A# cong 2 prec 50
  
  compute : {A,R,x,y: tm A} ⊦ x ≡ y mod (cong R) ⇔ R x y
  expand  : {A,C:tm Cong A} ⊦ C ≐ cong [x,y] x≡y mod C
 
  cong_refl : {A, C: tm Cong A, x} ⊦ x≡x mod C
  cong_sym  : {A, C: tm Cong A, x, y} ⊦ x≡y mod C ⟶ ⊦ y≡x mod C
  cong_trans : {A, C: tm Cong A, x,y,z} ⊦ x≡y mod C ⟶ ⊦ y≡z mod C ⟶  ⊦ x≡z mod C