Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Функциональное и логическое программирование. Учебно-методическое пособие
.pdf
Пример 1
Создать функцию, которая выводит каждый элемент списка с новой строки.
Решение
Имя функции print-list. Единственный параметр — исходный список. Алго-
ритм работы функции следующий:
Если список не пуст, то:
1. выводим голову списка;
2. вызываем print-list для хвоста списка.
(define (print-list lst)
(when (not (null? lst))
(begin (display (car lst))
(newline)
(print-list (cdr lst)))))
Рис. 2.15. Результат выполнения программы примера 1
111

Пример 2
Создать функцию, которая определяет количество элементов списка.
Решение
Создадим функцию length с параметром list (список).
Длина любого списка равняется 1 плюс длина хвоста (cdr) этого списка.
Этот шаг последовательно применяется, пока мы не достигнем базового
случая:
Длина пустого списка равна 0.
(define (length list)
(if (null? list)
0
(+ 1 (length (cdr list)))))
Рис. 2.16. Результат выполнения программы примера 2
Пример 3
Создать функцию, которая берет в качестве аргументов список и число n и
возвращает n-й элемент списка.
112

Решение
Создадим функцию list-ref с параметрами list (заданный список) и n (номер
элемента списка). Обычно элементы списка нумеруют, начиная с 0. Метод вычисления list-ref следующий:
Если n = 0, list-ref должна вернуть голову (car) списка.
В остальных случаях list-ref должна вернуть (n − 1)-й элемент от хвоста
(cdr ) списка.
(define (list-ref list n)
(if (= n 0)
(car list)
(list-ref (cdr list) (- n 1))))
Рис. 2.17. Результат выполнения программы примера 3
Пример 4
Создать функцию для вычисления суммы элементов списка.
Решение
Создадим функцию sum с параметром list (заданный список).
Если список пустой, то сумма равна 0.
В остальных случаях вычисляется сумма элементов хвоста, а затем к ней
прибавляется голова списка.
113

(define (sum list)
(if (null? list)
0
(+ (car list) (sum (cdr list)))))
Рис. 2.18. Результат выполнения программы примера 4
Пример 5
Создать функцию, формирующую список из n случайных чисел, которые
выбираются из интервала от 0 до 10.
Решение
Создадим функцию list_rnd с параметром n (количество элементов списка).
Если n=0, то список пустой.
В остальных случаях формируем список из (n-1) элемента и объединяем
его со случайным числом.
(define (list_rnd n)
(let ((x (list)))
(if (= n 0)
x
(cons (random 10) (list_rnd (- n 1))))))
114

Рис. 2.19. Результат выполнения программы примера 5
Пример 6
Создать функцию, которая определяет количество нечетных элементов в
списке.
Решение
Создадим рекурсивную функцию count_nech, которая принимает в качестве
аргументов список (l) и число n и в результате работы выводит количество нечетных чисел.
Если список пуст, выводим количество нечетных элементов.
Иначе, если элемент головы списка является четным:
‒ то вызываем функцию count_nech и в качестве аргументов передаем хвост
списка и число n.
‒ иначе вызываем функцию count_nech и в качестве аргументов передаем
хвост списка и число n+1.
(define (count_nech n l)
(if (null? l)
(write (format «Количество нечетных чисел равно:~a»n))
(if (= 0 (remainder (car l) 2))
115

(count_nech n (cdr l))
(count_nech (+ n 1) (cdr l)))
))
(count_nech 0 '(3 2 3 4 5 1 1 6 8))
Рис. 2.20. Результат выполнения программы примера 6
Пример 7
Создать функцию, которая удаляет все вхождения числа в списке.
Решение
Функция remove принимает в качестве аргументов список (lst) и число k. В
результате выводит список без элементов k.
Если голова списка равна K, то вызываем функцию remove, отсекая голову.
Иначе голова списка соединяется с хвостом.
(define (remove lst k)
(if (null? lst)
'()
(if (= (car lst) k)
116

(remove (cdr lst) k)
(cons (car lst) (remove (cdr lst) k))
)))
(remove '(1 2 3 4 5 6 2 3) 2)
Рис. 2.21. Результат выполнения программы примера 7
Пример 8
Создать функцию, которая проверяет два списка на равенство. Списки
должны содержать равное количество элементов.
Решение
Для решения задачи будем отсекать от каждого списка по одному элементу,
сравнивать и подсчитывать количество i не равных между собой элементов. Если в результате оба списка оказались пустыми и i равно нулю, то списки равны,
в противном случае — не равны.
Создадим функцию search, которая принимает в качестве аргументов два
списка и число i=0. В результате должен произойти вызов функции Yes (выводит сообщение о том, что списки равны) или No (выводит сообщение о том, что
списки не равны), которые выводят информацию о равенстве списков.
117

Если список пуст и элемент i = 0, то вызываем функцию Yes.
Иначе вызываем функцию No.
Если голова первого списка равна голове второго списка, то вызываем
функцию search, отсекая головы двух списков и не изменяя число i.
Иначе, если головы не равны, то вызываем функцию, отсекая головы списка
и изменяя i на 1.
(define (No)
(write «Списки неравны») )
(define (Yes)
(write «Списки равны») )
(define (search lst lst2 i)
(if (null? lst)
(if (= i 0)
(Yes)
(No) )
(if (= (car lst) (car lst2))
(search (cdr lst) (cdr lst2) i)
(search (cdr lst) (cdr lst2) (+ i 1)))))
(search '(1 2 1) '(1 2 0) 0)
Рис. 2.22. Результат выполнения программы примера 8
для неравных заданных списков
118

Рис. 2.23. Результат выполнения программы примера 8
для равных заданных списков
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
1. Создать функцию, формирующую список из n случайных чисел, которые
выбираются из интервала от 0 до 10, и удалить из него введенное число.
2. Сформировать списки [1, 3, 5, 7, 9] и [2, 4, б, 8, 10] и объединить
их в один.
3. Создать функцию, формирующую список из n случайных чисел, которые
выбираются из интервала от 0 до 100, и вставить в него введенное число.
4. Сформировать список из N натуральных чисел, начиная с 10. Каждое
следующее на 5 больше предыдущего.
5. Создать функцию, формирующую список из n случайных
чисел, которые выбираются из интервала от 0 до 60, и найти сумму его
элементов.
6. Сформировать список [6, 5, 4, 3, 2] и найти сумму его элементов.
7. Сформировать список [7, 5, 3, 1] и найти произведение его элементов.
8. Сформировать список из N последовательных натуральных чисел, начи-
ная с 10. Найти сумму его элементов.
9. Создать функцию, формирующую список из n случайных чисел, которые
выбираются из интервала от 0 до 100, и найти сумму его элементов.
119

10. Сформировать список из N натуральных чисел, начиная с 2. Каждое
следующее на 3 больше предыдущего. Найти среднее арифметическое его элементов.
ЛИТЕРАТУРА
1. Адаменко А., Кучуков А. Логическое программирование и Visual
Prolog. — СПб, 2003.
2. Братко И. Программирование на языке ПРОЛОГ для искусственного ин-
теллекта. — М., 1990.
3. Козырева Г.Ф. Лабораторный практикум на языке Visual Prolog. Учебно-
методическое пособие для студентов, обучающихся по специальности «инфор-
матика». — Армавир: АГПУ, 2004. — 65 с.
4. Козырева Г.Ф. Практикум решения задач по курсу «Основы искусствен-
ного интеллекта: учебно-методическое пособие для студентов, обучающихся по
специальности «Информатика» / Г.Ф. Козырева — Армавир, 2005. — 61 с.
5. Козырева Г.Ф. Учебно-методическое пособие «Контрольные работы по
курсу «Интеллектуальные информационные системы» для студентов заочной
формы обучения. — Армавир: АГПУ, 2009. — 44 с.
6. Сергиевский Г. М. Функциональное и логическое программирование :
учебное пособие / Г. М. Сергиевский, Н. Г. Волченков. — М.: Академия,
2010. — 317 с.
7. Сошников Д. В. Парадигма логического программирования /
Д. В. Сошников. — М.: Вузовская книга, 2006. — 220 с.
8. Харольд Абельсон, Джеральд Джей Сассман. Структура и Интерпретация
Компьютерных Программ — Добросвет, КДУ, 2010.
9. Википедия https://ru.wikipedia.org.
120
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
