import Graded.Modality
import Graded.Mode
module Graded.Usage.Restrictions
{a b} {M : Set a} {Mode : Set b}
(open Graded.Modality M)
(𝕄 : Modality)
(open Graded.Mode Mode 𝕄)
(𝐌 : IsMode)
where
open import Graded.Context 𝕄
open import Graded.Usage.Erased-matches
open import Graded.Usage.Restrictions.Natrec 𝕄
open import Graded.Usage.Restrictions.Omega 𝕄
open import Definition.Untyped.NotParametrised
open import Tools.Bool
open import Tools.Function
open import Tools.Level
open import Tools.Product
open import Tools.PropositionalEquality
open import Tools.Relation
open import Tools.Sum
open import Tools.Empty
open import Tools.Unit
open Modality 𝕄
open IsMode 𝐌
private variable
p q r : M
m m′ : Mode
s : Strength
⦃ ok ⦄ : T _
γ δ η : Conₘ _
data JK : Set where
J K : JK
private variable
jk : JK
record Usage-restrictions : Set (lsuc a ⊔ b) where
no-eta-equality
field
natrec-mode : Natrec-mode
Prodrec-allowed : Mode → (r p q : M) → Set a
Prodrec-allowed-upwards-closed :
Prodrec-allowed m r p q → m ≤ᵐ m′ → Prodrec-allowed m′ r p q
Unitrec-allowed : Mode → (p q : M) → Set a
Unitrec-allowed-upwards-closed :
Unitrec-allowed m p q → m ≤ᵐ m′ → Unitrec-allowed m′ p q
Emptyrec-allowed : Mode → M → Set a
Emptyrec-allowed-upwards-closed :
Emptyrec-allowed m p → m ≤ᵐ m′ → Emptyrec-allowed m′ p
[]-cong-allowed-mode : Strength → Mode → Set a
[]-cong-allowed-mode-upwards-closed :
[]-cong-allowed-mode s m → m ≤ᵐ m′ → []-cong-allowed-mode s m′
starˢ-sink : Bool
Id-erased : Set a
Id-erased? : Dec Id-erased
usage-rules-with-ω : Usage-with-or-without-omega
erased-matches-for-JK : JK → Mode → Erased-matches
erased-matches-for-JK-≤ᵉᵐ :
m ≤ᵐ m′ → erased-matches-for-JK jk m ≤ᵉᵐ erased-matches-for-JK jk m′
erased-matches-for-JK-supports-ω :
erased-matches-for-JK jk m ≤ᵉᵐ some →
Usage-with-omega usage-rules-with-ω
Quotient-terms-allowed : Set a
Higher-quotient-constructors-allowed : Set a
Higher-quotient-constructors-allowed→¬Trivialᵐ :
Higher-quotient-constructors-allowed → ¬ Trivialᵐ
Higher-quotient-constructors→Quotient-terms :
Higher-quotient-constructors-allowed → Quotient-terms-allowed
Qrec-motive-erased : Set a
Qrec-motive-erased? :
Dec Qrec-motive-erased
Nr-available : Set a
Nr-available = Natrec-mode-has-nr natrec-mode
Nr-not-available : Set a
Nr-not-available = Natrec-mode-no-nr natrec-mode
Nr-not-available-GLB : Set a
Nr-not-available-GLB = Natrec-mode-no-nr-glb natrec-mode
Usage-allows-omega : Set a
Usage-allows-omega = Usage-with-omega usage-rules-with-ω
field
mode-supports-nr :
⦃ ok : Nr-available ⦄ →
Mode-supports-nr ⦃ has-nr = Natrec-mode-Has-nr ok ⦄ 𝐌
Starˢ-sink : Set
Starˢ-sink = T starˢ-sink
not-sink-and-no-sink : Starˢ-sink → ¬ Starˢ-sink → ⊥
not-sink-and-no-sink sink ¬sink with starˢ-sink
… | false = sink
… | true = ¬sink _
sink-or-no-sink : Starˢ-sink ⊎ ¬ Starˢ-sink
sink-or-no-sink with starˢ-sink
… | false = inj₂ idᶠ
… | true = inj₁ _
erased-matches-for-J : Mode → Erased-matches
erased-matches-for-J = erased-matches-for-JK J
erased-matches-for-K : Mode → Erased-matches
erased-matches-for-K = erased-matches-for-JK K
opaque
Usage-allows-omega-propositional : (p q : Usage-allows-omega) → p ≡ q
Usage-allows-omega-propositional = Usage-with-omega-propositional
opaque
erased-matches-for-J-≤ᵉᵐ :
m ≤ᵐ m′ → erased-matches-for-J m ≤ᵉᵐ erased-matches-for-J m′
erased-matches-for-J-≤ᵉᵐ = erased-matches-for-JK-≤ᵉᵐ
opaque
erased-matches-for-K-≤ᵉᵐ :
m ≤ᵐ m′ → erased-matches-for-K m ≤ᵉᵐ erased-matches-for-K m′
erased-matches-for-K-≤ᵉᵐ = erased-matches-for-JK-≤ᵉᵐ
opaque
Prodrec-allowed-·ᵐ :
Prodrec-allowed m r p q →
Prodrec-allowed (m′ ·ᵐ m) r p q
Prodrec-allowed-·ᵐ ok =
Prodrec-allowed-upwards-closed ok ·ᵐ-increasingˡ
opaque
Unitrec-allowed-·ᵐ :
Unitrec-allowed m p q →
Unitrec-allowed (m′ ·ᵐ m) p q
Unitrec-allowed-·ᵐ ok =
Unitrec-allowed-upwards-closed ok ·ᵐ-increasingˡ
opaque
Emptyrec-allowed-·ᵐ :
Emptyrec-allowed m p →
Emptyrec-allowed (m′ ·ᵐ m) p
Emptyrec-allowed-·ᵐ ok =
Emptyrec-allowed-upwards-closed ok ·ᵐ-increasingˡ
opaque
[]-cong-allowed-mode-·ᵐ :
[]-cong-allowed-mode s m →
[]-cong-allowed-mode s (m′ ·ᵐ m)
[]-cong-allowed-mode-·ᵐ ok =
[]-cong-allowed-mode-upwards-closed ok ·ᵐ-increasingˡ
instance
erased-matches-JK-≤-some-Usage-allows-omega :
⦃ ok : erased-matches-for-JK jk m ≤ᵉᵐ some ⦄ →
Usage-allows-omega
erased-matches-JK-≤-some-Usage-allows-omega ⦃ ok ⦄ =
erased-matches-for-JK-supports-ω
(≤ᵉᵐ-transitive (erased-matches-for-JK-≤ᵉᵐ 𝟙ᵐ≤) ok)
{-# INCOHERENT erased-matches-JK-≤-some-Usage-allows-omega #-}
instance
erased-matches-JK-≡-some-≤-some :
⦃ ok : erased-matches-for-JK jk m ≡ some ⦄ →
erased-matches-for-JK jk m ≤ᵉᵐ some
erased-matches-JK-≡-some-≤-some ⦃ ok ⦄ =
subst (_≤ᵉᵐ some) (sym ok) _
{-# INCOHERENT erased-matches-JK-≡-some-≤-some #-}
erased-matches-for-JK-≤ᵉᵐ·ᵐ :
erased-matches-for-JK jk m ≤ᵉᵐ erased-matches-for-JK jk (m′ ·ᵐ m)
erased-matches-for-JK-≤ᵉᵐ·ᵐ =
erased-matches-for-JK-≤ᵉᵐ ·ᵐ-increasingˡ
erased-matches-for-JK-all·ᵐ :
erased-matches-for-JK jk m ≡ all →
erased-matches-for-JK jk (m′ ·ᵐ m) ≡ all
erased-matches-for-JK-all·ᵐ ≡all =
≤ᵉᵐ→≡all→≡all erased-matches-for-JK-≤ᵉᵐ·ᵐ ≡all
erased-matches-for-J-all·ᵐ :
erased-matches-for-J m ≡ all →
erased-matches-for-J (m′ ·ᵐ m) ≡ all
erased-matches-for-J-all·ᵐ = erased-matches-for-JK-all·ᵐ
erased-matches-for-K-all·ᵐ :
erased-matches-for-K m ≡ all →
erased-matches-for-K (m′ ·ᵐ m) ≡ all
erased-matches-for-K-all·ᵐ = erased-matches-for-JK-all·ᵐ
erased-matches-for-JK-some·ᵐ :
erased-matches-for-JK jk m ≡ some →
erased-matches-for-JK jk (m′ ·ᵐ m) ≡ all ⊎
erased-matches-for-JK jk (m′ ·ᵐ m) ≡ some
erased-matches-for-JK-some·ᵐ {m} {m′} ≡-some =
some≤ᵉᵐ→ (subst (_≤ᵉᵐ erased-matches-for-JK _ (m′ ·ᵐ m))
≡-some erased-matches-for-JK-≤ᵉᵐ·ᵐ)
erased-matches-for-J-some·ᵐ :
erased-matches-for-J m ≡ some →
erased-matches-for-J (m′ ·ᵐ m) ≡ all ⊎
erased-matches-for-J (m′ ·ᵐ m) ≡ some
erased-matches-for-J-some·ᵐ = erased-matches-for-JK-some·ᵐ
erased-matches-for-K-some·ᵐ :
erased-matches-for-K m ≡ some →
erased-matches-for-K (m′ ·ᵐ m) ≡ all ⊎
erased-matches-for-K (m′ ·ᵐ m) ≡ some
erased-matches-for-K-some·ᵐ = erased-matches-for-JK-some·ᵐ
opaque
Usage-allows-omega? : Dec Usage-allows-omega
Usage-allows-omega? = Usage-with-omega?
opaque
⌜⌝-·ᶜ-nrᶜ :
⦃ ok : Nr-available ⦄ →
⌜ m ⌝ ·ᶜ nrᶜ ⦃ Natrec-mode-Has-nr ok ⦄ p r γ δ η ≈ᶜ
nrᶜ ⦃ Natrec-mode-Has-nr ok ⦄ p r (⌜ m ⌝ ·ᶜ γ) (⌜ m ⌝ ·ᶜ δ) (⌜ m ⌝ ·ᶜ η)
⌜⌝-·ᶜ-nrᶜ {γ = ε} {(ε)} {(ε)} = ε
⌜⌝-·ᶜ-nrᶜ {γ = _ ∙ _} {_ ∙ _} {_ ∙ _} ⦃ ok ⦄ =
⌜⌝-·ᶜ-nrᶜ ∙ Mode-supports-nr.⌜⌝-·-nr ⦃ has-nr = Natrec-mode-Has-nr ok ⦄ mode-supports-nr
opaque
⌞⌟·ᵐ⌞nr⌟₁ :
⦃ ok : Nr-available ⦄ {z s n : M} →
⌞ z ⌟ ·ᵐ ⌞ Has-nr.nr (Natrec-mode-Has-nr ok) p r z s n ⌟ ≡ ⌞ z ⌟
⌞⌟·ᵐ⌞nr⌟₁ ⦃ ok ⦄ =
sym (Mode-supports-nr.⌞nr⌟-decreasing₁ ⦃ has-nr = Natrec-mode-Has-nr ok ⦄ mode-supports-nr)
opaque
⌞⌟·ᵐ⌞nr⌟₃ :
⦃ ok : Nr-available ⦄ {z s n : M} →
⌞ n ⌟ ·ᵐ ⌞ Has-nr.nr (Natrec-mode-Has-nr ok) p r z s n ⌟ ≡ ⌞ n ⌟
⌞⌟·ᵐ⌞nr⌟₃ ⦃ ok ⦄ =
sym (Mode-supports-nr.⌞nr⌟-decreasing₃ ⦃ has-nr = Natrec-mode-Has-nr ok ⦄ mode-supports-nr)