---
# System prepended metadata

title: Lista 12
tags: [jp21]

---


# Lista 12
###### tags: `jp21`

# Zadanie 1 (TAPL 15.3.2)

![](https://i.imgur.com/m6hWm5d.png)

ezpz
![](https://i.imgur.com/qTSFk2a.png)

![](https://i.imgur.com/WTG2ICY.png)

![](https://i.imgur.com/fxLGEuE.png)


![](https://i.imgur.com/n26RjRw.png)


# Zadanie 2 (TAPL 15.5.2, 15.5.3)

![](https://i.imgur.com/MTi16eA.png)

$$
\dfrac{S_1 <: T_1 \quad T_1 <: S_1}{Ref\ S_1 <: Ref\ T_1} \qquad \dfrac{}{}
$$

(1) 

Mamy:
$$
\dfrac{T_1 <: S_1}{Ref\ S_1 <: Ref\ T_1} (S-Ref_{(1)})
$$


T = {x:Nat, y:Nat} S ={x:Nat}

a = {x = 5} 
b = {x=7, y=8}
store := ref  a (Ref S)
odczyt = (!store).y (no i y nie jest zapisany??) 

![](https://i.imgur.com/XrOtoKD.png)

$$
\dfrac{
\dfrac{5 : Nat}{ref \{x = 5\} : Ref \{x\}} \quad 
\dfrac{
\dfrac{
\dfrac{
s:Ref\{x\} \vdash s:Ref\{x\} \quad \dfrac{\{x, y\} <: \{x\}}{Ref\{x\} <: Ref\{x, y\}} (S-Ref_{(1)})
}{
s:Ref\{x\} \vdash s : Ref \{y, x\}} (T-Sub)
}{
s:Ref\{x\} \vdash !s : \{y, x\}
}
}{s:Ref \{x=Nat\} \vdash (!s).y : Nat}
}{\emptyset \vdash let\, s = ref \{x = 5\}\, in\, (!s).y : Nat}
$$

---
(2)
~~albo:
a = {x = 5} ( S<=T)
b = {x=7, y=8}
store := ref  a
store := b (no i y nie ma miejsca?? )~~

Mamy:
$$
\dfrac{S_1 <: T_1}{Ref\ S_1 <: Ref\ T_1} (S-Ref_{(2)})
$$

```
let x = ref {a:1, b:2} in x := {a:0}; !x.b
```
$$t = [\lambda l. \ (\lambda \_. \ (!l).y)(l := \{x : unit\})](ref \{x : unit, y : unit\})$$

$$\dfrac{\dfrac{\dfrac{\dfrac{\dfrac{\dfrac{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ \ l : Ref\{x : Unit, y : Unit\}}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ \ !l : \{x : Unit, y : Unit\}}}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ \ (!l).y : Unit}}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ \ \lambda \_. \ (!l).y : Unit \rightarrow Unit}
\quad\quad \dfrac{\color{blue}{\dfrac{\dfrac{}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ l : Ref\{x : Unit, y : Unit \}} \quad\quad \dfrac{\{x : Unit, y : Unit\} <: \{x : Unit \}}{Ref\{x : Unit, y : Unit\} <: Ref\{x : Unit \}}}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ l : Ref\{x : Unit \}}} \quad\quad \dfrac{}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ \{x : unit\} : \{x : Unit\}}}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ l := \{x : unit\} : Unit}}{l : Ref\{x : Unit, y : Unit\} \ | \ \emptyset \vdash \ (\lambda \_. \ (!l).y)(l := \{x : unit\}) : Unit}}{\emptyset \ | \ \emptyset \vdash \lambda l. \ (\lambda \_. \ (!l).y)(l := \{x : unit\}) : Ref\{x : Unit, y : Unit\} \rightarrow Unit} \quad\quad \dfrac{}{\emptyset \ | \ \emptyset \vdash ref \{x : unit, y : unit\} : Ref\{x : Unit, y : Unit\}}}{\emptyset \ | \ \emptyset \vdash [\lambda l. \ (\lambda \_. \ (!l).y)(l := \{x : unit\})](ref \{x : unit, y : unit\}) : Unit}$$



![](https://i.imgur.com/SQbHTyJ.png)
![](https://i.imgur.com/z8KnHym.png)



# Zadanie 3 (TAPL 15.6.3)
![](https://i.imgur.com/XxUPnlX.png)

![](https://i.imgur.com/H5kVpLH.png)



# Zadanie 4 (TAPL 20.2.1)

![](https://i.imgur.com/Y898x8x.png)
![](https://i.imgur.com/Ujs1kJZ.png)



# Zadanie 5 (TAPL 20.2.2)

![](https://i.imgur.com/KvTCOyE.png)

![](https://i.imgur.com/1NVWrtr.png)

**Lemat o postaciach kanonicznych**
- ...
- Jeśli $v$ jest zamkniętą wartością o typie $U = \mu X. T$ to $v$ ma postać $fold \ [U] \ v_0$ gdzie $v_0$ również jest wartością. 

**Lemat o inwersji**
- ...
- Jeśli $\Gamma \vdash fold \ [S] \ t_1 : T$ to $S = T$ oraz istnieje taki $T_1$, że $T = \mu X. T_1$ oraz $\Gamma \vdash t_1 : [X := T]T_1$.
- Jeśli $\Gamma \vdash unfold \ [S] \ t_1 : T$ istnieje taki $S_1$, że $S = \mu X. S_1$ oraz $\Gamma \vdash t_1 : S$ oraz $T = [X := S]S_1$.

Dowody obu lematów wynikają wprost z definicji.

---

**Progress:** Jeśli $\emptyset \vdash t : T$ to $t$ jest wartością lub istnieje $t'$ taki, że $t \rightarrow t'$.

Dowód: Indukcja względem relacji $\emptyset \vdash t : T$. Rozważymy tylko dwa nowe przypadki:

- $\dfrac{T = \mu X.T_1 \quad\quad \emptyset \vdash t_1 : [X := T]T_1}{\emptyset \vdash fold \ [T] \ t_1 : T}$ czyli $t = fold \ [U] \ t_1$

Mamy dwa podprzypadki zależnie od tego, czy $t_1$ jest wartością. Jeśli tak, to $t = fold \ [T] \ t_1$ także jest wartością.

Załóżmy więc, że $t_1$ nie jest wartością. Mamy $\emptyset \vdash t_1 : [X := T]T_1$, zatem z ZI istnieje taki $t_1'$, że $t_1 \rightarrow t_1'$. Zatem:
$$\dfrac{t_1 \rightarrow t_1'}{fold \ [T] \ t_1 \rightarrow fold \ [T] \ t_1'}$$

- $\dfrac{T = \mu X.T_1 \quad\quad \Gamma \vdash t_1 : T}{\Gamma \vdash unfold \ [T] \ t_1 : [X := T]T_1}$ czyli $t = unfold \ [U] \ t_1$

Mamy dwa podprzypadki zależnie od tego, czy $t_1$ jest wartością. Jeśli nie, to skoro $\Gamma \vdash t_1 : T$ to z ZI istnieje $t_1'$, że $t_1 \rightarrow t_1'$, zatem:
$$\dfrac{t_1 \rightarrow t_1'}{unfold \ [T] \ t_1 \rightarrow unfold \ [T] \ t_1'}$$

Załóżmy więc, że $t_1$ jest wartością. Skoro ma ona typ $T = \mu X. T_1$, to z lematu o postaciach kanonicznych $t_1 = fold \ [T] \ v$. Zatem $t = unfold \ [T] \ (fold \ [T] \ v))$, więc:
$$\dfrac{}{unfold \ [T] \ (fold \ [T] \ v) \rightarrow v}$$

---

**Preservation:** Jeśli $t \rightarrow t'$ oraz $\Gamma \vdash t : T$ to $\Gamma \vdash t' : T$.

Dowód: Indukcja względem relacji $t \rightarrow t'$. Rozważymy tylko 3 nowe przypadki.

- $\dfrac{}{unfold \ [S] \ (fold \ [U] \ v_1) \rightarrow v_1}$ czyli $t = unfold \ [S] \ (fold \ [U] \ v_1)$ oraz $t' = v_1$

Stosujemy inwersję dwa razy: najpierw skoro $\Gamma \vdash unfold \ [S] \ (fold \ [U] \ v_1) : T$ to $S = \mu X. S_1$ oraz $T = [X := S]S_1$ oraz $\Gamma \vdash fold \ [U] \ v_1 : S$. Następnie z tego ostatniego faktu dostajemy, że $U = S$ oraz że $\Gamma \vdash v_1 : [X := S]S_1$, czyli $\Gamma \vdash v_1 : T$.

- $\dfrac{t_1 \rightarrow t_1'}{fold \ [S] \ t_1 \rightarrow fold \ [S] \ t_1'}$ czyli $t = fold \ [S] \ t_1$ oraz $t' = fold \ [S] \ t_1'$

Z inwersji skoro $\Gamma \vdash fold \ [S] \ t_1 : T$ to $S = T = \mu X. T_1$ oraz $\Gamma \vdash t_1 : [X := T]T_1$. Zatem z ZI dostajemy $\Gamma \vdash t_1' : [X := T]T_1$, co z reguły typowania dla fold od razu daje:
$$\dfrac{T = \mu X.T_1 \quad\quad \Gamma \vdash t_1' : [X := T]T_1}{\Gamma \vdash fold \ [T] \ t_1' : T}$$

- $\dfrac{t_1 \rightarrow t_1'}{unfold \ [S] \ t_1 \rightarrow unfold \ [S] \ t_1'}$ czyli $t = unfold \ [S] \ t_1$ oraz $t' = unfold \ [S] \ t_1'$

Z inwersji skoro $\Gamma \vdash unfold \ [S] \ t_1 : T$ to $S = \mu X. S_1$ oraz $T = [X := S]S_1$ oraz $\Gamma \vdash t_1 : S$. Zatem z ZI dostajemy $\Gamma \vdash t_1' : S$, co z reguły typowania dla unfold od razu daje:
$$\dfrac{S = \mu X.S_1 \quad\quad \Gamma \vdash t_1' : S}{\Gamma \vdash unfold \ [S] \ t_1' : [X := S]S_1}$$


