Lecture 4: Streams
- Streams:
- \[\cfrac{Γ, c: C ⊢ A: U\quad Γ, c: C ⊢ t:A\quad Γ ⊢ v: C\quad Γ ⊢ C: U\quad Γ, s: \prod_{c:C} Stream \, A, c:C ⊢ U: Stream \, A}{Γ ⊢ \lbrace hd=t; \; tl/s = u \rbrace_{/c} \, v : Stream \, A}\]
- \[hd \lbrace hd=t; \; tl/s = u \rbrace_{/c}^v ⟶ t[c:=v]\]
- \[tl \lbrace hd=t; \; tl/s = u \rbrace_{/c}^v ⟶ u[c := v]\left[s := λx. \lbrace hd=t; \; tl/s = u \rbrace_{/c} \, x\right]\]
Exs:
- $prod \, n \, A = \underbrace{A × ⋯ × A}_{n \text{ times}}$
- $hd \, numbers ⟶ zero$
- $tl numbers ⟶ (λx. \lbrace hd = c; \; tl/s = s \, (succ \, c) \rbrace_c \, x) (succ \, zero)$
- $hd \, tl \, numbers ⟶ succ \, zero$
- $tl \, tl \, number ⟶ \lbrace hd=c; \; tl/s = s \, (succ \, c) \rbrace_c \, (succ \, (succ \, zero))$
Write some functions about streams:
- a function which takes a stream of $Nat$ and multiplies all elements by $2$
- a function which takes two streams of $Nat$ and add all elements pointwise.
1.
\[multstream ≝ λs: Stream \, Nat. \lbrace hd=(hd \, c) × 2; \; tl/s' = s' \, (tl \, c) \rbrace_{/c} \, s\]Indeed:
\[hd \Big(multstream \, \lbrace hd=3; \; tl=\lbrace hd=7; \; tl=\lbrace hd=2; \; ⋯ \rbrace \rbrace \rbrace \Big) ⟶ 6\] \[tl \, \Big(multstream \, \lbrace hd=3; \; tl=\lbrace hd=7; \; tl=\lbrace hd=2; \; ⋯ \rbrace \rbrace \rbrace \Big) ⟶ \lbrace hd=(hd \, c) × 2; \; tl/s' = s' \, (tl \, c) \rbrace_{/c} \, \lbrace hd = 7; ⋯ \rbrace\]2.
\[λ s_1: Stream \, Nat, s_2: Stream \, Nat.\\ \lbrace hd: hd \, c.1 + hd \, c.2; \quad tl/s' = s' \, (tl \, c.1, tl \, c.2) \rbrace_{/c} \, (s_1, s_2)\]$Σ$-type as a co-inductive type
A $Σ$-type is just an instance of a negative type, i.e a co-inductive type without recursivity.
\[\sum\limits_{ a:A } B\] \[\cfrac{Γ ⊢ A: U_i \quad Γ, a:A ⊢ B: U_j}{Γ ⊢ \underbrace{\lbrace fst: A; snd: B \, (fst) \rbrace}_{\text{an alternative notation for }\sum\limits_{ a:A } B }: U_{\max(i, j)}}\]Destructors:
\[\cfrac{Γ ⊢ t: \sum\limits_{ a:A } B}{Γ ⊢ fst \, t: A}\]and
\[\cfrac{Γ ⊢ t: \sum\limits_{ a:A } B}{Γ ⊢ snd \, t: B \, (fst \, t)}\] \[\cfrac{Γ ⊢ t: A \quad Γ ⊢ u: B(t)}{Γ ⊢ \underbrace{\lbrace fst=t; snd=u \rbrace}_{\text{ also denoted by } (t, u)}: \sum\limits_{ a:A } B}\]- \[fst \, (t, u) = fst \, \lbrace fst=t; snd=u \rbrace ⟶ t\]
- \[snd \, (t, u) = snd \, \lbrace fst=t; snd=u \rbrace ⟶ u\]
$η$-rule for $Σ$-types
\[v ≡ \underbrace{(v.1, v.2)}_{\text{surjective pairing, a.k.a } η\text{-rule for } Σ\text{ types}}\\ v ≡ \lbrace fst = \underbrace{fst}_{\text{just syntactic sugar}} \, v; snd = snd \, v\rbrace\]co-Nat
- CoNat:
-
like Nat, but with an infinite element $∞$: it’s the largest set generated by $zero$ and $succ$, whereas Nat is the smallest one.
Nat | CoNat |
---|---|
zero | |
succ |
where
Inductive option (A: Ui): Ui :=
none : option A
| some : A -> option A
In category theory: $1+A$
CoInductive CoNat: U1 := {tl: option CoNat}
Two ways to build elements of $CoNat$:
- by co-induction
- by induction on $Nat$
General constructions
\[t, A ≝ \lbrace d_1: N; ⋯ ; d_n: N \rbrace \qquad \text{negative: destructors}\\ \mid \lbrace c_1: P; ⋯ ; c_n: P \rbrace \qquad \text{positive: constructors}\]ex:
- $0: Unit ⟶ Nat$
- $S: Nat ⟶ Nat$
- $\lbrace 0: Unit; S: Nat \rbrace$
No dependency for constructors right now, but we have dependent types for destructors (cf. $Σ$-types).
\[cons: A ⟶ list \, A ⟶ list \, A \\ cons: A \otimes list \, A ⟶ list \, A\]where $\otimes$ is the positive conjunction (in linear logic): $Σ$-type is the negative one.
\[P ≝ 1 \mid (a:A) \otimes P\\ N ≝ \prod\limits_{ a:A } N \mid A\]$\prod$ is a negative type which is not co-inductive, that is: its introduction rules are reversible (you can recover the premises from the conclusion).
Ex:
Not reversible:
\[\cfrac{?}{Γ ⊢ n: Nat}\]because it could come from $zero$ or $succ$
Revertible (negative)
\[\cfrac{⊢ A \quad ⊢ B}{⊢ A \& B}\]Usually:
-
negative types have
- an $η$-rule on the constructor/eliminator
- universal properties that include arrows going into them (limits)
-
positive types have
- an $η$-rule on the destructors/eliminator
- universal properties that include arrows going out of them (co-limits)
\[t, A ≝ ⋯ \mid case \; t \; of \; [c_1 \, p ⇒ t \mid ⋯ \mid c_n \, p ⇒ t]\\ p ≝ () \mid (a, p) \\ t ≝ ⋯ \mid c_i \, u \mid d_i \, t\\ u ≝ () \mid (t, u) \mid \lbrace d_1 = v; ⋯ ; d_n = v \rbrace\\ v ≝ λa:A. v \mid t\]
Leave a comment