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 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ₘ _
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
erased-matches-for-J : Mode → Erased-matches
erased-matches-for-J-≤ᵉᵐ :
m ≤ᵐ m′ → erased-matches-for-J m ≤ᵉᵐ erased-matches-for-J m′
erased-matches-for-K : Mode → Erased-matches
erased-matches-for-K-≤ᵉᵐ :
m ≤ᵐ m′ → erased-matches-for-K m ≤ᵉᵐ erased-matches-for-K m′
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
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₁ _
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ˡ
opaque
erased-matches-for-J-≤ᵉᵐ·ᵐ :
erased-matches-for-J m ≤ᵉᵐ erased-matches-for-J (m′ ·ᵐ m)
erased-matches-for-J-≤ᵉᵐ·ᵐ =
erased-matches-for-J-≤ᵉᵐ ·ᵐ-increasingˡ
opaque
erased-matches-for-J-all·ᵐ :
erased-matches-for-J m ≡ all →
erased-matches-for-J (m′ ·ᵐ m) ≡ all
erased-matches-for-J-all·ᵐ ≡all =
≤ᵉᵐ→≡all→≡all erased-matches-for-J-≤ᵉᵐ·ᵐ ≡all
opaque
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·ᵐ {m} {m′} ≡some =
some≤ᵉᵐ→ (subst (_≤ᵉᵐ erased-matches-for-J (m′ ·ᵐ m))
≡some erased-matches-for-J-≤ᵉᵐ·ᵐ)
private opaque
erased-matches-for-JK-not-none·ᵐ :
∀ sem em → not-none sem ≤ᵉᵐ em →
∃ λ sem′ → em ≡ not-none sem′
erased-matches-for-JK-not-none·ᵐ all′ none ()
erased-matches-for-JK-not-none·ᵐ all′ (not-none x) _ = x , refl
erased-matches-for-JK-not-none·ᵐ some′ none ()
erased-matches-for-JK-not-none·ᵐ some′ (not-none x) le = x , refl
opaque
erased-matches-for-J-not-none·ᵐ :
∀ {sem} →
erased-matches-for-J m ≡ not-none sem →
∃ λ sem′ → erased-matches-for-J (m′ ·ᵐ m) ≡ not-none sem′
erased-matches-for-J-not-none·ᵐ {m} {m′} ok =
erased-matches-for-JK-not-none·ᵐ _ _
(subst (_≤ᵉᵐ erased-matches-for-J (m′ ·ᵐ m)) ok erased-matches-for-J-≤ᵉᵐ·ᵐ)
opaque
erased-matches-for-K-≤ᵉᵐ·ᵐ :
erased-matches-for-K m ≤ᵉᵐ erased-matches-for-K (m′ ·ᵐ m)
erased-matches-for-K-≤ᵉᵐ·ᵐ =
erased-matches-for-K-≤ᵉᵐ ·ᵐ-increasingˡ
opaque
erased-matches-for-K-all·ᵐ :
erased-matches-for-K m ≡ all →
erased-matches-for-K (m′ ·ᵐ m) ≡ all
erased-matches-for-K-all·ᵐ ≡all =
≤ᵉᵐ→≡all→≡all erased-matches-for-K-≤ᵉᵐ·ᵐ ≡all
opaque
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·ᵐ {m} {m′} ≡some =
some≤ᵉᵐ→ (subst (_≤ᵉᵐ erased-matches-for-K (m′ ·ᵐ m))
≡some erased-matches-for-K-≤ᵉᵐ·ᵐ)
opaque
erased-matches-for-K-not-none·ᵐ :
∀ {sem} →
erased-matches-for-K m ≡ not-none sem →
∃ λ sem′ → erased-matches-for-K (m′ ·ᵐ m) ≡ not-none sem′
erased-matches-for-K-not-none·ᵐ {m} {m′} ok =
erased-matches-for-JK-not-none·ᵐ _ _
(subst (_≤ᵉᵐ erased-matches-for-K (m′ ·ᵐ m)) ok erased-matches-for-K-≤ᵉᵐ·ᵐ)
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)