Такая версия длина1 будет давать те же результаты, что и исходная. Ее можно записать короче:

длина1( [ _ | Хвост], 1 + N) :-

 длина1( Хвост, N).

и она и в этом случае будет давать те же результаты. С помощью длина1, впрочем, тоже можно вычислять количество элементов списка:

?- длина( [а, b, с], N), Длина is N.

N = 1+(1+(l+0))

Длина = 3

Итак:

• Для выполнения арифметических действий используются встроенные процедуры.

• Арифметические операции необходимо явно запускать при помощи встроенной процедуры is. Встроенные процедуры связаны также с предопределенными операторами  +-*/div и mod.

• К моменту выполнения операций все их аргументы должны быть конкретизированы числами.

• Значения арифметических выражений можно сравнивать с помощью таких операторов, как <=< и т.д. Эти операторы вычисляют значения своих аргументов.

Упражнения

3.16. Определите отношение

mах( X, Y, Мах)

так, чтобы Мах равнялось наибольшому из двух чисел X и Y.

3.17. Определите предикат

максспис( Список, Мах)

так, чтобы Мах равнялось наибольшему из чисел, входящих в Список.

3.18. Определите предикат

сумспис( Список, Сумма)

так, чтобы Сумма равнялось сумме чисел, входящих в Список.

3.19. Определите предикат

упорядоченный( Список)

который принимает значение истина, если Список представляет собой упорядоченный список чисел. Например: упорядоченный [1, 5, 6, 6, 9, 12] ).

3.20. Определите предикат

подсумма( Множ, Сумма, ПодМнож)

где Множ это список чисел, Подмнож подмножество этих чисел, а сумма чисел из ПодМнож равна Сумма. Например:

?- подсумма( [1, 2, 5, 3, 2], 5, ПМ).

ПМ = [1, 2, 2];

ПМ = [2, 3];

ПМ = [5];

...

3.21. Определите процедуру

между( N1, N2, X)

которая, с помощью перебора, порождает все целые числа X, отвечающие условию N1≤X≤N2.

3.22.    Определите операторы 'если', 'то', 'иначе' и ':=' таким образом, чтобы следующее выражение стало правильным термом:

если X > Y то Z := X иначе Z := Y

Выберите приоритеты так, чтобы  'если' стал главным функтором. Затем определите отношение 'если' так, чтобы оно стало как бы маленьким интерпретатором выражений типа 'если-то-иначе'. Например, такого

если Вел1 > Вел2 то Перем := Вел3

иначе Перем := Вел4

где Вел1, Вел2, Вел3 и Вел4 — числовые величины (или переменные, конкретизированные числами), а Перем — переменная. Смысл отношения 'если' таков: если значение Вел1 больше значения Вел2, тогда Перем конкретизируется значением Вел3, в противном случае — значением Вел4. Приведем пример использования такого интерпретатора:

?- X = 2, Y = 3,

 Вел2 is 2*X,

 Вел4 is 4*X,

 Если Y > Вел2 то Z := Y иначе Z := Вел4.

 Если Z > 5 то W := 1 иначе W :=0.

X = 2

Y = 3

Z = 8

W = 1

Вел2 = 4

Вел4 = 8

Резюме

• Список — часто используемая структура. Он либо пуст, либо состоит из головы и хвоста, который в свою очередь также является списком. Для списков в Прологе имеется специальная нотация.

• В данной главе рассмотрены следующие операции над списками: принадлежность к списку, конкатенация, добавление элемента, удаление элемента, удаление подсписка.

• Операторная запись позволяет программисту приспособить синтаксис программ к своим конкретным нуждам. С помощью операторов можно значительно повысить наглядность программ.

• Новые операторы определяются с помощью директивы op, в которой указываются его имя, тип и приоритет.

• Как правило, с оператором не связывается никакой операции; оператор это просто синтаксическое удобство, обеспечивающее альтернативный способ записи термов.

• Арифметические операции выполняются с помощью встроенных процедур. Вычисление арифметических выражений запускается процедурой is, а также предикатами сравнения <, =< и т.д.

• Понятия, введенные в данной главе:

 список, голова списка, хвост списка

 списковая нотация

 операторы, операторная нотация

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату