Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактикум(1-5)_ПЗ в ИС_2011 .doc
Скачиваний:
63
Добавлен:
19.11.2019
Размер:
1.56 Mб
Скачать

Поиск максимального (минимального) элемента в списке

Для пустого списка понятие максимального элемента не имеет смысла. В списке, состоящем из одного элемента, этот элемент и будет максимальным.

Рекурсивное правило для поиска максимального элемента можно записать так:

max_элемент=max(голова, max_элемент(хвост))

В правиле используется предикат max, который находит максимум из двух чисел (см. рис.2.1).

Поиск максимального числа можно осуществить попарным сравнением: найти максимум из двух первых элементов списка, оставить из них максимальное значение, продолжить сравнение, пока не останется только один элемент – он и будет максимальным во всем списке.

Практикум 4-10

Создайте предикат, для нахождения максимального значения в списке чисел

Самостоятельные задания

1.Ниже представлен пример Пролог – программы:

DOMAINS

dog_list=symbol*

PREDICATES

dogs(dog_list).

find_it(symbol,dog_list).

CLAUSES

find_it(X,[X,_]).

find_it(X,[_,Y]):-find_it(X,[Y]).

GOAL

find_it(«болонка»,[«лайка», «дог» ]),write(“да”).

Что напечатает эта программа?

  1. Напишите программу для определения максимального элемента в списке

  2. Создайте предикат, находящий предпоследний элемент списка. Создайте предикат, удаляющий предпоследний элемент списка.

Контрольное задание 2 Исходные данные

Вариант

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Задачи

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

28

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

Задачи

  1. Создайте предикат, порождающий список, состоящий из случайного количества (но не более 10) случайных чисел от 0 до 100.

  2. Напишите программу для отношения ДВОЙНОЙ_СПИСОК (Список1, Список2), в котором каждый элемент Списка1 удваивается и записывается в Список2, например, ДВОЙНОЙ_СПИСОК ( [1,2,3],[1,1,2,2,3,3] ).

  3. Определить отношение РАЗНОСТЬ(Список1, Список2, Список3), где элементы списка Список3 принадлежат Списку1, но не принадлежат Списку2.

  4. Определить отношение СДВИГ(Список1, Список2) таким образом, чтобы список Список2 представлял собой список Список1, "циклически сдвинутый" влево на один символ, например, СДВИГ([a,b,c,d], [d,a,b,c]).

  5. Треугольное число с индексом N - это сумма всех натуральных чисел до N включительно. Напишите программу, задающую отношение triangle(N,T), истинное, если T - треугольное число с индексом N.

  6. По кругу расположено N человек. Начиная с некоторой позиции, мы считаем по кругу и каждый второй человек выбывает из круга, при этом круг смыкается. Напишите программу, которая определяет порядок, в котором люди выбывают из круга, например, ВЫБ(2, [a,b,c,d,e,f,g], [b,d,f,a,e,c,g])

  7. По кругу расположено N человек. Начиная с некоторой позиции, мы считаем по кругу и каждый третий человек выбывает из круга, при этом круг смыкается. Напишите программу, которая определяет порядок, в котором люди выбывают из круга, например, ВЫБ(3, [a,b,c,d,e,f,g], [c,f,b,g,e,a,d])

  8. Напишите программу, которая подсчитывает число вхождений каждого элемента списка L и формирует новый список L1, в котором каждый элемент - это список, состоящий из элемента и числа его вхождений в список L. Например, если L=[f, d, f, g, a, f, d ], то L1=[[f, 3], [d, 2], [g, 1], [a, 1] ].

  9. Определите два предиката ЧЕТНАЯ_ДЛИНА (Список) и НЕЧЕТНАЯ_ДЛИНА (Список) таким образом, чтобы они были истинными, если их аргументом является список четной или нечетной длины соответственно.

  10. Напишите программу для предиката ПОДСТАНОВКА (X,Y, Список1, Список2), где Список2 - результат подстановки Y вместо всех вхождений X в Список1. Например, отношение ПОДСТАНОВКА (а , х , [а, b, а, с], [х, b, х, с]) - истинно, а отношение ПОДСТАНОВКА (а, х, [а, в, а, с], [ а, в, х, с]) - ложно.

  11. Определите отношение ПЕРЕВОД (Список1, Список2) для перевода списка чисел от 0 до 9 и список соответствующих им названий (строк). Например, ПЕРЕВОД ([3, 5, 2, 3], [три, пять, два, три] ). Используйте следующее отношения:

ОЗНАЧАЕТ (0, ноль).

ОЗНАЧАЕТ (1, один).

ОЗНАЧАЕТ (2, два).

  1. Определить отношение ПЕРЕСЕЧЕНИЕ(Список1, Список2, Список3), где элементы списка Список3 являются общими для списков Список1 и Список2.

  2. Определить отношение ПРОИЗВЕДЕНИЕ(Список1,Список2,Список3), в котором элементы списка Список3 равны произведениям соответствующих элементов списков Список1 и Список2Создайте предикат, переводящий список цифр от 0 до 9 в список соответствующих им римских чисел.

  3. Создайте предикат, переводящий список арабских чисел в список соответствующих им римских чисел.

  4. Создайте предикат, переводящий список римских чисел в список соответствующих им арабских чисел.

  5. Создайте предикат, удваивающий значения элементов списка.

  6. Создайте предикат, порождающий по заданным числам M, K список, состоящий из К-М случайных чисел из промежутка от M до K.

  7. Создайте предикат, преобразующий список, элементами которого являются числа, в список, элементы которого неотрицательны, т.е. отрицательные умножить на (-1), а положительные отставить без изменения.

  8. Создайте предикат, преобразующий исходный список чисел в список позиций отрицательных элементов.

  9. Создайте предикат, удаляющий из исходного списка элементы с четными номерами.

  10. Создайте предикат, который разделит исходный список из целых чисел на два списка: список положительных чисел и список отрицательных чисел.

  11. Создайте предикат, разделяющий исходный список на два подсписка. В первый из них должны попасть элементы с нечетными номерами, во второй - элементы с четными номерами.

  12. Создайте предикат, вычисляющий по списку и числу, подсписок исходного списка, начинающийся с элемента с указанным номером.

  13. Создайте предикат, осуществляющий удаление указанного количества последних элементов исходного списка.

  14. Создайте предикат, осуществляющий разделение исходного списка на два подсписка. В первый из них должно попасть указанное количество элементов из начала списка, во второй - оставшиеся элементы.

  15. Создайте предикат, осуществляющий разделение исходного списка на два подсписка. В первый из них должно попасть указанное количество элементов с конца списка, во второй - оставшиеся элементы.

  16. Создайте предикат, заменяющий в исходном списке два подряд идущих одинаковых элемента одним.

  17. Создайте предикат, удаляющий в исходном списке все повторные вхождения элементов.

  18. Создайте предикат, осуществляющий перестановку двух элементов списка с заданными номерами.

  19. Создайте предикат, генерирующий все перестановки элементов списка, указанного в качестве первого аргумента предиката.

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

  21. Создайте предикат, вычисляющий скалярное произведение векторов, заданных списками целых чисел.

  22. Создайте предикат, определяющий первую позицию подсписка в списке.

  23. Создайте предикат, добавляющий элементы одного списка во второй список, начиная с заданной позиции.

  24. Создайте предикат, заменяющий в исходном списке первое вхождение заданного значения другим.

  25. Создайте предикат, порождающий по заданному натуральному числу N список, состоящий из N случайных натуральных чисел из промежутка от 1 до 100.

  26. Создайте предикат, который увеличивает элементы исходного списка на единицу.

  27. Создайте предикат, порождающий по заданному натуральному числу N список, состоящий из натуральных чисел от 1 до N (по возрастанию).

  28. Создайте предикат, порождающий по заданному натуральному числу N список, состоящий из натуральных чисел от N до 1 (по убыванию).

  29. Даны два списка, имеющие ненулевое пересечение. Построить список, включающий все элементы указанных двух списков без повторений.

  30. Создайте предикат, преобразующую исходную строку в список символов, например, ПРЕОБ( “кошка”, [“к”,”о”,”ш”,”к”,”а”]). Используйте стандартный предикат frontchar

  31. Создайте предикат, вычисляющий позицию минимального элемента в списке

  32. Создайте предикат, вычисляющий позицию максимального элемента в списке

  33. Создайте предикат, преобразующую исходный список в строку символов, например, ПРЕОБ( [“к”,”о”,”ш”,”к”,”а”],“кошка”). Используйте стандартный предикат frontchar

  34. Создайте предикат, преобразующую исходный список в строку символов, например, ПРЕОБ( [“к”,”о”,”ш”,”к”,”а”],“кошка”). Используйте стандартный предикат frontchar