[Agda] Agda standard library tutorial?
gallais at EnsL.org
guillaume.allais at ens-lyon.org
Thu Jan 13 15:56:04 CET 2011
Hi andreas,
I was also quite lost when I first looked at this and I ended up
mimicking what Nils does in the ring solver files. This is (I guess)
the pattern that you are looking for:
=======
import Data.Bool.Properties as BoolProp
import Algebra.Structures as Struct
private module BSR = Struct.IsAStructure
BoolProp.istheproofassociatedtothisstructure
=======
You can now use BSR.F to access the field F.
Cheers,
--
guillaume
On 13 January 2011 15:03, Andreas Abel <andreas.abel at ifi.lmu.de> wrote:
> Hi all,
>
> is there a tutorial on how to use the standard library? I am having (again)
> problems with the complexity of its organization. My problem is rather
> simple. I want to use commutativity and associativity of the boolean
> connectives. Looking at Data.Bool.Properties, I have them there dangling
> right before my eyes:
>
> ------------------------------------------------------------------------
> -- (Bool, ∨, ∧, false, true) forms a commutative semiring
>
> private
>
> ∨-assoc : Associative _∨_
> ∨-assoc true y z = refl
> ∨-assoc false y z = refl
>
> ...
>
> But, sigh, they are private. Ok, not too bad, there is a structure
> embedding them:
>
> isCommutativeSemiring-∨-∧
> : IsCommutativeSemiring _≡_ _∨_ _∧_ false true
> isCommutativeSemiring-∨-∧ = record
> { +-isCommutativeMonoid = record
> { isSemigroup = record
> { isEquivalence = isEquivalence
> ; assoc = ∨-assoc
> ; ∙-cong = cong₂ _∨_
> }
> ; identityˡ = λ _ → refl
> ; comm = ∨-comm
> }
> ; *-isCommutativeMonoid = record
> ...
>
> Somehow the simple names ∨-assoc,... are gone and replaced by some
> hierarchical structure of names. Ok, how do I get to them? I cannot
> project out of a record directly because the projections are tied in with
> the module associated to the record type, so let's find it in
> Algebra.Structures.
>
> record IsCommutativeSemiring
> {a ℓ} {A : Set a} (≈ : Rel A ℓ)
> (_+_ _*_ : Op₂ A) (0# 1# : A) : Set (a ⊔ ℓ) where
> open FunctionProperties ≈
> field
> +-isCommutativeMonoid : IsCommutativeMonoid ≈ _+_ 0#
> *-isCommutativeMonoid : IsCommutativeMonoid ≈ _*_ 1#
> distribʳ : _*_ DistributesOverʳ _+_
> zeroˡ : LeftZero 0# _*_
>
> private
> module +-CM = IsCommutativeMonoid +-isCommutativeMonoid
> open module *-CM = IsCommutativeMonoid *-isCommutativeMonoid public
> using () renaming (comm to *-comm)
> open EqR (record { isEquivalence = +-CM.isEquivalence })
>
> distrib : _*_ DistributesOver _+_
> distrib = (distribˡ , distribʳ)
> where
> distribˡ : _*_ DistributesOverˡ _+_
> distribˡ x y z = begin
> (x * (y + z)) ≈⟨ *-comm x (y + z) ⟩
> ((y + z) * x) ≈⟨ distribʳ x y z ⟩
> ((y * x) + (z * x)) ≈⟨ *-comm y x ⟨ +-CM.∙-cong ⟩ *-comm z x ⟩
> ((x * y) + (x * z)) ∎
>
> zero : Zero 0# _*_
> zero = (zeroˡ , zeroʳ)
> where
> zeroʳ : RightZero 0# _*_
> zeroʳ x = begin
> (x * 0#) ≈⟨ *-comm x 0# ⟩
> (0# * x) ≈⟨ zeroˡ x ⟩
> 0# ∎
>
> isSemiring : IsSemiring ≈ _+_ _*_ 0# 1#
> isSemiring = record
> { isSemiringWithoutAnnihilatingZero = record
> { +-isCommutativeMonoid = +-isCommutativeMonoid
> ; *-isMonoid = *-CM.isMonoid
> ; distrib = distrib
> }
> ; zero = zero
> }
>
> open IsSemiring isSemiring public
> hiding (distrib; zero; +-isCommutativeMonoid)
>
> isCommutativeSemiringWithoutOne :
> IsCommutativeSemiringWithoutOne ≈ _+_ _*_ 0#
> isCommutativeSemiringWithoutOne = record
> { isSemiringWithoutOne = isSemiringWithoutOne
> ; *-comm = *-CM.comm
> }
>
> I must confess at this point I am lost. What the h... are all these local
> modules and record and how on earth shall I quickly extract from this heap
> what the names of the innocent lemmata are I want to use?? My brain does
> not implement the Agda module system! My clumsy attempt to open this
> structure fails:
>
> open import Data.Bool using (Bool; true; false; if_then_else_)
> open import Data.Bool.Properties using (isCommutativeSemiring-∨-∧)
> import Algebra.Structures
> open Algebra.Structures.IsCommutativeSemiring isCommutativeSemiring-∨-∧
> hiding (zero)
> open import Relation.Binary.PropositionalEquality
>
> Because now "refl" is ambiguous!
>
> Forgive me, but at this point my patience is spent. Before investing more
> hours fighting with a complex structure that I do not understand and which
> is documented by nothing than the source code, I give in to the temptation
> and cut-and-paste, or reimplement myself.
>
> I think I am not the only one having this problem with the standard library.
> Others might have more patients wrestling with the correct list of imports,
> module definitions, and opens.
>
> What can be done about this? I have some ideas, but cannot implement them
> myself (otherwise I would not have this problem...)
>
> 1. Write a tutorial for the standard library that shows how its definitions
> can be used. I know that there are README files, but imho they only show
> how definitions can be used in principle, but not concretely.
>
> 2. Supply (documented) example programs for each of the library modules that
> explain how to use the stuff there. Would that not also have the benefit to
> have some initial users and test cases?
>
> 3. Provide "preludes" that extract the most important definitions from a
> package into a single file, such that definitions are available directly
> without sophisticated module- or open-statements. For instance, one could
> have a Data.Bool.Prelude, Data.Nat.Prelude, Data.List.Prelude etc.
>
> Frustrated,
> Andreas
>
>
>
>
>
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>
More information about the Agda
mailing list