import Relation.Binary.PropositionalEquality as Eq open Eq using (_≡_; refl) module Effects where record Effect : Set₁ where infix 4 _≤_ infixl 6 _+_ field Eff : Set pure : Eff tock : Eff _+_ : Eff → Eff → Eff +-assoc : ∀ {φ₁ φ₂ φ₃ : Eff} → (φ₁ + φ₂) + φ₃ ≡ φ₁ + (φ₂ + φ₃) +-pure-idʳ : ∀ {φ : Eff} → φ + pure ≡ φ +-pure-idˡ : ∀ {φ : Eff} → pure + φ ≡ φ _≤_ : Eff → Eff → Set ≤-refl : ∀ {φ : Eff} → φ ≤ φ ≤-trans : ∀ {φ₁ φ₂ φ₃ : Eff} → φ₁ ≤ φ₂ → φ₂ ≤ φ₃ → φ₁ ≤ φ₃ ≤-+-compatibleʳ : ∀ {φ₁ φ₂ ψ : Eff} → φ₁ ≤ φ₂ → φ₁ + ψ ≤ φ₂ + ψ ≤-+-compatibleˡ : ∀ {φ₁ φ₂ ψ : Eff} → φ₁ ≤ φ₂ → ψ + φ₁ ≤ ψ + φ₂ variable φ φ′ φ₁ φ₂ φ₃ ψ ψ₁ ψ₂ : Eff module Properties (E : Effect) where open Effect E ≤-+ʳ : pure ≤ φ₂ → φ₁ ≤ φ₁ + φ₂ ≤-+ʳ {φ₂} {φ₁} pure≤φ₂ with ≤-+-compatibleˡ {pure} {φ₂} {φ₁} pure≤φ₂ ... | pf rewrite +-pure-idʳ {φ₁} = pf ≤-+-invertʳ : φ₁ + φ ≤ φ₂ → pure ≤ φ → φ₁ ≤ φ₂ ≤-+-invertʳ pf pure≤φ = ≤-trans (≤-+ʳ pure≤φ) pf ≡→≤ : φ₁ ≡ φ₂ → φ₁ ≤ φ₂ ≡→≤ refl = ≤-refl