Повторяющиеся элементы бинарного дерева - Prolog

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

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

Необходимо на Turbo Prolog 2.0 вывести все повторяющиеся элементы бинарного дерева. Была похожая тема, но программа не работала.

Решение задачи: «Повторяющиеся элементы бинарного дерева»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. btree=tree(int,btree,btree); nil
  5.        
  6. predicates
  7.  
  8. task(btree,intl)
  9. b2l(btree,intl)
  10. app(intl,intl,intl)
  11. del(int,intl,intl)
  12. memb(int,intl)
  13. dups(intl,intl)
  14.  
  15. clauses
  16.  
  17. b2l(nil,[]).
  18. b2l(tree(V,L,R),X) :- b2l(L,LL), b2l(R,RR), app(LL,[V],L1), app(L1,RR,X).
  19.  
  20. app([],X,X).
  21. app([H|T],X,[H|R]) :- app(T,X,R).
  22.  
  23. del(_,[],[]).
  24. del(H,[H|T],R):- del(H,T,R).
  25. del(H,[Z|T],[Z|R]):- Z<>H, del(H,T,R).
  26.  
  27. memb(_,[]) :- fail.
  28. memb(X,[X|_]):- !.
  29. memb(X,[Y|T]):- X<>Y, memb(X,T).
  30.  
  31. dups([],[]).
  32. dups([H|T],[H|R]) :- del(H,T,TT), memb(H,T), dups(TT,R).
  33. dups([H|T],R) :- del(H,T,TT), not(memb(H,T)), dups(TT,R).
  34.  
  35. task(B,R) :- b2l(B,BB), dups(BB,R).

Объяснение кода листинга программы

В представленном коде на языке Prolog описывается работа с бинарными деревьями и повторяющимися элементами.

  1. Объявления:
    • domains: определения типов данных, используемых в программе. В данном случае, int - это целочисленный тип данных, intl - это массив (вектор) целочисленных значений. Также определено типовое представление бинарного дерева - btree.
    • predicates: здесь перечислены все предикаты (отношения), которые используются в программе.
    • clauses: это правила, определяющие поведение предикатов.
  2. Первое правило b2l(nil,[]) говорит, что если в качестве аргументов функции b2l выступает корень (nil), то результатом будет пустой список [].
  3. Второе правило b2l(tree(V,L,R),X) говорит, что если в качестве аргументов функции b2l выступает не корень (то есть у дерева есть левое и правое поддеревья, а также значение V), то результатом будет список X, полученный путем объединения результатов обхода левого и правого поддеревьев с добавлением значения V.
  4. Следующие два правила app([],X,X) и app([H|T],X,[H|R]) определяют поведение функции app, которая добавляет элемент X в список, предварительно разделенный на голову (H) и хвост (T).
  5. Правила del(_,[],[]), del(H,[H|T],R) и del(H,[Z|T],[Z|R]) определяют поведение функции del, которая удаляет элемент с заданным ключом из списка.
  6. Правила memb(,[]) и memb(X,[X|]) определяют поведение функции memb, которая проверяет, является ли элемент X частью списка.
  7. Правила dups([],[]) и dups([H|T],[H|R]) определяют поведение функции dups, которая находит все повторяющиеся элементы в списке.
  8. Последнее правило task(B,R) :- b2l(B,BB), dups(BB,R) говорит, что функция task преобразует бинарное дерево B в список BB, а затем с помощью функции dups находит все повторяющиеся элементы в этом списке и возвращает их в виде результата R.

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


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

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

6   голосов , оценка 4.333 из 5

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

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

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