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

46.  Расширить синтаксис языка Пролог, введя операции (см. встроенный предикат op/3) над комплексными числами. Следует использовать имя «isс» для операции извлечения результата и стандартные «+, -, *, /, ^» для арифметических операций.

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

?- X isс (1.6, 4.5) + (2.8, 7.1). X = (4.4, 11.6) yes ?-

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

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

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

48.  Определить, являются ли два заданных дерева равными с точностью до перестановки левого и правого поддерева в каждом узле.

Аргументы: первое дерево; второе дерево.

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

49.  Собрать все узлы в список.

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

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

50.  В каждом узле дерева поменять при необходимости поддеревья местами так, чтобы в результирующем дереве в каждом узле выполнялось требование – количество узлов в левом поддереве не больше, чем в правом.

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

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

51.  Найти максимум количества узлов лежащих на одной глубине.

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

?- pred(s(f(b(m,k),a),t(r,w)),X). X = 4 yes ?-

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

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

?- pred(s(f(b(m,k),a),t(a,g)),1,X). X = [s] yes ?- pred(s(f(b(m,k),a),t(a,g)),3,X). X = [b,a,a,g] yes ?- pred(s(f(b(m,k),a),t(a,g)),5,X). X = [] yes ?-

53.  Обрезать дерево на заданной глубине.

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

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

54.  Произвести следующую процедуру над деревом, начиная обработку с корня: в текущем узле с заданной вероятностью принимается решение об усечении дерева в этом узле (узел становится листом).

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

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

55.  Заданный узел в дереве сделать корнем дерева с той же связностью узлов, что и в исходном дереве. Результирующее дерево не является бинарным.

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

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

56.  Подсчитать количество узлов дерева, лежащих на заданной глубине.

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

?- pred(s(f(b(m,k),a),t(a,w)),1,X). X = 1 yes ?- pred(s(f(b(m,k),a),t(a,w)),3,X). X = 4 yes ?- pred(s(f(b(m,k),a),t(a,w)),4,X). X = 2 yes ?-

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

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

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

58.  Подсчитать количество узлов с заданным именем.

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

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

59.  Определить путь между двумя заданными узлами.

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

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

60.  Переименовать все узлы, имеющие заданное имя.