57 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Agda
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Agda
		
	
	
	
	
	
|  | open import Lattice
 | |||
|  | 
 | |||
|  | module Lattice.IterProd {a} {A B : Set a}
 | |||
|  |     (_≈₁_ : A → A → Set a) (_≈₂_ : B → B → Set a)
 | |||
|  |     (_⊔₁_ : A → A → A) (_⊔₂_ : B → B → B)
 | |||
|  |     (_⊓₁_ : A → A → A) (_⊓₂_ : B → B → B)
 | |||
|  |     (lA : IsLattice A _≈₁_ _⊔₁_ _⊓₁_) (lB : IsLattice B _≈₂_ _⊔₂_ _⊓₂_) where
 | |||
|  | 
 | |||
|  | open import Data.Nat using (ℕ; suc)
 | |||
|  | open import Data.Product using (_×_)
 | |||
|  | open import Utils using (iterate)
 | |||
|  | 
 | |||
|  | IterProd : ℕ → Set a
 | |||
|  | IterProd k = iterate k (λ t → A × t) B
 | |||
|  | 
 | |||
|  | -- To make iteration more convenient, package the definitions in Lattice
 | |||
|  | -- records, perform the recursion, and unpackage.
 | |||
|  | 
 | |||
|  | private module _ where
 | |||
|  |     ALattice : Lattice A
 | |||
|  |     ALattice = record
 | |||
|  |         { _≈_ = _≈₁_
 | |||
|  |         ; _⊔_ = _⊔₁_
 | |||
|  |         ; _⊓_ = _⊓₁_
 | |||
|  |         ; isLattice = lA
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |     BLattice : Lattice B
 | |||
|  |     BLattice = record
 | |||
|  |         { _≈_ = _≈₂_
 | |||
|  |         ; _⊔_ = _⊔₂_
 | |||
|  |         ; _⊓_ = _⊓₂_
 | |||
|  |         ; isLattice = lB
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |     IterProdLattice : ∀ {k : ℕ} → Lattice (IterProd k)
 | |||
|  |     IterProdLattice {0} = BLattice
 | |||
|  |     IterProdLattice {suc k'} = record
 | |||
|  |         { _≈_ = _≈_
 | |||
|  |         ; _⊔_ = _⊔_
 | |||
|  |         ; _⊓_ = _⊓_
 | |||
|  |         ; isLattice = isLattice
 | |||
|  |         }
 | |||
|  |         where
 | |||
|  |             RightLattice : Lattice (IterProd k')
 | |||
|  |             RightLattice = IterProdLattice {k'}
 | |||
|  | 
 | |||
|  |             open import Lattice.Prod
 | |||
|  |                 _≈₁_ (Lattice._≈_ RightLattice)
 | |||
|  |                 _⊔₁_ (Lattice._⊔_ RightLattice)
 | |||
|  |                 _⊓₁_ (Lattice._⊓_ RightLattice)
 | |||
|  |                 lA  (Lattice.isLattice RightLattice)
 | |||
|  | 
 | |||
|  | -- Expose the computed definition in public.
 | |||
|  | module _ (k : ℕ) where
 | |||
|  |     open Lattice.Lattice (IterProdLattice {k}) public
 |