------------------------------------------------------------------------
-- Assumptions used to prove that the usage relation is decidable
------------------------------------------------------------------------

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

module Graded.Usage.Decidable.Assumptions
  {a} {M : Set a}
  {𝕄 : Modality M}
  (R : Usage-restrictions 𝕄)
  where

open Modality 𝕄
open Usage-restrictions R

open import Graded.Context 𝕄
open import Graded.Context.Properties 𝕄
open import Graded.Modality.Properties 𝕄 hiding (has-nr)
open import Graded.Mode 𝕄 using (𝟘ᡐ; πŸ™α΅)
open import Graded.Usage.Restrictions.Natrec 𝕄

open import Tools.Nat using (Nat)
open import Tools.PropositionalEquality
open import Tools.Relation
open import Tools.Sum

private variable
  n : Nat

record Assumptions : Set a where
  no-eta-equality
  infix 10 _β‰Ÿ_ _≀?_ _β‰€αΆœ?_
  field
    -- Equality is assumed to be decidable for M.
    _β‰Ÿ_ : Decidable (_≑_ {A = M})

    -- The relation Prodrec-allowed-πŸ™α΅ is assumed to be decidable.
    Prodrec-allowed-πŸ™α΅? : βˆ€ r p q β†’ Dec (Prodrec-allowed-πŸ™α΅ r p q)

    -- The relation Unitrec-allowed-πŸ™α΅ is assumed to be decidable.
    Unitrec-allowed-πŸ™α΅? : βˆ€ p q β†’ Dec (Unitrec-allowed-πŸ™α΅ p q)

    -- The relation Emptyrec-allowed-πŸ™α΅ is assumed to be decidable.
    Emptyrec-allowed-πŸ™α΅? : βˆ€ p β†’ Dec (Emptyrec-allowed-πŸ™α΅ p)

    -- The relation []-cong-allowed-mode-πŸ™α΅ is assumed to be
    -- decidable.
    []-cong-allowed-mode-πŸ™α΅? : βˆ€ s β†’ Dec ([]-cong-allowed-mode-πŸ™α΅ s)

    instance
      -- The inference function is supported
      ⦃ inference-ok ⦄ : Natrec-mode-supports-usage-inference natrec-mode

    -- Either strong unit types are not allowed to be used as sinks,
    -- or 𝟘 is a greatest grade.
    no-sink-or-β‰€πŸ˜ : Β¬ StarΛ’-sink ⊎ (βˆ€ {p} β†’ p ≀ 𝟘)

  -- Inequality is decidable.

  _≀?_ : Decidable _≀_
  _≀?_ = ≑-decidable→≀-decidable _β‰Ÿ_

  -- Context inequality is decidable.

  _β‰€αΆœ?_ : Decidable (_β‰€αΆœ_ {n = n})
  _β‰€αΆœ?_ = β‰€αΆœ-decidable _≀?_

  opaque

    -- The relation Prodrec-allowed is decidable.

    Prodrec-allowed? : βˆ€ m r p q β†’ Dec (Prodrec-allowed m r p q)
    Prodrec-allowed? 𝟘ᡐ = Ξ» _ _ _ β†’ yes _
    Prodrec-allowed? πŸ™α΅ = Prodrec-allowed-πŸ™α΅?

  opaque

    -- The relation Unitrec-allowed is decidable.

    Unitrec-allowed? : βˆ€ m p q β†’ Dec (Unitrec-allowed m p q)
    Unitrec-allowed? 𝟘ᡐ = Ξ» _ _ β†’ yes _
    Unitrec-allowed? πŸ™α΅ = Unitrec-allowed-πŸ™α΅?

  opaque

    -- The relation Emptyrec-allowed is decidable.

    Emptyrec-allowed? : βˆ€ m p β†’ Dec (Emptyrec-allowed m p)
    Emptyrec-allowed? 𝟘ᡐ = Ξ» _ β†’ yes _
    Emptyrec-allowed? πŸ™α΅ = Emptyrec-allowed-πŸ™α΅?

  opaque

    -- The relation []-cong-allowed-mode is decidable.

    []-cong-allowed-mode? : βˆ€ s m β†’ Dec ([]-cong-allowed-mode s m)
    []-cong-allowed-mode? _ 𝟘ᡐ = yes _
    []-cong-allowed-mode? s πŸ™α΅ = []-cong-allowed-mode-πŸ™α΅? s