module Type.BetaNBE.Soundness where
open import Function using (_∘_;id) open import Data.Sum using (inj₁;inj₂) open import Data.Product using (Σ;_×_;_,_) open import Data.Vec using (Vec;[];_∷_) open import Data.List using (List;[];_∷_) open import Relation.Binary.PropositionalEquality using (_≡_;refl;sym;trans;cong;cong₂) open import Utils using (*;♯;_⇒_) open import Type using (Ctx⋆;_,⋆_;_⊢⋆_;_∋⋆_;Z;S) open _⊢⋆_ open import Type.Equality using (_≡β_;≡2β;ren≡β;_⟨[≡]⟩β_;_[≡]β_) open _≡β_ open import Type.RenamingSubstitution using (Ren;ren;ext;ext-id;ren-comp;ren-id;ren-cong;ext-comp;exts;weaken) using (Sub;sub;sub-cons;sub-id;sub-comp;sub-cong;sub-ren;sub-List;sub-VecList) open import Type.BetaNormal using (_⊢Ne⋆_;embNf;ren-embNf;embNe;ren-embNe;embNf-List;embNf-VecList) open import Type.BetaNBE using (Val;renVal;_·V_;reflect;reify;Env;_,,⋆_;fresh;eval;idEnv;nf;eval-List;eval-VecList)
The Soundness Relation (SR) is a Kripke logical relation between types and their values. It is defined by induction on kinds. it says that a type is related to a value if when we reach ground kind (# or *) then the type is beta-eta-equal to the result of reifying the value.
SR : ∀{Φ} K → Φ ⊢⋆ K → Val Φ K → Set SR * A v = A ≡β embNf v SR ♯ A v = A ≡β embNf v SR (K ⇒ J) A (inj₁ n) = A ≡β embNe n SR (K ⇒ J) A (inj₂ f) = Σ (_ ,⋆ K ⊢⋆ J) λ B → (A ≡β ƛ B) -- this bit of indirection is needed as we have only β not βη × ∀{Ψ} → (ρ : Ren _ Ψ) → {u : Ψ ⊢⋆ K} → {v : Val Ψ K} → SR K u v ----------------------------------------------------- → SR J (ren ρ (ƛ B) · u) (renVal ρ (inj₂ f) ·V v)
reflectSR : ∀{Φ K}{A : Φ ⊢⋆ K}{n : Φ ⊢Ne⋆ K} → A ≡β embNe n ------------------ → SR K A (reflect n) reflectSR {K = *} p = p reflectSR {K = ♯} p = p reflectSR {K = K ⇒ J} p = p reifySR : ∀{Φ K}{A : Φ ⊢⋆ K}{v : Val Φ K} → SR K A v -------------------- → A ≡β embNf (reify v) reifySR {K = *} p = p reifySR {K = ♯} p = p reifySR {K = K ⇒ J} {v = inj₁ n} p = p reifySR {K = K ⇒ J} {v = inj₂ f} (A' , p , q) = trans≡β p (trans≡β (≡2β (cong ƛ (trans (trans (sym (sub-id A')) (sub-cong (λ { Z → refl ; (S α) → refl}) A')) (sub-ren A')))) (ƛ≡β (trans≡β (sym≡β (β≡β _ _)) (reifySR (q S (reflectSR (refl≡β (` Z))))))))
Lifting SR from ⊢⋆/Val to Sub/Env
SREnv : ∀{Φ Ψ} → Sub Φ Ψ → Env Φ Ψ → Set SREnv {Φ} σ η = ∀{K}(α : Φ ∋⋆ K) → SR K (σ α) (η α)
Cons for SREnv
SR,,⋆ : ∀{Φ Ψ}{σ : Sub Φ Ψ}{η : Env Φ Ψ} → SREnv σ η → ∀{K}{A : Ψ ⊢⋆ K}{v : Val Ψ K} → SR K A v → SREnv (sub-cons σ A) (η ,,⋆ v) SR,,⋆ p q Z = q SR,,⋆ p q (S α) = p α
SR is closed under ≡β
subSR : ∀{Φ K}{A A' : Φ ⊢⋆ K} → A' ≡β A → {v : Val Φ K} → SR K A v --------------------------- → SR K A' v subSR {K = *} p q = trans≡β p q subSR {K = ♯} p q = trans≡β p q subSR {K = K ⇒ J} p {inj₁ n} q = trans≡β p q subSR {K = K ⇒ J} p {inj₂ f} (A' , q , r) = _ , trans≡β p q , r
renaming for SR
renSR : ∀{Φ Ψ}(ρ : Ren Φ Ψ){K}{A : Φ ⊢⋆ K}{v : Val Φ K} → SR K A v --------------------------------- → SR K (ren ρ A) (renVal ρ v) renSR ρ {*}{A}{n} p = trans≡β (ren≡β ρ p) (sym≡β (≡2β (ren-embNf ρ n))) renSR ρ {♯}{A}{n} p = trans≡β (ren≡β ρ p) (sym≡β (≡2β (ren-embNf ρ n))) renSR ρ {K ⇒ J} {A} {inj₁ n} p = trans≡β (ren≡β ρ p) (sym≡β (≡2β (ren-embNe ρ n))) renSR ρ {K ⇒ J} {A} {inj₂ f} (A' , p , q) = ren (ext ρ) A' , ren≡β ρ p , λ ρ' {u}{v} r → subSR (≡2β (cong₂ _·_ (cong ƛ (trans (sym (ren-comp A')) (ren-cong (sym ∘ ext-comp) A'))) refl)) (q (ρ' ∘ ρ) r)
Extending via exts is the same the same as weakening and cons on ` Z
exts-sub-cons : ∀{Φ Ψ K J} → (σ : Sub Φ Ψ) → (α : Φ ,⋆ J ∋⋆ K) → exts σ α ≡ sub-cons (weaken ∘ σ) (` Z) α exts-sub-cons σ Z = refl exts-sub-cons σ (S _) = refl
SREnv is closed under (pointwise) equality of environments
subSREnv : ∀{Φ Ψ}{σ σ' : Sub Φ Ψ} → (∀{K}(α : Φ ∋⋆ K) → σ α ≡ σ' α) → {η : Env Φ Ψ} → SREnv σ η ------------------------------- → SREnv σ' η subSREnv p q α rewrite sym (p α) = q α
SREnv is closed under exts/extending the env (note: would this be cleaner if we used exte?)
SRweak : ∀{Φ Ψ}{σ : Sub Φ Ψ}{η : Env Φ Ψ} → SREnv σ η → ∀ {K} ------------------------------------------------------- → SREnv (exts σ) ((renVal S ∘ η) ,,⋆ fresh {σ = K}) SRweak p = subSREnv (sym ∘ exts-sub-cons _) (SR,,⋆ (renSR S ∘ p) (reflectSR (refl≡β (` Z))))
SR is closed under ·V
SRApp : ∀{Φ K J} → {A : Φ ⊢⋆ (K ⇒ J)} → {f : Val Φ (K ⇒ J)} → SR (K ⇒ J) A f → {u : Φ ⊢⋆ K} → {v : Val Φ K} → SR K u v --------------------- → SR J (A · u) (f ·V v) SRApp {f = inj₁ n} p q = reflectSR (·≡β (reflectSR p) (reifySR q)) SRApp {f = inj₂ f} (A' , p , q) r = subSR (·≡β (trans≡β p (≡2β (cong ƛ (trans (sym (ren-id A')) (ren-cong (sym ∘ ext-id) A'))))) (refl≡β _)) (q id r)
Fundamental Theorem of Logical Relations for SR
evalSR : ∀{Φ Ψ K}(A : Φ ⊢⋆ K){σ : Sub Φ Ψ}{η : Env Φ Ψ} → SREnv σ η → SR K (sub σ A) (eval A η) evalSR-List : ∀{Φ Ψ}(xs : List (Φ ⊢⋆ *)){σ : Sub Φ Ψ}{η : Env Φ Ψ} → SREnv σ η → sub-List σ xs [≡]β embNf-List (eval-List xs η) evalSR-VecList : ∀{Φ Ψ n}(xss : Vec (List (Φ ⊢⋆ *)) n){σ : Sub Φ Ψ}{η : Env Φ Ψ} → SREnv σ η → sub-VecList σ xss ⟨[≡]⟩β embNf-VecList (eval-VecList xss η) evalSR (` α) p = p α evalSR (Π B) p = Π≡β (evalSR B (SRweak p)) evalSR (A ⇒ B) p = ⇒≡β (evalSR A p) (evalSR B p) evalSR (ƛ B) {σ}{η} p = sub (exts σ) B , refl≡β _ , λ ρ {u}{v} q → subSR (trans≡β (β≡β _ _) (≡2β (trans (sym (sub-ren (sub (exts σ) B))) (trans (sym (sub-comp B)) (sub-cong (λ { Z → refl ; (S α) → trans (sym (sub-ren (σ α))) (trans (sub-ren (σ α)) (sub-id (ren ρ (σ α))))}) B))))) (evalSR B (SR,,⋆ (renSR ρ ∘ p) q)) evalSR (A · B) p = SRApp (evalSR A p) (evalSR B p) evalSR (μ A B) p = μ≡β (reifySR (evalSR A p)) (reifySR (evalSR B p)) evalSR (^ b) p = reflectSR (refl≡β _) evalSR (con c) p = con≡β (evalSR c p) evalSR (SOP xss) p = SOP≡β (evalSR-VecList xss p) evalSR-List [] p = _[≡]β_.nil[≡]β evalSR-List (x ∷ xs) p = _[≡]β_.cons[≡]β (evalSR x p) (evalSR-List xs p) evalSR-VecList [] p = _⟨[≡]⟩β_.nil⟨[≡]⟩β evalSR-VecList (xs ∷ xss) p = _⟨[≡]⟩β_.cons⟨[≡]⟩β (evalSR-List xs p) (evalSR-VecList xss p)
Identity SREnv
idSR : ∀{Φ} → SREnv ` (idEnv Φ) idSR = reflectSR ∘ _≡β_.refl≡β ∘ `
Soundness Result
soundness : ∀ {Φ J} → (A : Φ ⊢⋆ J) → A ≡β embNf (nf A) soundness A = trans≡β (≡2β (sym (sub-id A))) (reifySR (evalSR A idSR))