- 271 -
tree_member(X,tr(X,_,_)):-!. /* X - является корнем
дерева */
tree_member(X,tr(_,L,_)):-
tree_member(X,L),!. /* X принадлежит
левому поддереву */
tree_member(X,tr(_,_,R)):-
tree_member(X,R). /* X принадлежит
правому поддереву */
Пример 2. Предикат, который будет заменять в дереве все
вхождения одного значения на другое.
Решение
У предиката будет четыре аргумента: три входных (значение, которое
нужно заменять; значение, которым нужно заменять; исходное дерево),
четвертым – выходным – аргументом будет дерево, полученное в результате
замены всех вхождений первого значения на второе.
Базис рекурсивного решения: из пустого дерева можно получить
только пустое дерево. При этом абсолютно неважно, что на что заменяется.
Шаг рекурсии зависит от того, находится ли заменяемое значение в корне
дерева. Если находится, то нужно заменить корневое значение вторым
значением, после чего перейти к замене первого значения на второе в левом и
правом поддереве. Если же в корне содержится значение, отличное от
заменяемого, то оно должно остаться. Замену нужно произвести в левом и
правом поддеревьях.
Пролог-программа:
tree_replace(_,_,empty,empty). /* пустое дерево
остается пустым деревом*/
tree_replace(X,Y,tr(X,L,R),tr(Y,L1,R1)):-
/* корень содержит заменяемое
значение X*/
!,tree_replace(X,Y,L,L1),
/* L1 - результат замены
в дереве L всех вхождений X
на Y */
tree_replace(X,Y,R,R1).
/* R1 - результат замены
в дереве R всех вхождений X
на Y */
tree_replace(X,Y,tr(K,L,R),tr(K,L1,R1)):-
/* корень не содержит
заменяемое значение X */
tree_replace(X,Y,L,L1),
/* L1 - результат замены
в дереве L всех вхождений X
на Y */