open import Data.Nat using (ℕ; zero)
open import Data.Product using (_×_; ∃; ∃-syntax; _,_)
open import CBPV.Effects.Terms
open import Effects
module CBPV.Effects.EffectSoundness (E : Effect) where
open import CBPV.Effects.Semantics E
open import CBPV.Effects.SemanticTyping E
open import CBPV.Effects.SyntacticTyping E
open import CBPV.Effects.Types E
open Effect E
open Properties E
mutual
fundamental-lemma-val : Γ ⊢v V ⦂ A
→ Γ ⊨v V ⦂ A
fundamental-lemma-val {Γ = Γ} typeVar =
semanticVar {Γ = Γ}
fundamental-lemma-val {Γ = Γ} typeUnit =
semanticUnit {Γ = Γ}
fundamental-lemma-val {Γ = Γ} (typeThunk ⊢M) =
semanticThunk {Γ = Γ} (fundamental-lemma-comp ⊢M)
fundamental-lemma-val {Γ = Γ} (typePair ⊢V₁ ⊢V₂) =
semanticPair {Γ = Γ}
(fundamental-lemma-val ⊢V₁)
(fundamental-lemma-val ⊢V₂)
fundamental-lemma-val {Γ = Γ} (typeInl ⊢V) =
semanticInl {Γ = Γ} (fundamental-lemma-val ⊢V)
fundamental-lemma-val {Γ = Γ} (typeInr ⊢V) =
semanticInr {Γ = Γ} (fundamental-lemma-val ⊢V)
fundamental-lemma-comp : Γ ⊢c M ⦂ B # φ
→ Γ ⊨c M ⦂ B # φ
fundamental-lemma-comp (typeAbs ⊢M) =
semanticAbs (fundamental-lemma-comp ⊢M)
fundamental-lemma-comp {Γ = Γ} (typeApp ⊢M ⊢V) =
semanticApp {Γ = Γ}
(fundamental-lemma-comp ⊢M)
(fundamental-lemma-val ⊢V)
fundamental-lemma-comp {Γ = Γ} (typeSequence {B = B} ⊢V ⊢M) =
semanticSequence {Γ = Γ} {B = B}
(fundamental-lemma-val ⊢V)
(fundamental-lemma-comp ⊢M)
fundamental-lemma-comp {Γ = Γ} (typeForce ⊢V φ′≤φ) =
semanticForce {Γ = Γ} (fundamental-lemma-val ⊢V) φ′≤φ
fundamental-lemma-comp {Γ = Γ} (typeRet ⊢V pure≤φ) =
semanticRet {Γ = Γ} (fundamental-lemma-val ⊢V) pure≤φ
fundamental-lemma-comp (typeLetin {B = B} ⊢M ⊢N φ₁+φ₂≤φ) =
semanticLetin {B = B}
(fundamental-lemma-comp ⊢M)
(fundamental-lemma-comp ⊢N)
φ₁+φ₂≤φ
fundamental-lemma-comp {B = B} (typeSplit ⊢V ⊢M) =
semanticSplit {B = B}
(fundamental-lemma-val ⊢V)
(fundamental-lemma-comp ⊢M)
fundamental-lemma-comp {B = B} (typeCase ⊢V ⊢M₁ ⊢M₂) =
semanticCase {B = B}
(fundamental-lemma-val ⊢V)
(fundamental-lemma-comp ⊢M₁)
(fundamental-lemma-comp ⊢M₂)
fundamental-lemma-comp {Γ = Γ} (typeTick tock≤φ) =
semanticTick {Γ = Γ} tock≤φ
fundamental-lemma-comp {Γ = Γ} (typeCpair ⊢M₁ ⊢M₂) =
semanticCpair {Γ = Γ}
(fundamental-lemma-comp ⊢M₁)
(fundamental-lemma-comp ⊢M₂)
fundamental-lemma-comp {Γ = Γ} (typeProjl ⊢M) =
semanticProjl {Γ = Γ} (fundamental-lemma-comp ⊢M)
fundamental-lemma-comp {Γ = Γ} (typeProjr ⊢M) =
semanticProjr {Γ = Γ} (fundamental-lemma-comp ⊢M)
effect-soundness : ∅ ⊢c M ⦂ 𝑭 A # φ
→ ∃[ T ] ∃[ φ′ ] φ′ ≤ φ × ∅ᵨ ⊢c M ⇓ T # φ′
effect-soundness ⊢M
with fundamental-lemma-comp ⊢M (λ ())
... | T@(return _) , φ′ , _ , M⇓ , (_ , pure≤φ″) , φ′+φ″≤φ =
T , φ′ , ≤-+-invertʳ φ′+φ″≤φ pure≤φ″ , M⇓