[Agda] Definizione di semianello
Un semigruppo e un monoide si definiscono in Agda come segue:
Come si definisce, ora, un semianello? Questa definizione typechecka, ma non so (proprio a livello di sintassi) come specificare che l'operazione di monoide è \(\oplus\) e quella di semigruppo \(\circ\):
record Semigroup (a : Set) : Set where
field
_o_ : a → a → a
assoc : ∀ a b c → (a o b) o c ≡ a o (b o c)
record Monoid (a : Set) : Set where
field
semigroup : Semigroup a
open Semigroup semigroup
field
z : a
lId : ∀ x → z o x ≡ x
rId : ∀ x → x o z ≡ x
Come si definisce, ora, un semianello? Questa definizione typechecka, ma non so (proprio a livello di sintassi) come specificare che l'operazione di monoide è \(\oplus\) e quella di semigruppo \(\circ\):
record Semiring (a : Set) : Set where
field
monoid : Monoid a
semigroup : Semigroup a
field
_⊕_ : a → a → a
_o_ : a → a → a
Risposte
Ci sono riuscito, e il risultato è proprio bello.
(ma c'è un modo di avere della syntax highlighting nell'ambiente code?)
module MyAlgebra where
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_)
-- properties
Commutative :
∀ {a} →
(a → a → a) → Set
Commutative f =
∀ x → ∀ y → f x y ≡ f y x
Associative :
∀ {a} →
(a → a → a) → Set
Associative f =
∀ x y z → f (f x y) z ≡ f x (f y z)
_distributesOver_ :
∀ {a} →
(a → a → a) →
(a → a → a) → Set
f distributesOver g =
∀ a b c → f a (g b c) ≡ g (f a b) (f a c)
-- structures
record IsSemigroup
(a : Set)
(_o_ : a → a → a) : Set where
field
assoc : Associative (_o_)
record Semigroup : Set₁ where
field
a : Set
_o_ : a → a → a
isSemigroup : IsSemigroup a (_o_)
record HasIdentity
(a : Set)
(_o_ : a → a → a)
(z : a) : Set where
field
lId : ∀ a → z o a ≡ a
rId : ∀ a → a o z ≡ a
record HasInverses
(a : Set)
(_o_ : a → a → a)
(z : a)
(inv : a → a) : Set where
field
rInv : ∀ x → x o (inv x) ≡ z
lInv : ∀ x → (inv x) o x ≡ z
record IsMonoid
(a : Set)
(_o_ : a → a → a)
(z : a) : Set where
field
isSemigroup : IsSemigroup a (_o_)
hasIdentity : HasIdentity a (_o_) z
record IsGroup
(a : Set)
(_o_ : a → a → a)
(z : a)
(i : a → a) : Set where
field
isMonoid : IsMonoid a (_o_) z
hasInverses : HasInverses a (_o_) z i
record IsAbelianMonoid
(a : Set)
(_o_ : a → a → a)
(z : a) : Set where
field
isMonoid : IsMonoid a (_o_) z
isAbelian : Commutative (_o_)
record IsAbelianGroup
(a : Set)
(_o_ : a → a → a)
(z : a)
(i : a → a) : Set where
field
isGroup : IsGroup a (_o_) z i
isCommutativeCirc : Commutative (_o_)
record IsRing
(a : Set)
(_o_ : a → a → a)
(_⊕_ : a → a → a)
(z : a)
(i : a → a) : Set where
field
isAbelianGroup : IsAbelianGroup a (_o_) z i
isMonoid : IsMonoid a (_o_) z
isRing : (_o_) distributesOver (_⊕_)
record IsUnitaryRing
(a : Set)
(_o_ : a → a → a)
(_⊕_ : a → a → a)
(z : a)
(i : a → a)
(u : a) : Set where
field
isRing : IsRing a (_o_) (_⊕_) z i
isUnitary : IsMonoid a (_o_) u
record IsCommutativeRing
(a : Set)
(_o_ : a → a → a)
(_⊕_ : a → a → a)
(z : a)
(i : a → a)
(u : a) : Set where
field
isUnitaryRing : IsUnitaryRing a (_o_) (_⊕_) z i u
isCommutativeCirc : IsAbelianMonoid a (_o_) z
(ma c'è un modo di avere della syntax highlighting nell'ambiente code?)
Partendo da qui, sapete dimostrare che, dato un insieme $X$, l'algebra di Boole \((2^X, \land, \lor)\) è un anello booleano?