Ярославский Государственный Университет им. П.Г. Демидова
Опубликован: 06.11.2008 | Доступ: свободный | Студентов: 989 / 62 | Оценка: 4.50 / 4.00 | Длительность: 10:47:00
Лекция 12:

Модель Бэкуса алгебры программ: фундаментальные формы и определение функций

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Аннотация: Основные формы и примеры для них: композиция; конструкция; условие и форма Бэкуса для условия; генератор постоянных; редукция; общая аппликация; итерация; специализатор. Функции: определение функции; примеры создания функций pair (пара ли кортеж), last (последний элемент кортежа), long (длина кортежа), trans (транспонирование матрицы), !n (факториал), IP (скалярное произведение); особенности стиля программирования в модели Бэкуса.

Фундаментальные формы

Помимо аппликации в язык модели Бэкуса введено еще 8 основных форм.

Композиция ( * )

(f*g) : X :: f:(g:X).

Функции композиции применяются к аргументу справа налево. Например, композиция 1*t1 селектора первого элемента и выбора хвоста кортежа - это селектор 2 выбора второго элемента кортежа.

Конструкция ( ,)

(f1,...,fn) : X :: <f1 : X,..., fn : X >.

Применение конструкции к аргументу есть кортеж, элементами которого является применение каждой функции конструкции к аргументу. Например, (3,2,1):<a, b, c> = <c, b, a>.

Условие ( ->; )

(p -> f; g) : X :: (p : X) = T -> f : X; (p : X) = F -> g : X; <?>.

В условии участвуют 3 функции: p - предикатная функция, f и g - любые функции. Если применение предиката p к аргументу является истинным, то значением условия будет применение f к аргументу, а иначе - применение g к аргументу. Если p на аргументе не возвращает истинностное значение или же f или g не применимы к аргументу, то результатом будет неопределенность. Например, определенная условием функция (> -> 1; 2) возвращает значение максимального из 2 элементов кортежа данного.

Для большей наглядности круглые скобки, выделяющие условие, опускаются (так называемая форма Бэкуса для условия ). Например, в записи (p1 -> f1; (p2 -> f2; g)) мы будем опускать скобки:

p1 -> f1; p2 -> f2; g.

Генератор постоянных ( const )

const(X) : Y :: Y = <?> -> <?>; X

Например, const(5): <1, 2, 3> = 5, а const(T) : <1, 2, 3> = T.

Редукция ( / )

/ f : X :: X=<x1> -> x1;
           X=<x1,..., xn> & n >= 2 ->
                              f:<x1, /f:<x2,..., xn>>;
           <?>

Примером редукции может служить суммирование всех компонент числового кортежа /+. Действительно,

/+ : <1, 2, 3> = +:<1, /+:<2, 3>> =
               = +:<1, +:<2, /+:<3>>> = +:<1, +:<2, 3> > =
               = +:<1, 5> = 6.

Из примера видно, что редукция связана с циклом по всем элементам кортежа с накоплением результата.

Общая аппликация ( A )

Af : X :: X=<> -> <>;
          X=<x1,..., xn> -> <f:x1,..., f:xn>;
          <?>

Например, для получения 1-го столбца матрицы можно выполнить общую аппликацию селектора 1. Действительно,

A1 : < <1, 2, 3>, <4, 5, 6>, <7, 8, 9> > = <1, 4, 7>.

Итерация ( while )

(while p f) : X :: (p : X) = T -> (while p f) : (f : X); 
                   (p : X) = F -> X;
                   <?>

Специализатор ( s )

(s f X) : Y :: f : <X, Y>

Например, (s+1): Y :: + <1,Y>, т. е. 1+Y.

Формы служат для создания новых функций, определение и построение которых мы рассмотрим в следующем разделе.

Функции

Новая функция определяется следующим образом:

DEF I :: r,

где I - неиспользованное ранее имя новой функции, а r - функциональная форма, которая может зависеть и от I, т. е. функция может определяться рекурсивно.

Пример 1. Необходимо создать логическую функцию pair, которая возвращает значение T, когда аргументом является кортеж с парой элементов, и значение F, если это не так, но аргумент определен. Решением является следующее определение этой функции:

DEF pair :: eq*(long, const(2)) -> T; ne*(long, const(2)) -> F; <?>.

Пример 2. Необходимо создать функцию-селектор last, которая выбирает последний элемент кортежа. Идея организации такого селектора основана на следующем соображении: если кортеж содержит одну компоненту (т. е. хвост кортежа пустой), то последний элемент является первым, т. е. выбирается селектором 1 ; если же это не так (хвост кортежа не пустой), то задача выбора последнего элемента сводится к задаче выбора такого элемента для хвоста кортежа. Поэтому решением является следующее определение:

DEF last :: null*t1 -> 1; last*t1.

Так, например,

last : <a, b, c> = last: <b, c> = last : <c> = 1 : <c> = c.
< Лекция 11 || Лекция 12: 12 || Лекция 13 >