---
# System prepended metadata

title: JP 9

---

# JP 9

[JP 8](https://hackmd.io/06zXspmXQW-BCzT5D2Kctw)

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

## Zadanie 1
![](https://i.imgur.com/GDXVvxw.png)
![](https://i.imgur.com/PdIXfm7.png)


Niech $\text{refs}(t)$ = wszystkie wskaźniki w pamięci używane w $t$.

Wskaźnik $l$ jest osiągalne w jednym kroku z $l'$ w pamięci $\mu'$ jeśli $l' \in \text{refs}(\mu(l))$.
Wskaźnik $l$ jest osiągalne w wielu krokach z $l'$ jeśli istnieje ciąg lokalizacji zaczynający się na $l$ i kończący się na $l'$, taki, że każdy kolejny element jest osiągalny w jednym kroku z poprzedniego.

$$
\frac{\mu' = \mu \text{ obciete do osiagalnych wskaznikow z $t$}}{t|\mu \rightarrow^{GC} t|\mu'}
$$

Tę regułę wykonujemy na skrajnie zewnętrznym termie (jeśli potrafimy) albo musimy zastosować trick z dzieleniem pamięci przy schodzeniu w podterm:
$\mu_1, v_1 \ t_2 \rightarrow \mu_1 \cap refs(t_2), t_2 \rightarrow \mu_1 \cup \mu_2, v_1 \, v_2$.

Twierdzenie do pokazania:

$$
\forall_{t, t_1, \mu} \,
\exists_{\mu_1, \mu_2} \, 
t \, | \, \mu \rightarrow^{*} t_1 \, | \, \mu_1 \iff 
t \, | \, \mu \rightarrow^{*}_{GC} t_1 \, | \, \mu_2
\land (\mu_2 \subseteq \mu_1)
$$

## Zadanie 2

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

Mamy taką regułę typowania:
![](https://i.imgur.com/VJoWU1N.png)

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



$\texttt{let } r_1 = \texttt{ref } (\lambda x : \texttt{Nat}. 0) \texttt{ in}$
$\texttt{let } r_2 = \texttt{ref } (\lambda x : \texttt{Nat}. (!r_1) \, 0) \texttt{ in}$
$(r_1 := (\lambda x : \texttt{Nat}. (!r_2) \, 0));$
$r_2$

```ocaml=
let r_1 = ref (fun x : Nat -> 0) in
let r_2 = ref (fun x : Nat -> (!r_1) 0) in
r_1 := (fun x : Nat -> (!r_2) 0);
r_2
```

----------------------------------------------------------

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


## Zadanie 3
![](https://i.imgur.com/kVjgnF4.png)
![](https://i.imgur.com/61kVK3G.png)

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


### Lemat o podstawieniu
![](https://i.imgur.com/0k5qeHX.png)

W trywialny sposób można zauważyć, że nic się nie zmieni.

### Lemat o osłabianiu

$\Gamma \, | \, \Sigma \vdash t : T$, to dla $\Sigma \subseteq \Sigma'$ mamy $\Gamma \, | \, \Sigma' \vdash t : T$.

### Dowód

Indukcja po strukturze wyprowadzenia typu.

* (T-LOC) -- trywialne (bo nasz term jest wartością)
$$
\frac{\Sigma(l) = T_1}{\Gamma \, | \, \Sigma \vdash l : \texttt{Ref } T_1}
$$

* (T-REF)
$$
\frac{\Gamma \, | \, \Sigma \vdash t_1 : T_1}
{\Gamma \, | \, \Sigma \vdash \texttt{ref } t_1 : \texttt{Ref } T_1}
$$
    * Jeśli $t_1 = v_1$, to zrobimy krok z (E-REFV). Uzyskamy z tego pewne miejsce w pamięci $l$ z $\mu' = \mu \cup \{ l, v_1 \}$. Weźmy $\Sigma' = \Sigma \cup \{ l : T_1 \}$. Oczywiście $\Gamma \, | \, \Sigma' \vdash \mu'$, bo $v_1$ ma typ $T_1$. $\Gamma \, | \, \Sigma' \vdash l : \texttt{Ref } T_1$ mamy z (T-LOC), bo przesłanka $\Sigma'(l) = T_1$ jest spełniona.
    * Wpp. $t_1 \rightarrow t_1'$ i z założenia indukcyjnego dla $t_1$ wiemy, że $t_1'$ ma typ $T_1$.

* (T-DEREF)
$$
\frac{\Gamma \, | \, \Sigma \vdash t_1 : \texttt{Ref } T_{11}}
{\Gamma \, | \, \Sigma \vdash \, !t_1 : T_{11}}
$$
    * Jeśli $t_1 = l_1$, to korzystamy z reguły (E-DEREFLOC). Zwrócimy $\mu(l_1) = v_1$. Korzystamy z $\Gamma \, | \, \Sigma \vdash \mu$, więc wiemy że $\Sigma(l_1) = T_{11}$, czyli $v_1$ ma typ $T_{11}$.
    * Wpp. $t_1 \rightarrow t_1'$ i z założenia indukcyjnego dla $t_1$, wiemy że $t_1'$ ma typ $T_1$.

* (T-ASSIGN)
$$
\frac{\Gamma \, | \, \Sigma \vdash t_1 : \texttt{Ref } T_{11} \hspace{10pt} \Gamma \, | \, \Sigma \vdash t_2 : T_{11}}
{\Gamma \, | \, \Sigma\ \vdash t_1 := t_2 : \texttt{Unit}}
$$
    * Jeśli $t_1 = l_1, t_2 = v_2$, to korzystamy z reguły (E-ASSIGN). W oczywisty sposób zwracamy $\texttt{unit}$, czyli zwracany typ to $\texttt{Unit}$. Zauważmy, że w $\mu'$ pod $l$ mamy nadal ten sam typ, czyli nadal zachodzi $\Gamma \, | \, \Sigma \vdash \mu'$.
    * Wpp. jeśli $t_1 = l_1$, to korzystamy z reguły (E-ASSIGN2). Wtedy $t_2 \rightarrow t_2'$, a z założenia indukcyjnego dla $t_2'$ ma ono ten sam typ co $t_2$.
    * Wpp. korzystamy z reguły (E-ASSIGN1). Wtedy $t_1 \rightarrow t_1'$, a z założenia indukcyjnego dla $t_1'$ ma ono ten sam typ co $t_1$.


## Zadanie 4
![](https://i.imgur.com/hJMKji4.png)
![](https://i.imgur.com/yxXozFt.png)

Indukcja po strukturze wyprowadzenia typu.

* (T-LOC) -- trywialne (bo nasz term jest wartością)
$$
\frac{\Sigma(l) = T_1}{\Gamma \, | \, \Sigma \vdash l : \texttt{Ref } T_1}
$$
* (T-REF)
$$
\frac{\Gamma \, | \, \Sigma \vdash t_1 : T_1}
{\Gamma \, | \, \Sigma \vdash \texttt{ref } t_1 : \texttt{Ref } T_1}
$$
    * Jeśli $t_1 = v_1$, to korzystamy z reguły (E-REFV)
    * Wpp. korzystamy z reguły (E-REF) i założenia indukcyjnego dla $t_1$

* (T-DEREF)
$$
\frac{\Gamma \, | \, \Sigma \vdash t_1 : \texttt{Ref } T_{11}}
{\Gamma \, | \, \Sigma \vdash \, !t_1 : T_{11}}
$$
    * Jeśli $t_1 = l$, to korzystamy z reguły (E-DEREFLOC)
    * Wpp. korzystamy z reguły (E-DEREF) i założenia indukcyjnego dla $t_1$

* (T-ASSIGN)
$$
\frac{\Gamma \, | \, \Sigma \vdash t_1 : \texttt{Ref } T_{11} \hspace{10pt} \Gamma \, | \, \Sigma \vdash t_2 : T_{11}}
{\Gamma \, | \, \Sigma\ \vdash t_1 := t_2 : \texttt{Unit}}
$$
    * Jeśli $t_1 = l_1, t_2 = v_2$, to korzystamy z reguły (E-ASSIGN)
    * Wpp. jeśli $t_1 = l_1$, to korzystamy z założenia indukcyjnego dla $t_2$ i reguły (E-ASSIGN2)
    * Wpp. korzystały z założenia indukcyjnego dla $t_1$ i reguły (E-ASSIGN1)


## Zadanie 5
![](https://i.imgur.com/6JiqvLc.png)

### CBV

Z podstawieniem:

$$
\frac{}{v \Downarrow v}
$$

$$
\frac{t_1 \Downarrow \lambda x. t_1' \hspace{30pt} t_2 \Downarrow v_2 \hspace{30pt} [x \mapsto v_2]t_1' \Downarrow v_3}
{t_1 t_2 \Downarrow v_3}
$$

Bez podstawienia (środowisko):
$$
\frac{}{E \vdash v \, | \, \mu \Downarrow E, v, \mu} \hspace{30pt} $$

$$
\frac{x \in \text{Dom}(E) \hspace{30pt} E(x) = E', v}
{E \vdash x \, | \, \mu \Downarrow E', v, \mu}
$$

$$
\frac{E \vdash t_1 \, | \, \mu \Downarrow E_1, \lambda x.t_1', \mu_1 \hspace{10pt}
E \vdash t_2 \, | \, \mu_1 \Downarrow E_2, v_2, \mu_2 \hspace{10pt}
[E_1;(x \mapsto E_2, v_2)] \vdash t_1' \, | \, \mu_2 \Downarrow E', v_3, \mu_3}
{E \vdash t_1 t_2 \, | \, \mu \Downarrow E', v_3, \mu_3}
$$

$$
\frac{E \vdash t_1, \mu \Downarrow E_1, l_1, \mu_1 
\hspace{20pt} \mu_1(l_1) = E', v_1}
{E \vdash \, !t_1 \, | \, \mu \Downarrow E', v_1, \mu_1}
$$

$$
\frac{E \vdash t_1 \, | \, \mu \Downarrow E_1, v_1, \mu_1
\hspace{20pt}
l \notin Dom(\mu_1)
\hspace{20pt}
\mu_2 = [\mu_1; (l \mapsto E_1, v_1)]
}
{E \vdash \texttt{ref } t_1 \, | \, \mu \Downarrow E, l, \mu_2}
$$

$$
\frac{E \vdash t_1 \, | \, \mu \Downarrow E_1, l_1, \mu_1
\hspace{20pt}
E \vdash t_2 \, | \, \mu_1 \Downarrow E_2, v_2, \mu_2
\hspace{20pt}
\mu_3 = [\mu_2; (l_1 \mapsto E_2, v_2)]
}
{E \vdash t_1 := t_2 \, | \, \mu \Downarrow E, \texttt{unit}, \mu_3}
$$

Przykład, dla którego w powyższych dwóch regułach zwracamy $E$, a nie $E_1$ ani $E_2$
$$
\texttt{ref } (\lambda x. x) \, 0
$$
