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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

82.  Найти в дереве все поддеревья, являющиеся бинарными.

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

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

83.  Сделать в дереве заданный узел корнем дерева с той же связностью узлов, что и в исходном дереве.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

89.  Найти все поддеревья.

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

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

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

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

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