starting on values
This commit is contained in:
parent
0a824e8e03
commit
daf8cda196
1 changed files with 58 additions and 4 deletions
|
@ -130,11 +130,26 @@ that in Agda one may treat square brackets `[]` as ordinary symbols,
|
||||||
while round parentheses `()` and curly braces `{}` have special
|
while round parentheses `()` and curly braces `{}` have special
|
||||||
meaning.
|
meaning.
|
||||||
|
|
||||||
Using ratio is arguably a bad idea, because one must use context
|
Using ratio for this purpose is arguably a bad idea, because one must use context
|
||||||
rather than sight to distinguish it from colon. Arguably, it might be
|
rather than appearance to distinguish it from colon. Arguably, it might be
|
||||||
better to use a different symbol, such as `∈` or `::`. We reserve `∈`
|
better to use a different symbol, such as `∈` or `::`. We reserve `∈`
|
||||||
for use later to indicate that a variable appears free in a term, and
|
for use later to indicate that a variable appears free in a term, and
|
||||||
don't use `::` because we consider it too ugly.
|
eschew `::` because we consider it too ugly.
|
||||||
|
|
||||||
|
#### Formal vs Informal
|
||||||
|
|
||||||
|
In informal presentation of formal semantics, one uses choice of
|
||||||
|
variable name to disambiguate and writes `x` rather than `` ` x ``
|
||||||
|
for a term that is a variable. Agda requires we distinguish.
|
||||||
|
Often researchers use `var x` rather than `` ` x ``, but we chose
|
||||||
|
the latter since it is closer to the informal notation `x`.
|
||||||
|
|
||||||
|
Similarly, informal presentation often use the notations
|
||||||
|
`A → B` for functions, `λ x . N` for abstractions, and `L M` for applications.
|
||||||
|
We cannot use these, because they overlap with the notation used by Agda.
|
||||||
|
Some researchers use `L @ M` in place of `L · M`, but we cannot
|
||||||
|
because `@` has a reserved meaning in Agda.
|
||||||
|
|
||||||
|
|
||||||
#### Examples
|
#### Examples
|
||||||
|
|
||||||
|
@ -153,6 +168,8 @@ not = λ[ x ∶ 𝔹 ] (if ` x then false else true)
|
||||||
two = λ[ f ∶ 𝔹 ⇒ 𝔹 ] λ[ x ∶ 𝔹 ] ` f · (` f · ` x)
|
two = λ[ f ∶ 𝔹 ⇒ 𝔹 ] λ[ x ∶ 𝔹 ] ` f · (` f · ` x)
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|
||||||
|
#### Precedence
|
||||||
|
|
||||||
As in Agda, functions of two or more arguments are represented via
|
As in Agda, functions of two or more arguments are represented via
|
||||||
currying. This is made more convenient by declaring `_⇒_` to
|
currying. This is made more convenient by declaring `_⇒_` to
|
||||||
associate to the right and `_·_` to associate to the left.
|
associate to the right and `_·_` to associate to the left.
|
||||||
|
@ -183,9 +200,45 @@ example₃ : λ[ f ∶ 𝔹 ⇒ 𝔹 ] λ[ x ∶ 𝔹 ] ` f · (` f · ` x)
|
||||||
example₃ = refl
|
example₃ = refl
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|
||||||
|
#### Quiz
|
||||||
|
|
||||||
|
* What is the type of the following term?
|
||||||
|
|
||||||
|
λ[ f ∶ 𝔹 ⇒ 𝔹 ] ` f · (` f · true)
|
||||||
|
|
||||||
|
1. `𝔹 ⇒ (𝔹 ⇒ 𝔹)`
|
||||||
|
2. `(𝔹 ⇒ 𝔹) ⇒ 𝔹`
|
||||||
|
3. `𝔹 ⇒ 𝔹 ⇒ 𝔹`
|
||||||
|
4. `𝔹 ⇒ 𝔹`
|
||||||
|
5. `𝔹`
|
||||||
|
|
||||||
|
Give more than one answer if appropriate.
|
||||||
|
|
||||||
|
* What is the type of the following term?
|
||||||
|
|
||||||
|
(λ[ f ∶ 𝔹 ⇒ 𝔹 ] ` f · (` f · true)) · not
|
||||||
|
|
||||||
|
1. `𝔹 ⇒ (𝔹 ⇒ 𝔹)`
|
||||||
|
2. `(𝔹 ⇒ 𝔹) ⇒ 𝔹`
|
||||||
|
3. `𝔹 ⇒ 𝔹 ⇒ 𝔹`
|
||||||
|
4. `𝔹 ⇒ 𝔹`
|
||||||
|
5. `𝔹`
|
||||||
|
|
||||||
|
Give more than one answer if appropriate.
|
||||||
|
|
||||||
## Values
|
## Values
|
||||||
|
|
||||||
|
A term is a value if it is fully reduced.
|
||||||
|
|
||||||
|
For booleans, the situtation is clear, `true` and
|
||||||
|
`false` are values, while conditionals are not.
|
||||||
|
|
||||||
|
For functions, applications are not values, because
|
||||||
|
we expect them to further reduce, and variables are
|
||||||
|
not values, because we focus on closed terms
|
||||||
|
(which never contain unbound variables).
|
||||||
|
|
||||||
|
|
||||||
\begin{code}
|
\begin{code}
|
||||||
data Value : Term → Set where
|
data Value : Term → Set where
|
||||||
value-λ : ∀ {x A N} → Value (λ[ x ∶ A ] N)
|
value-λ : ∀ {x A N} → Value (λ[ x ∶ A ] N)
|
||||||
|
@ -206,7 +259,8 @@ _[_:=_] : Term → Id → Term → Term
|
||||||
(L′ · M′) [ x := V ] = (L′ [ x := V ]) · (M′ [ x := V ])
|
(L′ · M′) [ x := V ] = (L′ [ x := V ]) · (M′ [ x := V ])
|
||||||
(true) [ x := V ] = true
|
(true) [ x := V ] = true
|
||||||
(false) [ x := V ] = false
|
(false) [ x := V ] = false
|
||||||
(if L′ then M′ else N′) [ x := V ] = if (L′ [ x := V ]) then (M′ [ x := V ]) else (N′ [ x := V ])
|
(if L′ then M′ else N′) [ x := V ] =
|
||||||
|
if (L′ [ x := V ]) then (M′ [ x := V ]) else (N′ [ x := V ])
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|
||||||
## Reduction rules
|
## Reduction rules
|
||||||
|
|
Loading…
Reference in a new issue