{-# OPTIONS --without-K --safe #-}
module Categories.Category.Finite.Fin.Construction.Poset where
open import Data.Nat.Base using (ℕ; z≤n; s≤s)
open import Data.Sum.Base using (_⊎_; inj₁; inj₂)
open import Data.Product using (Σ; _,_; _×_)
open import Data.Fin.Base using (Fin; zero; suc; _≤_; _<_)
open import Data.Fin.Patterns
open import Relation.Binary.PropositionalEquality.Core as ≡
open import Categories.Category.Finite.Fin
open import Categories.Category.Core
private
card : ∀ {n} → Fin n → Fin n → ℕ
card {ℕ.suc n} zero y = 1
card {ℕ.suc n} (suc x) zero = 0
card {ℕ.suc n} (suc x) (suc y) = card x y
id : ∀ n {a : Fin n} → Fin (card a a)
id .(ℕ.suc _) {zero} = 0F
id (ℕ.suc n) {suc a} = id n
comp : ∀ n {a b c : Fin n} → Fin (card b c) → Fin (card a b) → Fin (card a c)
comp (ℕ.suc n) {0F} {b} {c} f g = 0F
comp (ℕ.suc n) {suc a} {suc b} {suc c} f g = comp n f g
assoc : ∀ n {a b c d : Fin n} {f : Fin (card a b)} {g : Fin (card b c)} {h : Fin (card c d)} →
comp n (comp n h g) f ≡ comp n h (comp n g f)
assoc (ℕ.suc n) {0F} {b} {c} {d} {f} {g} {h} = refl
assoc (ℕ.suc n) {suc a} {suc b} {suc c} {suc d} {f} {g} {h} = assoc n
identityˡ : ∀ n {a b : Fin n} {f : Fin (card a b)} → comp n (id n) f ≡ f
identityˡ (ℕ.suc n) {0F} {b} {0F} = refl
identityˡ (ℕ.suc n) {suc a} {suc b} {f} = identityˡ n
identityʳ : ∀ n {a b : Fin n} {f : Fin (card a b)} → comp n f (id n) ≡ f
identityʳ (ℕ.suc n) {0F} {b} {0F} = refl
identityʳ (ℕ.suc n) {suc a} {suc b} {f} = identityʳ n
card-rel : ∀ {n} (x y : Fin n) → card x y ≡ 1 × x ≤ y ⊎ card x y ≡ 0 × y < x
card-rel {ℕ.suc n} 0F y = inj₁ (refl , z≤n)
card-rel {ℕ.suc n} (suc x) 0F = inj₂ (refl , s≤s z≤n)
card-rel {ℕ.suc n} (suc x) (suc y) with card-rel x y
... | inj₁ (eq , x≤y) = inj₁ (eq , s≤s x≤y)
... | inj₂ (eq , y<x) = inj₂ (eq , s≤s y<x)
card-sound₁ : ∀ {n} (x y : Fin n) → card x y ≡ 1 → x ≤ y
card-sound₁ 0F 0F eq = z≤n
card-sound₁ 0F (suc y) eq = z≤n
card-sound₁ (suc x) (suc y) eq = s≤s (card-sound₁ x y eq)
card-sound₂ : ∀ {n} (x y : Fin n) → card x y ≡ 0 → y ≤ x
card-sound₂ (suc x) 0F eq = z≤n
card-sound₂ (suc x) (suc y) eq = s≤s (card-sound₂ x y eq)
card-complete₁ : ∀ {n} {x y : Fin n} → x ≤ y → card x y ≡ 1
card-complete₁ {.(ℕ.suc _)} {0F} {0F} x≤y = refl
card-complete₁ {.(ℕ.suc _)} {0F} {suc y} x≤y = refl
card-complete₁ {.(ℕ.suc _)} {suc x} {suc y} (s≤s x≤y) = card-complete₁ x≤y
card-complete₂ : ∀ {n} {x y : Fin n} → y < x → card x y ≡ 0
card-complete₂ {.(ℕ.suc _)} {suc x} {0F} y<x = refl
card-complete₂ {.(ℕ.suc _)} {suc x} {suc y} (s≤s y<x) = card-complete₂ y<x
module _ (size : ℕ) where
PosetShape : FinCatShape
PosetShape = shapeHelper record
{ size = size
; ∣_⇒_∣ = card
; id = id size
; _∘_ = comp size
; assoc = assoc size
; identityˡ = identityˡ size
; identityʳ = identityʳ size
}
Poset : ℕ → Category _ _ _
Poset size = FinCategory (PosetShape size)
module Poset size = Category (Poset size)