Заменить соседние элементы, если они находятся в отношении родитель-ближайший потомок. Объясните, как работает - Prolog

Узнай цену своей работы

Формулировка задачи:

Помогите объяснить программу. Программу взяла с форума. Необходимо заменить соседние элементы,если они находятся в отношении родитель-ближайший потомок

Решение задачи: «Заменить соседние элементы, если они находятся в отношении родитель-ближайший потомок. Объясните, как работает»

textual
Листинг программы
% пустые поддеревья не обрабатываем - так и остаются пустыми
swap(empty,_,_,empty).
 
% если корень дерева равен X, то смотрим на корни ближайших поддеревьев
 
% 1) если оба ближайших поддерева имеют корень Y:
% - корень нового дерева будет равен Y;
% - корни обоих его ближайших поддеревьев будут равны X;
% - четыре поддерева следующего уровня преобразуются рекурсивным вызовом предиката.
swap(tree(X,tree(Y,L,R),tree(Y,LE,RA)), X, Y, tree(Y,tree(X,L1,R1),tree(X,LE1,RA1))):- !,
    swap(L,X,Y,L1),        % L -> L1
    swap(R,X,Y,R1),        % R -> R1
    swap(LE,X,Y,LE1),      % LE -> LE1
    swap(RA,X,Y,RA1).      % RA -> RA1
 
% 2) если только левое ближайшее поддерево имеет корень Y:
% - корень нового дерева будет равен Y;
% - корень левого ближайшего поддерева будет равен X;
% - два его поддерева следующего уровня преобразуются рекурсивным вызовом предиката;
% - правое ближайшее поддерево целиком преобразуется рекурсивным вызовом предиката.
swap(tree(X,tree(Y,L,R),RA), X, Y, tree(Y,tree(X,L1,R1),RA1)):- !,
    swap(L,X,Y,L1),        % L -> L1
    swap(R,X,Y,R1),        % R -> R1
    swap(RA,X,Y,RA1).      % RA -> RA1
 
% 3) если только правое ближайшее поддерево имеет корень Y:
% - корень нового дерева будет равен Y;
% - корень правого ближайшего поддерева будет равен X;
% - два его поддерева следующего уровня преобразуются рекурсивным вызовом предиката;
% - левое ближайшее поддерево целиком преобразуется рекурсивным вызовом предиката.
swap(tree(X,LE,tree(Y,L,R)), X, Y, tree(Y,LE1,tree(X,L1,R1))):- !,
    swap(L,X,Y,L1),        % L -> L1
    swap(R,X,Y,R1),        % R -> R1
    swap(LE,X,Y,LE1).      % LE -> LE1
 
% Во всех остальных случаях корень нового дерева равен корню старого,
% а оба ближайших поддерева целиком преобразуется рекурсивным вызовом предиката. 
swap(tree(K,L,R),X,Y,tree(K,L1,R1)):- 
    swap(L,X,Y,L1),        % L -> L1
    swap(R,X,Y,R1).        % R -> R1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы