Show the basic Nat lattice.
Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
parent
a20fe07a56
commit
6179c86919
|
@ -242,6 +242,7 @@ record IsSemilattice {a} (A : Set a) (_⊔_ : A → A → A) : Set a where
|
|||
⊔-idemp : (x : A) → (x ⊔ x) ≡ x
|
||||
```
|
||||
|
||||
Note that this is an example of the ["Is Something" pattern]({{< relref "agda_is_pattern" >}}).
|
||||
It turns out to be convenient, however, to not require definitional equality
|
||||
(`≡`). For instance, we might model sets as lists. Definitional equality
|
||||
would force us to consider lists with the same elements but a different
|
||||
|
@ -260,7 +261,7 @@ As it turns out, the `min` function has very similar properties to `max`:
|
|||
it's idempotent, commutative, and associative. For a partial order like
|
||||
ours, the analog to `min` is "greatest lower bound", or "the largest value
|
||||
that's smaller than both inputs". Such a function is denoted as \\(a\\sqcap b\\).
|
||||
Intuitively, where \\(s_1 \\sqcup s_2\\) means "combine two signs where
|
||||
As for what it means, where \\(s_1 \\sqcup s_2\\) means "combine two signs where
|
||||
you don't know which one will be used" (like in an `if`/`else`),
|
||||
\\(s_1 \\sqcap s_2\\) means "combine two signs where you know both of
|
||||
them to be true". For example, \\((+\ \\sqcap\ ?)\ =\ +\\), because a variable
|
||||
|
@ -321,4 +322,19 @@ In Agda, we can therefore write a lattice as follows:
|
|||
|
||||
{{< codelines "Agda" "agda-spa/Lattice.agda" 153 163 >}}
|
||||
|
||||
### Concrete Example:
|
||||
### Concrete Example: Natural Numbers
|
||||
|
||||
Since we've been talking about `min` and `max` as motivators for properties
|
||||
of \\((\\sqcap)\\) and \\((\\sqcup)\\), it might not be all that surprising
|
||||
that natural numbers form a lattice with `min` and `max` as the two binary
|
||||
operations. In fact, the Agda standard library writes `min` as `_⊓_` and
|
||||
`max` as `_⊔_`! We can make use of the already-proven properties of these
|
||||
operators to easily define `IsLattice` for natural numbers. Notice that
|
||||
since we're not doing anything clever, like considering lists up to reordering,
|
||||
there's no reason not to use definitional equality `≡` for our equivalence relation.
|
||||
|
||||
{{< codelines "Agda" "agda-spa/Lattice/Nat.agda" 1 45 >}}
|
||||
|
||||
The definition for the lattice instance itself is pretty similar; I'll omit
|
||||
it here to avoid taking up a lot of vertical space, but you can find it
|
||||
on lines 47 through 83 of [my `Lattice.Nat` module]({{< codeurl "agda-spa/Lattice/Nat.agda" >}}).
|
||||
|
|
Loading…
Reference in New Issue
Block a user