{-# OPTIONS --type-in-type #-} open import NeilPrelude module Cancellative {A : Set} {B : Set} {C : Set} (_⊕_ : A → B → C) (cancL : CancellativeL _⊕_) (cancR : CancellativeR _⊕_) where ⊕canc : CancellativeL _⊕_ ⊕canc = cancL canc⊕ : CancellativeR _⊕_ canc⊕ = cancR ⊕⊕canc : {a₁ a₂ : A} → {b₁ b₂ : B} → a₁ ⊕ b₁ ≡ a₁ ⊕ b₂ → a₂ ⊕ b₁ ≡ a₂ ⊕ b₂ ⊕⊕canc = cong2L _⊕_ ∘ ⊕canc canc⊕⊕ : {a₁ a₂ : A} → {b₁ b₂ : B} → a₁ ⊕ b₁ ≡ a₂ ⊕ b₁ → a₁ ⊕ b₂ ≡ a₂ ⊕ b₂ canc⊕⊕ = cong2R _⊕_ ∘ canc⊕