open import Data.Sum open import Data.Product open import Relation.Binary open import Relation.Binary.Construct.Union open import Agda.Primitive open import Function open import Relation.Binary.PropositionalEquality module Refinement {a} {I : Set a} where record Transform {ℓ} (≈₁ ≈₂ ≺₁ ≺₂ : Rel I ℓ) (T≈₁₂ T≈₂₁ T≺₁₂ T≺₂₁ : _ → _ → Rel I ℓ) : Set (lsuc a ⊔ ℓ) where field ≈₁→₂ : ≈₁ ⇒ T≈₁₂ ≈₂ ≺₂ ≈₂→₁ : ≈₂ ⇒ T≈₂₁ ≈₁ ≺₁ ≺₁→₂ : ≺₁ ⇒ T≺₁₂ ≈₂ ≺₂ ≺₂→₁ : ≺₂ ⇒ T≺₂₁ ≈₁ ≺₁ open Transform public _≈≈_ : ∀ {ℓ} → Rel (Rel I ℓ × Rel I ℓ) _ (≈₁ , ≺₁) ≈≈ (≈₂ , ≺₂) = Transform ≈₁ ≈₂ ≺₁ ≺₂ (λ ≈₂ _ → ≈₂) (λ ≈₁ _ → ≈₁) (λ _ ≺₂ → ≺₂) (λ _ ≺₁ → ≺₁) _≺≈_ : ∀ {ℓ} → Rel (Rel I ℓ × Rel I ℓ) _ (≈₁ , ≺₁) ≺≈ (≈₂ , ≺₂) = Transform ≈₁ ≈₂ ≺₁ ≺₂ (λ ≈₂ _ → ≈₂) (λ ≈₁ ≺₁ → ≈₁ ∪ (≺₁ ∪ flip ≺₁)) (λ ≈₂ ≺₂ → ≺₂ ∪ ≈₂) (λ _ ≺₁ → ≺₁) refl≈≈ : ∀ {ℓ} → Reflexive (_≈≈_ {ℓ}) refl≈≈ = record { ≺₁→₂ = id ; ≺₂→₁ = id ; ≈₁→₂ = id ; ≈₂→₁ = id } sym≈≈ : ∀ {ℓ} → Symmetric (_≈≈_ {ℓ}) sym≈≈ x≈≈y .≈₁→₂ = ≈₂→₁ x≈≈y sym≈≈ x≈≈y .≈₂→₁ = ≈₁→₂ x≈≈y sym≈≈ x≈≈y .≺₁→₂ = ≺₂→₁ x≈≈y sym≈≈ x≈≈y .≺₂→₁ = ≺₁→₂ x≈≈y trans≈≈ : ∀ {ℓ} → Transitive (_≈≈_ {ℓ}) trans≈≈ i≈≈j j≈≈k .≈₁→₂ = (≈₁→₂ j≈≈k) ∘ ≈₁→₂ i≈≈j trans≈≈ i≈≈j j≈≈k .≈₂→₁ = (≈₂→₁ i≈≈j) ∘ ≈₂→₁ j≈≈k trans≈≈ i≈≈j j≈≈k .≺₁→₂ = (≺₁→₂ j≈≈k) ∘ ≺₁→₂ i≈≈j trans≈≈ i≈≈j j≈≈k .≺₂→₁ = (≺₂→₁ i≈≈j) ∘ ≺₂→₁ j≈≈k equiv≈≈ : ∀ {ℓ} → IsEquivalence (_≈≈_ {ℓ}) equiv≈≈ = record { refl = refl≈≈ ; sym = sym≈≈ ; trans = trans≈≈ } trans≺≈ : ∀ {ℓ} → Transitive (_≺≈_ {ℓ}) trans≺≈ i≺≈j j≺≈k .≈₁→₂ = (≈₁→₂ j≺≈k) ∘ ≈₁→₂ i≺≈j trans≺≈ i≺≈j j≺≈k .≈₂→₁ x with ≈₂→₁ j≺≈k x trans≺≈ i≺≈j _ .≈₂→₁ _ | inj₁ y = ≈₂→₁ i≺≈j y trans≺≈ i≺≈j _ .≈₂→₁ _ | inj₂ (inj₁ y) = inj₂ (inj₁ (≺₂→₁ i≺≈j y)) trans≺≈ i≺≈j _ .≈₂→₁ _ | inj₂ (inj₂ y) = inj₂ (inj₂ (≺₂→₁ i≺≈j y)) trans≺≈ i≺≈j _ .≺₁→₂ x with ≺₁→₂ i≺≈j x trans≺≈ _ j≺≈k .≺₁→₂ _ | inj₁ y = ≺₁→₂ j≺≈k y trans≺≈ _ j≺≈k .≺₁→₂ _ | inj₂ y = inj₂ (≈₁→₂ j≺≈k y) trans≺≈ i≺≈j j≺≈k .≺₂→₁ = (≺₂→₁ i≺≈j) ∘ ≺₂→₁ j≺≈k refl≺≈ : ∀ {ℓ} → (_≈≈_ {ℓ}) ⇒ (_≺≈_ {ℓ}) refl≺≈ i≈≈j .≈₁→₂ = ≈₁→₂ i≈≈j refl≺≈ i≈≈j .≈₂→₁ = inj₁ ∘ ≈₂→₁ i≈≈j refl≺≈ i≈≈j .≺₁→₂ = inj₁ ∘ ≺₁→₂ i≈≈j refl≺≈ i≈≈j .≺₂→₁ = ≺₂→₁ i≈≈j preorder≺≈≈ : ∀ {ℓ} → IsPreorder _≈≈_ (_≺≈_ {ℓ}) preorder≺≈≈ = record { isEquivalence = equiv≈≈ ; reflexive = refl≺≈ ; trans = trans≺≈ } antisym≺≈ : ∀ {ℓ} → Antisymmetric _≈≈_ (_≺≈_ {ℓ}) antisym≺≈ i≺≈j _ .≈₁→₂ = ≈₁→₂ i≺≈j antisym≺≈ _ j≺≈i .≈₂→₁ = ≈₁→₂ j≺≈i antisym≺≈ _ j≺≈i .≺₁→₂ = ≺₂→₁ j≺≈i antisym≺≈ i≺≈j _ .≺₂→₁ = ≺₂→₁ i≺≈j partialOrder≺≈≈ : ∀ {ℓ} → IsPartialOrder _≈≈_ (_≺≈_ {ℓ}) partialOrder≺≈≈ = record { isPreorder = preorder≺≈≈ ; antisym = antisym≺≈ }