ContextualEquivalence: 指称相等蕴含语境等价
module plfa.part3.ContextualEquivalence where
导入
open import Data.Product using (_×_; Σ; Σ-syntax; ∃; ∃-syntax; proj₁; proj₂) renaming (_,_ to ⟨_,_⟩) open import plfa.part2.Untyped using (_⊢_; ★; ∅; _,_; ƛ_; _—↠_) open import plfa.part2.BigStep using (_⊢_⇓_; cbn→reduce) open import plfa.part3.Denotational using (ℰ; _≃_; ≃-sym; ≃-trans; _iff_) open import plfa.part3.Compositional using (Ctx; plug; compositionality) open import plfa.part3.Soundness using (soundness) open import plfa.part3.Adequacy using (↓→⇓)
语境等价
语境等价(Contextual Equivalence)对编程语言来说是一种很重要的概念, 因为它是在保持程序整体行为的同时更改程序子项的充分条件。若两个项 M
和 N
分别插入到任意语境 C
中所产生的结果等价,则二者语境等价。 正如指称语义一章中所讨论过的,λ-演算中程序所产生的结果要么停机要么发散。 我们用下面的归约语义来刻画停机:
terminates : ∀{Γ} → (M : Γ ⊢ ★) → Set terminates {Γ} M = Σ[ N ∈ (Γ , ★ ⊢ ★) ] (M —↠ ƛ N)
因此将语境等价的两个项插入到相同的语境中,产生的两个程序要么都停机, 要么都发散。
_≅_ : ∀{Γ} → (M N : Γ ⊢ ★) → Set (_≅_ {Γ} M N) = ∀ {C : Ctx Γ ∅} → (terminates (plug C M)) iff (terminates (plug C N))
由于语境 C
是全称量化的,因此两个项是否语境等价很难直接基于上述定义来证明。 发展指称语义的主要动机之一就是找到一种方式,只需要对两个项进行论证就能证明二者语境等价。
指称等价蕴含语境等价
值得庆幸的是,「指称等价蕴含语境等价」的证明是我们已经证明的结果的一个简单推论。 除此之外,「当且仅当」的两个方向是对称的,因此我们可以证明一个引理, 然后在主定理中应用它两次。
该引理陈述了,若 M
和 N
指称等价,并且若将 M
插入到 C
中可停机,则将 N
插入到 C
中也停机。
denot-equal-terminates : ∀{Γ} {M N : Γ ⊢ ★} {C : Ctx Γ ∅} → ℰ M ≃ ℰ N → terminates (plug C M) ----------------------------------- → terminates (plug C N) denot-equal-terminates {Γ}{M}{N}{C} ℰM≃ℰN ⟨ N′ , CM—↠ƛN′ ⟩ = let ℰCM≃ℰƛN′ = soundness CM—↠ƛN′ in let ℰCM≃ℰCN = compositionality{Γ = Γ}{Δ = ∅}{C = C} ℰM≃ℰN in let ℰCN≃ℰƛN′ = ≃-trans (≃-sym ℰCM≃ℰCN) ℰCM≃ℰƛN′ in cbn→reduce (proj₂ (proj₂ (proj₂ (↓→⇓ ℰCN≃ℰƛN′))))
证明过程很直白,因为 plug C —↠ plug C (ƛ N′)
,我们应用可靠性定理得到
ℰ (plug C M) ≃ ℰ (ƛ N′)
根据 ℰ M ≃ ℰ N
,应用组合性定理可得
ℰ (plug C M) ≃ ℰ (plug C N).
将两个事实合并可得
ℰ (plug C N) ≃ ℰ (ƛ N′).
应用充分性一章中的 ↓→⇓
可推出
∅' ⊢ plug C N ⇓ clos (ƛ N′′) δ).
由于「传名调用求值」蕴含「可归约到 λ-抽象」,因此可得
terminates (plug C N).
两次应用该引理后,主定理即可得证。
denot-equal-contex-equal : ∀{Γ} {M N : Γ ⊢ ★} → ℰ M ≃ ℰ N --------- → M ≅ N denot-equal-contex-equal{Γ}{M}{N} eq {C} = ⟨ (λ tm → denot-equal-terminates eq tm) , (λ tn → denot-equal-terminates (≃-sym eq) tn) ⟩
Unicode
本章使用了以下 Unicode:
≅ U+2245 APPROXIMATELY EQUAL TO (\~= or \cong)