Каждое поле field_i может быть выражением или формаль-
ным параметром вида ?var, где var — имя переменной выполняе-
мого процесса.
Аргументы примитива IN называются шаблоном. Процесс IN
ждет, пока в ПК появится хотя бы один кортеж, соответству-
ющий шаблону, и удаляет его из ПК.
Кортеж d соответствует шаблону t, если
1) их метки идентичны;
2) число полей d и t одинаково;
3) значение каждого выражения в t (если оно указано) р авно
соответствующему значению в кортеже данных d.
После того, как кортеж будет удален из ПК формальным пара-
метрам шаблона при сваивается соответствующие значения.
Пример 1. Реализация семафора.
Пусть sem — символьное имя семафора. Тогда операция V над
семафором (увеличение семафора на единицу) будет иметь вид
OUT("sem"), а операция P над семафором (ожидание увел иче ния се-
мафора на единицу, если он был нуль) будет иметь вид IN("sem").
Замечание. Операции P и V состоят из следующих неделимых
операций: P(s): <await(s>0); s=s-1;>, V(s): <s=s+1;>.
Значение семафора — число кортежей sem в пространстве кор-
тежей.
Для моделирования массива семафоров используется дополни-
тельное поле, пред ставляющее индекс массива, например
IN("sems", i); # P[sems[I]]
OUT("sems", i); # V[sems[I]]
Базовый примитив RD (блокирующий) используется д ля про-
смотра кортежей в пространстве кортежей (без их изъятия из этого
пространства — в отличие от примитива IN). Если t — шаблон, то
RD(t) приостанавливает процесс до тех пор, пока в пространстве
кортежей не появится кортеж, соответствующий шаблону t.
Примитивы INP и RDP выполняют те же действия, что IN и RD, но
не являются блокирующими; они кроме того возвращают TRUE или
FALSE в зависимости от того, есть или нет кортежа в пространстве
кортежей с данным шаблоном.
INP — извлекает кортеж из ПК (если он есть);
65