Source code on Github{-# OPTIONS --safe #-}
module abstract-set-theory.FiniteSetTheory where
open import abstract-set-theory.Prelude
import Algebra
import Axiom.Set.List as L
open import Axiom.Set
open import Relation.Binary using (_Preserves_⟶_)
opaque
List-Model : Theory {0ℓ}
List-Model = L.List-Model
List-Modelᶠ : Theoryᶠ
List-Modelᶠ = L.List-Modelᶠ
List-Modelᵈ : Theoryᵈ
List-Modelᵈ = L.List-Modelᵈ
private variable
A A' B C : Set
open Theoryᵈ List-Modelᵈ public
renaming (Set to ℙ_; filter to filterˢ?; map to mapˢ; ∅ to ∅ˢ; ❴_❵ to ❴_❵ˢ)
hiding (_∈_; _∉_)
open import Axiom.Set.Map th public
renaming ( Map to infixr 1 _⇀_
; filterᵐ to filterᵐ?; filterKeys to filterKeys?; _∣^'_ to _∣^'?_ )
open import Axiom.Set.Factor List-Model public
open import Axiom.Set.Map.Dec List-Modelᵈ public
open import Axiom.Set.Rel th public hiding (_∣'_; _∣^'_; dom; range)
open import Axiom.Set.Sum th public
open import Axiom.Set.TotalMap th public
open import Axiom.Set.TotalMapOn th
open import Class.IsSet th public
open import Class.HasEmptySet th public
open import Class.HasSingleton th public
open import Axiom.Set.Properties th using (card-≡ᵉ)
module _ ⦃ _ : DecEq A ⦄ where
open Restriction {A} ∈-sp public
renaming (_∣_ to _∣ʳ_; _∣_ᶜ to _∣ʳ_ᶜ)
open Corestriction {A} ∈-sp public
renaming (_∣^_ to _∣^ʳ_; _∣^_ᶜ to _∣^ʳ_ᶜ) public
open Restrictionᵐ {A} ∈-sp public
open Corestrictionᵐ {A} ∈-sp public
open Unionᵐ {A} ∈-sp public
open Intersection {A} ∈-sp public
open Lookupᵐ {A} ∈-sp public
open Lookupᵐᵈ {A} ∈-sp public
module _ ⦃ _ : DecEq A ⦄ ⦃ _ : DecEq B ⦄ where
open Intersectionᵐ {A} {B} ∈-sp public
open IndexedSumUnionᵐ {A} {B} ∈-sp (_∈? _) public
module Properties where
open import Axiom.Set.Properties th public
module _ ⦃ _ : DecEq A ⦄ where
open Intersectionᵖ {A} ∈-sp public
opaque
unfolding List-Model
to-sp : {A : Type} (P : A → Type) → ⦃ P ⁇¹ ⦄ → specProperty P
to-sp _ = dec¹
finiteness : ∀ (X : Theory.Set th A) → finite X
finiteness = Theoryᶠ.finiteness List-Modelᶠ
lengthˢ : ∀ {𝕊} ⦃ _ : DecEq A ⦄ ⦃ _ : IsSet 𝕊 A ⦄ → 𝕊 → ℕ
lengthˢ X = Theoryᶠ.lengthˢ List-Modelᶠ (toSet X)
lengthˢ-≡ᵉ : ∀ {𝕊} ⦃ _ : DecEq A ⦄ ⦃ _ : IsSet 𝕊 A ⦄ → (X Y : 𝕊)
→ toSet X ≡ᵉ toSet Y
→ lengthˢ X ≡ lengthˢ Y
lengthˢ-≡ᵉ X Y X≡Y =
card-≡ᵉ (-, Theoryᶠ.DecEq⇒strongly-finite List-Modelᶠ (toSet X))
(-, Theoryᶠ.DecEq⇒strongly-finite List-Modelᶠ (toSet Y)) X≡Y
setToList : ℙ A → List A
setToList = id
instance
DecEq-ℙ : ⦃ _ : DecEq A ⦄ → DecEq (ℙ A)
DecEq-ℙ = L.Decˡ.DecEq-Set
Show-ℙ : ⦃ _ : Show A ⦄ → Show (ℙ A)
Show-ℙ .show = λ x → Show-finite .show (x , (finiteness x))
_ᶠᵐ : A ⇀ B → FinMap A B
(R , uniq) ᶠᵐ = (R , uniq , finiteness _)
_ᶠˢ : ℙ A → FinSet A
X ᶠˢ = X , finiteness _
filterˢ : (P : A → Type) ⦃ _ : P ⁇¹ ⦄ → ℙ A → ℙ A
filterˢ P = filterˢ? (to-sp P)
filterᵐ : (P : A × B → Type) ⦃ _ : P ⁇¹ ⦄ → (A ⇀ B) → (A ⇀ B)
filterᵐ P = filterᵐ? (to-sp P)
filterKeys : (P : A → Type) ⦃ _ : P ⁇¹ ⦄ → (A ⇀ B) → (A ⇀ B)
filterKeys P = filterKeys? (to-sp P)
_∣^'_ : A ⇀ B → (P : B → Type) ⦃ _ : P ⁇¹ ⦄ → A ⇀ B
s ∣^' P = s ∣^'? to-sp P
indexedSumᵛ' : ⦃ DecEq A ⦄ → ⦃ DecEq B ⦄ → ⦃ CommutativeMonoid 0ℓ 0ℓ C ⦄ → (B → C) → A ⇀ B → C
indexedSumᵛ' f m = indexedSumᵛ f (m ᶠᵐ)
indexedSum' : ⦃ DecEq A ⦄ → ⦃ CommutativeMonoid 0ℓ 0ℓ B ⦄ → (A → B) → ℙ A → B
indexedSum' f s = indexedSum f (s ᶠˢ)
syntax indexedSumᵛ' (λ a → x) m = ∑[ a ← m ] x
syntax indexedSum' (λ a → x) m = ∑ˢ[ a ← m ] x
module _ ⦃ _ : DecEq A ⦄ ⦃ _ : DecEq B ⦄ ⦃ _ : CommutativeMonoid 0ℓ 0ℓ C ⦄ where
aggregateBy : ⦃ DecEq C ⦄ → Rel A B → A ⇀ C → B ⇀ C
aggregateBy R m = mapFromFun (λ b → ∑[ x ← m ∣ dom (R ∣^ʳ ❴ b ❵) ] x) (range R)
indexedSumᵛ'-cong : ∀ {f : B → C} → indexedSumᵛ' f Preserves _≡ᵉ_ on proj₁ ⟶ CommutativeMonoid._≈_ it
indexedSumᵛ'-cong {x = x} {y} = indexedSum-cong {A = A × B} {x = (x ˢ) ᶠˢ} {(y ˢ) ᶠˢ}