Заменить соседние элементы, если они находятся в отношении родитель-ближайший потомок. Объясните, как работает - Prolog
Формулировка задачи:
Помогите объяснить программу. Программу взяла с форума. Необходимо заменить соседние элементы,если они находятся в отношении родитель-ближайший потомок
Листинг программы
- domains
- tree = empty; tree(integer,tree,tree)
- predicates
- swap(tree,integer,integer,tree)
- clauses
- swap(empty,_,_,empty).
- 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),swap(R,X,Y,R1),swap(LE,X,Y,LE1),swap(RA,X,Y,RA1).
- swap(tree(X,tree(Y,L,R),RA),X,Y,tree(Y,tree(X,L1,R1),RA1)):- !,
- swap(L,X,Y,L1),swap(R,X,Y,R1),swap(RA,X,Y,RA1).
- swap(tree(X,LE,tree(Y,L,R)),X,Y,tree(Y,LE1,tree(X,L1,R1))):- !,
- swap(L,X,Y,L1),swap(R,X,Y,R1),swap(LE,X,Y,LE1).
- swap(tree(K,L,R),X,Y,tree(K,L1,R1)):- swap(L,X,Y,L1),swap(R,X,Y,R1).
- goal
- Tree=tree(5,tree(4,tree(5,empty,empty),tree(7,empty,empty)),tree(3,tree(11,tree(5,tree(4,empty,empty),tree(5,empty,empty)),empty),empty)),
Решение задачи: «Заменить соседние элементы, если они находятся в отношении родитель-ближайший потомок. Объясните, как работает»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д