open import Graded.Modality
module Graded.Context.Properties.PartialOrder
  {a} {M : Set a} (𝕄 : Modality M) where
open import Graded.Context 𝕄
open import Graded.Context.Properties.Equivalence 𝕄
open import Graded.Modality.Properties 𝕄
open import Tools.Function
open import Tools.Nat using (Nat)
import Tools.Reasoning.PartialOrder
open import Tools.Relation
open Modality 𝕄
private
  variable
    n : Nat
    γ δ η : Conₘ n
≤ᶜ-refl : γ ≤ᶜ γ
≤ᶜ-refl {γ = ε} = ε
≤ᶜ-refl {γ = γ ∙ p} = ≤ᶜ-refl ∙ ≤-refl
≤ᶜ-trans : γ ≤ᶜ δ → δ ≤ᶜ η → γ ≤ᶜ η
≤ᶜ-trans {γ = ε}     {δ = ε}     {η = ε}     _           _           = ε
≤ᶜ-trans {γ = _ ∙ _} {δ = _ ∙ _} {η = _ ∙ _} (γ≤δ ∙ p≤q) (δ≤η ∙ q≤r) =
  (≤ᶜ-trans γ≤δ δ≤η) ∙ (≤-trans p≤q q≤r)
≤ᶜ-antisym : γ ≤ᶜ δ → δ ≤ᶜ γ → γ ≈ᶜ δ
≤ᶜ-antisym {γ = ε}     {δ = ε}     _           _           = ε
≤ᶜ-antisym {γ = _ ∙ _} {δ = _ ∙ _} (γ≤δ ∙ p≤q) (δ≤γ ∙ q≤p) =
  (≤ᶜ-antisym γ≤δ δ≤γ) ∙ (≤-antisym p≤q q≤p)
≤ᶜ-reflexive : γ ≈ᶜ δ → γ ≤ᶜ δ
≤ᶜ-reflexive {γ = ε}     {δ = ε}     _            = ε
≤ᶜ-reflexive {γ = _ ∙ _} {δ = _ ∙ _} (γ≈ᶜδ ∙ p≡q) =
  ≤ᶜ-reflexive γ≈ᶜδ ∙ ≤-reflexive p≡q
≤ᶜ-preorder : IsPreorder (_≈ᶜ_ {n = n}) _≤ᶜ_
≤ᶜ-preorder = record
  { isEquivalence = ≈ᶜ-equivalence
  ; reflexive = ≤ᶜ-reflexive
  ; trans = ≤ᶜ-trans
  }
≤ᶜ-partial : IsPartialOrder (_≈ᶜ_ {n = n}) _≤ᶜ_
≤ᶜ-partial = record
  { isPreorder = ≤ᶜ-preorder
  ; antisym = ≤ᶜ-antisym
  }
≤ᶜ-poset : {n : Nat} → Poset _ _ _
≤ᶜ-poset {n} = record
  { Carrier = Conₘ n
  ; _≈_ = _≈ᶜ_
  ; _≤_ = _≤ᶜ_
  ; isPartialOrder = ≤ᶜ-partial
  }
module ≤ᶜ-reasoning {n : Nat} =
  Tools.Reasoning.PartialOrder (≤ᶜ-poset {n = n})
≤ᶜ-decidable : Decidable _≤_ → Decidable (_≤ᶜ_ {n = n})
≤ᶜ-decidable _≤?_ = λ where
  ε       ε       → yes ε
  (γ ∙ p) (δ ∙ q) → case p ≤? q of λ where
    (no p≰q)  → no λ where
                  (_ ∙ p≤q) → p≰q p≤q
    (yes p≤q) → case ≤ᶜ-decidable _≤?_ γ δ of λ where
      (no γ≰δ)  → no λ where
                    (γ≤δ ∙ _) → γ≰δ γ≤δ
      (yes γ≤δ) → yes (γ≤δ ∙ p≤q)
≤ᶜ𝟘ᶜ : (∀ {p} → p ≤ 𝟘) → γ ≤ᶜ 𝟘ᶜ
≤ᶜ𝟘ᶜ {γ = ε}     _  = ε
≤ᶜ𝟘ᶜ {γ = _ ∙ _} ≤𝟘 = ≤ᶜ𝟘ᶜ ≤𝟘 ∙ ≤𝟘