Заменить соседние элементы, если они находятся в отношении родитель-ближайший потомок. Объясните, как работает - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д