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}, {}



Содержание