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

10.2Семантика языка L

В этом параграфе мы определяем семантику языка L, которая представляет собой правило, сопоставляющее каждой конструкции Q языка L некоторое ПВ h|Q|i, называемое семантикой конструкции Q.

При определении этой семантики мы будем использовать следующие обозначения и соглашения.

1.В каждом ПВ B, соответствующем какой-либо конструкции языка L, знакосочетания

δ!, ρ!, i? и o!

обозначают действия, имеющие заранее предопределённый смысл:

(a)δ! обозначает сигнал о завершении исполнения процесса, соответствющего процессному выражению B

(b)ρ! обозначает вывод значения, являющегося результатом работы процесса, соответствующего процессному выражению B

(c)i? обозначает ввод значения в программу

(d)o! обозначает вывод значения из программы

2.Символ done обозначает ПВ δ! . 0

3.Для каждой пары ПВ B1, B2

(a)знакосочетание B1 before B2 обозначает ПВ

B1[β/δ] | β?.B2 \ {β}

где β не входит в B1 и B2

(b) знакосочетание B1 result B2 обозначает ПВ

(B1 | B2) \ {ρ}

315

(c) знакосочетание B1 par B2 обозначает ПВ

B2

2

/δ] |

 

 

 

δ1, δ2

 

 

B1

1

/δ]

 

 

\ {

 

}

δ1!.δ2

!.done|

+ δ2!.δ1!.done

 

 

 

 

 

 

 

 

 

 

где δ1 и δ2 не входят в B1 и B2

4.Для каждого объекта с именем n, объявленного в некоторой декларации D, символ Ln обозначает подмножество множества Names, состоящее из точек доступа к этому объекту:

Ln = {πR, ϕR

,

}

 

если D = (10.2)

 

{

αx, γx

, πx

, ϕx

,

если

D = (10.1)

α

, γ

}

 

 

 

 

D = (10.3)

 

 

 

,

 

 

 

def

{

 

 

G}

 

 

 

 

 

 

 

G

 

 

 

если

 

 

 

 

 

 

 

 

 

 

 

Если имена n1 и n2 таких объектов различны, то

Ln1 ∩ Ln2 =

10.2.1Семантика выражений

Каждому выражению e языка L соответствует ПВ h|e|i, определяемое индукцией по построению выражения e:

• для каждой переменной x V ar

 

 

 

 

 

 

 

 

def

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h|x|i = γx?y. ρ!y. 0

 

 

 

 

• для каждой константы c Con

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h|c|i

def

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

= ρ!c. 0

 

 

 

 

• для каждого ФС f

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

def

 

 

 

 

 

 

 

 

 

 

 

 

h|f(e1, . . . , en)|i =

 

. ρ! f(x1

, . . . , xn) . 0

! \ {

 

 

}

=

ρ1

?x1

. . . . ρn?xn

ρ1

, . . . , ρn

h|

e

1|i [

1

] |

. . .

| h|

n|i [

ρ

n

] |

 

 

def

 

 

 

ρ /ρ

e

 

 

 

 

 

 

 

316

10.2.2Семантика деклараций

При описании семантики деклараций мы будем использовать вспомогательные ПВ, соответствующие процессам, определяемым

ввиде РО:

REGx(y) = αx?z . REGx(z) + γx!y . REGx(y)

([[REGx(y)]] = регистр для хранения значения переменной x)

def

• LOCx = αx?y . REGx(y)

(регистр без начального содержания)

• SEMx = πx! . ϕx! . SEMx

• SEMR = πR! . ϕR! . SEMR

Семантика деклараций имеет следующий вид.

1. Если D = VAR x, то

def

h|D|i = LOCx | SEMx

2. Если D = RESOURCE R, то

def

h|D|i = SEMR

3.Если D = PROCEDURE G(u, v) IS C, то процессному выражению h|D|i соответствует РО

 

 

LOCu

 

 

 

 

 

 

 

 

 

 

h|D|i =

LOCv |

 

C

 

 

)

 

LG)

\ (Lu Lv)

 

αG?x .|αu!x . (( D

|i | h|

|i

\

 

 

 

h|

 

 

 

 

 

 

 

 

before γv?y . γG!y .

h|

D

|i

 

 

 

 

 

 

 

 

 

 

 

 

 

Если в РО для h|PROCEDURE . . . |i вместо

(h|D|i | h|C|i) \ LG

было бы написано просто h|C|i, то неправильно транслировались бы такие процедуры, которые рекурсивно вызывают сами себя, т.е. такие G, в теле которых есть оператор call G.

317

Вышеприведённая семантика деклараций вида (10.3) является неидеальной. Она неправильно сопоставляет ПВ таким операторам, в которых есть параллельные вызовы одной и той же процедуры, например, оператору вида

call G(6, z) par call G(7, w)

Если известно максимальное число n доступных процессоров (т.е. одновременно n процедур могут быть активными), то семантику декларации D вида (10.3) лучше определить в виде РО

h|

i = 1, . . . , n

| . . . | h|D|in

 

 

 

 

D|i

= h|D|i1

 

 

 

 

 

 

 

 

 

 

 

 

LOCu

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

|

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LOCv

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h|

D

|ii =

α

G,i

?

x .

 

αu!x . |((h|D|i | h|C|i) \ LG)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

before γv?y . γG,k!y .

 

D i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h|

|i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

def

 

 

 

 

 

 

 

 

 

где LG = {αG,1, . . . , αG,n, γG,1, . . . , γG,n}.

 

 

\ (Lu Lv)

(10.4)

10.2.3Семантика операторов

def

1. h|x := e|i = πx? . h|e|i result (ρ?y . αx!y . ϕx? . done)

def

2. h|C1; C2|i = h|C1|i before h|C2|i

def

3. h|if e then C1 else C2|i =

def

= h|e|i result ρ?x . (x ? h|C1|i + ¬x ? h|C2|i)

4. если C = while e do C0, то ПВ h|C|i связано со следующим РО:

h|

C

|i

=

e

|i

result (ρ?x.

x ? h|C0|i before h|C|i +

)

 

 

h|

 

x ? done

!

 

 

 

 

 

 

 

¬

 

def

5. h|begin {D1, . . . , Dk; C} end|i =

def

= (h|D1|i | . . . | h|Dk|i | h|C|i) \ (LD1 . . . LDk )

def

6. h|C1 par C2|i = h|C1|i par h|C2|i

318

def

7. h|input x|i = i?y . αx!y . done

def

8. h|output e|i = h|e|i result (ρ?x . o!x . done)

def

9. h|skip|i = done

def

10. h|call G(e, z)|i =

def

= h|e|i result (ρ?x . αG!x . γG?z . αz!z . done)

def

11. h|with R do C|i = πR? . h|C|i before (ϕR? . done)

Если известно максимальное число n доступных процессоров (т.е. одновременно n процедур могут быть активными), и семантика деклараций вида (10.3) определяется в соответствии с (10.4), то семантику оператора call G(e, z) следует определить следующим образом:

def

h|call G(e, z)|i =

def

= h|e|i result (ρ?x .

n

P αG,i!x . γG,i?z . αz!z . done)

i=1

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

определить семантику каких-либо современных языков параллельного или распределённого программирования (MPI

ит.п.) или языков проектирования бизнес-процессов (BEPL

ит.п.), и

разработать на основе этой семантики автоматизированную систему доказательства свойств программ или описаний систем на этих языках.

319