------------------------------------------------------------------------
-- Properties of the modality semiring that hold if ๐Ÿ˜ is well-behaved.
------------------------------------------------------------------------

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
open import Tools.Relation

private
  variable
    p q r : M

-- If pย +ย q is zero, then q is zero.

+-positiveสณ : p + q โ‰ก ๐Ÿ˜ โ†’ q โ‰ก ๐Ÿ˜
+-positiveสณ p+qโ‰ก๐Ÿ˜ = +-positiveหก (trans (+-comm _ _) p+qโ‰ก๐Ÿ˜)

-- If pย +ย q is zero, then p and q are zero.

+-positive : p + q โ‰ก ๐Ÿ˜ โ†’ p โ‰ก ๐Ÿ˜ ร— q โ‰ก ๐Ÿ˜
+-positive p+qโ‰ก๐Ÿ˜ = +-positiveหก p+qโ‰ก๐Ÿ˜ , +-positiveสณ p+qโ‰ก๐Ÿ˜

-- If pย โˆงย q is zero, then q is zero.

โˆง-positiveสณ : p โˆง q โ‰ก ๐Ÿ˜ โ†’ q โ‰ก ๐Ÿ˜
โˆง-positiveสณ pโˆงqโ‰ก๐Ÿ˜ = โˆง-positiveหก (trans (โˆง-comm _ _) pโˆงqโ‰ก๐Ÿ˜)

-- If pย โˆงย q is zero, then p and q are zero.

โˆง-positive : p โˆง q โ‰ก ๐Ÿ˜ โ†’ p โ‰ก ๐Ÿ˜ ร— q โ‰ก ๐Ÿ˜
โˆง-positive pโˆงqโ‰ก๐Ÿ˜ = โˆง-positiveหก pโˆงqโ‰ก๐Ÿ˜ , โˆง-positiveสณ pโˆงqโ‰ก๐Ÿ˜

-- Every value that is "greater than or
-- equal to" ๐Ÿ˜ is equivalent to ๐Ÿ˜.
--
-- This property matches one of the assumptions in Conor McBride's "I
-- Got Plenty oโ€™ Nuttinโ€™".

๐Ÿ˜โ‰ฎ : ๐Ÿ˜ โ‰ค p โ†’ p โ‰ก ๐Ÿ˜
๐Ÿ˜โ‰ฎ {p = p} ๐Ÿ˜โ‰คp = โˆง-positiveหก (begin
  p โˆง ๐Ÿ˜  โ‰กโŸจ โˆง-comm _ _ โŸฉ
  ๐Ÿ˜ โˆง p  โ‰กห˜โŸจ ๐Ÿ˜โ‰คp โŸฉ
  ๐Ÿ˜      โˆŽ)
  where
  open Tools.Reasoning.PropositionalEquality

-- If p is bounded by q and p isย ๐Ÿ˜, then q isย ๐Ÿ˜.

โ‰คโ†’โ‰ก๐Ÿ˜โ†’โ‰ก๐Ÿ˜ : p โ‰ค q โ†’ p โ‰ก ๐Ÿ˜ โ†’ q โ‰ก ๐Ÿ˜
โ‰คโ†’โ‰ก๐Ÿ˜โ†’โ‰ก๐Ÿ˜ pโ‰คq refl = ๐Ÿ˜โ‰ฎ pโ‰คq

-- ๐Ÿ˜ is not less than or equal to ๐Ÿ™

๐Ÿ˜โ‰ฐ๐Ÿ™ : ๐Ÿ˜ โ‰ค ๐Ÿ™ โ†’ โŠฅ
๐Ÿ˜โ‰ฐ๐Ÿ™ ๐Ÿ˜โ‰ค๐Ÿ™ = non-trivial (๐Ÿ˜โ‰ฎ ๐Ÿ˜โ‰ค๐Ÿ™)

-- The meet of ๐Ÿ˜ and ๐Ÿ™ is strictly belowย ๐Ÿ˜.

๐Ÿ˜โˆง๐Ÿ™<๐Ÿ˜ : ๐Ÿ˜ โˆง ๐Ÿ™ < ๐Ÿ˜
๐Ÿ˜โˆง๐Ÿ™<๐Ÿ˜ =
    โˆง-decreasingหก _ _
  , (๐Ÿ˜ โˆง ๐Ÿ™ โ‰ก ๐Ÿ˜  โ†’โŸจ sym โŸฉ
     ๐Ÿ˜ โ‰ค ๐Ÿ™      โ†’โŸจ ๐Ÿ˜โ‰ฐ๐Ÿ™ โŸฉ
     โŠฅ          โ–ก)

opaque

  -- The grade ฯ‰ is strictly less thanย ๐Ÿ˜.

  ฯ‰<๐Ÿ˜ : ฯ‰ < ๐Ÿ˜
  ฯ‰<๐Ÿ˜ = โ‰ค<-trans ฯ‰โ‰ค๐Ÿ˜โˆง๐Ÿ™ ๐Ÿ˜โˆง๐Ÿ™<๐Ÿ˜

-- The grade ฯ‰ is not equal toย ๐Ÿ˜.

ฯ‰โ‰ข๐Ÿ˜ : ฯ‰ โ‰ข ๐Ÿ˜
ฯ‰โ‰ข๐Ÿ˜ = ฯ‰<๐Ÿ˜ .projโ‚‚

-- If pย โŠ›ย qย โ–ทย r is equal to zero, then p is equal to zero.

โŠ›โ‰ก๐Ÿ˜หก :
  โฆƒ 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

-- If pย โŠ›ย qย โ–ทย r is equal to zero, then q is equal to zero.

โŠ›โ‰ก๐Ÿ˜สณ :
  โฆƒ 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