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

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

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

Помогите объяснить программу. Программу взяла с форума. Необходимо заменить соседние элементы,если они находятся в отношении родитель-ближайший потомок
Листинг программы
  1. domains
  2. tree = empty; tree(integer,tree,tree)
  3. predicates
  4. swap(tree,integer,integer,tree)
  5. clauses
  6. swap(empty,_,_,empty).
  7. swap(tree(X,tree(Y,L,R),tree(Y,LE,RA)),X,Y,tree(Y,tree(X,L1,R1),tree(X,LE1,RA1))):- !,
  8. swap(L,X,Y,L1),swap(R,X,Y,R1),swap(LE,X,Y,LE1),swap(RA,X,Y,RA1).
  9. swap(tree(X,tree(Y,L,R),RA),X,Y,tree(Y,tree(X,L1,R1),RA1)):- !,
  10. swap(L,X,Y,L1),swap(R,X,Y,R1),swap(RA,X,Y,RA1).
  11. swap(tree(X,LE,tree(Y,L,R)),X,Y,tree(Y,LE1,tree(X,L1,R1))):- !,
  12. swap(L,X,Y,L1),swap(R,X,Y,R1),swap(LE,X,Y,LE1).
  13. swap(tree(K,L,R),X,Y,tree(K,L1,R1)):- swap(L,X,Y,L1),swap(R,X,Y,R1).
  14. goal
  15. 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
Листинг программы
  1. % пустые поддеревья не обрабатываем - так и остаются пустыми
  2. swap(empty,_,_,empty).
  3.  
  4. % если корень дерева равен X, то смотрим на корни ближайших поддеревьев
  5.  
  6. % 1) если оба ближайших поддерева имеют корень Y:
  7. % - корень нового дерева будет равен Y;
  8. % - корни обоих его ближайших поддеревьев будут равны X;
  9. % - четыре поддерева следующего уровня преобразуются рекурсивным вызовом предиката.
  10. swap(tree(X,tree(Y,L,R),tree(Y,LE,RA)), X, Y, tree(Y,tree(X,L1,R1),tree(X,LE1,RA1))):- !,
  11.     swap(L,X,Y,L1),        % L -> L1
  12.     swap(R,X,Y,R1),        % R -> R1
  13.     swap(LE,X,Y,LE1),      % LE -> LE1
  14.     swap(RA,X,Y,RA1).      % RA -> RA1
  15.  
  16. % 2) если только левое ближайшее поддерево имеет корень Y:
  17. % - корень нового дерева будет равен Y;
  18. % - корень левого ближайшего поддерева будет равен X;
  19. % - два его поддерева следующего уровня преобразуются рекурсивным вызовом предиката;
  20. % - правое ближайшее поддерево целиком преобразуется рекурсивным вызовом предиката.
  21. swap(tree(X,tree(Y,L,R),RA), X, Y, tree(Y,tree(X,L1,R1),RA1)):- !,
  22.     swap(L,X,Y,L1),        % L -> L1
  23.     swap(R,X,Y,R1),        % R -> R1
  24.     swap(RA,X,Y,RA1).      % RA -> RA1
  25.  
  26. % 3) если только правое ближайшее поддерево имеет корень Y:
  27. % - корень нового дерева будет равен Y;
  28. % - корень правого ближайшего поддерева будет равен X;
  29. % - два его поддерева следующего уровня преобразуются рекурсивным вызовом предиката;
  30. % - левое ближайшее поддерево целиком преобразуется рекурсивным вызовом предиката.
  31. swap(tree(X,LE,tree(Y,L,R)), X, Y, tree(Y,LE1,tree(X,L1,R1))):- !,
  32.     swap(L,X,Y,L1),        % L -> L1
  33.     swap(R,X,Y,R1),        % R -> R1
  34.     swap(LE,X,Y,LE1).      % LE -> LE1
  35.  
  36. % Во всех остальных случаях корень нового дерева равен корню старого,
  37. % а оба ближайших поддерева целиком преобразуется рекурсивным вызовом предиката.
  38. swap(tree(K,L,R),X,Y,tree(K,L1,R1)):-
  39.     swap(L,X,Y,L1),        % L -> L1
  40.     swap(R,X,Y,R1).        % R -> R1

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


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

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

10   голосов , оценка 3.7 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы