some edits

This commit is contained in:
Jeremy Siek 2020-04-09 09:15:25 -04:00
parent 2dc431121e
commit 2afe5706a1

View file

@ -22,7 +22,7 @@ Such a property would tell us that having a denotation implies either
reduction to normal form or divergence. This is indeed true, but we reduction to normal form or divergence. This is indeed true, but we
can prove a much stronger property! In fact, having a denotation that can prove a much stronger property! In fact, having a denotation that
is a function value (not `⊥`) implies reduction to a lambda is a function value (not `⊥`) implies reduction to a lambda
abstraction (no divergence). abstraction.
This stronger property, reformulated a bit, is known as _adequacy_. This stronger property, reformulated a bit, is known as _adequacy_.
That is, if a term `M` is denotationally equal to a lambda abstraction, That is, if a term `M` is denotationally equal to a lambda abstraction,
@ -30,23 +30,21 @@ then `M` reduces to a lambda abstraction.
M ≃ (ƛ N) implies M —↠ ƛ N' for some N' M ≃ (ƛ N) implies M —↠ ƛ N' for some N'
Recall that ` M ≃ (ƛ N)` is equivalent to saying that Recall that ` M ≃ (ƛ N)` is equivalent to saying that `γ ⊢ M ↓ (v ↦
`γ ⊢ M ↓ (v ↦ w)` for some `v` and `w`. We will show that w)` for some `v` and `w`. We will show that `γ ⊢ M ↓ (v ↦ w)` implies
`γ ⊢ M ↓ (v ↦ w)` implies reduction a lambda abstraction. multi-step reduction a lambda abstraction. The recursive structure of
the derivations for `γ ⊢ M ↓ (v ↦ w)` are completely different from
It is well known that a term can reduce to a lambda abstraction using the structure of multi-step reductions, so a direct proof would be
full β reduction if and only if it can reduce to a lambda abstraction challenging. However, The structure of `γ ⊢ M ↓ (v ↦ w)` closer to
using the call-by-name reduction strategy. So we shall prove that that of the [BigStep](../part2/BigStep.lagda.md) call-by-name
`γ ⊢ M ↓ (v ↦ w)` implies that `M` halts under call-by-name evaluation, evaluation. Further, we already proved that big-step evaluation
which we define with a big-step semantics written `γ' ⊢ M ⇓ c`, where implies multi-step reduction to a lambda (`cbn→reduce`). So we shall
`c` is a closure (a term paired with an environment) and `γ'` is an prove that `γ ⊢ M ↓ (v ↦ w)` implies that `γ' ⊢ M ⇓ c`, where `c` is a
environment that maps variables to closures closure (a term paired with an environment), `γ'` is an environment
that maps variables to closures, and `γ` and `γ'` are appropriate
So we will show that `γ ⊢ M ↓ (v ↦ w)` implies `γ' ⊢ M ⇓ c`, related. The proof will be an induction on the derivation of
provided `γ` and `γ'` are appropriate related. The proof will `γ ⊢ M ↓ v`, and to strengthen the induction hypothesis, we will relate
be an induction on the derivation of `γ ⊢ M ↓ v`, and to semantic values to closures using a _logical relation_ `𝕍`.
strengthen the induction hypothesis, we will relate semantic values to
closures using a _logical relation_ `𝕍`.
The rest of this chapter is organized as follows. The rest of this chapter is organized as follows.
@ -55,9 +53,6 @@ The rest of this chapter is organized as follows.
equal to a function value. We establish several properties about equal to a function value. We establish several properties about
being ``greater than a function''. being ``greater than a function''.
* We define the call-by-name big-step semantics of the lambda calculus
and prove that it is deterministic.
* We define the logical relation `𝕍` that relates values and closures, * We define the logical relation `𝕍` that relates values and closures,
and extend it to a relation on terms `𝔼` and environments `𝔾`. and extend it to a relation on terms `𝔼` and environments `𝔾`.
@ -265,7 +260,6 @@ by `𝔼`.
𝔾-ext {Γ} {γ} {γ'} g e {S x} = g 𝔾-ext {Γ} {γ} {γ'} g e {S x} = g
``` ```
We need a few properties of the `𝕍` and `𝔼` relations. The first is that We need a few properties of the `𝕍` and `𝔼` relations. The first is that
a closure in the `𝕍` relation must be in weak-head normal form. We a closure in the `𝕍` relation must be in weak-head normal form. We
define WHNF has follows. define WHNF has follows.
@ -582,16 +576,14 @@ kth-x{γ' = γ'}{x = x} with γ' x
## Proof of denotational adequacy ## Proof of denotational adequacy
The adequacy property is a corollary of the main lemma. From the main lemma we can directly show that ` M ≃ (ƛ N)` implies
We have `∅ ⊢ ƛ N ↓ ⊥ ↦ ⊥`, so ` M ≃ (ƛ N)` that `M` big-steps to a lambda, i.e., `∅ ⊢ M ⇓ clos (ƛ N) γ`.
gives us `∅ ⊢ M ↓ ⊥ ↦ ⊥`. Then the main lemma gives us
`∅ ⊢ M ⇓ clos (ƛ N) γ` for some `N` and `γ`.
``` ```
adequacy : ∀{M : ∅ ⊢ ★}{N : ∅ , ★ ⊢ ★} → M ≃ (ƛ N) ↓→⇓ : ∀{M : ∅ ⊢ ★}{N : ∅ , ★ ⊢ ★} → M ≃ (ƛ N)
→ Σ[ Γ ∈ Context ] Σ[ N ∈ (Γ , ★ ⊢ ★) ] Σ[ γ ∈ ClosEnv Γ ] → Σ[ Γ ∈ Context ] Σ[ N ∈ (Γ , ★ ⊢ ★) ] Σ[ γ ∈ ClosEnv Γ ]
∅' ⊢ M ⇓ clos (ƛ N) γ ∅' ⊢ M ⇓ clos (ƛ N) γ
adequacy{M}{N} eq ↓→⇓{M}{N} eq
with ↓→𝔼 𝔾-∅ ((proj₂ (eq `∅ (⊥ ↦ ⊥))) (↦-intro ⊥-intro)) with ↓→𝔼 𝔾-∅ ((proj₂ (eq `∅ (⊥ ↦ ⊥))) (↦-intro ⊥-intro))
⟨ ⊥ , ⟨ ⊥ , ⊑-refl ⟩ ⟩ ⟨ ⊥ , ⟨ ⊥ , ⊑-refl ⟩ ⟩
... | ⟨ clos {Γ} M γ , ⟨ M⇓c , Vc ⟩ ⟩ ... | ⟨ clos {Γ} M γ , ⟨ M⇓c , Vc ⟩ ⟩
@ -600,26 +592,46 @@ adequacy{M}{N} eq
⟨ Γ , ⟨ N , ⟨ γ , M⇓c ⟩ ⟩ ⟩ ⟨ Γ , ⟨ N , ⟨ γ , M⇓c ⟩ ⟩ ⟩
``` ```
The proof goes as follows. We derive `∅ ⊢ ƛ N ↓ ⊥ ↦ ⊥` and
then ` M ≃ (ƛ N)` gives us `∅ ⊢ M ↓ ⊥ ↦ ⊥`. We conclude
by applying the main lemma to obtain `∅ ⊢ M ⇓ clos (ƛ N) γ`
for some `N` and `γ`.
Now to prove the adequacy property. We apply the above
lemma to obtain `∅ ⊢ M ⇓ clos (ƛ N) γ` and then
apply `cbn→reduce` to conclude.
```
adequacy : ∀{M : ∅ ⊢ ★}{N : ∅ , ★ ⊢ ★}
M ≃ (ƛ N)
→ Σ[ N ∈ (∅ , ★ ⊢ ★) ]
(M —↠ ƛ N)
adequacy{M}{N} eq
with ↓→⇓ eq
... | ⟨ Γ , ⟨ N , ⟨ γ , M⇓ ⟩ ⟩ ⟩ =
cbn→reduce M⇓
```
## Call-by-name is equivalent to beta reduction ## Call-by-name is equivalent to beta reduction
As promised, we return to the question of whether call-by-name As promised, we return to the question of whether call-by-name
evaluation is equivalent to beta reduction. In the chapter CallByName evaluation is equivalent to beta reduction. In chapter
we established the forward direction: that if call-by-name produces a [BigStep](../part2/BigStep.lagda.md) we established the forward
result, then the program beta reduces to a lambda abstraction. We now direction: that if call-by-name produces a result, then the program
prove the backward direction of the if-and-only-if, leveraging our beta reduces to a lambda abstraction (`cbn→reduce`). We now prove the backward
results about the denotational semantics. direction of the if-and-only-if, leveraging our results about the
denotational semantics.
``` ```
reduce→cbn : ∀ {M : ∅ ⊢ ★} {N : ∅ , ★ ⊢ ★} reduce→cbn : ∀ {M : ∅ ⊢ ★} {N : ∅ , ★ ⊢ ★}
→ M —↠ ƛ N → M —↠ ƛ N
→ Σ[ Δ ∈ Context ] Σ[ N ∈ Δ , ★ ⊢ ★ ] Σ[ δ ∈ ClosEnv Δ ] → Σ[ Δ ∈ Context ] Σ[ N ∈ Δ , ★ ⊢ ★ ] Σ[ δ ∈ ClosEnv Δ ]
∅' ⊢ M ⇓ clos (ƛ N) δ ∅' ⊢ M ⇓ clos (ƛ N) δ
reduce→cbn M—↠ƛN = adequacy (soundness M—↠ƛN) reduce→cbn M—↠ƛN = ↓→⇓ (soundness M—↠ƛN)
``` ```
Suppose `M —↠ ƛ N`. Soundness of the denotational semantics gives us Suppose `M —↠ ƛ N`. Soundness of the denotational semantics gives us
` M ≃ (ƛ N)`. Then by adequacy we conclude that ` M ≃ (ƛ N)`. Then by `↓→⇓` we conclude that
`∅' ⊢ M ⇓ clos (ƛ N) δ` for some `N` and `δ`. `∅' ⊢ M ⇓ clos (ƛ N) δ` for some `N` and `δ`.
Putting the two directions of the if-and-only-if together, we Putting the two directions of the if-and-only-if together, we