open import Graded.Modality
open import Graded.Mode
open import Graded.Usage.Restrictions
open import Definition.Typed.Restrictions
module Graded.Heap.Assumptions
{a b} {M : Set a} {Mode : Set b}
{𝕄 : Modality M}
{𝐌 : IsMode Mode 𝕄}
(UR : Usage-restrictions 𝕄 𝐌)
(TR : Type-restrictions 𝕄)
(∣ε∣ : M)
where
open Modality 𝕄
open IsMode 𝐌
open Type-restrictions TR
open Usage-restrictions UR
open import Graded.Modality.Properties.Subtraction 𝕄
import Graded.Heap.Reduction
import Graded.Heap.Typed
import Graded.Heap.Untyped
import Graded.Heap.Usage
open import Graded.Usage.Restrictions.Natrec 𝕄
open import Definition.Untyped M
open import Definition.Typed TR
open import Tools.Empty
open import Tools.Function
open import Tools.Level
open import Tools.Product
open import Tools.PropositionalEquality
open import Tools.Relation
open import Tools.Sum
record Assumptions : Set (a ⊔ b) where
field
Level-not-allowed : ¬ Level-allowed
subtraction-ok : Supports-subtraction
Unitʷ-η→ : ∀ {m p q} → Unitʷ-η → Unitrec-allowed m p q → ⌜ m ⌝ ≢ 𝟘 → p ≤ 𝟘
natrec-mode-ok :
(Σ Nr-available λ has-nr →
Is-factoring-nr M (Natrec-mode-Has-nr has-nr)) ⊎
Nr-not-available-GLB
opaque
¬Nr-not-available : ¬ Nr-not-available
¬Nr-not-available x =
case natrec-mode-ok of λ where
(inj₁ (y , _)) → ¬[Nr∧No-nr] y x
(inj₂ y) → ¬[No-nr∧No-nr-glb] x y
opaque
factoring-nr :
⦃ has-nr : Nr-available ⦄ →
Is-factoring-nr M (Natrec-mode-Has-nr has-nr)
factoring-nr ⦃ has-nr ⦄ =
case natrec-mode-ok of λ where
(inj₁ (has-nr′ , factoring)) →
case Nr-available-propositional has-nr has-nr′ of λ where
refl → factoring
(inj₂ no-nr) → ⊥-elim (¬[Nr∧No-nr-glb] has-nr no-nr)
open Graded.Heap.Reduction type-variant UR factoring-nr ∣ε∣
open Graded.Heap.Typed UR TR factoring-nr ∣ε∣
open Graded.Heap.Untyped type-variant UR factoring-nr ∣ε∣
open Graded.Heap.Usage type-variant UR factoring-nr ∣ε∣
⊢▸Final-Reasons : ∀ {k m n} → Con Term k → Heap k m → Term n → Wk m n → Stack m → Set _
⊢▸Final-Reasons {k} Δ H t ρ S =
∀ {A : Term k} →
Δ ⊢ₛ ⟨ H , t , ρ , S ⟩ ∷ A →
▸ ⟨ H , t , ρ , S ⟩ →
Final ⟨ H , t , ρ , S ⟩ →
Value t × S ≡ ε