/
lec04.tex
251 lines (223 loc) · 13.2 KB
/
lec04.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
\subsection{\texorpdfstring{Вывод типа}{Type deduction}}
\epigraph{Помните, что в $\lambda$-исчислении нет смысла? Здесь смысл отрицательный, скорее.}{Д.Г.}
В $\lambda$-исчислении выделяют 3 задачи:
\begin{enumerate}[label=(\asbuk*)]
\item Проверка типа: верно ли $\Gamma \vdash M : \sigma$?
\item Вывод типа: существуют ли такие $\Gamma$ и $\sigma$, что $\Gamma \vdash M : \sigma$?
\item Обитаемость типа: существуют ли такие $\Gamma$ и $M$, что $\Gamma \vdash M : \sigma$?
\end{enumerate}%
Первые две задачи возникают в контексте дизайна языков программирования.
Понятно, что задача проверки типа сводится к задаче вывода типа.
Из изоморфизма Карри-Ховарда ясно, что задача обитаемости типа эквивалентна задаче проверки выражения ИИВ на доказуемость,
а задача проверки типа может быть рассмотрена как верификация доказательства.
В этом разделе мы будем рассматривать задачу вывода типа.
\begin{definition}[алгебраический терм]
\begin{bnf}
\[
A ::= x | f\left(A, \ldots, A\right)
\]
\end{bnf}%
где $x \in X$, $f$ "--- функциональный символ.
\end{definition}
Уравнение в алгебраических термах: $A = A$.
\begin{definition}[подстановка] Подстановкой называется функция из $A$ в $A$:
\[
S : A \to A
\]
Причём $S$ "--- id\footnote{id "--- общепринятое обозначение функции $f(x)=x$.} почти везде (везде, кроме конечного количества).
\end{definition}
\begin{definition}[естественное обобщение]
Естественное обобщение "--- такая подстановка $S : A \to A$, получаемая из $S : X \to A$, что
$S\left(f\left(A_1 \dots A_n\right)\right) = f\left(S(f_1) \ldots S(f_n)\right)$
\end{definition}
\begin{definition}[унификатор] \label{unificator}
$S$ "--- унификатор (решение уравнения) $P=Q$, если $S(P)=S(Q)$.
\end{definition}
\begin{example}
Пусть
\[
\sigma = \beta\to\alpha\to\beta \qquad \tau = (\gamma\to\gamma)\to\delta
\]
Их унификатор это
\[
S = [\beta \coloneqq \gamma\to\gamma, \delta \coloneqq \alpha\to\gamma\to\gamma]
\qquad S(\sigma) \equiv S(\tau) = (\gamma\to\gamma)\to\alpha\to\gamma\to\gamma
\]
\end{example}
Задача решения уравнения в алгебраических термах "--- унификация.
\begin{definition}[композиция]
$(S \circ T)(A) = S(T(A))$
\end{definition}
\begin{definition}[частный случай]
$T$ "--- частный случай $U$, если существует такое $S$, что $T = S \circ U$.
\end{definition}
\begin{definition}[наиболее общий унификатор]
Наиболее общий унификатор $U$ для уравнения $A=B$ "--- такой унификатор, что:
\begin{enumerate}
\item $U(A)=U(B)$.
\item Любой другой унификатор "--- частный случай $U$.
\end{enumerate}
\end{definition}
\begin{definition}[несовместная система]
Назовём систему несовместной, если выполнено одно из условий:
\begin{enumerate}
\item В ней есть уравнение вида $f(\ldots)=g(\ldots)$.
\item В ней есть уравнение вида $x = f(\ldots~x~\ldots)$.
\end{enumerate}
\end{definition}
\begin{definition}[эквивалентные системы]
Назовём две системы эквивалентными, если они имеют одинаковые решения.
\end{definition}
\begin{statement}
Для любой системы
\[
\begin{cases}
A_1 = B_1 \\
\phantom{A_1} \mathrel{\makebox[\widthof{=}]{\vdots}} \\
A_n = B_n
\end{cases}
\]
найдётся эквивалентная ей система из одного уравнения:
\[
f(A_1 \ldots A_n) = f(B_1 \ldots B_n)
\]
где $f$ "--- новый символ.
\end{statement}
\begin{definition}[разрешённая система]
Назовём систему разрешённой, если:
\begin{enumerate}
\item Все уравнения имеют вид $x = A$.
\item Если переменная встречается в левой части, то ни в каком уравнении она не встречается в правой части.
\item Переменная может встречаться в левой части только одного уравнения.
\end{enumerate}
\end{definition}
По системе в разрешённой форме $\set{x_i = A_i}$ мы можем построить решение $S$, определив $S(x_i) = A_i$ для каждого $i$.
\begin{statement}
Построенный по системе в разрешённой форме унификатор $S$ "--- наиболее общий унификатор.
\end{statement}
\begin{statement}
Несовместная система не имеет решений.
\end{statement}
Рассмотрим следующие преобразования, не меняющие свойств системы:
\begin{center}
\begin{tabular}{l l l} \toprule
Выражения & Условия & Новые выражения \\ \midrule
$T=x$, $T$ не переменная & & $x=T$ \\ \midrule
$T=T$ & & убрать это уравнение \\ \midrule
\multirow{2}{*}[-\aboverulesep]{$f(A_1, \ldots A_n) = g(B_1, \ldots B_n)$}
& $f=g$ & $ A_1 = B_1 \ldots A_n = B_n$ \\ \cmidrule{2-3}
& $f \neq g$ & система несовместна \\ \midrule
\multirow{2}{*}[-\aboverulesep]{$x=T$, $R=S$, $x$ входит в $S$ или $R$}
& $T$ не содержит $x$ & $x=T$,
$R\left[x\coloneqq T\right]=S\left[x\coloneqq T\right]$\\ \cmidrule{2-3}
& $T$ содержит $x$ & система несовместна \\ \bottomrule
\end{tabular}
\end{center}
\begin{statement}
Последовательное применение преобразований либо за конечное число шагов приведёт систему в разрешённый вид,
либо покажет, что она несовместна.
\end{statement}
\begin{proof}
Пусть $(n_1, n_2, n_3)$ "--- характеристика системы, где
$n_1$ "--- количество переменных, не входящих систему только слева от знака равенства один раз,
$n_2$ "--- общее количество вхождений функциональных символов в $S$,
$n_3$ "--- количество выражений вида $T=x$ или $T=T$.
Каждое преобразование уменьшает эту тройку (если сравнивать лексикографически).
\end{proof}
\begin{theorem}
Задача вывода типа в $\lambda$-исчислении разрешима.
\end{theorem}
\begin{proof}
Опишем алгоритм. Пусть нам дан $\lambda$-терм $M$. Рекурсивно построим по нему систему уравнений $E_m$ и тип выражения $\tau_m$:
\begin{center}
\begin{tabular}{l l l} \toprule
Вид $M$ & $E_m$ & $\tau_m$ \\ \midrule
$x$ & $\varnothing$ & $\alpha_x$ "--- новая переменная \\ \midrule
$PR$ & $E_p \cup E_r \cup \set{\tau_p=\tau_r\to\pi}$ & $\pi$ "--- новая переменная \\ \midrule
$\lambda x . P$ & $E_p$ & $\tau_x\to\tau_p$ \\ \bottomrule
\end{tabular}
\end{center}
Решим построенную систему уравнений.
Пусть унификатор $S$ "--- решение системы уравнений $E_m$. Тогда тип $M$ это $S(\tau_m)$.
Можно показать, что алгоритм корректный.
\end{proof}
Отметим важную для реализации деталь. Одной переменной должен соответствовать только один тип.
Однако не всегда переменные, называющиеся одинаково, мы считаем одинаковыми.
В выражении $\lambda f x . f \reduction x \reduction x$ важно, чтобы выделенные переменные получили один тип.
Но в выражении $\lambda x . \reduction x \lambda x . \reduction x \lambda x . \reduction x$ типы выделенных переменных должны быть разными.
Его тип должен быть такой же, как и, например, тип выражения $\lambda x . x \lambda y . y \lambda z . z$.
Можно сформулировать правило: построенная система уравнений должна оставаться корректной для любого выражения,
$\alpha$-эквивалентного исходному.
\begin{example}
Рассмотрим выражение $\overline 2 = \lambda f . \lambda x . f (f x)$. Сначала построим по нему систему уравнений
($M$ "--- аргумент функции, столбики справа "--- рекурсивные вызовы, $E$ и $\tau$ "--- результат функции):
\begin{center}
\begin{tabular}{l l l l l} \toprule
$M = \lambda f x . f (f x)$ & $M = \lambda x . f (f x)$ & $M = f (f x)$ & $M = f$ & \\
& & & $E = \varnothing$ & \\
& & & $\tau = \alpha$ \\ \cmidrule{4-5}
& & & $M = f x$ & $M = f$ \\
& & & & $E = \varnothing$ \\
& & & & $\tau = \alpha$ \\ \cmidrule{5-5}
& & & & $M = x$ \\
& & & & $E = \varnothing$ \\
& & & & $\tau = \beta$ \\ \cmidrule{5-5}
& & & $E = \set{\alpha = \beta \to \gamma}$ & \\
& & & $\tau = \gamma$ & \\ \cmidrule{4-5}
$E = \begin{cases}
\alpha=\beta\to\gamma \\
\alpha=\gamma\to\delta
\end{cases}\mkern-18mu$ &
$E = \begin{cases}
\alpha=\beta\to\gamma \\
\alpha=\gamma\to\delta
\end{cases}\mkern-18mu$ &
$E = \begin{cases}
\alpha=\beta\to\gamma \\
\alpha=\gamma\to\delta
\end{cases}\mkern-18mu$ & & \\[1.2em]
$\tau = \alpha\to(\beta\to\delta)$ &
$\tau = \beta\to\delta$ &
$\tau = \delta$ & & \\ \bottomrule
\end{tabular}
\end{center}
Затем решим полученную систему уравнений:
\[
\begin{cases}
\alpha=\beta\to\gamma \\
\alpha=\gamma\to\delta
\end{cases} \mkern-18mu
\implies
\begin{cases}
\alpha=\beta\to\gamma \\
\beta\to\gamma=\gamma\to\delta
\end{cases} \mkern-18mu
\implies
\begin{cases}
\alpha=\beta\to\gamma \\
\beta=\gamma \\
\gamma=\delta
\end{cases} \mkern-18mu
\implies
\begin{cases}
\alpha=\beta\to\delta \\
\beta=\delta \\
\gamma=\delta
\end{cases} \mkern-18mu
\implies
\begin{cases}
\alpha=\delta\to\delta \\
\beta=\delta \\
\gamma=\delta
\end{cases}
\]
Получаем подстановку $S = \left[\alpha\coloneqq\delta\to\delta, \beta\coloneqq\delta, \gamma\coloneqq\delta\right]$.
Применяя её к $\tau$ получаем тип выражения:
\begin{gather*}
S(\tau) = (\delta\to\delta)\to(\delta\to\delta) \\
\lambda f . \lambda x . f (f x) : (\delta\to\delta)\to(\delta\to\delta)
\end{gather*}
\end{example}
%\subsection{\texorpdfstring{Про ложь}{About false}}
%
%\todo\ послушать запись. %todo