30 3.1. Введение
лять букву t для обозначения произвольного терма. Всюду, где встречается символ t, можно подставить
любой терм. Курсив справа — просто комментарии.
Символ t в правых частях правил грамматики называется метапеременной. Это переменная в
том смысле, что t служит в качестве заместителя какого-нибудь конкретного терма, но это «мета»-
переменная, поскольку она является переменной не объектного языка — простого языка программиро-
вания, чей синтаксис мы сейчас описываем, — а метаязыка, — знаковой системы, которая служит для
описания. (На самом деле, в нашем теперешнем объектном языке даже нет переменных; мы их вве-
дем в Главе 5.) Приставка meta- происходит из мета-математики, отрасли логики, которая изучает
математические свойства систем, предназначенных для математических и логических рассуждений (в
частности, языков программирования). Оттуда же происходит термин метатеория; он означает сово-
купность истинных утверждений, которые мы можем сделать о какой-либо логической системе (или о
языке программирования), а в расширенном смысле — исследование таких утверждений. Таким обра-
зом, выражения вроде «метатеория наследования» в этой книге могут пониматься как «формальное
исследование свойств систем с наследованием».
На протяжнии этой книги мы будем использовать метапеременную t, а также близкие к ней буквы,
скажем, s, u и r, и варианты вроде t
1
или s , для термов объектного языка, которым мы занимаемся
в данный момент; далее будут введены и другие буквы для обозначения выражений других синтак-
сических категорий. Полный список соглашений по использованию метапеременных можно найти в
Приложении B.
Пока что слова терм и выражение обозначают одно и то же. Начиная с Главы 8, когда мы станем
изучать исчисления, обладающие более богатым набором синтаксических категорий (таких, как типы),
словом выражение мы будем называть любые синтаксические объекты (в том числе выражения-термы,
выражения-типы, выражения-виды и т. п.), а терм будет употребляться в более узком смысле, для
конструкций, которые обозначают вычисления (т. е., выражения, которые можно подставить вместо
метапеременной t).
Программа на нашем нынешнем языке — это всего лишь терм, построенный при помощи перечис-
ленных выше конструкций. Вот несколько примеров программ, вместе с результатами их вычисления.
Для краткости мы используем стандартные арабские цифры для записи чисел, которые формально
представляются как набор вложенных применений операции succ к 0. Например, succ(succ(succ(0)))
записывается как 3.
if false then 0 else 1;
1
is zero ( pred ( succ 0));
true
Символом |> на протяжении всей книги обозначаются результаты вычисления примеров. (Для кратко-
сти результаты опускаются, когда они очевидны или не играют никакой роли.) При верстке результаты
автоматически вставляются реализацией системы, которая в данный момент рассматривается (в этой
главе arith); напечатанные результаты представляют собой настоящий вывод системы.
Составные аргументы succ, pred и iszero в примерах приведены, для удобства чтения, в скобках.
1
Скобки не упоминаются в грамматике термов; она определяет только абстрактный синтаксис. Разу-
меется, присутствие скобок или их отсутствие играет весьма малую роль в чрезвычайно простом языке,
с которым мы сейчас имеем дело: обычно скобки служат для разрешения неоднозначностей в грамма-
тике, но в нашей грамматике неоднозначностей нет — любая последовательность символов может быть
разобрана максимум одним способом. Мы вернемся к обсуждению абстрактного синтаксиса и скобок в
Главе 5 (стр. 50).
При верстке перевода это правило не соблюдалось. — прим. перев.
1
На самом деле интерпретатор, которым обрабатывались примеры из этой главы (на сайте книги он называется arith)
требует скобок вокруг составных аргументов succ, pred и iszero, даже несмотря на то, что их можно однозначно разо-
брать и без скобок. Это сделано для совместимости с последующими исчислениями, где подобный синтаксис используется
при применении функций к аргументам.
rev. 104