------------------------------------------------------------------------
-- Properties related to usage, Ο‰ and Ξ©
------------------------------------------------------------------------

open import Graded.Modality
open import Graded.Mode
open import Graded.Usage.Restrictions

module Graded.Derived.Omega
  {a b} {M : Set a} {Mode : Set b}
  {𝕄 : Modality M}
  {𝐌 : IsMode Mode 𝕄}
  (UR : Usage-restrictions 𝕄 𝐌)
  where

open Modality 𝕄 hiding (Ο‰)
open IsMode 𝐌

open import Graded.Context 𝕄
open import Graded.Context.Properties 𝕄
open import Graded.Modality.Properties 𝕄
open import Graded.Usage UR

open import Definition.Untyped.Omega M

open import Tools.Bool
open import Tools.Function
open import Tools.Nat using (Nat)
open import Tools.PropositionalEquality
import Tools.Reasoning.PartialOrder
open import Tools.Relation

private variable
  n : Nat
  Ξ³ : Conβ‚˜ _
  m : Mode
  p : M

opaque
  unfolding Ο‰

  -- A usage lemma for Ο‰.

  β–ΈΟ‰ :
    (⌜ m ⌝ β‰’ 𝟘 β†’ p ≀ πŸ™ + p) β†’
    𝟘ᢜ β–Έ[ m ] Ο‰ {n = n} p
  β–ΈΟ‰ {m} {p} hyp =
    lamβ‚˜ $
    sub (var βˆ˜β‚˜ var) $ begin
      𝟘ᢜ βˆ™ ⌜ m ⌝ Β· p                          β‰€βŸ¨ β‰€αΆœ-refl βˆ™ lemma _ hyp ⟩
      𝟘ᢜ βˆ™ ⌜ m ⌝ + p Β· ⌜ m ᡐ· p ⌝             β‰ˆΛ˜βŸ¨ +ᢜ-identityΛ‘ _ βˆ™ refl ⟩
      𝟘ᢜ +ᢜ 𝟘ᢜ βˆ™ ⌜ m ⌝ + p Β· ⌜ m ᡐ· p ⌝       β‰ˆΛ˜βŸ¨ +ᢜ-congΛ‘ (·ᢜ-zeroΚ³ _) βˆ™ refl ⟩
      (𝟘ᢜ βˆ™ ⌜ m ⌝) +ᢜ p ·ᢜ (𝟘ᢜ βˆ™ ⌜ m ᡐ· p ⌝)  ∎
    where
    lemma :
      βˆ€ m β†’ (⌜ m ⌝ β‰’ 𝟘 β†’ p ≀ πŸ™ + p) β†’ ⌜ m ⌝ Β· p ≀ ⌜ m ⌝ + p Β· ⌜ m ᡐ· p ⌝
    lemma m hyp =
      case is-𝟘? ⌜ m ⌝ of λ where
        (yes ⌜mβŒβ‰‘πŸ˜) β†’ begin
          ⌜ m ⌝ Β· p              β‰ˆβŸ¨ ⌜⌝-Β·-comm _ ⟩
          p Β· ⌜ m ⌝              β‰‘Λ˜βŸ¨ +-identityΛ‘ _ ⟩
          𝟘 + p Β· ⌜ m ⌝          β‰‘Λ˜βŸ¨ +-cong ⌜mβŒβ‰‘πŸ˜ (·⌜ᡐ·⌝ _) ⟩
          ⌜ m ⌝ + p · ⌜ m ᡐ· p ⌝ ∎
        (no ⌜mβŒβ‰’πŸ˜) β†’ begin
          ⌜ m ⌝ Β· p              β‰€βŸ¨ Β·-monotoneΚ³ (hyp ⌜mβŒβ‰’πŸ˜) ⟩
          ⌜ m ⌝ Β· (πŸ™ + p)        β‰‘βŸ¨ Β·-distribΛ‘-+ _ _ _ ⟩
          ⌜ m ⌝ Β· πŸ™ + ⌜ m ⌝ Β· p  β‰‘βŸ¨ +-cong (Β·-identityΚ³ _) (⌜⌝-Β·-comm _) ⟩
          ⌜ m ⌝ + p Β· ⌜ m ⌝      β‰‘Λ˜βŸ¨ +-congΛ‘ (·⌜ᡐ·⌝ _) ⟩
          ⌜ m ⌝ + p · ⌜ m ᡐ· p ⌝ ∎
      where
      open ≀-reasoning

    open β‰€αΆœ-reasoning

opaque
  unfolding Ξ©

  -- A usage lemma for Ξ©.

  β–ΈΞ© :
    (⌜ m ⌝ β‰’ 𝟘 β†’ p ≀ πŸ™ + p) β†’
    𝟘ᢜ β–Έ[ m ] Ξ© {n = n} p
  β–ΈΞ© {m} {p} hyp =
    sub (β–ΈΟ‰ hyp βˆ˜β‚˜ β–ΈΟ‰ (hyp βˆ˜β†’ ⌜⌝-·ᡐ-𝟘ˑ)) $ begin
      𝟘ᢜ             β‰ˆΛ˜βŸ¨ ·ᢜ-zeroΚ³ _ ⟩
      p ·ᢜ 𝟘ᢜ        β‰ˆΛ˜βŸ¨ +ᢜ-identityΛ‘ _ ⟩
      𝟘ᢜ +ᢜ p ·ᢜ 𝟘ᢜ  ∎
    where
    open β‰€αΆœ-reasoning