3.2Составные термы
Составными термами являются структуры,
списки и недоопределённые множества:
составной_терм =
структура | список | недоопределённое_множество
Значения составных термов определяются с помощью кортежей и некоторых
специальных имён (констант).
3.2.1Структуры
Структура — это составной терм, построенный из функтора
и последовательности одного или более аргументов, заключённой в круглые скобки:
структура = функтор "(" термы_и_выражения ")"
термы_и_выражения =
[ термы_и_выражения "," ] терм_или_выражение
терм_или_выражение = терм | выражение
Значением структуры f<A1,A2,... ,Аn>является кортеж
длины n+2, в первой позиции которого стоит специальная константа
structure:
<structure,f,A,A2,... ,An>.
Пример.
Правильно построенные структуры:
gl(l+2,X,Y),Y), functor(i(l-(R*12),2,3),4,k(5),Z), h(J)
3.2.2 Списки
Список — это составной терм, построенный из последовательности
(возможно, пустой) аргументов, заключённой в квадратные скобки. В случае если
последовательность аргументов списка не является пустой, в его состав может быть
включён дополнительный компонент, обозначающий остаток (хвост) списка:
список = "[" [ термы_и_выражения [ "|" хвост ] ] "]"
хвост = параметр | вызов_функции_в_предложении | выражение
Значением пустого списка [] является специальная константа
#empty_list.
Значением списка [A1,A2...,An|Rest] является кортеж
<list,Ai,<list,A2,... <list,An,Rest>...>>
где list — специальная константа, Rest — хвост списка.
Таким образом, терму [A1,A2,... ,Аn] соответствует значение
<list,A1,<list,A2,... <list,An,#empty_list>... >>.
Пример.
Правильно построенные списки:
[17,_,"item_of_list",321,93,_], [X+721,Y,R+H,Z|R], []
3.2.3Недоопределённые множества
Недоопределённое множество — это составной терм, построенный
из набора (возможно, пустого) элементов, заключённого в фигурные скобки.
Элементы недоопределённого множества задаются в виде пар
«имя_элемента: значение_элемента»,
где имя элемента — некоторый символ или неотрицательное
целое число, а значение элемента — терм или выражение:
элементы_множества =
[ элементы_множества ",'' ] элемент_множества
элемент, множества =
имя_элемента [ ":" терм_или_выражение ] | атрибут
имя_элемента = символ | числовой_литерал
Если в составе элемента множества не заданы
терм или выражение после имени элемента, значением такого элемента считается
анонимная переменная «_». В таких случаях символы, используемые в качестве имён
элементов, обязательно должны быть в апострофах.
Если недоопределённое множество используется в составе
определения класса, то имена элементов множества, совпадающие с атрибутами этого класса,
должны быть символами в апострофах.
Если в качестве элемента множества задан атрибут Name,
то именем элемента множества считается символ 'Name', а значением — слот Name.
Заголовком недоопределённого множества называется значение
элемента с именем 0 (ноль), которое может быть задано в начале недоопределённого
множества, за пределами фигурных скобок. При таком способе определения в качестве
заголовка недоопределённого множества разрешается использовать только простые термы:
Недоопределённое множество вида
F{x1:A1,x2:A2--xn:An|Rest},
в составе которого задан заголовок F, эквивалентно
{0:F,x1:A1,x2:A2--xn:An|Rest}.
В случае если набор элементов множества (учитывая заголовок)
не является пустым, в составе множества может быть задан дополнительный компонент,
обозначающий неопределённый остаток (хвост) множества. Если недоопределённое множество
используется в составе определения атрибутов класса, в качестве хвоста этого множества
разрешается использовать только переменные.
недоопределённое-множество =
[ простой_терм ] "{" элементы_и_хвост_множества "}"
элементы_и_хвост_множества = [ элементы_множества ] [ "|" хвост ]
Недоопределённое множество не может содержать пары с одинаковыми именами элементов.
Для того чтобы построить значение недоопределённого множества, необходимо:
1.Просмотреть полный текст программы и построить множество S всех имён элементов всех недоопределённых множеств, которые в ней используются.
2.С помощью лексикографического упорядочения из элементов множества S построить цепочку S1,S2,... ,sm (m — мощность множества S).
3.Если недоопределённое множество обозначает конечное число элементов (случай {sx:Ax,sy:Ay,... ,sz:Az}), его значением является кортеж длины m+1:
<set,... ,z,... ,t(Ay),... ,z,... ,t(Ax),... ,t(Az),...>,
где set — специальная константа, t — имя вспомогательного функтора.
Каждая позиция i+1 (i=1,... ,m) кортежа содержит значение t(Ai), если пара с именем
элемента Si присутствует в рассматриваемом терме, или, если такая пара не обнаружена,
специальную константу z. Значением пустого множества {}, в частности, является кортеж
вида
<set,z,z,z,z,... z,z,z>.
4. Значением недоопределённого множества общего вида
{sx:Ax,sy:Ay,...,sz:Az|Rest}
является кортеж длины m+1:
G1 = <set.....Vx.....t(Ay).....V2.....t(Ax),... >,
каждая позиция i+1 (i=1,... ,т) которого
содержит t(Ai), если пара с именем элемента Sj присутствует в
рассматриваемом терме, или некоторую уникальную переменную Vj, если
соответствующая пара не обнаружена. Кроме того, понадобится ещё один
кортеж
G2 = <set,... ,V1:... ,z,... ,V2,... ,z,... >,
который отличается от предыдущего тем, что все аргументы t(A)
в нём заменены константами z. Считается, что всякий раз, когда создаётся значение
недоопределённого множества G1, одновременно с этим происходит унификация G2 с
переменной Rest.
Пример.
Правильно построенные недоопределённые множества:
R2{x:17,y:-(1+X),'z',5:'yes'}, {q:Y,e:W,symbol:_,k:0|W}, {}
Содержание