Wie ich before erzählte, arbeite ich in einer Bibliothek über Algebra, Matrizen und Kategorientheorie. Ich habe die algebraischen Strukturen in einem "Turm" von Datensatztypen zerlegt, von denen jeder eine algebraische Struktur darstellt. Um zum Beispiel ein Monoid zu spezifizieren, definieren wir zuerst eine Halbgruppe und definieren ein kommutatives Monoid. Wir verwenden eine Monoiddefinition, die dem gleichen Muster folgt wie die Agda-Standardbibliothek.Gibt es eine bequemere Möglichkeit, verschachtelte Datensätze zu verwenden?
Mein Problem ist, dass, wenn ich eine Eigenschaft einer algebraischen Struktur benötigen, das innerhalb eines anderen (zB Eigenschaft eines Monoid
, die Teil eines CommutativeSemiring
ist) tief ist, dass wir eine Nummer eines Vorsprüngen gleich gewünschten algebraische Struktur verwenden müssen Tiefe.
Als Beispiel für mein Problem, betrachten Sie das folgende „Lemma“:
open import Algebra
open import Algebra.Structures
open import Data.Vec
open import Relation.Binary.PropositionalEquality
open import Algebra.FunctionProperties
open import Data.Product
module _ {Carrier : Set} {_+_ _*_ : Op₂ Carrier} {0# 1# : Carrier} (ICSR : IsCommutativeSemiring _≡_ _+_ _*_ 0# 1#) where
csr : CommutativeSemiring _ _
csr = record{ isCommutativeSemiring = ICSR }
zipWith-replicate-0# : ∀ {n}(xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≡ xs
zipWith-replicate-0# [] = refl
zipWith-replicate-0# (x ∷ xs) = cong₂ _∷_ (proj₁ (IsMonoid.identity (IsCommutativeMonoid.isMonoid
(IsCommutativeSemiring.+-isCommutativeMonoid
(CommutativeSemiring.isCommutativeSemiring csr)))) x)
(zipWith-replicate-0# xs)
Beachten Sie, dass, um die linke IDENTITY einer Monoid zuzugreifen, muss ich es aus dem Monoid projizieren, die in ist das kommutative Monoid, das in der Struktur eines kommutativen Semirings liegt.
Meine Sorge ist, dass, wenn ich mehr und mehr algebraische Strukturen hinzufügen, solche Lemmas wird es unlesbar werden.
Meine Frage ist: Gibt es ein Muster oder einen Trick, die diese "Leiter" von Rekordprojektionen vermeiden können?
Jeder Hinweis darauf ist sehr willkommen.