Для того чтобы лучше понять, каким образом работает приведенный пример, рекомендуется
самостоятельно построить дерево целей, в качестве основы можно взять деревья целей для
примеров работы со списками.
И еще один пример по работе с деревьями – создание упорядоченного дерева. Пусть в узлах
дерева содержатся символы, символы, добавляемые к дереву, не должны повторяться
(программа не выполняет проверки на существование вводимых символов в дереве).
Символы вводятся с клавиатуры, символ ‘#’ – признак конца ввода символов.
DOMAINS
treetype=tree (char, treetype, treetype) ; end
PREDICATES
insert (char, treetype, treetype)
create_tree (treetype, treetype)
CLAUSES
%предикат insert обеспечивает вставку введенного с клавиатуры символа в дерево,
%для предиката insert записывается три правила вывода, в которых рассматривается
%три случая: первый случай – вставка нового символа в пустое дерево,
%второй и третий случаи – вставка нового символа в непустое дерево,
%если новый символ меньше, чем символ в корне дерева, то
новый символ добавляется
%в левое поддерево, если больше – в правое
%(для сравнения символов используются их ASCII-коды)
%вставка нового символа в пустое дерево, получается дерево с корнем и пустыми
%левым и правым поддеревьями
insert (New, end, tree (New, end, end)):- !.
%вставка нового символа по результатам проверки в левое поддерево,
%левое поддерево изменяется, а правое остается без изменений
insert (New, tree (Root, Left, Right), tree (Root, NewLeft, Right)):- New<Root, !,
insert (New, Left, NewLeft).
%вставка нового символа в правое поддерево, без проверки,
%правое поддерево изменяется, а левое остается без изменений
insert (New, tree (Root, Left, Right), tree (Root, Left, NewRight)):-
insert (New, Right, NewRight).
%предикат create_tree обеспечивает ввод символа с клавиатуры, и вызов предиката insert
create_tree (Tree, NewTree):- readchar(Ch), Ch<>’#’, !,
insert (Ch, Tree, TmpTree), create_tree (TmpTree, NewTree).
create_tree (Tree, Tree).
GOAL
create_tree (end, Tree), write(“Tree=”, Tree).
Результат работы программы:
Tree=tree('d',tree('a',end,tree('b',end,tree('c',end,end))),tree('f',tree('e',end,end),tree('g
',end,end)))
С клавиатуры была введена последовательность:
‘d’ ‘a’ ‘f’ ‘b’ ‘e’ ‘g’ ‘c’ ‘#’