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

Применение ссылочного типа

Правильным является применение ссылочных типов лишь в тех местах,

где это действительно необходимо, а во всех остальных случаях использо-

вать переменные обычного типа. В Турбо Прологе вы можете преобразовывать

переменные ссылочного типа в переменные обычного типа, где это необходи-

мо. Вы можете создать, например, предикат, который преобразует ссылочный

целый тип в обычный целый тип с помощью следующего фрагмента:

domains

refint = reference integer

predicates

conv(refint,integer)

clauses

conv(X,X).

В Турбо Прологе преобразование переменной из ссылочного в обычный

тип происходит автоматически (как это выполняется в предложении conv, в

котором Х преобразуется из refint в integer). Необходимо отметить, что

ссылочной переменной должно быть присвоено фактическое значение прежде,

чем переменная будет преобразована к обычному типу. Аналогичным образом,

если вы пытаетесь преобразовать переменную из одного ссылочного типа в

другой (например, из reference integer в reference char), вы должны быть

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

дано сообщение: "Free variable are not allowed here".

Обращайте внимание на автоматическое преобразование типов при полу-

чении новой свободной ссылочной переменной путем обращения к free, напри-

мер:

free(X), Y=X, bind_integer(X),...

или получения свободной переменной при помощи предиката = (равно), напри-

мер:

Y=X,bind_integer(X),...

В этих примерах при использовании предикатов free и = возникают

трудности при получении правильного типа. Механизм проверки типов пытает-

ся определить тип переменной во время слежения с возвратом при помощи

последовательных попыток выполнить анализ потока параметров. При проверке

типов будет выбран тип char (поскольку тип char может быть преобразован к

типу integer).

С помощью ссылочного типа вы можете получать значения переменных,

которым эти значения были присвоены несколько позже. Вы можете также соз-

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

Пример

Для того, чтобы поближе познакомиться с работой ссылочного типа,

попробуйте ввести ряд целевых утверждений с применением хорошо знакомых

предикатов member и append:

/* Program CH19EX04.PRO */

domains

refinteger = integer

reflist = reference refinteger*

predicates

member(refinteger, reflist)

append(reflist, reflist, reflist)

clauses

member(X, [X|_]).

member(X, ([_|L]) :- member(X, L).

append([], L, L).

append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).

Загрузите эту программу, затем запустите ее, нажав Alt-R и введите

следующие целевые утверждения:

member(1,L).

member(X,L),X=1

member(1,2),member(2,L).

X=Y,member (Y,L),X=3.

member(1,L0,append(L,[2,3],L1).

append(L,L,L1),ember(1,L).

L1=[1,2,3],append(L2,L2,L3),append(L1,L1,L3).

Сравните полученные ответы с тем, что вы предполагали получить.