Поиск количества совпадающих элементов в бинарном дереве - Prolog

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

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

Здравствуйте. Нужно найти количество совпадающих элементов в бинарном дереве. Я написал следующие правила
Листинг программы
  1. element(t(X,_,_), X).
  2. element(t(_, Left, Right), X) :- element(Left,X);element(Right,X).
  3. counter(nil,_,0) :- !.
  4. counter(t(K,TL,TR),K,N) :- counter(TL,K,NL), counter(TR,K,NR), N is NL+NR+1.
  5. counter(t(_,TL,TR),K,N) :- counter(TL,K,NL), counter(TR,K,NR), N is NL+NR.
  6. func(Tree) :- element(Tree, Elements), func(Tree), counter(Tree, Elements, Num),
  7. write(Elements), write('-'), write(Num), nl.
но получается не то что хотел. Например:
Листинг программы
  1. ?- func(t(158,t(158,nil,nil), t(152,nil,nil))).
  2. 158-2
  3. yes
а расчитывал на
Листинг программы
  1. ?- func(t(158,t(158,nil,nil), t(152,nil,nil))).
  2. 158-2
  3. 158-2
  4. 152-1
  5. yes
По отдельности element и counter работают, соответственно 1-й выводит все элементы дерева, а 2-й кол-во вхождений элемента в дерево. Помогите разобраться в чем же дело

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

textual
Листинг программы
  1. func(Tree) :-
  2.     element(Tree, Elements),    % <--- Здесь возникает развилка
  3.     counter(Tree, Elements, Num),
  4.     write(Elements), write('-'), write(Num), nl,
  5.     fail;    % <--- Здесь происходит принудительный откат к развилке
  6.     write('---').   % <--- А сюда попадём, когда варианты перебора в развилке закончатся

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


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

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

8   голосов , оценка 4 из 5

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

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

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