диана работает секретарем в нашем отделе.
а затем спрашивать:
?- Кто работает секретарем в нашем отделе.
Кто = диана
?- диана работает Кем.
Кем = секретарем в нашем отдела
3.14. Рассмотрим программу:
t( 0+1, 1+0).
t( X+0+1, X+1+0).
t( X+1+1, Z) :-
t( X+1, X1),
t( X1+1, Z).
Как данная программа будет отвечать на ниже перечисленные вопросы, если '+
' — это (как обычно) инфиксный оператор типа yfx
?
(a) ?- t( 0+1, А).
(b) ?- t( 0+1+1, В).
(с) ?- t( 1+0+1+1+1, С).
(d) ?- t( D, 1+1+1+0).
3.15. В предыдущем разделе отношения между списка ми мы записывали так:
принадлежит( Элемент, Список),
конк( Список1, Список2, Список3),
удалить( Элемент, Список, НовыйСписок), ...
Предположим, что более предпочтительной для нас является следующая форма записи:
Элемент входит_в Список,
конкатенация_списков Список1 и Список2
дает Список3,
удаление_элемента Элемент из_списка Список
дает НовыйСписок, ...
Определите операторы 'входит_в
', 'конкатенация_списков
', 'и
' и т.д. таким образом, чтобы обеспечить эту возможность. Переопределите также и соответствующие процедуры.
3.4. Арифметические действия
Пролог рассчитан главным образом на обработку символьной информации, при которой потребность в арифметических вычислениях относительно мала. Поэтому и средства для таких вычислений довольно просты. Для осуществления основных арифметических действий можно воспользоваться несколькими предопределенными операторами.
+
сложение
-
вычитание
*
умножение
/
деление
mod
модуль, остаток от целочисленного деления
Заметьте, что это как раз тот исключительный случай. когда оператор может и в самом деле произвести некоторую операцию. Но даже и в этом случае требуется дополнительное указание на выполнение действия. Пролог-система знает, как выполнять вычисления, предписываемые такими операторами, но этого недостаточно для их непосредственного использования. Следующий вопрос - наивная попытка произвести арифметическое действие:
?- X = 1 + 2.
Пролог-система 'спокойно' ответит
X = 1 + 2
а не X = 3
, как, возможно, ожидалось. Причина этого проста: выражение 1 + 2
обозначает лишь прологовский терм, в котором +
является функтором, а 1 и 2 — его аргументами. В вышеприведенной цели нет ничего, что могло бы заставить систему выполнить операцию сложения. Для этого в Прологе существует специальный оператор is
(есть). Этот оператор заставит систему выполнить вычисление. Таким образом, чтобы правильно активизировать арифметическую операцию, надо написать:
?- X is 1 + 2.
Вот теперь ответ будет
X = 3
Сложение здесь выполняется специальной процедурой, связанной с оператором +
. Мы будем называть такие процедуры
В Прологе не существует общепринятой нотации для записи арифметических действий, поэтому в разных реализациях она может слегка различаться. Например, оператор '/
' может в одних реализациях обозначать целочисленное деление, а в других — вещественное. В данной книге под '/
' мы подразумеваем вещественное деление, для целочисленного же будем использовать оператор div
. В соответствии с этим, на вопрос
?- X is 3/2,
Y is 3 div 2.
ответ должен быть такой:
X = 1.5
Y = 1
Левым аргументом оператора is
является простой объект. Правый аргумент — арифметическое выражение, составленное с помощью арифметических операторов, чисел и переменных. Поскольку оператор is
запускает арифметические вычисления, к моменту начала вычисления этой цели все ее переменные должны быть уже конкретизированы какими-либо числами. Приоритеты этих предопределенных арифметических операторов (см. рис. 3.8) выбраны с таким расчетом, чтобы операторы применялись к аргументам в том порядке, который принят в математике. Чтобы изменить обычный порядок вычислений, применяются скобки (тоже, как в математике). Заметьте, что +
, -
, *
, /
и div
определены, как yfx
, что определяет порядок их выполнения слева направо. Например,
X is 5 - 2 - 1
понимается как
X is (5 - 2) - 1
Арифметические операции используются также и при
?- 277 * 37 > 10000.
yes
(да)
Заметьте, что точно так же, как и is
, оператор '>
' вызывает выполнение вычислений.
Предположим, у нас есть программа, в которую входит отношение рожд
, связывающее имя человека с годом его рождения. Тогда имена людей, родившихся между 1950 и 1960