- •Списки, операторы, арифметика
- •3. 1. Представление списков
- •3. 2. Некоторые операции над списками
- •3. 2. 1. Принадлежность к списку
- •3. 2. 2. Сцепление ( конкатенация)
- •3. 2. 3. Добавление элемента
- •3. 2. 4. Удаление элемента
- •3. 2. 5. Подсписок
- •3. 2. 6. Перестановки
- •3. 3. Операторная запись (нотация)
- •3. 4. Арифметические действия
- •Упражнения
Упражнения
3. 1. (а) Используя отношение конк, напишите цель, соответствующую вычеркиванию трех последних элементов списка L, результат - новый список L1. Указание: L - конкатенация L1 и трехэлементного списка.
(b) Напишите последовательность целей для порождения списка L2, получающегося из списка L вычеркиванием его трех первых и трех последних элементов.
3. 2. Определите отношение
последний( Элемент, Список)
так, чтобы Элемент являлся последним элементом списка Список. Напишите два варианта определения: (а) с использованием отношения конк, (b) без использования этого отношения.
3. 3. Определите два предиката
четнаядлина( Список) и нечетнаядлина( Список)
таким образом, чтобы они были истинными, если их аргументом является список четной или нечетной длины соответственно. Например, список [а, b, с, d] имеет четную длину, a [a, b, c] - нечетную.
3. 4. Определите отношение
обращение( Список, ОбращенныйСписок),
которое обращает списки. Например,
обращение( [a, b, c, d], [d, c, b, a] ).
3. 5. Если принять такие определения
:- ор( 300, xfy, играет_в). :- ор( 200, xfy, и).
то два следующих терма представляют собой синтаксически правильные объекты:
Tepмl = джимми играет_в футбол и сквош Терм1 = сьюзан играет_в теннис и баскетбол и волейбол
Как эти термы интерпретируются пролог-системой? Каковы их главные функторы и какова их структура?
3. 6. Предложите подходящее определение операторов ("работает", "в", "нашем"), чтобы можно было писать предложения типа:
диана работает секретарем в нашем отделе.
а затем спрашивать:
?- Кто работает секретарем в нашем отделе. Кто = диана
?- диана работает Кем. Кем = секретарем в нашем отдела
3. 7. Рассмотрим программу:
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. 8. В предыдущем разделе отношения между списка ми мы записывали так:
принадлежит( Элемент, Список), конк( Список1, Список2, Список3), удалить( Элемент, Список, НовыйСписок), . . .
Предположим, что более предпочтительной для нас является следующая форма записи:
Элемент входит_в Список, конкатенация_списков Список1 и Список2 дает Список3, удаление_элемента Элемент из_списка Список дает НовыйСписок, ...
Определите операторы "входит_в", "конкатенация_списков", "и" и т.д. таким образом, чтобы обеспечить эту возможность. Переопределите также и соответствующие процедуры.
3. 9. Определите отношение
mах( X, Y, Мах)
так, чтобы Мах равнялось наибольшому из двух чисел Х и Y.
3. 10. Определите предикат
максспис( Список, Мах)
так, чтобы Мах равнялось наибольшему из чисел, входящих в Список.
3. 11. Определите предикат
сумспис( Список, Сумма)
так, чтобы Сумма равнялось сумме чисел, входящих в Список.
3. 12. Определите предикат
упорядоченный( Список)
который принимает значение истина, если Список представляет собой упорядоченный список чисел. Например: упорядоченный [1, 5, 6, 6, 9, 12] ).
3. 13. Определите предикат
подсумма( Множ, Сумма, ПодМнож)
где Множ это список чисел, Подмнож подмножество этих чисел, а сумма чисел из ПодМнож равна Сумма. Например:
?- подсумма( [1, 2. 5. 3. 2], 5, ПМ).
ПМ = [1, 2, 2]; ПМ = [2, 3]; ПМ = [5]; . . .
3. 14. Определите процедуру
между( Nl, N2, X)
которая, с помощью перебора, порождает все целые числа X, отвечающие условию Nl <=X <=N2.
3. 15. Определите операторы 'если', 'то', 'иначе' и ':=" таким образом, чтобы следующее выражение стало правильным термом:
если Х > Y то Z := Х иначе Z := Y
Выберите приоритеты так, чтобы 'если' стал главным функтором. Затем определите отношение 'если' так, чтобы оно стало как бы маленьким интерпретатором выражений типа 'если-то-иначе'. Например, такого
если Вел1 > Вел2 то Перем := Вел3 иначе Перем := Вел4
где Вел1, Вел2, Вел3 и Вел4 - числовые величины (или переменные, конкретизированные числами), а Перем - переменная. Смысл отношения 'если' таков: если значение Вел1 больше значения Вел2, тогда Перем конкретизируется значением Вел3, в противном случае - значением Вел4. Приведем пример использования такого интерпретатора:
?- Х = 2, Y = 3, Вел2 is 2*X, Вел4 is 4*X, Если Y>Вел2 то Z:=Y иначе Z:=Вел4.
Если Z > 5 то W := 1 иначе W :=0.
Х = 2 Y = 3 Z = 8 W = 1
Вел2 = 4 Вел4 = 8
