import Graded.Modality
module Graded.Modality.Properties.Has-well-behaved-zero
  {a} {M : Set a}
  (open Graded.Modality M)
  (๐ : Semiring-with-meet)
  (open Semiring-with-meet ๐)
  โฆ ๐-well-behaved : Has-well-behaved-zero ๐ โฆ
  where
open Has-well-behaved-zero ๐-well-behaved public
open import Graded.Modality.Nr-instances
open import Graded.Modality.Properties.Addition ๐
open import Graded.Modality.Properties.Meet ๐
open import Graded.Modality.Properties.PartialOrder ๐
open import Tools.PropositionalEquality
open import Tools.Empty
open import Tools.Function
open import Tools.Product
import Tools.Reasoning.PartialOrder
import Tools.Reasoning.PropositionalEquality
private
  variable
    p q r : M
+-positiveสณ : p + q โก ๐ โ q โก ๐
+-positiveสณ p+qโก๐ = +-positiveหก (trans (+-comm _ _) p+qโก๐)
+-positive : p + q โก ๐ โ p โก ๐ ร q โก ๐
+-positive p+qโก๐ = +-positiveหก p+qโก๐ , +-positiveสณ p+qโก๐
โง-positiveสณ : p โง q โก ๐ โ q โก ๐
โง-positiveสณ pโงqโก๐ = โง-positiveหก (trans (โง-comm _ _) pโงqโก๐)
โง-positive : p โง q โก ๐ โ p โก ๐ ร q โก ๐
โง-positive pโงqโก๐ = โง-positiveหก pโงqโก๐ , โง-positiveสณ pโงqโก๐
๐โฎ : ๐ โค p โ p โก ๐
๐โฎ {p = p} ๐โคp = โง-positiveหก (begin
  p โง ๐  โกโจ โง-comm _ _ โฉ
  ๐ โง p  โกหโจ ๐โคp โฉ
  ๐      โ)
  where
  open Tools.Reasoning.PropositionalEquality
โคโโก๐โโก๐ : p โค q โ p โก ๐ โ q โก ๐
โคโโก๐โโก๐ pโคq refl = ๐โฎ pโคq
๐โฐ๐ : ๐ โค ๐ โ โฅ
๐โฐ๐ ๐โค๐ = non-trivial (๐โฎ ๐โค๐)
๐โง๐<๐ : ๐ โง ๐ < ๐
๐โง๐<๐ =
    โง-decreasingหก _ _
  , (๐ โง ๐ โก ๐  โโจ sym โฉ
     ๐ โค ๐      โโจ ๐โฐ๐ โฉ
     โฅ          โก)
opaque
  
  ฯ<๐ : ฯ < ๐
  ฯ<๐ = โค<-trans ฯโค๐โง๐ ๐โง๐<๐
ฯโข๐ : ฯ โข ๐
ฯโข๐ = ฯ<๐ .projโ
โโก๐หก :
  โฆ has-star : Has-star ๐ โฆ โ
  p โ q โท r โก ๐ โ p โก ๐
โโก๐หก {p = p} {q = q} {r = r} pโqโทrโก๐ = ๐โฎ (begin
  ๐          โหโจ pโqโทrโก๐ โฉ
  p โ q โท r  โคโจ โ-ineqโ _ _ _ โฉ
  p          โ)
  where
  open import Tools.Reasoning.PartialOrder โค-poset
โโก๐สณ :
  โฆ has-star : Has-star ๐ โฆ โ
  p โ q โท r โก ๐ โ q โก ๐
โโก๐สณ {p = p} {q = q} {r = r} pโqโทrโก๐ = +-positiveหก (๐โฎ (begin
  ๐                  โหโจ pโqโทrโก๐ โฉ
  p โ q โท r          โคโจ โ-ineqโ _ _ _ โฉ
  q + r ยท p โ q โท r  โ))
  where
  open import Tools.Reasoning.PartialOrder โค-poset