added TypedFresh and some comments
This commit is contained in:
parent
eb8f85bca7
commit
155677811c
2 changed files with 130 additions and 105 deletions
3
index.md
3
index.md
|
@ -46,7 +46,8 @@ fixes are encouraged.
|
||||||
|
|
||||||
New
|
New
|
||||||
- [Collections](Collections)
|
- [Collections](Collections)
|
||||||
- [Typed: Typed term representation](Typed)
|
- [Typed: Raw terms with types (broken)](Typed)
|
||||||
|
- [TypedFresh: Raw terms with fresh names (broken)](TypedFresh)
|
||||||
- [TypedDB: Typed DeBruijn representation](TypedDB)
|
- [TypedDB: Typed DeBruijn representation](TypedDB)
|
||||||
- [Extensions: Extensions to simply-typed lambda calculus](Extensions)
|
- [Extensions: Extensions to simply-typed lambda calculus](Extensions)
|
||||||
|
|
||||||
|
|
232
src/Typed.lagda
232
src/Typed.lagda
|
@ -1,9 +1,19 @@
|
||||||
---
|
---
|
||||||
title : "Typed: Typed Lambda term representation"
|
title : "Typed: Raw terms with types (broken)"
|
||||||
layout : page
|
layout : page
|
||||||
permalink : /Typed
|
permalink : /Typed
|
||||||
---
|
---
|
||||||
|
|
||||||
|
This version uses raw terms. Substitution presumes that no
|
||||||
|
generation of fresh names is required.
|
||||||
|
|
||||||
|
The substitution algorithm is based on one by McBride.
|
||||||
|
It is given a map from names to terms. Say the mapping of a
|
||||||
|
name is trivial if it takes a name to a term consisting of
|
||||||
|
just the variable with that name. No fresh names are required
|
||||||
|
if the mapping on each variable is either trivial or to a
|
||||||
|
closed term. However, the proof of correctness currently
|
||||||
|
contains a hole, and may be difficult to repair.
|
||||||
|
|
||||||
## Imports
|
## Imports
|
||||||
|
|
||||||
|
@ -437,6 +447,123 @@ begin_ : ∀ {M N} → (M ⟶* N) → (M ⟶* N)
|
||||||
begin M⟶*N = M⟶*N
|
begin M⟶*N = M⟶*N
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|
||||||
|
## Sample execution
|
||||||
|
|
||||||
|
\begin{code}
|
||||||
|
_ : plus · two · two ⟶* (`suc (`suc (`suc (`suc `zero))))
|
||||||
|
_ =
|
||||||
|
begin
|
||||||
|
plus · two · two
|
||||||
|
⟶⟨ ξ-·₁ (ξ-·₁ (β-Y refl)) ⟩
|
||||||
|
(`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
||||||
|
`suc (plus · (`pred (` "m")) · (` "n")))) · two · two
|
||||||
|
⟶⟨ ξ-·₁ (β-→ (Suc (Suc Zero))) ⟩
|
||||||
|
(`λ "n" `→ `if0 two then ` "n" else
|
||||||
|
`suc (plus · (`pred two) · (` "n"))) · two
|
||||||
|
⟶⟨ β-→ (Suc (Suc Zero)) ⟩
|
||||||
|
`if0 two then two else
|
||||||
|
`suc (plus · (`pred two) · two)
|
||||||
|
⟶⟨ β-if0-suc (Suc Zero) ⟩
|
||||||
|
`suc (plus · (`pred two) · two)
|
||||||
|
⟶⟨ ξ-suc (ξ-·₁ (ξ-·₁ (β-Y refl))) ⟩
|
||||||
|
`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
||||||
|
`suc (plus · (`pred (` "m")) · (` "n")))) · (`pred two) · two)
|
||||||
|
⟶⟨ ξ-suc (ξ-·₁ (ξ-·₂ Fun (β-pred-suc (Suc Zero)))) ⟩
|
||||||
|
`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
||||||
|
`suc (plus · (`pred (` "m")) · (` "n")))) · (`suc `zero) · two)
|
||||||
|
⟶⟨ ξ-suc (ξ-·₁ (β-→ (Suc Zero))) ⟩
|
||||||
|
`suc ((`λ "n" `→ `if0 `suc `zero then ` "n" else
|
||||||
|
`suc (plus · (`pred (`suc `zero)) · (` "n")))) · two
|
||||||
|
⟶⟨ ξ-suc (β-→ (Suc (Suc Zero))) ⟩
|
||||||
|
`suc (`if0 `suc `zero then two else
|
||||||
|
`suc (plus · (`pred (`suc `zero)) · two))
|
||||||
|
⟶⟨ ξ-suc (β-if0-suc Zero) ⟩
|
||||||
|
`suc (`suc (plus · (`pred (`suc `zero)) · two))
|
||||||
|
⟶⟨ ξ-suc (ξ-suc (ξ-·₁ (ξ-·₁ (β-Y refl)))) ⟩
|
||||||
|
`suc (`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
||||||
|
`suc (plus · (`pred (` "m")) · (` "n")))) · (`pred (`suc `zero)) · two))
|
||||||
|
⟶⟨ ξ-suc (ξ-suc (ξ-·₁ (ξ-·₂ Fun (β-pred-suc Zero)))) ⟩
|
||||||
|
`suc (`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
||||||
|
`suc (plus · (`pred (` "m")) · (` "n")))) · `zero · two))
|
||||||
|
⟶⟨ ξ-suc (ξ-suc (ξ-·₁ (β-→ Zero))) ⟩
|
||||||
|
`suc (`suc ((`λ "n" `→ `if0 `zero then ` "n" else
|
||||||
|
`suc (plus · (`pred `zero) · (` "n"))) · two))
|
||||||
|
⟶⟨ ξ-suc (ξ-suc (β-→ (Suc (Suc Zero)))) ⟩
|
||||||
|
`suc (`suc (`if0 `zero then two else
|
||||||
|
`suc (plus · (`pred `zero) · two)))
|
||||||
|
⟶⟨ ξ-suc (ξ-suc β-if0-zero) ⟩
|
||||||
|
`suc (`suc (`suc (`suc `zero)))
|
||||||
|
∎
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
## Values do not reduce
|
||||||
|
|
||||||
|
Values do not reduce.
|
||||||
|
\begin{code}
|
||||||
|
Val-⟶ : ∀ {M N} → Value M → ¬ (M ⟶ N)
|
||||||
|
Val-⟶ Fun ()
|
||||||
|
Val-⟶ Zero ()
|
||||||
|
Val-⟶ (Suc VM) (ξ-suc M⟶N) = Val-⟶ VM M⟶N
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
As a corollary, terms that reduce are not values.
|
||||||
|
\begin{code}
|
||||||
|
⟶-Val : ∀ {M N} → (M ⟶ N) → ¬ Value M
|
||||||
|
⟶-Val M⟶N VM = Val-⟶ VM M⟶N
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
## Reduction is deterministic
|
||||||
|
|
||||||
|
\begin{code}
|
||||||
|
det : ∀ {M M′ M″}
|
||||||
|
→ (M ⟶ M′)
|
||||||
|
→ (M ⟶ M″)
|
||||||
|
----------
|
||||||
|
→ M′ ≡ M″
|
||||||
|
det (ξ-·₁ L⟶L′) (ξ-·₁ L⟶L″) = cong₂ _·_ (det L⟶L′ L⟶L″) refl
|
||||||
|
det (ξ-·₁ L⟶L′) (ξ-·₂ VL _) = ⊥-elim (Val-⟶ VL L⟶L′)
|
||||||
|
det (ξ-·₁ L⟶L′) (β-→ _) = ⊥-elim (Val-⟶ Fun L⟶L′)
|
||||||
|
det (ξ-·₂ VL _) (ξ-·₁ L⟶L″) = ⊥-elim (Val-⟶ VL L⟶L″)
|
||||||
|
det (ξ-·₂ _ M⟶M′) (ξ-·₂ _ M⟶M″) = cong₂ _·_ refl (det M⟶M′ M⟶M″)
|
||||||
|
det (ξ-·₂ _ M⟶M′) (β-→ VM) = ⊥-elim (Val-⟶ VM M⟶M′)
|
||||||
|
det (β-→ VM) (ξ-·₁ L⟶L″) = ⊥-elim (Val-⟶ Fun L⟶L″)
|
||||||
|
det (β-→ VM) (ξ-·₂ _ M⟶M″) = ⊥-elim (Val-⟶ VM M⟶M″)
|
||||||
|
det (β-→ _) (β-→ _) = refl
|
||||||
|
det (ξ-suc M⟶M′) (ξ-suc M⟶M″) = cong `suc_ (det M⟶M′ M⟶M″)
|
||||||
|
det (ξ-pred M⟶M′) (ξ-pred M⟶M″) = cong `pred_ (det M⟶M′ M⟶M″)
|
||||||
|
det (ξ-pred M⟶M′) β-pred-zero = ⊥-elim (Val-⟶ Zero M⟶M′)
|
||||||
|
det (ξ-pred M⟶M′) (β-pred-suc VM) = ⊥-elim (Val-⟶ (Suc VM) M⟶M′)
|
||||||
|
det β-pred-zero (ξ-pred M⟶M′) = ⊥-elim (Val-⟶ Zero M⟶M′)
|
||||||
|
det β-pred-zero β-pred-zero = refl
|
||||||
|
det (β-pred-suc VM) (ξ-pred M⟶M′) = ⊥-elim (Val-⟶ (Suc VM) M⟶M′)
|
||||||
|
det (β-pred-suc _) (β-pred-suc _) = refl
|
||||||
|
det (ξ-if0 L⟶L′) (ξ-if0 L⟶L″) = cong₃ `if0_then_else_ (det L⟶L′ L⟶L″) refl refl
|
||||||
|
det (ξ-if0 L⟶L′) β-if0-zero = ⊥-elim (Val-⟶ Zero L⟶L′)
|
||||||
|
det (ξ-if0 L⟶L′) (β-if0-suc VL) = ⊥-elim (Val-⟶ (Suc VL) L⟶L′)
|
||||||
|
det β-if0-zero (ξ-if0 L⟶L″) = ⊥-elim (Val-⟶ Zero L⟶L″)
|
||||||
|
det β-if0-zero β-if0-zero = refl
|
||||||
|
det (β-if0-suc VL) (ξ-if0 L⟶L″) = ⊥-elim (Val-⟶ (Suc VL) L⟶L″)
|
||||||
|
det (β-if0-suc _) (β-if0-suc _) = refl
|
||||||
|
det (ξ-Y M⟶M′) (ξ-Y M⟶M″) = cong `Y_ (det M⟶M′ M⟶M″)
|
||||||
|
det (ξ-Y M⟶M′) (β-Y refl) = ⊥-elim (Val-⟶ Fun M⟶M′)
|
||||||
|
det (β-Y refl) (ξ-Y M⟶M″) = ⊥-elim (Val-⟶ Fun M⟶M″)
|
||||||
|
det (β-Y refl) (β-Y refl) = refl
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
Almost half the lines in the above proof are redundant, for example
|
||||||
|
|
||||||
|
det (ξ-·₁ L⟶L′) (ξ-·₂ VL _) = ⊥-elim (Val-⟶ VL L⟶L′)
|
||||||
|
det (ξ-·₂ VL _) (ξ-·₁ L⟶L″) = ⊥-elim (Val-⟶ VL L⟶L″)
|
||||||
|
|
||||||
|
are essentially identical. What we might like to do is delete the
|
||||||
|
redundant lines and add
|
||||||
|
|
||||||
|
det M⟶M′ M⟶M″ = sym (det M⟶M″ M⟶M′)
|
||||||
|
|
||||||
|
to the bottom of the proof. But this does not work. The termination
|
||||||
|
checker complains, because the arguments have merely switched order
|
||||||
|
and neither is smaller.
|
||||||
|
|
||||||
## Canonical forms
|
## Canonical forms
|
||||||
|
|
||||||
\begin{code}
|
\begin{code}
|
||||||
|
@ -492,61 +619,6 @@ value (Suc CV) = Suc (value CV)
|
||||||
value (Fun ⊢N) = Fun
|
value (Fun ⊢N) = Fun
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|
||||||
## Values do not reduce
|
|
||||||
|
|
||||||
Values do not reduce.
|
|
||||||
\begin{code}
|
|
||||||
Val-⟶ : ∀ {M N} → Value M → ¬ (M ⟶ N)
|
|
||||||
Val-⟶ Fun ()
|
|
||||||
Val-⟶ Zero ()
|
|
||||||
Val-⟶ (Suc VM) (ξ-suc M⟶N) = Val-⟶ VM M⟶N
|
|
||||||
\end{code}
|
|
||||||
|
|
||||||
As a corollary, terms that reduce are not values.
|
|
||||||
\begin{code}
|
|
||||||
⟶-Val : ∀ {M N} → (M ⟶ N) → ¬ Value M
|
|
||||||
⟶-Val M⟶N VM = Val-⟶ VM M⟶N
|
|
||||||
\end{code}
|
|
||||||
|
|
||||||
|
|
||||||
## Reduction is deterministic
|
|
||||||
|
|
||||||
\begin{code}
|
|
||||||
det : ∀ {M M′ M″}
|
|
||||||
→ (M ⟶ M′)
|
|
||||||
→ (M ⟶ M″)
|
|
||||||
----------
|
|
||||||
→ M′ ≡ M″
|
|
||||||
det (ξ-·₁ L⟶L′) (ξ-·₁ L⟶L″) = cong₂ _·_ (det L⟶L′ L⟶L″) refl
|
|
||||||
det (ξ-·₁ L⟶L′) (ξ-·₂ VL _) = ⊥-elim (Val-⟶ VL L⟶L′)
|
|
||||||
det (ξ-·₁ L⟶L′) (β-→ _) = ⊥-elim (Val-⟶ Fun L⟶L′)
|
|
||||||
det (ξ-·₂ VL _) (ξ-·₁ L⟶L″) = ⊥-elim (Val-⟶ VL L⟶L″)
|
|
||||||
det (ξ-·₂ _ M⟶M′) (ξ-·₂ _ M⟶M″) = cong₂ _·_ refl (det M⟶M′ M⟶M″)
|
|
||||||
det (ξ-·₂ _ M⟶M′) (β-→ VM) = ⊥-elim (Val-⟶ VM M⟶M′)
|
|
||||||
det (β-→ VM) (ξ-·₁ L⟶L″) = ⊥-elim (Val-⟶ Fun L⟶L″)
|
|
||||||
det (β-→ VM) (ξ-·₂ _ M⟶M″) = ⊥-elim (Val-⟶ VM M⟶M″)
|
|
||||||
det (β-→ _) (β-→ _) = refl
|
|
||||||
det (ξ-suc M⟶M′) (ξ-suc M⟶M″) = cong `suc_ (det M⟶M′ M⟶M″)
|
|
||||||
det (ξ-pred M⟶M′) (ξ-pred M⟶M″) = cong `pred_ (det M⟶M′ M⟶M″)
|
|
||||||
det (ξ-pred M⟶M′) β-pred-zero = ⊥-elim (Val-⟶ Zero M⟶M′)
|
|
||||||
det (ξ-pred M⟶M′) (β-pred-suc VM) = ⊥-elim (Val-⟶ (Suc VM) M⟶M′)
|
|
||||||
det β-pred-zero (ξ-pred M⟶M′) = ⊥-elim (Val-⟶ Zero M⟶M′)
|
|
||||||
det β-pred-zero β-pred-zero = refl
|
|
||||||
det (β-pred-suc VM) (ξ-pred M⟶M′) = ⊥-elim (Val-⟶ (Suc VM) M⟶M′)
|
|
||||||
det (β-pred-suc _) (β-pred-suc _) = refl
|
|
||||||
det (ξ-if0 L⟶L′) (ξ-if0 L⟶L″) = cong₃ `if0_then_else_ (det L⟶L′ L⟶L″) refl refl
|
|
||||||
det (ξ-if0 L⟶L′) β-if0-zero = ⊥-elim (Val-⟶ Zero L⟶L′)
|
|
||||||
det (ξ-if0 L⟶L′) (β-if0-suc VL) = ⊥-elim (Val-⟶ (Suc VL) L⟶L′)
|
|
||||||
det β-if0-zero (ξ-if0 L⟶L″) = ⊥-elim (Val-⟶ Zero L⟶L″)
|
|
||||||
det β-if0-zero β-if0-zero = refl
|
|
||||||
det (β-if0-suc VL) (ξ-if0 L⟶L″) = ⊥-elim (Val-⟶ (Suc VL) L⟶L″)
|
|
||||||
det (β-if0-suc _) (β-if0-suc _) = refl
|
|
||||||
det (ξ-Y M⟶M′) (ξ-Y M⟶M″) = cong `Y_ (det M⟶M′ M⟶M″)
|
|
||||||
det (ξ-Y M⟶M′) (β-Y refl) = ⊥-elim (Val-⟶ Fun M⟶M′)
|
|
||||||
det (β-Y refl) (ξ-Y M⟶M″) = ⊥-elim (Val-⟶ Fun M⟶M″)
|
|
||||||
det (β-Y refl) (β-Y refl) = refl
|
|
||||||
\end{code}
|
|
||||||
|
|
||||||
## Progress
|
## Progress
|
||||||
|
|
||||||
\begin{code}
|
\begin{code}
|
||||||
|
@ -760,51 +832,3 @@ normalise {L} (suc m) ⊢L with progress ⊢L
|
||||||
... | normal n CV M⟶*V = normal n CV (L ⟶⟨ L⟶M ⟩ M⟶*V)
|
... | normal n CV M⟶*V = normal n CV (L ⟶⟨ L⟶M ⟩ M⟶*V)
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|
||||||
## Sample execution
|
|
||||||
|
|
||||||
\begin{code}
|
|
||||||
_ : plus · two · two ⟶* (`suc (`suc (`suc (`suc `zero))))
|
|
||||||
_ =
|
|
||||||
begin
|
|
||||||
plus · two · two
|
|
||||||
⟶⟨ ξ-·₁ (ξ-·₁ (β-Y refl)) ⟩
|
|
||||||
(`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
|
||||||
`suc (plus · (`pred (` "m")) · (` "n")))) · two · two
|
|
||||||
⟶⟨ ξ-·₁ (β-→ (Suc (Suc Zero))) ⟩
|
|
||||||
(`λ "n" `→ `if0 two then ` "n" else
|
|
||||||
`suc (plus · (`pred two) · (` "n"))) · two
|
|
||||||
⟶⟨ β-→ (Suc (Suc Zero)) ⟩
|
|
||||||
`if0 two then two else
|
|
||||||
`suc (plus · (`pred two) · two)
|
|
||||||
⟶⟨ β-if0-suc (Suc Zero) ⟩
|
|
||||||
`suc (plus · (`pred two) · two)
|
|
||||||
⟶⟨ ξ-suc (ξ-·₁ (ξ-·₁ (β-Y refl))) ⟩
|
|
||||||
`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
|
||||||
`suc (plus · (`pred (` "m")) · (` "n")))) · (`pred two) · two)
|
|
||||||
⟶⟨ ξ-suc (ξ-·₁ (ξ-·₂ Fun (β-pred-suc (Suc Zero)))) ⟩
|
|
||||||
`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
|
||||||
`suc (plus · (`pred (` "m")) · (` "n")))) · (`suc `zero) · two)
|
|
||||||
⟶⟨ ξ-suc (ξ-·₁ (β-→ (Suc Zero))) ⟩
|
|
||||||
`suc ((`λ "n" `→ `if0 `suc `zero then ` "n" else
|
|
||||||
`suc (plus · (`pred (`suc `zero)) · (` "n")))) · two
|
|
||||||
⟶⟨ ξ-suc (β-→ (Suc (Suc Zero))) ⟩
|
|
||||||
`suc (`if0 `suc `zero then two else
|
|
||||||
`suc (plus · (`pred (`suc `zero)) · two))
|
|
||||||
⟶⟨ ξ-suc (β-if0-suc Zero) ⟩
|
|
||||||
`suc (`suc (plus · (`pred (`suc `zero)) · two))
|
|
||||||
⟶⟨ ξ-suc (ξ-suc (ξ-·₁ (ξ-·₁ (β-Y refl)))) ⟩
|
|
||||||
`suc (`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
|
||||||
`suc (plus · (`pred (` "m")) · (` "n")))) · (`pred (`suc `zero)) · two))
|
|
||||||
⟶⟨ ξ-suc (ξ-suc (ξ-·₁ (ξ-·₂ Fun (β-pred-suc Zero)))) ⟩
|
|
||||||
`suc (`suc ((`λ "m" `→ (`λ "n" `→ `if0 ` "m" then ` "n" else
|
|
||||||
`suc (plus · (`pred (` "m")) · (` "n")))) · `zero · two))
|
|
||||||
⟶⟨ ξ-suc (ξ-suc (ξ-·₁ (β-→ Zero))) ⟩
|
|
||||||
`suc (`suc ((`λ "n" `→ `if0 `zero then ` "n" else
|
|
||||||
`suc (plus · (`pred `zero) · (` "n"))) · two))
|
|
||||||
⟶⟨ ξ-suc (ξ-suc (β-→ (Suc (Suc Zero)))) ⟩
|
|
||||||
`suc (`suc (`if0 `zero then two else
|
|
||||||
`suc (plus · (`pred `zero) · two)))
|
|
||||||
⟶⟨ ξ-suc (ξ-suc β-if0-zero) ⟩
|
|
||||||
`suc (`suc (`suc (`suc `zero)))
|
|
||||||
∎
|
|
||||||
\end{code}
|
|
||||||
|
|
Loading…
Reference in a new issue