After the Agda Records Tutorial
module Sets.Records where open import Data.Nat open import Data.Bool open import Relation.Binary.PropositionalEquality using (_≡_) import Relation.Binary.PropositionalEquality as Eq
A record type is a special set for representing tuples of values. For example, the following set represents a Bool
, ℕ
pair:
record R : Set where field r₁ : Bool r₂ : ℕ
An example:
x : R x = record { r₁ = true; r₂ = 2 }
One could define a constructor for R
values:
r : Bool → ℕ → R r b n = record { r₁ = b; r₂ = n } x′ = r true 2
Agda provides this definition to us with the following syntax:
record R′ : Set where constructor r′ -- record constructor field r₁ : Bool r₂ : ℕ x″ = r′ true 2
Agda defines field selectors automatically:
sel₁ : R → Bool sel₁ = R.r₁ sel₂ : R → ℕ sel₂ = R.r₂ x‴ = r (R.r₁ x) (R.r₂ x)
record
vs. data
definitionsFor every set defined with record
there is an equivalent set defined with data
.
For example, the following set is equivalent to R
:
data R″ : Set where r″ : (r₁ : Bool) (r₂ : ℕ) → R″ r₁ : R″ → Bool r₁ (r″ a b) = a r₂ : R″ → ℕ r₂ (r″ a b) = b
Records have the following advantages over data
definitions:
extRec : (x : R) → x ≡ r (R.r₁ x) (R.r₂ x) extRec _ = Eq.refl -- {- not possible -} -- extData : (x : R″) → x ≡ r″ (r₁ x) (r₂ x) -- extData _ = refl
It is advised to use record
definitions whenever it is possible.
⊤
as a record!_×_
as a record!The type of a field can depend on the values of the previous fields.
For example the following set is equivalent to List ℕ
:
open import Data.Vec using (Vec; []; _∷_) record Listℕ : Set where constructor Lℕ field length : ℕ vector : Vec ℕ length list : Listℕ list = Lℕ 3 (0 ∷ 1 ∷ 2 ∷ []) list′ : Listℕ list′ = Lℕ _ (0 ∷ 1 ∷ 2 ∷ [])
The type of the selector functions:
length′ : Listℕ → ℕ length′ = Listℕ.length vector′ : (x : Listℕ) → Vec ℕ (length′ x) -- dependent vector′ = Listℕ.vector
The previous example parameterised with the types of the vector elements:
record List (A : Set) : Set where constructor L field length : ℕ vector : Vec A length list₂ : List Bool list₂ = L _ (true ∷ false ∷ true ∷ [])
The type of the selector functions:
length″ : {A : Set} → List A → ℕ length″ = List.length vector″ : {A : Set} (x : List A) → Vec A (length″ x) -- dependent vector″ = List.vector
Note that the parameters became implicit in the field selectors' type.
(This is a design decision of the Agda language.)
Define Σ
with record
!
TODO
Define the predicate of being an equivalence relation!
record IsEquivalence {A : Set} (_≈_ : A → A → Set) : Set where
Prove that _≡_
is an equivalence relation on any set!
isEquivalence : {A : Set} → IsEquivalence {A} _≡_
Define the predicate of being a semigroup!
Prove that ℕ
is a semigroup with _+_
!