Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки логического программирования. Учебное пособие
.pdf
< <B, C>, D> >.
Аппликация обозначается как двоеточие ":". Если f - функция, а X объект, то f:X - результат применения функции к объекту. Примеры:
+ (функция сложения) +:<1, 2> = 3.
1 (функция выбора 1-го элемента) 1:<A, B, C> = A.
2 (функция выбора 2-го элемента) 2:<A, B, C> = B.
t1 (функция хвоста кортежа) t1:<A, B, C> = <B, C>.
Функции преобразуют объекты в объекты и сохраняют
неопределенность ( f:<?> = <?> ). Результат применения функции к
объекту является неопределенностью ( f:X = <?> ) в следующих
случаях:
1. результат операции ":" равен <?> ;
2. незавершенная операция ":" (зацикливание).
Примитивные функции
Для описания примитивных функций воспользуемся синтаксисом
условного выражения Маккарти:
P1 -> E1,..., Pn -> En, T -> E.
Здесь - логические условия, а - выражения.
Семантика вычислений такова: вычисляются последовательно условия
до тех пор, пока не найдется истинное значение ( T является
тождественно истинным условием) и значение соответствующего
выражения (после стрелки с этим условием) становится значением
всего выражения. Будем условное выражение Маккарти записывать в
виде:
P1 -> E1;...; Pn -> En; E.
При описании функции будем использовать двойное двоеточие как
слово "есть" для отделения описываемой функции и описания при
Языки логического программированияВ.С. Рублев
101

помощи выражения Маккарти:
f:X :: <описание функции>.
Тождественная функция
id:X :: X
Логические функции
Атом
Пусто ( null )
Число ( numb )
Равенство ( eq )
Неравенство ( ne )
Арифметические операции и отношения
Cумма ( + )
+ : X :: X=<y,z> & numb(y) & numb(z) -> y+z; <?>
Разность ( - )
Языки логического программированияВ.С. Рублев
102

- : X :: X=<y,z> & numb(y) & numb(z) -> y-z; <?>
Произведение ( x )
x : X :: X=<y,z> & numb(y) & numb(z) -> y*z; <?>
Частное ( )
Больше, чем ( gt )
gt:X :: X=<y,z> & y>z -> T;
X=<y,z> & y<=z -> F;
<?>
Больше или равно ( ge )
ge:X :: X=<y,z> & y>=z -> T;
X=<y,z> & y<z -> F;
<?>
Меньше, чем ( lt )
lt:X :: X=<y,z> & y<z -> T;
X=<y,z> & y>=z -> F;
<?>
Меньше или равно ( le )
le:X :: X=<y,z> & y<=z -> T;
X=<y,z> & y>z -> F;
<?>
Функции кортежей
Селекторы
1:X :: X=<x1,..., xn> -> x1; <?>
s:X :: X=<x1,..., xn> & n >= s -> xs; <?>
Языки логического программированияВ.С. Рублев
103

Например,
5 5:<t1, t2,t3, t4, t5, e> = t5,
5 5:<e> = <?>.
Хвост
t1:X :: X=<x1> -> <>;
X=<x1,..., xn> & n >= 2 -> <x2,..., xn>;
<?>
Расписать левым - кортеж пар из 1-го аргумента и элементов 2-го (
distl )
distl : X :: X=<y,<> > -> ;
X=<y, <z1,..., zn>>->
<<y,z1>,..., <y,zn>>;
<?>
Расписать правым - кортеж пар из элементов 1-го аргумента и 2-го
аргумента ( distr )
distr : X :: X=<<>,y> -> <>;
X=<<z1,..., zn>, y>->
<<z1, y>,..., <zn, y>>;
<?>
Присоединить слева - 1-й аргумент ко 2-му ( appendl )
appendl : X :: X=<y, <>> -> <y>;
X=<y, <z1,..., zn>> -> <y, z1,..., zn>;
<?>
Присоединить справа - 2-й аргумент к 1-му ( appendr )
appendr : X :: X=<<>, y> -> <y>;
X=<z1,..., zn>, y> -> <z1,..., zn, y>;
<?>
Языки логического программированияВ.С. Рублев
104

Следующие две функции хотя и задаются как примитивные, могут быть
написаны с помощью языка модели Бэкуса (см. далее).
Длина кортежа ( long )
long : X :: X=<> -> 0; X=<x1,..., xn> -> n; <?>
Транспонирование матрицы ( trans )
trans : X :: X=<<x11,..., x1m>,
<x21,..., x2m>,
...
<xn1,..., xnm>> ->
<<x11,..., xn1>,
<x12,..., xn2>,
...
<x1m,..., xnm>>;
<?>
Матрица представляется в виде кортежа кортежей.
Конъюнкция ( & )
Дизъюнкция ( )
Отрицание ( not )
not : X :: X=T -> F;
X=F -> T;
<?>
Языки логического программированияВ.С. Рублев
105

Упражнения
1. С помощью условного выражения Маккарти и примитивных
функций опишите функцию, которая перемножает 2 комплексных
числа, заданных кортежами из вещественной и мнимой части.
2. С помощью условного выражения Маккарти и примитивных
функций опишите функцию, которая проверяет является ли кортеж
матрицы данных квадратной матрицей.
3. С помощью условного выражения Маккарти и примитивных
функций опишите функцию, которая сравнивает на равенство 2
комплексных числа заданных кортежами из вещественной и
мнимой части.
4. С помощью условного выражения Маккарти и примитивных
функций опишите функцию, которая выбирает главную диагональ
квадратной матрицы 2-го порядка.
Языки логического программированияВ.С. Рублев
106

Модель Бэкуса алгебры программ: фундаментальные
формы и определение функций
Основные формы и примеры для них: композиция; конструкция;
условие и форма Бэкуса для условия; генератор постоянных; редукция;
общая аппликация; итерация; специализатор. Функции: определение
функции; примеры создания функций 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 к аргументу, а
Языки логического программированияВ.С. Рублев
107

иначе - применение 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=<> -> <>;
Языки логического программированияВ.С. Рублев
108

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; <?>.
Языки логического программированияВ.С. Рублев
109

Пример 2. Необходимо создать функцию-селектор last, которая
выбирает последний элемент кортежа. Идея организации такого
селектора основана на следующем соображении: если кортеж содержит
одну компоненту (т. е. хвост кортежа пустой), то последний элемент
является первым, т. е. выбирается селектором 1 ; если же это не так
(хвост кортежа не пустой), то задача выбора последнего элемента
сводится к задаче выбора такого элемента для хвоста кортежа. Поэтому
решением является следующее определение:
DEF last :: null*t1 -> 1; last*t1.
Так, например,
last : <a, b, c> = last: <b, c> = last : <c> = 1 : <c> = c.
Пример 3. Функцию long длины кортежа мы ввели как примитивную.
Покажем, как ее можно создать с помощью конструкций языка модели
Бэкуса. Заметим, что для определения длины кортежа нам нужно ввести
счетчик элементов кортежа, который бы увеличивался, когда мы
считаем эти элементы. Необходимо поэтому задание начальной длины
такого счетчика. Поэтому введем 2 функции: init для задания счетчика
с его нулевым начальным значением и count для подсчета числа
элементов. Тогда необходимую функцию можно определить как
композицию этих функций:
DEF long :: count*init.
Перейдем теперь к построению функции count. Для этого заметим, что
нам нужно иметь одновременно и кортеж с текущим количеством еще
не подсчитанных элементов, и счетчик уже подсчитанных элементов.
Поэтому текущими данными этой функции должен служить
вспомогательный кортеж с двумя элементами:
1. кортеж с неподсчитанными элементами исходного кортежа;
2. счетчик подсчитанных элементов исходного кортежа.
Создать такой кортеж с начальным значением элементов (первый
элемент - исходный кортеж, а второй - обнуленный счетчик) должна
функция init. Для ее описания нужно использовать форму
Языки логического программированияВ.С. Рублев
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
