logo search
TurboProlog / Документация / TOM_1

Сортировка с помощью ссылочных типов

В этом разделе мы расширим предыдущий пример с бинарным деревом

(CH19EX05.PRO), чтобы показать как вы можете использовать ссылочные типы

и преобразовывать переменные из ссылочного в обычный тип.

/* Program CH19EX05.PRO */

domains

tree = reference t(val, tree, tree)

val = integer

list = integer*

predicates

insert(integer, tree)

instree(list, tree)

treemembers(integer, tree)

sort(list, list)

clauses

insert(Val, t(Val,_,_)) :- !.

insert(Val, t(Val1,Tree,_)) :- Val<Val1, !, insert(Val, Tree).

insert(Val, t(_,_,Tree)) :- insert(Val, Tree).

instree([],_).

instree([H|T], Tree) :-

insert(H, Tree),

instree(T, Tree).

treemembers(_, T) :- free(T), !, fail.

treemembers(X, T(Refstr,_,_)) :- X = Refstr.

treemembers(X, t(_, _, R)) :- treemembers(X, R).

treemembers(X, t(_, L,_)) :- treemembers(X, L).

sort(L, L1) :-

instree(L, Tree),

findall(X, treemembers(X, Tree), L1).

goal

sort([3, 6, 4, 5], L).

В этом примере обратите внимание на то, что ссылочный тип использу-

ется только для получения дерева. Все остальные аргументы относятся к

обычному типу.

Для более глубокого изучения ссылочных типов обратитесь к разделу

"Метапрограммирование".