------------------------------------------------------------------------
-- The Agda standard library
--
-- Some basic properties of Quasigroup
------------------------------------------------------------------------

{-# OPTIONS --cubical-compatible --safe #-}

open import Algebra.Bundles using (Quasigroup)

module Algebra.Properties.Quasigroup {q₁ q₂} (Q : Quasigroup q₁ q₂) where

open Quasigroup Q
open import Algebra.Definitions _≈_
open import Relation.Binary.Reasoning.Setoid setoid
open import Data.Product.Base using (_,_)

cancelˡ : LeftCancellative _∙_
cancelˡ x y z eq = begin
  y             ≈⟨ leftDividesʳ x y 
  x \\ (x  y)  ≈⟨ \\-congˡ eq 
  x \\ (x  z)  ≈⟨ leftDividesʳ x z 
  z             

cancelʳ : RightCancellative _∙_
cancelʳ x y z eq = begin
  y             ≈⟨ rightDividesʳ x y 
  (y  x) // x  ≈⟨ //-congʳ eq 
  (z  x) // x  ≈⟨ rightDividesʳ x z 
  z             

cancel : Cancellative _∙_
cancel = cancelˡ , cancelʳ

y≈x\\z :  x y z  x  y  z  y  x \\ z
y≈x\\z x y z eq = begin
  y            ≈⟨ leftDividesʳ x y 
  x \\ (x  y) ≈⟨ \\-congˡ eq 
  x \\ z       

x≈z//y :  x y z  x  y  z  x  z // y
x≈z//y x y z eq = begin
  x            ≈⟨ rightDividesʳ y x 
  (x  y) // y ≈⟨ //-congʳ eq 
  z // y