Произвольные структуры (деревья)
Стр 1 из 2Следующая ⇒ УДК 004.4 (076.1) Васяшин А.В. Сборник задач по курсу «Логическое программирование». Учебное пособие. – Обнинск: ИАТЭ, 2009. – 73 с. Пособие представляет собой сборник лабораторных работ по логическому программированию. Каждой из пяти лабораторных работ соответствует свой набор индивидуальных заданий (задач). Первые четыре лабораторные работы посвящены работе со списками и структурами языка «Пролог» и основным методом решения этих задач является рекурсия. Задачи последнего раздела посвящены работе с базой данных «Пролога», а основным приёмом их решения является «вынуждаемый возврат».
Рецензенты: к.т.н. О.А. Мирзеабасов, Темплан 2009, поз. 9 © Обнинский государственный технический университет атомной энергетики, 2009.
Предисловие Все представленные ниже лабораторные работы разбиты на четыре темы. Первые три темы, а именно, «Списки и строки», «Бинарные деревья», «Произвольные структуры» включают в себя наборы задач на основной прием программирования в Прологе – рекурсию. При выполнении работ по этим темам допускается использовать любой тип рекурсии (входящую или исходящую). Последняя тема «Файлы и разделы базы данных» предполагает использование в качестве основного приема программирования «вынуждаемый возврат». Описание каждой задачи состоит из трех частей: ü словесная формулировка задачи; ü список аргументов; ü примеры запросов к разработанной процедуре в среде интерпретатора и получаемые ответы. При выполнении лабораторных работ требуется строго выполнять два требования: ü нельзя изменять количество и смысл аргументов; ü нельзя решать задачу для частных случаев.
Последнее требование означает, что разработанная процедура должна быть универсальна. Так для задачи № 1 (см. ниже) процедура должна работать со списками произвольной длины, содержащими любые термы Пролога. В примерах запросов все процедуры имеют имя pred. Это не является требованием. Напротив, рекомендуется называть процедуру так, чтобы в наименовании отражался смысл ее работы. Для задачи № 1, например, диалог в интерпретаторе Пролога может быть таким: ?- sorted([a,b,d,f]).
Списки и строки 1. Определить, является ли список упорядоченным по возрастанию. Аргументы: исходный список. ?- pred([a,b,d,f]). 2. Определить, имеет ли список четное число элементов, не прибегая к подсчету длины списка. Аргументы: исходный список. ?- pred([a,b,d,f]). 3. Перевести число из десятичной системы счисления в двоичную. Аргументы: число в десятичной с.с.; ?- pred(26,X). 4. Найти в неупорядоченном списке вещественных чисел ближайших соседей – два числа, расстояние между которыми на вещественной оси является минимальным среди всех возможных пар. Аргументы: исходный список; ?- pred([0.1,0.04,8.6,7.56,8.11],X). 5. Перевести число из двоичной системы счисления в десятичную. Аргументы: число в двоичной с.с. (список); ?- pred([1,1,0,1,0],X). 6. Перевести число из десятичной системы счисления в римскую. Аргументы: число в десятичной с.с.; ?- pred(24,X). 7. Перевести число из римской системы счисления в десятичную. Аргументы: число в римской с.с. (список); ?- pred([x,x,i,v],X). 8. Перевести число из двоичной системы счисления в шестнадцатеричную. Аргументы: число в двоичной с.с. (список); ?- pred([1,1,0,1,0],X).
9. Перевести число из шестнадцатеричной системы счисления в двоичную. Аргументы: число в шестнадцатеричной с.с. (список); ?- pred([1,a],X). 10. Определить, является ли первый список подмножеством второго. Списки не имеют дубликатов. Аргументы: первый список; ?- pred([a,b,c],[s,a,e,c,d,b]). 11. Удалить из списка элементы с четными номерами. Аргументы: исходный список; ?- pred([a,b,c,d,e],X). 12. Удалить из списка те элементы, которые не имеют дубликатов. Аргументы: исходный список; ?- pred([a,e,c,d,e],X). 13. Дан числовой список – [ A, B, C, D, E,…]. Посчитать результат по формуле R=A+B−C+D−E+ …. Аргументы: исходный список; ?- pred([1,2,3,4,5],X). 14. Сформировать по заданному мужскому имени отчество. Аргументы: исходная строка (имя); ?- pred(’Иван’,X). 15. Дан список, содержащий списки одинаковой длины (матрица). Построить транспонированную матрицу. Аргументы: матрица (список); ?- pred([[1,2,3],[4,5,6],[7,8,9]],X). 16. Дан список, содержащий списки одинаковой длины (квадратная матрица). Посчитать детерминант. Аргументы: матрица (список); ?- pred([[1,2],[4,5]],X). 17. Удалить из числового списка элементы, меньшие заданного числа. Аргументы: исходный список; ?- pred([3,1,5,4,8],5,X). 18. Удалить из списка элемент с заданным порядковым номером. Аргументы: исходный список; ?- pred([a,b,c,d,e],4,X). 19. Поместить в результирующий список каждый элемент исходного списка с заданной вероятностью. Аргументы: исходный список; ?- pred([a,b,c,d,e],0.5,X). X = [a,c,d] yes ?- pred([a,b,c,d,e],0.5,X). X = [b,c,d,e] yes ?- 20. Выполнить циклический сдвиг списка влево на заданное количество элементов. Аргументы: исходный список; ?- pred([a,b,c,d,e],3,X). X = [d,e,a,b,c] yes ?- 21. Выполнить циклический сдвиг списка вправо на заданное количество элементов. Аргументы: исходный список; ?- pred([a,b,c,d,e],3,X).
22. Получить целое число из строки, использующей числительные русского языка. Аргументы: строка; ?- pred(’Пять тысяч восемьсот одиннадцать’,X). 23. Даны два списка. Каждый из списков не имеет дубликатов и, следовательно, их можно рассматривать как множества. Построить симметрическую разность (объединение минус пересечение) списков. Аргументы: первый список; ?- pred([a,b,c,d,e],[e,w,q,c],X). 24. Дан список, содержащий числовые списки одинаковой длины (матрица), и числовой список (вектор). Перемножить матрицу и вектор. Аргументы: матрица (список); ?- pred([[1,2],[4,5]],[2,3],X). 25. Дан числовой список [ a, b, c, d, … ] и число x. Посчитать значение полинома R = a+bx+cx 2 +dx 3 + …. Аргументы: список; ?- pred([1,2,4,1],3,X). 26. Преобразовать целое число в строку с использованием числительных русского языка. Аргументы: целое число; ?- pred(5811,X). 27. Выполнить циклический сдвиг списка влево. Аргументы: исходный список; ?- pred([a,b,c,d,e],X). 28. Выполнить циклический сдвиг списка вправо. Аргументы: исходный список; ?- pred([a,b,c,d,e],X). 29. Найти порядковый номер максимального элемента числового списка. Аргументы: исходный список; ?- pred([3,5,8,1,4],X). 30. Найти все возможные пары элементов списка. Аргументы: исходный список; ?- pred([a,b,c,d,e],X). 31. Найти все возможные перестановки элементов списка. Аргументы: исходный список; ?- pred([a,b,c],X). ?- 32. Строка текста на русском языке содержит «лишние» пробелы. Удалить избыточные пробелы.
Аргументы: исходная строка; ?- pred(’Мы будем рады узнать ваше мнение!’,X). 33. Даны два числовых списка, содержащие коэффициенты двух полиномов. Соответствие между элементами списка и коэффициентами полинома можно отобразить следующим образом: a 0 +a 1 x+a 2 x 2 +a 3 x 3 +a 4 x 4 +… ®[ a 0, a 1, a 2, a 3, a 4,…]. Перемножить полиномы. Результирующий полином должен представлять собой список коэффициентов, составленный по тому же правилу, что и списки для исходных полиномов. Аргументы: первый полином (список); ?- pred([3,5,8],[1,4],X). 34. Дан список и число N. Построить сочетания по N элементов из исходного списка. Аргументы: исходный список; ?- pred([3,5,8,1],3,X). 35. Преобразовать предложение на русском языке в список слов. Аргументы: исходная строка; ?- pred(’Это будет работать, но возникнут две проблемы.’,X). 36. Восстановить по отчеству имя. Аргументы: исходная строка (отчество); ?- pred(’Иванович’,X). 37. Подсчитать количество вхождений каждой буквы в строку текста на русском языке и собрать результаты в список. Аргументы: исходная строка; ?- pred(’Это будет работать’,X). 38. Произвести перекодировку строки текста на русском языке из кодировки DOS в кодировку Windows. Аргументы: исходная строка (DOS); ?- pred(’Перевод получен’,X). 39. Дан числовой список, содержащий первые N членов ряда, и порядковый номер элемента ряда K. Расчитать K -ый элемент ряда при условии, что каждый член ряда равен сумме N предыдущих его членов (за исключением N первых членов). Аргументы: список первых членов ряда; ?- pred([0,1,2],4,X). 40. Произвести замену всех вхождений заданной подстроки в исходную строку на новую подстроку. Аргументы: исходная строка; ?- pred(’голод, холод’, ’од’, ’одом’,X). 41. Дано предложение на русском языке. Построить список слов предложения. Список не должен содержать повторов слов и знаков препинания. Аргументы: исходная строка; ?- pred(’Что воля, что неволя...’,X). 42. Дан список точек плоскости. Каждая точка задается парой координат (X, Y) и, таким образом, исходный список имеет вид [(X 1, Y 1),(X 2, Y 2),(X 3, Y 3), … ]. Преобразовать исходный список в список относительных координат вида [(X 1, Y 1),(D X 2,D Y 2),(D X 3,D Y 3), … ], где первая точка задается абсолютными координатами, а все последующие – в виде пары (сдвиг по оси X, сдвиг по оси Y) относительно предыдущей точки (D Xk=Xk−Xk- 1,D Yk=Yk−Yk- 1).
Аргументы: исходный список абсолютных координат; ?- pred([(1,2),(3,5),(2,0),(0,0)],X).
Бинарные деревья 43. Определить наличие на каком-либо из путей от корня до листа хотя бы двух узлов с одинаковым именем. Аргументы: произвольное бинарное дерево. ?- pred(a(f(a(m,k),r),n)). 44. Определить наличие хотя бы двух узлов с одинаковым именем на одной глубине. Аргументы: произвольное бинарное дерево. ?- pred(s(f(b(m,k),a),n(b,g))). 45. Определить наличие двух одинаковых путей от корня до листа. Аргументы: произвольное бинарное дерево. ?- pred(s(f(b(m,k),a),f(a,g))). 46. Расширить синтаксис языка Пролог, введя операции (см. встроенный предикат op/3) над комплексными числами. Следует использовать имя «isс» для операции извлечения результата и стандартные «+, -, *, /, ^» для арифметических операций. Аргументы: арифметическое выражение; ?- X isс (1.6, 4.5) + (2.8, 7.1).
47. Определить глубину дерева. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),f(a,g)),X). 48. Определить, являются ли два заданных дерева равными с точностью до перестановки левого и правого поддерева в каждом узле. Аргументы: первое дерево; ?- pred(s(t(b(m,k),a),f(a,g)), s(t(b(k,m),a),f(g,a))). 49. Собрать все узлы в список. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),f(a,g)),X). 50. В каждом узле дерева поменять при необходимости поддеревья местами так, чтобы в результирующем дереве в каждом узле выполнялось требование – количество узлов в левом поддереве не больше, чем в правом. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),t(a,g)),X). 51. Найти максимум количества узлов лежащих на одной глубине. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),t(r,w)),X). 52. Собрать в список имена всех узлов дерева, лежащих на заданной глубине. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),t(a,g)),1,X). 53. Обрезать дерево на заданной глубине. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),t(a,g)),2,X). 54. Произвести следующую процедуру над деревом, начиная обработку с корня: в текущем узле с заданной вероятностью принимается решение об усечении дерева в этом узле (узел становится листом). Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),t(a,g)),0.5,X). 55. Заданный узел в дереве сделать корнем дерева с той же связностью узлов, что и в исходном дереве. Результирующее дерево не является бинарным. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),w),t(a,g)),s,X). 56. Подсчитать количество узлов дерева, лежащих на заданной глубине. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),t(a,w)),1,X). 57. Произвести обработку дерева в каждом узле по следующему правилу. Если узел имеет заданное имя, то все его дочерние узлы должны стать дочерними узлами его родительского узла, а сам этот узел удаляется из дерева. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(b(u(i,o),v),k),a),t(b,g)),b,X). 58. Подсчитать количество узлов с заданным именем. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(b(u(i,o),v),k),a),t(b,g)),b,X). 59. Определить путь между двумя заданными узлами. Аргументы: произвольное бинарное дерево; ?- pred(s(f(w(b(u(i,o),v),k),a),t(r,g)),w,r,X). 60. Переименовать все узлы, имеющие заданное имя. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(b(u(i,o),v),k),a),t(b,g)),b,r,X). 61. Найти все поддеревья заданного дерева. Аргументы: произвольное бинарное дерево; ?- pred(a(f(a(m,k),r),n(i,o)),X). 62. Найти все пути в дереве от корня до его листьев. Аргументы: произвольное бинарное дерево; ?- pred(a(f(a(m,k),r),n(i,o)),X). 63. Найти все пути от корня до его листьев, лежащих на максимальной глубине. Аргументы: произвольное бинарное дерево; ?- pred(a(f(a(m,k),r),n(i,o)),X). 64. Найти все поддеревья, имеющие глубину не больше заданной. Аргументы: произвольное бинарное дерево; ?- pred(a(f(a(m,k),r),n(i,o)),2,X). 65. Выполнить перебор листьев в порядке убывания их глубины. Аргументы: произвольное бинарное дерево; ?- pred(a(f(a(m,k),r),n(i(d,e),o)),X). 66. Произвести приведение полинома. Аргументы: исходный полином; ?- pred(2+6*x^3-7*x^2-4+x^3+6*x^2,X). 67. Произвести символьное дифференцирование полинома, который задается структурой вида: a+b*x+c*x^ 2 +d*x^ 3 +… Аргументы: исходный полином; ?- pred(2+6*x-7*x^3,X). 68. Произвести деление полиномов. Исходные полиномы задаются структурами вида: a+b*x+c*x^ 2 +d*x^ 3 +… Аргументы: первый полином; ?- pred(2+6*x-7*x^3,1+x,X,Y). 69. Расширить синтаксис языка Пролог, введя операции (см. встроенный предикат op/3) над множествами (списки). Следует использовать следующие имена операций: «iss» – операция извлечения результата; «+» – операция объединения; «*» – операция пересечения; «-» – операция вычитания. Аргументы: арифметическое выражение (в арифметике множеств); ?- X iss [a,s,d,f] * [d,g,f] + [p,f]. 70. Расширить синтаксис языка Пролог, введя операции (см. встроенный предикат op/3) модульной арифметики (арифметики вычетов, см. приложение В). Следует использовать имя «ism» для операции извлечения результата и стандартные «+, -, *, /» – для арифметических операций. Для хранения модуля, по которому производятся вычисления, необходимо использовать факт ism/1. В качестве модуля предполагается использовать только простые числа. Аргументы: арифметическое выражение; ?- ism(X). 71. Произвести перестановку поддеревьев в каждом узле дерева. Аргументы: произвольное бинарное дерево; ?- pred(s(f(b(m,k),a),f(a,g)),X).
Произвольные структуры (деревья) 72. Определить наличие на каком-либо из путей от корня до листа хотя бы двух узлов с одинаковым именем. Аргументы: произвольное дерево. ?- pred(a(f(i(m,k),r,a(t)),n)). 73. Определить наличие хотя бы двух узлов с одинаковым именем на одной глубине. Аргументы: произвольное дерево. ?- pred(s(f(b(m,k),a),n(b,g),r(u))). 74. Определить наличие двух одинаковых путей от корня до листа. Аргументы: произвольное дерево. ?- pred(s(f(b(m,k),a),f(a,g),n(h))). 75. Определить глубину дерева. Аргументы: произвольное дерево; ?- pred(s(f(b(m(i),k),a),f(a,g),h(y)),X). 76. Определить, являются ли два заданных дерева равными с точностью до перестановки поддеревьев в каждом узле. Аргументы: первое дерево; ?- pred(s(t(b(m,k),a),f(a,g)), s(t(b(w,k,m),a),f(g))). 77. Собрать все узлы в список. Аргументы: произвольное дерево; ?- pred(s(f(b(m,k,n),a(r)),f(a,g)),X). 78. Найти максимум количества узлов, лежащих на одной глубине. Аргументы: произвольное дерево; ?- pred(s(f(b(m,k(e),n),a),t(r,w)),X). 79. Обрезать дерево на заданной глубине. Аргументы: произвольное дерево; ?- pred(s(f(b(m,k),a),t(a,g),j(u)),2,X).
80. Собрать в список имена всех узлов дерева, лежащих на заданной глубине. Аргументы: произвольное дерево; ?- pred(s(f(b(m,k),a),t(a,g),j(u)),1,X). 81. Произвести следующую процедуру над деревом, начиная обработку с корня: в текущем узле с заданной вероятностью принимается решение об усечении дерева в этом узле (узел становится листом). Аргументы: произвольное дерево; ?- pred(s(f(b(m,k),a),t(a)),0.5,X). 82. Найти в дереве все поддеревья, являющиеся бинарными. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k(v)),r),n(i(d,e,z(q,w)),o)),X).
83. Сделать в дереве заданный узел корнем дерева с той же связностью узлов, что и в исходном дереве. Аргументы: произвольное дерево; ?- pred(s(f(b(m,k),w),t(a)),s,X). 84. Подсчитать количество узлов дерева, лежащих на заданной глубине. Аргументы: произвольное дерево; ?- pred(s(f(b(m,k),a),t(a)),1,X). 85. Подсчитать количество узлов с заданным именем. Аргументы: произвольное дерево; ?- pred(s(f(b(b(u(i,o),v),k),a),t(b,g,b(i))),b,X).
86. Произвести обработку дерева в каждом узле по следующему правилу. Если узел имеет заданное имя, то все его дочерние узлы должны стать дочерними узлами его родительского узла, а сам этот узел удаляется из дерева. Аргументы: произвольное дерево; ?- pred(s(f(b(b(u(i,o),v),k),a),t(b,g),b),b,X). 87. Определить путь между двумя заданными узлами. Аргументы: произвольное дерево; ?- pred(s(f(w(b(u(i,o,d),v),k),a),t(r(u),g),m),w,r,X). 88. Переименовать все узлы, имеющие заданное имя. Аргументы: произвольное дерево; ?- pred(s(f(b(b(u(i,o),v),k),a),t(b(e),g),b),b,r,X). 89. Найти все поддеревья. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k,v),r),n(i)),X). 90. Найти в дереве все пути от корня до его листьев. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k),r),n(i,o,v(x))),X). 91. Найти в дереве все пути от корня до его листьев, лежащих на максимальной глубине. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k,v),r),n(i,o)),X). 92. Найти в дереве все поддеревья, имеющие глубину не больше заданной. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k),r,v(g)),n(i,o)),2,X). 93. Выполнить перебор листьев в порядке убывания их глубины. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k(v)),r),n(i(d,e,z),o)),X). 94. Найти узел, имеющий максимальное количество потомков. Аргументы: произвольное дерево; ?- pred(a(f(a(m,k(v)),r),n(i(d,e,z(q,w,t)),o)),X). 95. Составить описание каждого узла дерева (потомки нумеруются слева направо). Аргументы: произвольное дерево; ?- pred(a(f(a(m,k(v)),r),n(i(d,e,z)),o),X). 96. Дана строка, которая с помощью предиката string_term/2 (см. пример) корректно преобразуется в терм. Предполагается, что строка может преобразовываться в структуру любой арности, содержащую свободные переменные. Собрать из исходной строки в список имена свободных переменных. Аргументы: исходная строка; ?- string_term(’r(T,m(T,K))’,B).
97. Сформировать графическое представление дерева в виде строки, используя символы псевдографики (см. приложение В). Аргументы: произвольное дерево; ?- pred(a(f(a(m,k(v)),r),n(i(d,e,z)),o),X).
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|