Такая версия длина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
, а также предикатами сравнения <
, =<
и т.д.
• Понятия, введенные в данной главе:
список, голова списка, хвост списка
списковая нотация
операторы, операторная нотация