open import Data.Empty using (⊥)
open import Data.Fin using (Fin; suc; zero)
open import Data.Nat using (ℕ; suc; zero)
open import Data.Product using (_×_; ∃; ∃-syntax; _,_)
open import Data.Unit using (⊤; tt)
open import CBPV.Base.Semantics
open import CBPV.Base.SemanticTyping
open import CBPV.Base.SyntacticTyping
open import CBPV.Base.Terms
open import CBPV.Base.Types
module CBPV.Base.TypeSoundness where
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) =
semanticSeq {Γ = Γ} {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) =
semanticRet {Γ = Γ} (fundamental-lemma-val ⊢V)
fundamental-lemma-comp (typeLetin {B = B} ⊢M ⊢N) =
semanticLetin {B = B}
(fundamental-lemma-comp ⊢M)
(fundamental-lemma-comp ⊢N)
fundamental-lemma-comp (typeSplit {B = B} ⊢V ⊢M) =
semanticSplit {B = B}
(fundamental-lemma-val ⊢V)
(fundamental-lemma-comp ⊢M)
fundamental-lemma-comp (typeCase {B = B} ⊢V ⊢M₁ ⊢M₂) =
semanticCase {B = B}
(fundamental-lemma-val ⊢V)
(fundamental-lemma-comp ⊢M₁)
(fundamental-lemma-comp ⊢M₂)
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)
type-soundness : ∅ ⊢c M ⦂ B
→ ∃[ T ] ∅ᵨ ⊢c M ⇓ T
type-soundness ⊢M
with fundamental-lemma-comp ⊢M (λ ())
... | T , M⇓ , _ = T , M⇓