170 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Agda
		
	
	
	
	
	
		
		
			
		
	
	
			170 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Agda
		
	
	
	
	
	
|  | open import Lattice
 | ||
|  | 
 | ||
|  | module Lattice.ExtendBelow {a} (A : Set a)
 | ||
|  |     {_≈₁_ : A → A → Set a} {_⊔₁_ : A → A → A} {_⊓₁_ : A → A → A}
 | ||
|  |     {{lA : IsLattice A _≈₁_ _⊔₁_ _⊓₁_}} where
 | ||
|  | 
 | ||
|  | open import Equivalence
 | ||
|  | open import Showable using (Showable; show)
 | ||
|  | open import Relation.Binary.Definitions using (Decidable)
 | ||
|  | open import Relation.Binary.PropositionalEquality using (refl)
 | ||
|  | open import Relation.Nullary using (Dec; ¬_; yes; no)
 | ||
|  | 
 | ||
|  | open IsLattice lA using ()
 | ||
|  |     renaming ( ≈-equiv to ≈₁-equiv
 | ||
|  |              ; ≈-⊔-cong to ≈₁-⊔₁-cong
 | ||
|  |              ; ⊔-assoc to ⊔₁-assoc; ⊔-comm to ⊔₁-comm; ⊔-idemp to ⊔₁-idemp
 | ||
|  |              ; ≈-⊓-cong to ≈₁-⊓₁-cong
 | ||
|  |              ; ⊓-assoc to ⊓₁-assoc; ⊓-comm to ⊓₁-comm; ⊓-idemp to ⊓₁-idemp
 | ||
|  |              ; absorb-⊔-⊓ to absorb-⊔₁-⊓₁; absorb-⊓-⊔ to absorb-⊓₁-⊔₁
 | ||
|  |              )
 | ||
|  | 
 | ||
|  | open IsEquivalence ≈₁-equiv using ()
 | ||
|  |     renaming (≈-refl to ≈₁-refl; ≈-sym to ≈₁-sym; ≈-trans to ≈₁-trans)
 | ||
|  | 
 | ||
|  | data ExtendBelow : Set a where
 | ||
|  |     [_] : A → ExtendBelow
 | ||
|  |     ⊥ : ExtendBelow
 | ||
|  | 
 | ||
|  | instance
 | ||
|  |     showable : {{ showableA : Showable A }} → Showable ExtendBelow
 | ||
|  |     showable = record
 | ||
|  |         { show = (λ
 | ||
|  |             { ⊥ → "⊥"
 | ||
|  |             ; [ a ] → show a
 | ||
|  |             })
 | ||
|  |         }
 | ||
|  | 
 | ||
|  | data _≈_ : ExtendBelow → ExtendBelow → Set a where
 | ||
|  |     ≈-⊥-⊥ : ⊥ ≈ ⊥
 | ||
|  |     ≈-lift : ∀ {x y : A} → x ≈₁ y → [ x ] ≈ [ y ]
 | ||
|  | 
 | ||
|  | ≈-refl : ∀ {ab : ExtendBelow} → ab ≈ ab
 | ||
|  | ≈-refl {⊥} = ≈-⊥-⊥
 | ||
|  | ≈-refl {[ x ]} = ≈-lift ≈₁-refl
 | ||
|  | 
 | ||
|  | ≈-sym : ∀ {ab₁ ab₂ : ExtendBelow} → ab₁ ≈ ab₂ → ab₂ ≈ ab₁
 | ||
|  | ≈-sym ≈-⊥-⊥ = ≈-⊥-⊥
 | ||
|  | ≈-sym (≈-lift x≈₁y) = ≈-lift (≈₁-sym x≈₁y)
 | ||
|  | 
 | ||
|  | ≈-trans : ∀ {ab₁ ab₂ ab₃ : ExtendBelow} → ab₁ ≈ ab₂ → ab₂ ≈ ab₃ → ab₁ ≈ ab₃
 | ||
|  | ≈-trans ≈-⊥-⊥ ≈-⊥-⊥ = ≈-⊥-⊥
 | ||
|  | ≈-trans (≈-lift a₁≈a₂) (≈-lift a₂≈a₃) = ≈-lift (≈₁-trans a₁≈a₂ a₂≈a₃)
 | ||
|  | 
 | ||
|  | instance
 | ||
|  |     ≈-equiv : IsEquivalence ExtendBelow _≈_
 | ||
|  |     ≈-equiv = record
 | ||
|  |         { ≈-refl = ≈-refl
 | ||
|  |         ; ≈-sym = ≈-sym
 | ||
|  |         ; ≈-trans = ≈-trans
 | ||
|  |         }
 | ||
|  | 
 | ||
|  | _⊔_ : ExtendBelow → ExtendBelow → ExtendBelow
 | ||
|  | _⊔_ ⊥ x = x
 | ||
|  | _⊔_ [ a₁ ] ⊥ = [ a₁ ]
 | ||
|  | _⊔_ [ a₁ ] [ a₂ ] = [ a₁ ⊔₁ a₂ ]
 | ||
|  | 
 | ||
|  | _⊓_ : ExtendBelow → ExtendBelow → ExtendBelow
 | ||
|  | _⊓_ ⊥ x = ⊥
 | ||
|  | _⊓_ [ _ ] ⊥ = ⊥
 | ||
|  | _⊓_ [ a₁ ] [ a₂ ] = [ a₁ ⊓₁ a₂ ]
 | ||
|  | 
 | ||
|  | ≈-⊔-cong : ∀ {x₁ x₂ x₃ x₄} → x₁ ≈ x₂ → x₃ ≈ x₄ →
 | ||
|  |            (x₁ ⊔ x₃) ≈ (x₂ ⊔ x₄)
 | ||
|  | ≈-⊔-cong .{⊥} .{⊥} {x₃} {x₄} ≈-⊥-⊥ [a₃]≈[a₄] = [a₃]≈[a₄]
 | ||
|  | ≈-⊔-cong {x₁ = [ a₁ ]} {x₂ = [ a₂ ]} .{⊥} .{⊥} [a₁]≈[a₂] ≈-⊥-⊥ = [a₁]≈[a₂]
 | ||
|  | ≈-⊔-cong {x₁ = [ a₁ ]} {x₂ = [ a₂ ]} {x₃ = [ a₃ ]} {x₄ = [ a₄ ]} (≈-lift a₁≈a₂) (≈-lift a₃≈a₄) = ≈-lift (≈₁-⊔₁-cong a₁≈a₂ a₃≈a₄)
 | ||
|  | 
 | ||
|  | ⊔-assoc : ∀ (x₁ x₂ x₃ : ExtendBelow) →  ((x₁ ⊔ x₂) ⊔ x₃) ≈ (x₁ ⊔ (x₂ ⊔ x₃))
 | ||
|  | ⊔-assoc ⊥ x₁ x₂ = ≈-refl
 | ||
|  | ⊔-assoc [ a₁ ] ⊥ x₂ = ≈-refl
 | ||
|  | ⊔-assoc [ a₁ ] [ a₂ ] ⊥ = ≈-refl
 | ||
|  | ⊔-assoc [ a₁ ] [ a₂ ] [ a₃ ] = ≈-lift (⊔₁-assoc a₁ a₂ a₃)
 | ||
|  | 
 | ||
|  | ⊔-comm : ∀ (x₁ x₂ : ExtendBelow) →  (x₁ ⊔ x₂) ≈ (x₂ ⊔ x₁)
 | ||
|  | ⊔-comm ⊥ ⊥ = ≈-refl
 | ||
|  | ⊔-comm ⊥ [ a₂ ] = ≈-refl
 | ||
|  | ⊔-comm [ a₁ ] ⊥ = ≈-refl
 | ||
|  | ⊔-comm [ a₁ ] [ a₂ ] = ≈-lift (⊔₁-comm a₁ a₂)
 | ||
|  | 
 | ||
|  | ⊔-idemp : ∀ (x : ExtendBelow) →  (x ⊔ x) ≈ x
 | ||
|  | ⊔-idemp ⊥ = ≈-refl
 | ||
|  | ⊔-idemp [ a ] = ≈-lift (⊔₁-idemp a)
 | ||
|  | 
 | ||
|  | ≈-⊓-cong : ∀ {x₁ x₂ x₃ x₄} → x₁ ≈ x₂ → x₃ ≈ x₄ →
 | ||
|  |            (x₁ ⊓ x₃) ≈ (x₂ ⊓ x₄)
 | ||
|  | ≈-⊓-cong .{⊥} .{⊥} {x₃} {x₄} ≈-⊥-⊥ [a₃]≈[a₄] = ≈-⊥-⊥
 | ||
|  | ≈-⊓-cong {x₁ = [ a₁ ]} {x₂ = [ a₂ ]} .{⊥} .{⊥} [a₁]≈[a₂] ≈-⊥-⊥ = ≈-⊥-⊥
 | ||
|  | ≈-⊓-cong {x₁ = [ a₁ ]} {x₂ = [ a₂ ]} {x₃ = [ a₃ ]} {x₄ = [ a₄ ]} (≈-lift a₁≈a₂) (≈-lift a₃≈a₄) = ≈-lift (≈₁-⊓₁-cong a₁≈a₂ a₃≈a₄)
 | ||
|  | 
 | ||
|  | ⊓-assoc : ∀ (x₁ x₂ x₃ : ExtendBelow) →  ((x₁ ⊓ x₂) ⊓ x₃) ≈ (x₁ ⊓ (x₂ ⊓ x₃))
 | ||
|  | ⊓-assoc ⊥ x₁ x₂ = ≈-refl
 | ||
|  | ⊓-assoc [ a₁ ] ⊥ x₂ = ≈-refl
 | ||
|  | ⊓-assoc [ a₁ ] [ a₂ ] ⊥ = ≈-refl
 | ||
|  | ⊓-assoc [ a₁ ] [ a₂ ] [ a₃ ] = ≈-lift (⊓₁-assoc a₁ a₂ a₃)
 | ||
|  | 
 | ||
|  | ⊓-comm : ∀ (x₁ x₂ : ExtendBelow) →  (x₁ ⊓ x₂) ≈ (x₂ ⊓ x₁)
 | ||
|  | ⊓-comm ⊥ ⊥ = ≈-refl
 | ||
|  | ⊓-comm ⊥ [ a₂ ] = ≈-refl
 | ||
|  | ⊓-comm [ a₁ ] ⊥ = ≈-refl
 | ||
|  | ⊓-comm [ a₁ ] [ a₂ ] = ≈-lift (⊓₁-comm a₁ a₂)
 | ||
|  | 
 | ||
|  | ⊓-idemp : ∀ (x : ExtendBelow) →  (x ⊓ x) ≈ x
 | ||
|  | ⊓-idemp ⊥ = ≈-refl
 | ||
|  | ⊓-idemp [ a ] = ≈-lift (⊓₁-idemp a)
 | ||
|  | 
 | ||
|  | absorb-⊔-⊓ : (x₁ x₂ : ExtendBelow) → (x₁ ⊔ (x₁ ⊓ x₂)) ≈ x₁
 | ||
|  | absorb-⊔-⊓ ⊥ ⊥ = ≈-refl
 | ||
|  | absorb-⊔-⊓ ⊥ [ a₂ ] = ≈-refl
 | ||
|  | absorb-⊔-⊓ [ a₁ ] ⊥ = ≈-refl
 | ||
|  | absorb-⊔-⊓ [ a₁ ] [ a₂ ] = ≈-lift (absorb-⊔₁-⊓₁ a₁ a₂)
 | ||
|  | 
 | ||
|  | absorb-⊓-⊔ : (x₁ x₂ : ExtendBelow) → (x₁ ⊓ (x₁ ⊔ x₂)) ≈ x₁
 | ||
|  | absorb-⊓-⊔ ⊥ ⊥ = ≈-refl
 | ||
|  | absorb-⊓-⊔ ⊥ [ a₂ ] = ≈-refl
 | ||
|  | absorb-⊓-⊔ [ a₁ ] ⊥ = ⊓-idemp [ a₁ ]
 | ||
|  | absorb-⊓-⊔ [ a₁ ] [ a₂ ] = ≈-lift (absorb-⊓₁-⊔₁ a₁ a₂)
 | ||
|  | 
 | ||
|  | instance
 | ||
|  |     isJoinSemilattice : IsSemilattice ExtendBelow _≈_ _⊔_
 | ||
|  |     isJoinSemilattice = record
 | ||
|  |         { ≈-equiv = ≈-equiv
 | ||
|  |         ; ≈-⊔-cong = ≈-⊔-cong
 | ||
|  |         ; ⊔-assoc = ⊔-assoc
 | ||
|  |         ; ⊔-comm = ⊔-comm
 | ||
|  |         ; ⊔-idemp = ⊔-idemp
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |     isMeetSemilattice : IsSemilattice ExtendBelow _≈_ _⊓_
 | ||
|  |     isMeetSemilattice = record
 | ||
|  |         { ≈-equiv = ≈-equiv
 | ||
|  |         ; ≈-⊔-cong = ≈-⊓-cong
 | ||
|  |         ; ⊔-assoc = ⊓-assoc
 | ||
|  |         ; ⊔-comm = ⊓-comm
 | ||
|  |         ; ⊔-idemp = ⊓-idemp
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |     isLattice : IsLattice ExtendBelow _≈_ _⊔_ _⊓_
 | ||
|  |     isLattice = record
 | ||
|  |         { joinSemilattice = isJoinSemilattice
 | ||
|  |         ; meetSemilattice = isMeetSemilattice
 | ||
|  |         ; absorb-⊔-⊓ = absorb-⊔-⊓
 | ||
|  |         ; absorb-⊓-⊔ = absorb-⊓-⊔
 | ||
|  |         }
 | ||
|  | 
 | ||
|  | module _ {{≈₁-Decidable : IsDecidable _≈₁_}} where
 | ||
|  |     open IsDecidable ≈₁-Decidable using () renaming (R-dec to ≈₁-dec)
 | ||
|  | 
 | ||
|  |     ≈-dec : Decidable _≈_
 | ||
|  |     ≈-dec ⊥ ⊥ = yes ≈-⊥-⊥
 | ||
|  |     ≈-dec [ a₁ ] [ a₂ ]
 | ||
|  |         with ≈₁-dec a₁ a₂
 | ||
|  |     ...   | yes a₁≈a₂ = yes (≈-lift a₁≈a₂)
 | ||
|  |     ...   | no a₁̷≈a₂ = no (λ { (≈-lift a₁≈a₂) → a₁̷≈a₂ a₁≈a₂ })
 | ||
|  |     ≈-dec ⊥ [ _ ] = no (λ ())
 | ||
|  |     ≈-dec [ _ ] ⊥ = no (λ ())
 | ||
|  | 
 | ||
|  |     instance
 | ||
|  |         ≈-Decidable : IsDecidable _≈_
 | ||
|  |         ≈-Decidable = record { R-dec = ≈-dec }
 |