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

Переменные и среда

Традиционный Пролог и большинство созданных на нем оболочек не имеет

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

только через их аргументы. Благодаря наличию среды эта обработка ведется

очень удобным способом.

Каждое активированное-и-еще-незаконченное предложение ("активное")

имеет свою собственную среду (которую часто называют связующий список).

Пролог создает для каждой переменной и ее значения элемент в среде. Эти

элементы образуются в порядке использования переменных во время их ис-

пользования.

Рассмотрим ситуацию, когда у вас есть два правила - правило А и пра-

вило В. Когда правило А вызывает правило В, то несвязанным переменным

правила А могут быть приписаны значения полученные при унификации с пра-

вилом В, или они могут быть переданы (с помощью аргументов) от А к В.

Если какие-нибудь переменные правила А не имеют значения в тот мо-

мент, когда правило а вызывает правило В, то они будут свободными пере-

менными, разделяемыми соответствующими переменными правила В. Так как

свободные переменные разделяются, то установки на более низком уровне от-

ражаются наверх (от В к А). Этот процесс легко воспроизвести в Турбо Про-

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

описываются ниже).

Среда - это просто список составлющих среды:

E = e(VID, aTerm)

Env = reference E*

, где Е - переменная среды, VID (для идентификатора переменной) - ссылоч-

ная строка, aTerm - активный терм, Env - весь список среды.

Например, среда, в которой есть переменная Х, связанная с 3, и пере-

менная Y, пока ни с чем не связанная, будет выглядеть так:

[e("X", int(3)), e("Y",_)[_]

, где знак подчеркивания (_) в e("Y",_) представляет свободную ссылочную

переменную, которую можно будет связать с чем-либо позже, а второй знак

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

менной. При обычном использовании конец списка среды всегда остается сво-

бодным, так что новые переменные могут входить в среду с помощью предика-

та member, подобно:

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

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

Предикат member несколько необычен. Если в среде нет искомого члена,

то member автоматически поместит его туда. Предикат member используется

для унификации статических и действительных термов.