------------------------------------------------------------------------
-- Modality variants
------------------------------------------------------------------------
open import Tools.Level
module Graded.Modality.Variant (a : Level) where
open import Tools.Bool
open import Tools.Empty
open import Tools.Level
open import Tools.PropositionalEquality
open import Tools.Relation
open import Tools.Unit
-- Modality variants:
-- * Modalities can come with one mode (๐แต) or two (๐แต and ๐แต).
-- * They can also come with, or not come with, a dedicated
--   natrec-star operator _โ_โท_. Even if they don't come with a
--   *dedicated* natrec-star operator one or more such operators can
--   perhaps still be defined.
record Modality-variant : Set (lsuc a) where
  field
    -- Is the mode ๐แต allowed?
    ๐แต-allowed : Bool
    -- Is a dedicated natrec-star operator available?
    โ-available : Set a
    -- The type โ-available is a proposition.
    โ-available-propositional : (p q : โ-available) โ p โก q
    -- The type โ-available is decided.
    โ-available-decided : Dec โ-available
-- A variant for which a dedicated natrec-star operator must be
-- available, and ๐แต is available if the boolean is true.
โ-available-and-๐แต-available-if : Bool โ Modality-variant
โ-available-and-๐แต-available-if ok = record
  { ๐แต-allowed                = ok
  ; โ-available               = Lift _ โค
  ; โ-available-propositional = ฮป _ _ โ refl
  ; โ-available-decided       = yes _
  }
-- A variant for which a dedicated natrec-star operator is not
-- available, and ๐แต is available if the boolean is true.
โ-not-available-and-๐แต-available-if : Bool โ Modality-variant
โ-not-available-and-๐แต-available-if ok = record
  { ๐แต-allowed                = ok
  ; โ-available               = Lift _ โฅ
  ; โ-available-propositional = ฮป ()
  ; โ-available-decided       = no (ฮป ())
  }