Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
23.05.2015
Размер:
1.7 Mб
Скачать

Глава 9

Представление структур данных в виде процессов

9.1Понятие структуры данных

Структура данных (СД) – это дискретная динамическая система, каждое состояние которой можно интерпретировать как совокупность данных (т.е. некоторых значений), хранящихся в текущий момент в этой системе.

Как правило, каждое состояние СД представляет собой совокупность из нескольких компонентов, каждая из которых является содержимым некоторого ресурса (например, содержимым ячейки памяти).

Одним из способов формального описания СД является представление их в виде процессов.

Если процесс P является представлением некоторой СД, то имена в P можно интерпретировать как точки доступа к данным, содержащимся в этой СД. Объекты, соответствующие этим именам, могут иметь виртуальный характер. Например, в качестве таких объектов могут выступать криптографические ключи.

Представление СД в виде процессов позволяет формализовать понятие активных данных (= знаний), которые развиваются в результате наличия у них неполноты или противоречивости. Активность структур данных заключается в том, что они могут сами инициировать запросы к окружающей среде с целью полу-

303

чения дополнительной информации для достижения согласованности в знаниях, которые содержатся в этих СД.

Вэтой главе мы приводим несколько примеров описания СД

ввиде процессов. Каждый из этих процессов задаётся в виде рекурсивного определения.

Ниже мы будем отождествлять процесс, представляющий некоторую СД, с самой этой СД.

9.2СД “память с 2k ячейками”

СД “память с 2k ячейками” (где k ≥ 0) – это процесс

[[MEMk(~x)]]

(9.1)

где MEMk – процессное имя, и ~x – список из 2k переменных вида

~x = {xm | m {0, 1}k}

каждая из которых соответствует некоторой ячейке памяти: для каждого m {0, 1}k значение переменной xm представляет собой содержимое ячейки памяти с адресом m.

Мы будем предполагать, что процесс [[MEMk(~x)]] работает следующим образом:

1.сначала, если k > 0, то через точку доступа α в процесс [[MEMk(~x)]] поступает адрес m,

2.затем через точку доступа β в процесс [[MEMk(~x)]] поступает значение v, которое надо записать в ячейке по адресу m

3.после чего через точку доступа γ процесс [[MEMk(~x)]] выдаёт значение, которое содержалось в ячейке по адресу m до выполнения предыдущего шага.

Процессы, соответствующие процессным выражениям вида MEMk(~x), определяются следующим РО:

MEM0(x) = β?y . γ!x . MEM0(y)

(процесс [[MEM0(x)]] – это - ячейка памяти, хранящая значение x)

304

• для каждого k ≥ 0

 

 

 

 

 

 

 

MEMk+1(~x · ~y) =

 

 

α0

, β0

, γ0,

 

=

MEMk(~x) [|

α0/α, β0/β, γ0/γ ]

\ (

)

 

SW IT CH

 

|

 

 

 

 

MEMk(~y) [ α1/α, β1/β, γ1/γ ]

α1

, β1

, γ1

 

 

 

 

 

 

 

 

 

где

~x · ~y – список из 2k+1 различных переменных, представленный в виде конкатенации двух списков из 2k переменных

SW IT CH - это процесс, называемый переключателем, и представляемый следующей блок-схемой:

START

- s

?

α?m + ? mˆ = 0

 

?

 

?

 

 

α0!m0

 

α1!m0

 

 

 

?

 

 

?

 

 

β?u

 

β?u

 

 

 

 

 

 

 

 

 

 

?

 

 

?

 

 

β0!u

 

β1!u

 

 

 

 

 

 

 

 

 

 

?

 

 

?

 

 

γ0?y

 

γ1?y

 

 

 

 

 

 

 

 

 

 

?

 

 

?

 

 

γ!y

 

γ!y

 

 

 

 

 

 

 

 

 

 

 

где

305

mˆ = первый бит в битовой строке m, и

m0 = строка из k−1 битов, получаемая из m удалением первого бита.

Процесс [[MEMk+1(~x · ~y)]] изображается следующим потоковым графом:

 

'd d t

$

 

 

 

 

 

α

β γ

 

 

 

 

 

 

t

 

 

 

d@I

 

 

 

 

SW IT CH

 

 

 

 

 

 

 

 

 

 

 

 

β0 &d t

β@%

 

 

α0 t

@ t@ @ γ1

$

'dd t

$'d d @t

 

 

 

@

1

@

 

 

 

 

γ0

α1

 

 

 

 

 

 

 

 

 

R@ R@

 

 

 

MEMk(~x)

 

 

 

MEMk(~y)

 

&

 

%&

 

 

 

%

Читателю предлагается самостоятельно доказать, что процесс [[MEMk(~x)]] удовлетворяет следующей спецификации: если k > 0, то для каждого процесса P

 

α!m . β!u . γ| ?y . P

! \ {α, β, γ} ≈

 

MEMk(~x)

 

 

+

(y := xm) . P

 

|

! \ {α, β, γ}

+

(xm := u) . MEMk(~x)

 

 

Операция

• чтения значения, содержащегося в ячейке процесса

[[MEMk(~x)]]

по адресу m (без изменения содержимого этой ячейки), и

• занесения этого значения в переменную y процесса P

представляется процессным выражением

(где z 6 P )

α!m . β!0 . γ|

?y . α!m . β!y . γ?z . P

! \ {α, β, γ}

MEMk(~x)

 

 

 

 

 

 

(9.2)

306

Читателю предлагается самостоятельно доказать, что

(9.2) ≈

(y := xkm) . P|

! \ {α, β, γ}

+

MEM (~x)

 

Можно изменить определение процесса [[MEMk(~x)]] так, чтобы новый процесс удовлетворял спецификации

+

MEMk(~x) ≈

+

β?y . (xm := y) . MEMk(~x) + γ!xm . MEMk(~x)

≈ α?m.

т.е.

сначала в процесс [[MEMk(~x)]] вводится адрес m,

а потом, в зависимости от выбора окружающей среды,

либо в [[MEMk(~x)]] записывается новое значение по адресу m

либо читается значение, хранящееся в [[MEMk(~x)]] по адресу m

Для этого надо по-другому определить процесс [[MEM0(x)]]:

MEM0(x) = β?y . MEM0(y) + γ!x . MEM0(x)

Работа с новым процессом [[MEMk(~x)]] происходит следующим образом.

Операция записи значения выражения e в ячейку по адресу m представляется процессным выражением

 

 

MEMk(~x) | α!m . β!e . 0

Операция чтения процессом P значения, записанного в ячейке процесса [[MEMk(~x)]] по адресу m, и занесения этого значения в переменную y процесса P , представляется процессным выражением

 

 

MEMk(~x) | α!m . γ?y . P

307

9.3СД “стек”

Стек – это СД с точками доступа α и γ, с которой можно выполнять следующие операции:

1.положить значение v в стек (действие α ! v)

2.если стек непуст, то взять головной элемент стека (действие

γ ? x).

СД “стек” представляется совокупностью процессных выражений

{P USHn(x1, . . . , xn) | n ≥ 0}

(9.3)

где для каждого n ≥ 0 P USHn – процессное имя, и ПВ

P USHn(x1, . . . , xn)

представляет процесс “стек, хранящий n значений”.

Процессы, соответствующие ПВ из совокупности (9.3) определяются следующим РО:

1.P USH0 = α?x . P USH1(x) + γ!$ . 0

2.для каждого n ≥ 0

P USHn+1(x, x1, . . . , xn) =

! \ {β, δ}

=

P USHn(x|1, . . . , xn)[β/α, δ/γ]

 

CELL(x)

 

где ПВ CELL(x) представляет процесс с точками доступа α, β, γ, δ, называемый ячейкой памяти, и определяемый следующим образом:

CELL(x) =

(y =

($))

? P USH0 + (y = $) ? CELL(y)

!

=

γ!?x . δ?!y .

 

α y . β x . CELL y

+

 

 

 

 

 

6

Потоковый граф процесса [[P USHn(x1, . . . , xn)]] имеет следующий вид:

308

α'e u$β - . . .

uCELL(x1) e δ . . .

γ& %

β -'e

uCELL(xn)

δ &

u$β -'e $

e uP USH0

%δ & %

Читателю предлагается самостоятельно доказать, что совокупность процессов, соответствующих ПВ из (9.3), удовлетворяет следующей спецификации: для каждого n ≥ 0

!

+

α?y . P USHn+2(y, x, x1, . . . , xn)+

P USHn+1(x, x1, . . . , xn) ≈

γ!x . P USHn(x1, . . . , xn)

9.4СД “очередь”

Очередь – это СД с точками доступа α и γ, с которой можно выполнять следующие операции:

1.добавить значение v в конец очереди (действие α ! v)

2.если очередь непуста, то взять первый элемент очереди (действие γ ? x).

СД “очередь” представляется совокупностью процессных выражений

{QUEUEn(x1, . . . , xn) | n ≥ 0}

(9.4)

где для каждого n ≥ 0 QUEUEn – процессное имя, и ПВ

QUEUEn(x1, . . . , xn)

представляет процесс “очередь, хранящая n значений”. Процессы, соответствующие ПВ из совокупности (9.4) опре-

деляются следующим РО:

1.QUEUE0 = α?x . QUEUE1(x) + γ!$ . 0

2.для каждого n ≥ 0

QUEUEn+1(x, x1, . . . , xn) =

! \ {β, δ}

=

QUEU(En(|x1, . . . , xn)[β/α, δ/γ]

 

CELL x)

 

309

где ПВ CELL(x) представляет процесс с точками доступа α, β, γ, δ, называемый ячейкой памяти, и определяемый следующим образом:

CELL(x) =

 

=

α?y . β!x . CELL(y) + γ!x . CELL(y) +

 

γ!x . δ?y . (y = $) ? QUEUE0 + (y 6= $) ? CELL(y)

 

Потоковый граф процесса [[QUEUEn(x1, . . . , xn)]] имеет такой же вид, как и потоковый граф в пункте 9.3.

Читателю предлагается самостоятельно доказать, что совокупность процессов, соответствующих ПВ из (9.4), удовлетворяет следующей спецификации: для каждого n ≥ 0

 

 

+

 

QUEUEn+1(x, x1, . . . , xn) ≈

!

γ!x . QUEUEn(x1

, . . . , xn)

+

α?y . QUEUE (x, x , . . . , x , y) +

 

n+2

1

n

310