------------------------------------------------------------------------
-- 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.Natrec-star-instances
open import Graded.Modality.Properties.Meet ๐•„
open import Graded.Modality.Properties.PartialOrder ๐•„
open import Tools.PropositionalEquality

open import Tools.Function
open import Tools.Product
import Tools.Reasoning.PartialOrder
import Tools.Reasoning.PropositionalEquality

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 q is zero.

โˆง-positiveสณ : p โˆง q โ‰ก ๐Ÿ˜ โ†’ q โ‰ก ๐Ÿ˜
โˆง-positiveสณ pโˆงqโ‰ก๐Ÿ˜ = โˆง-positiveหก (trans (โˆง-comm _ _) 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

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

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

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

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

-- If the mode ๐Ÿ˜แต is allowed and 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 the mode ๐Ÿ˜แต is allowed and 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