|
Атомы -
специальные константы, играющие
роль имен. Синтаксически атомы
отличаются от
переменных тем, что переменные начинаются либо с заглавной буквы, либо
со знака подчеркивания,
а атомы - со строчных букв (это традиция, ведущая начало с пролога
Dec-10 Дэвида Уоррена).
Атом как константа равен "самому себе". Короткий диалог с
Флэнг-системой:
?- Atom;
S0_0 Atom = S0_0
?- atom;
atom
?- Atom1 = Atom2;
true Atom1 = S0_0 Atom2 = S0_0
?- atom1 = atom2;
fail
показывает, что
переменная Atom с точки зрения
интерпретатора - всего лишь место в памяти
(в нашем примере - с адресом S0_0), а вот значение атома - сам атом.
Сравнение двух
переменных (Atom1 и Atom2) приводит к успеху, хотя при этом и
накладываются условия на то,
что обе переменные должны обозначать один и тот же объект. Сравнение
двух неравных атомов приводит
к неудаче.
Мы уже активно
пользовались атомами при решении
логической
задачи о генеалогическом древе. Там атомы
использовались для именования людей. Способ применения атомов в той
задаче - чисто прологовский. Однако
в отличие от пролога, атом во Флэнге не только именует какие-то
абстрактные объекты, но и может
нести об этом объекте некоторую дополнительную информацию. Это
делается через присваивание атому атрибута:
?- number := 3;
true
После этого, атому
number присваивается атрибут 3. Имеется операция
взятия значения
атрибута '^':
?- number;
number
?- ^number;
3
Атом не может иметь
более одного атрибута. С другой стороны,
атрибутом атома может быть любой объект Флэнга:
?- list := [1,2,3,4,5];
true
?- head([X|Y]) :- X;
?- head(X) :- not_a_list;
?- head(list);
not_a_list
?- head(^list);
1
В последнем примере
мы присваиваем атому list атрибут, являющийся
списком из пяти чисел,
затем определяем функцию head, которая возвращает голову аргумента,
если это список, или извещает о том,
что аргумент - не список, в противном случае. Поскольку значение head
во втором правиле -
также атом (not_a_list), то ему мы также можем присвоить атрибут:
?- not_a_list := "не список";
true
?- ^head(list);
"не список"
Поскольку область
действия атомов - вся программа, атомы
могут
играть роль
глобальных переменных. Практика работы с Флэнгом показывает, что как
правило
через атомы реализуется "окружающая среда", в которой работает
Флэнг-программа,
и через которые Флэнг-программа влияет на "мир", изменяя у атомов
атрибуты.
В качестве примера
приведем программу, организующую ввод
пользователем
с консоли строк, и собирающую введенные строки в атоме collect.
Работа программы завершается при вводе пустой строки. Программа
возвращает список введенных
строк. Заметим, что при реализации программы можно спокойно обойтись
без использования
атомов, так что атомы в программе появляются лишь с целью демонстрации
работы с ними.
|