{-# OPTIONS --safe #-}

{-
   The Category Solver solveCat! solves equations in a category that
   hold up to associativity and unit laws

   This file shows some examples of how to use it.
-}

module Cubical.Tactics.CategorySolver.Examples where

open import Cubical.Foundations.Prelude

open import Cubical.Categories.Category
open import Cubical.Tactics.CategorySolver.Reflection

private
  variable
    โ„“ โ„“' : Level

module Examples (๐“’ : Category โ„“ โ„“') where
  open Category ๐“’

  _ : โˆ€ {A} โ†’ id {A} โ‰ก id {A}
  _ = solveCat! ๐“’

  _ : โˆ€ {A B}{f : ๐“’ [ A , B ]}
    โ†’ f โˆ˜ id โ‰ก f
  _ = solveCat! ๐“’

  _ : โˆ€ {A B}{f : ๐“’ [ A , B ]}
    โ†’ id โˆ˜ (id โˆ˜ id โˆ˜ f) โˆ˜ id โ‰ก id โˆ˜ id โˆ˜ (id โˆ˜ f)
  _ = solveCat! ๐“’

  _ : โˆ€ {A B C}{f : ๐“’ [ A , B ]}{g : ๐“’ [ B , C ]}
    โ†’ f โ‹† g โ‰ก g โˆ˜ (id โˆ˜ f) โˆ˜โŸจ ๐“’ โŸฉ id
  _ = solveCat! ๐“’

  ex : โˆ€ {A B C}(f : ๐“’ [ A , B ])(g : ๐“’ [ B , C ])(h : ๐“’ [ A , C ])
    โ†’ (f โ‹† (id โ‹† g)) โ‰ก h
    โ†’ f โ‹† g โ‰ก h โ‹† id
  ex f g h p =
    f โ‹† g โ‰กโŸจ solveCat! ๐“’ โŸฉ
    (f โ‹† (id โ‹† g)) โ‰กโŸจ p โŸฉ
    h โ‰กโŸจ solveCat! ๐“’ โŸฉ
    h โ‹† id โˆŽ