Сборник задач по курсу «Логическое программирование»: Учебное пособие, страница 5

Аргументы: произвольное бинарное дерево; старое имя узла; новое имя узла; результирующее дерево.

?- pred(s(f(b(b(u(i,o),v),k),a),t(b,g)),b,r,X). X = s(f(r(r(u(i,o),v),k),a),t(r,g)) yes ?-

61.  Найти все поддеревья заданного дерева.

Аргументы: произвольное бинарное дерево; поддерево.

?- pred(a(f(a(m,k),r),n(i,o)),X). X = a(f(a(m,k),r),n(i,o)) -> ; X = f(a(m,k),r) -> ; X = a(m,k) -> ; X = m -> ; X = k -> ; X = r -> ; X = n(i,o) -> ; X = i -> ; X = o -> ; no ?-

62.  Найти все пути в дереве от корня до его листьев.

Аргументы: произвольное бинарное дерево; путь (список).

?- pred(a(f(a(m,k),r),n(i,o)),X). X = [a,f,a,m] -> ; X = [a,f,a,k] -> ; X = [a,f,r] -> ; X = [a,n,i] -> ; X = [a,n,o] -> ; no ?-

63.  Найти все пути от корня до его листьев, лежащих на максимальной глубине.

Аргументы: произвольное бинарное дерево; путь (список).

?- pred(a(f(a(m,k),r),n(i,o)),X). X = [a,f,a,m] -> ; X = [a,f,a,k] -> ; no ?-

64.  Найти все поддеревья, имеющие глубину не больше заданной.

Аргументы: произвольное бинарное дерево; максимальная глубина; поддерево.

?- pred(a(f(a(m,k),r),n(i,o)),2,X). X = a(m,k) -> ; X = m -> ; X = k -> ; X = r -> ; X = n(i,o) -> ; X = i -> ; X = o -> ; no ?-

65.  Выполнить перебор листьев в порядке убывания их глубины.

Аргументы: произвольное бинарное дерево; лист дерева.

?- pred(a(f(a(m,k),r),n(i(d,e),o)),X). X = m -> ; X = k -> ; X = d -> ; X = e -> ; X = r -> ; X = o -> ; no ?-

66.  Произвести приведение полинома.

Аргументы: исходный полином; результирующий полином.

?- pred(2+6*x^3-7*x^2-4+x^3+6*x^2,X). X = -2-x^2+7*x^3 yes ?-

67.  Произвести символьное дифференцирование полинома, который задается структурой вида: a+b*x+c*x^2+d*x^3+…

Аргументы: исходный полином; результирующий полином.

?- pred(2+6*x-7*x^3,X). X = 6-21*x^2 yes ?-

68.  Произвести деление полиномов. Исходные полиномы задаются  структурами вида: a+b*x+c*x^2+d*x^3+…

Аргументы: первый полином; второй полином; результирующий полином, остаток от деления.

?- pred(2+6*x-7*x^3,1+x,X,Y). X = -7*x^2+7*x-1 Y = 3 yes ?-

69.  Расширить синтаксис языка Пролог, введя операции (см. встроенный предикат op/3) над множествами (списки). Следует использовать следующие имена операций: «iss» – операция извлечения результата; «+» – операция объединения; «*» – операция пересечения; «-» – операция вычитания.

Аргументы: арифметическое выражение (в арифметике множеств); свободная переменная.

?- X iss [a,s,d,f] * [d,g,f] + [p,f]. X = [d,f,p] yes ?-

70.  Расширить синтаксис языка Пролог, введя операции (см. встроенный предикат op/3) модульной арифметики (арифметики вычетов, см. приложение В). Следует использовать имя «ism» для операции извлечения результата и стандартные «+, -, *, /» – для арифметических операций. Для хранения модуля, по которому производятся вычисления, необходимо использовать факт ism/1. В качестве модуля предполагается использовать только простые числа.

Аргументы: арифметическое выражение; свободная переменная.

?- ism(X). X = 3 yes ?- X ism (24+38)/2. X = 1 yes ?-

71.  Произвести перестановку поддеревьев в каждом узле дерева.

Аргументы: произвольное бинарное дерево; результирующее дерево.

?- pred(s(f(b(m,k),a),f(a,g)),X). X = s(f(g,a),f(a,b(m,k))) yes ?-


Произвольные структуры (деревья)

72.  Определить наличие на каком-либо из путей от корня до листа хотя бы двух узлов с одинаковым именем.

Аргументы: произвольное дерево.

?- pred(a(f(i(m,k),r,a(t)),n)). yes ?- pred(a(f(i(m,k),r,o(t)),n)). no ?-

73.  Определить наличие хотя бы двух узлов с одинаковым именем на одной глубине.

Аргументы: произвольное дерево.

?- pred(s(f(b(m,k),a),n(b,g),r(u))). yes ?- pred(s(f(b(m,k),a),n(t,g),r(u))). no ?-

74.  Определить наличие двух одинаковых путей от корня до листа.

Аргументы: произвольное дерево.

?- pred(s(f(b(m,k),a),f(a,g),n(h))). yes ?- pred(s(f(y(m,k),a),f(t,g),n(h))). no ?-

75.  Определить глубину дерева.

Аргументы: произвольное дерево; глубина дерева.