Язык программирования SWI-Prolog. Учебно-методическое пособие
.pdf
Step over – шаг без захода в подпрограммы; Step out – выйти из подпрограммы;
Retry – повторить;
Abort – прервать выполнение.
Выберем вариант Step into, тогда получим:
Call:sum_cubes(2, _4408)
Call:_4724 is 2+-1
Exit:1 is 2+-1
Call:sum_cubes(1, _4726)
Call:_4730 is 1+-1
Exit:0 is 1+-1
Call:sum_cubes(0, _4732)
Exit:sum_cubes(0, 0)
Call:_4742 is 0+1^3
Exit:1 is 0+1^3
Exit:sum_cubes(1, 1)
Call:_4408 is 1+2^3
Exit:9 is 1+2^3
Exit:sum_cubes(2, 9)
Res = 9
Задание точек остановки делается щелчком левой кнопкой мыши слева от требуемой строки. Программа выполняется до первой точки останова, после чего останавливается, выводит набор таких же кнопок-пиктограмм, что и выше, и ждёт указаний пользователя.
1.14. Использование встроенной документации
SWI-Prolog содержит хорошо структурированную встроенную систему помощи, которая включает примеры программ, документацию (на английском языке) и исходный код всех модулей Пролога.
Чтобы получить информацию по конкретному предикату, нужно набрать его имя в строке поиска и выбрать из выпадающего списка нужный вариант. После этого SWI-Prolog открывает окно с документацией по данному предикату.
На рисунке ниже приведена часть окна с описанием предиката sum_list.
61
В окне документации указан модульlists, содержащий код предиката. Модуль должен загружаться автоматически (can be autoloaded), в противном случае нужно подключить модуль директивой :- use_module(library(lists)).
Далее приводится описание предиката– имя и список его параметров. Каждый параметр снабжён специальным символом, который характеризует назначение параметра:
+обозначает, что данный параметр является входным;
–обозначает, что данный параметр является выходным.
Затем идёт краткое описание функциональности предиката, в данном случае строка: Sum есть результат сложения всех чисел списка List.
Справа в строке описания размещается круг с изображением символов :-. При переходе по этой ссылке открывается файл с исходным кодом модуля lists. Изучение исходного кода очень полезно для понимания методов разработки программ на Прологе. Приведём текст предиката:
sum_list(Xs, Sum) :- sum_list(Xs, 0, Sum).
sum_list([], Sum, Sum). sum_list([X|Xs], Sum0, Sum) :-
Sum1 is Sum0 + X, sum_list(Xs, Sum1, Sum).
Кроме входных и выходных, предикаты могут иметь и другие типы параметров. Чаще всего используется метасимвол«вопросительный знак». Этим знаком отмечаются параметры, которые могут быть как входными, так и выходными.
Пример – описание предиката append:
Все три параметра предиката могут быть входными, тогда предикат возвращает true, если конкатенация списковList1 и List2 совпадает со списком List1AndList2. Входными могут быть только два параметра, тогда результатом будет третий параметр, если, конечно, результат корректен.
Примеры.
1) Цель (запрос) append([1,2], [3], Res) удовлетворяется тогда и только тогда, когда Res = [1,2,3].
62
2)Цель (запрос) append(L, [3], [1,2,3]) удовлетворяется тогда и только тогда, когда L = [1,2], т. е. список L получается как разность списков.
3)Аналогично, цель append([1], L, [1,2,3]) удовлетворяется тогда и только тогда, когда L = [2,3], т. е. список L также получается как разность списков.
4)Запрос append(L, [4], [1,2,3]) вернёт false, так как список-результат L не существует.
Рассмотрим также случай, когда входным является только третий параметр, который согласно описанию представляет собой конкатенацию двух каких-то списков. Тогда запрос append(L1, L2, [1,2,3]) сгенерирует все варианты разбиения списка [1,2,3] в конкатенацию двух списков.
63
2.ПРАКТИЧЕСКАЯ ЧАСТЬ
2.1.Задачи на вычисление
Задание 1. Написать предикат вычисления значения функции
f(x) = (3+sin(2*x))/(x^2+1)
Вычислить значения этой функции для x = 3.
Задание 2. Получить двоичное представление натурального числа N.
Задание 3. Написать предикат вычисления значения функции
f(x) |
= |
sqrt(2+7*x) |
при |
x>0 |
f(x) |
= |
2-x |
при |
x<=0 |
Получить результат для значений X из списка
L = [2, 14, -2, -8].
Задание 4. Вычислить сумму
S = 1 + 1/4 + 1/9 + 1/16 + … + 1/n2.
Этот ряд при увеличении числа слагаемых стремится к значению
R = pi2/6.
Получить результат для N из списка [10, 100, 1000] и сравнить с предельным значением.
Задание 5. Вычислить сумму N слагаемых ряда
1 – 1/3 + 1/5 – 1/7 + … .
Этот ряд при увеличении числа слагаемых стремится к значению
R = pi/4.
Получить результат для N из списка [10, 100, 1000] и сравнить с предельным значением.
Задание 6. Вычислить сумму N слагаемых ряда
1 – 1/4 + 1/9 – 1/16 + … .
Этот ряд при увеличении числа слагаемых стремится к значению
R = pi2/12.
Получить результат для N из списка [10, 100, 1000] и сравнить с предельным значением.
64
Задание 7. Вычислить сумму N слагаемых ряда
1 + 1/32 + 1/52 + 1/72 + … .
Этот ряд при увеличении числа слагаемых стремится к значению pi2/8. Получить результат для N из списка [10, 100, 1000] и сравнить с пре-
дельным значением.
Задание 8. Вычислить сумму N слагаемых ряда
1 – 1/2 + 1/3 – 1/4 + … .
Этот ряд при увеличении числа слагаемых стремится к значению ln(2). Получить результат для N из списка [10, 100, 1000] и сравнить с пре-
дельным значением.
Задание 9. Вычислить сумму N слагаемых ряда
1 + 1/34 + 1/54 + 1/74 + … .
Этот ряд при увеличении числа слагаемых стремится к значению pi4/96.
Получить результат для N из списка [2, 20, 200] и сравнить с предельным значением.
Задание 10. Вычислить сумму N слагаемых ряда
1 – 1/33 + 1/53 – 1/73 + … .
Этот ряд при увеличении числа слагаемых стремится к значению pi3/32.
Получить результат для N из списка [5, 50, 500] и сравнить с предельным значением.
Задание 11. Вычислить сумму N слагаемых ряда
1/(22 – 1) + 1/(42 – 1) + 1/(62 – 1)+ … .
Этот ряд при увеличении числа слагаемых стремится к значению 1/2. Получить результат для N из списка [10, 100, 1000] и сравнить с пре-
дельным значением.
Задание 12. Вычислить сумму N слагаемых ряда
1/(22 – 1)2 + 2/(42 – 1)2 + 3/(62 – 1)2 + … .
Этот ряд при увеличении числа слагаемых стремится к значению 1/8.
65
Получить результат для N из списка [5, 50, 500] и сравнить с предельным значением.
Задание 13. Вычислить сумму N слагаемых ряда
2/(1*3) + 2/(3*5) + 2/(5*7) + … .
Этот ряд при увеличении числа слагаемых стремится к значению 1. Получить результат для N из списка [10, 100, 1000] и сравнить с пре-
дельным значением.
Задание 14. Вычислить сумму N слагаемых ряда
1/(1*3) + 1/(2*4) + 1/(3*5) + … .
Этот ряд при увеличении числа слагаемых стремится к значению 3/4. Получить результат для N из списка [10, 100, 1000] и сравнить с пре-
дельным значением.
Задание 15. Вычислить сумму N слагаемых ряда
1/(1*2*3) + 1/(3*4*5) + 1/(5*6*7) + 1/(7*8*9) + … .
Этот ряд при увеличении числа слагаемых стремится к значениюln(2)
– 1/2.
Получить результат для N из списка [5, 50, 500] и сравнить с предельным значением.
Задание 16. Вычислить сумму N слагаемых ряда
1 + x/1! + x2/2! + x3/3! + … .
Этот ряд при увеличении числа слагаемых стремится к значению R = ex для любого значения x.
Получить результат для x = 1 и N из списка [2, 20, 200].
Задание 17. Вычислить сумму N слагаемых ряда x – x2/2 + x3/3 – x4/4 + … .
Этот ряд при увеличении числа слагаемых стремится к значению
R = ln(1 + x) для x из интервала (-1; 1).
Получить результат для x = 0.5 и N из списка [2, 20, 200].
66
Задание 18. Написать предикат, вычисляющий факториал натурального числа. Получить результат для N из списка [5, 10, 15].
Задание 19. Вычислить F(n), если
F(0) = 0, F(1) = 1;
F(2*k) = F(k);
F(2*k+1) = F(k) + F(k+1).
Получить результат для N из списка [50, 100, 150].
Задание 20. Вычислить
y=sqrt(N+sqrt(N-1+sqrt(N-2+…+sqrt(1))...))),
где sqrt(A) есть корень квадратный из A.
Получить результат для N из списка [10, 100, 1000].
Задание 21. Написать предикат, который получает целое число N > 1 и возвращает сумму 1∙2 + 2∙3 + 3∙4 + … +(N – 1)∙N. Ввести значение N с клавиатуры и вывести результат на экран.
Получить результат для N = 10, 100, 1000.
Задание 22. Сто гномов едят одно яблоко весом200 грамм. Каждый гном откусывает одну сотую от того, что ему досталось, и ещё один грамм. Вычислить вес огрызка.
Задание 23. Из листа бумаги в клетку вырезан прямоугольникa×b клеток (a и b – целые числа). Затем от этого прямоугольника отрезали квадрат максимального размера, от оставшейся прямоугольной части снова отрезали квадрат максимального размера и повторяли эту процедуру до тех пор, пока не разрезали весь исходный прямоугольник на квадраты. Подсчитать количество полученных квадратов.
Задание 24. На столе стоят два стакана, заполненных до половины водой. P% содержимого первого стакана переливают во второй, а затем Q% содержимого второго стакана переливают в первый. Описанную процедуру повторяют N раз. Какая часть первого и соответственно второго стакана будет заполнена водой?
67
Задание 25. Найти наименьшее натуральное число, которое при делении на 13 даёт остаток 1, при делении на 17 даёт остаток 3, при делении на 24 даёт остаток 11.
Задание 26. Найти сумму цифр натурального числа.
Задание 27. Определить, является ли натуральное числоN степенью двойки. Если является, вычислить показатель степени.
Пример. N = 1024 есть степень двойки с показателем 10.
Задание 28. Реализовать метод деления пополам для нахождения корня уравнения f(x) = 0 с заданной точностью.
Задание 29. Получить последовательность биномиальных коэффициентов для бинома N-ной степени.
Пример. При N = 6 результат есть [1,6,15,20,15,6,1].
Подсказка. Воспользуйтесь соотношениями С(N,0) = 1;
C(N,K) = C(N,K-1)*(N-K+1)//K для K = 1, 2, …, N.
Задание 30. Вычислить цифровой корень натурального числа. Цифровой корень определяется следующим образом: находится сумма цифр числа. Если она больше 9, то находится сумма цифр получившегося значения. И если эта сумма больше 9, то снова находится сумма цифр и т. д., пока в результате не получим число от 1 до 9.
Пример. Пусть N = 888888, тогда N1 = 48, N2 = 12, N3 = 3.
Задание 31. Методом простых итераций найти корень уравнения x = cos(x). Сравнить результаты при 50 и 100 итерациях. Оценить погрешность корня.
Задание 32. Определить, сколько существует последовательностей из N нулей и единиц, в которых нет двух подряд идущих нулей.
Задание 33. Получить из натурального числа N единицу, пользуясь следующими преобразованиями:
68
нечётное N заменить на N-1 чётное N заменить на N div 2
Вывести всю последовательность значений.
Пример. При N = 73 должна получиться последовательность
73 - >72 - >36 - >18 - >9 - >8 - >4 - >2 - >1
Задание 34. Разложить натуральное N на простейшие множители.
Пример. N = 12 = 2*2*3.
Задание 35. Дано целое число N > 1. Определить, является ли это число простым. Получить результат для N из списка [353, 11233, 11311].
Задание 36. Даны два прямоугольника с размерами a × b и c × d (a, b, c, d – натуральные числа). Можно ли приложить их друг к другу так, чтобы получился новый прямоугольник? Если можно, то вывести на экран слово «Можно» и стороны полученного прямоугольника. Если нельзя, то вывести на экран только слово «Нельзя».
2.2. Работа со списками
Выполнить следующие задания в двух вариантах:
ВариантA) используя встроенные предикаты(если есть подходя-
щие);
Вариант B) НЕ используя встроенные предикаты.
Задание 1. Получить последний элемент списка.
Задание 2. Добавить новый элемент в конец списка.
Задание 3. Дан упорядоченный по возрастанию список целых чисел List и некоторое целое V. Вставить это значение в список с сохранением порядка.
Задание 4. Проверить, является ли список палиндромом. В случае палиндрома элементы списка образуют одну и ту же последовательность значений как при просмотре его слева направо, так и при просмотре справа налево.
69
Задание 5. Даны два числовых списка. Вычислить скалярное произведение общей части этих списков.
Пример. A = [1,2,3,4], B = [5,6], A*B = 1*5 + 2*6 = 17.
Задание 6. Даны список и некоторое число X. Получить новый список, в котором будут все элементы исходного списка, меньшие X.
Задание 7. По заданному натуральному числу N получить список чисел от N до 1 (по убыванию).
Задание 8. Написать предикат, который получает два целых числаK и N (K < N) и заполняет массив числами K, K + 1, …, N – 1. Если же K>=N то результат – пустой список.
Задание 9. Написать предикат, который получает список целых чисел и создаёт новый список прибавлением единицы к элементам исходного списка.
Задание 10. Получить список, содержащий квадраты элементов исходного списка.
Задание 11. Дан список цифр натурального числа, вычислить значение этого числа.
Задание 12. Написать предикат, который получает список целых чисел и создаёт новый список умножением элементов исходного списка наза данное целое число K.
Задание 13. Написать предикат, который получает список элементов, содержащихся хотя бы в одном из двух заданных списков без повторений.
Задание 14. Написать предикат, который формирует список элементов, содержащихся в каждом из двух заданных списков без повторений.
Задание 15. Написать предикат, который формирует новый список, извлекая из исходного списка элементы, стоящие на нечётных местах.
70
