Add an equivalence constraint on lattice relations.

Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
Danila Fedorin 2023-07-15 15:16:51 -07:00
parent 971d75bb2b
commit 8febffc8e3

View File

@ -1,7 +1,7 @@
module Lattice where
import Data.Nat.Properties as NatProps
open import Relation.Binary.PropositionalEquality as Eq using (_≡_; sym)
open import Relation.Binary.PropositionalEquality as Eq using (_≡_; sym; isEquivalence)
open import Relation.Binary.Definitions
open import Data.Nat as Nat using (; _≤_)
open import Data.Product using (_×_; _,_)
@ -10,15 +10,25 @@ open import Agda.Primitive using (lsuc; Level)
open import NatMap using (NatMap)
record IsEquivalence {a} (A : Set a) (_≈_ : A A Set a) : Set a where
field
≈-refl : {a : A} a a
≈-sym : {a b : A} a b b a
≈-trans : {a b c : A} a b b c a c
record IsSemilattice {a} (A : Set a)
(_≈_ : A A Set a)
(_⊔_ : A A A) : Set a where
field
≈-equiv : IsEquivalence A _≈_
⊔-assoc : (x y z : A) ((x y) z) (x (y z))
⊔-comm : (x y : A) (x y) (y x)
⊔-idemp : (x : A) (x x) x
open IsEquivalence ≈-equiv public
record IsLattice {a} (A : Set a)
(_≈_ : A A Set a)
(_⊔_ : A A A)
@ -66,14 +76,24 @@ module IsSemilatticeInstances where
NatIsMaxSemilattice : IsSemilattice _≡_ _⊔_
NatIsMaxSemilattice = record
{ ⊔-assoc = ⊔-assoc
{ ≈-equiv = record
{ ≈-refl = refl
; ≈-sym = sym
; ≈-trans = trans
}
; ⊔-assoc = ⊔-assoc
; ⊔-comm = ⊔-comm
; ⊔-idemp = ⊔-idem
}
NatIsMinSemilattice : IsSemilattice _≡_ _⊓_
NatIsMinSemilattice = record
{ ⊔-assoc = ⊓-assoc
{ ≈-equiv = record
{ ≈-refl = refl
; ≈-sym = sym
; ≈-trans = trans
}
; ⊔-assoc = ⊓-assoc
; ⊔-comm = ⊓-comm
; ⊔-idemp = ⊓-idem
}
@ -114,9 +134,33 @@ module IsSemilatticeInstances where
, IsSemilattice.⊔-idemp sB b
)
≈-refl : {p : A × B} p p
≈-refl =
( IsSemilattice.≈-refl sA
, IsSemilattice.≈-refl sB
)
≈-sym : {p₁ p₂ : A × B} p₁ p₂ p₂ p₁
≈-sym (a₁≈a₂ , b₁≈b₂) =
( IsSemilattice.≈-sym sA a₁≈a₂
, IsSemilattice.≈-sym sB b₁≈b₂
)
≈-trans : {p₁ p₂ p₃ : A × B} p₁ p₂ p₂ p₃ p₁ p₃
≈-trans (a₁≈a₂ , b₁≈b₂) (a₂≈a₃ , b₂≈b₃) =
( IsSemilattice.≈-trans sA a₁≈a₂ a₂≈a₃
, IsSemilattice.≈-trans sB b₁≈b₂ b₂≈b₃
)
ProdIsSemilattice : IsSemilattice (A × B) _≈_ _⊔_
ProdIsSemilattice = record
{ ⊔-assoc = ⊔-assoc
{ ≈-equiv = record
{ ≈-refl = ≈-refl
; ≈-sym = ≈-sym
; ≈-trans = ≈-trans
}
; ⊔-assoc = ⊔-assoc
; ⊔-comm = ⊔-comm
; ⊔-idemp = ⊔-idemp
}