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
|
⊔-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
|
It turns out to be convenient, however, to not require definitional equality
|
||||||
(`≡`). For instance, we might model sets as lists. 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
|
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
|
it's idempotent, commutative, and associative. For a partial order like
|
||||||
ours, the analog to `min` is "greatest lower bound", or "the largest value
|
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\\).
|
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`),
|
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
|
\\(s_1 \\sqcap s_2\\) means "combine two signs where you know both of
|
||||||
them to be true". For example, \\((+\ \\sqcap\ ?)\ =\ +\\), because a variable
|
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 >}}
|
{{< 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