Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Матвей сгдм.DOC
Скачиваний:
1
Добавлен:
27.04.2019
Размер:
753.66 Кб
Скачать

1.6.4. Звездочка

Множество A*–это набор всех конечных протоколов (включая <>), составленных из элементов множества A. После сужения на A такие протоколы остаются неизменными, Отсюда следует простое определение:

A* = {s | sA = s}

Приведенные ниже законы являются следствиями этого опре­деления:

L1. <>A*

L2. <x>A*xA

L3. (s^t)A*sA* & tA*

Они обладают достаточной мощностью, чтобы определить, принадлежит ли протокол множеству A*. Например, если

x A, а уA, то

<x, y> A* (<x>^<y>) A*

(<x> A*) & (<y> A*) по L3

истина & ложь по L2

ложь

Еще один полезный закон может служить рекурсивным опре­делением A*:

L4. A* = {t | t = <>(t0A & t’A*)}

1.6.5. Порядок

Если s – копия некоторого начального отрезка t, то можно найти такое продолжение u последовательности s, что s^u = t Поэтому мы определим отношение порядка

st = (u.s^ = t)

и будем говорить, что s является префиксом t. Например:

<x, y> ≤ <x, y, x, w>

<x, y> ≤ <z, x, y> ≡ x = z

Отношение является частичным упорядочением и имеет своим наименьшим элементом <>. Об этом говорят законы L1–L4:

L1. <> ≤ s наименьший элемент

L2. ss рефлексивность

L3. st & t s s = t антисимметричность

L4. st & tu su транзитивность

Следующий закон вместе с L1 позволяет определить, яв­ляется ли справедливым отношение st:

L5. (<x>^s) ≤ tt ≠ <> & x = t0 & st

Множество префиксов данной последовательности вполне упо­рядочено:

L6. su & tustts

Если s является подпоследовательностью t (не обязатель­но начальной), мы говорим, что s находится в t; это можно определить так:

s в t = (u, v.t = u^s^v)

Это отношение также задает частичный порядок в том смысле, что оно удовлетворяет законам L1–L4, Кроме того, для него справедливо следующее утверждение:

L7. (<x>^s) в t = t ≡ t ≠ <> & ((t0 = х & s ≤ t)(<x>^s) в t’)

Будем говорить, что функция f из множества протоколов во множество протоколов монотонна, если она сохраняет от­ношение порядка т. е.

f(s) ≤ f(t) всякий раз, когда st

Все дистрибутивные функции монотонны, например;

L8. st (s A) ≤ (t A)

Двуместная функция может быть монотонной по каждому из аргументов. Например, конкатенация монотонна по второму (но не по первому) аргументу:

L9. t ≤ u ⇒ (s^t) ≤ (s^u)

Функция, монотонная по всем аргументам, называется просто монотонной.

1.6.6. Длина

Длину протокола t будем обозначать #t, Например, #<x, y, x> = 3 Следующие законы определяют операцию #;

L1. #<> = 0

L2. #<x> = 1

L3. #(s^t) = (#s) + (#t)

Число вхождений в t символов из A вычисляется выра­жением # (tA).

L4. #(t(AB)) = #(tA) + #(tВ) – #(t(AB))

L5. s ≤ t#s ≤ #t

L6. #(tn) = n(#t)

Число вхождений символа х в протокол s определяется как

sx = #(s {x})

1.7. Реализация протоколов

Для машинного представления протоколов и реализации операций над ними нам потребуется язык высокого уровня с развитыми средствами работы со списками, К счастью, ЛИСП как нельзя лучше подходит для этой цели. Протоколы в нем очевидным образом представляются списками атомов, соответствующих его событиям:

<> = NIL

<мон>= cons("MOН, NIL)

<мон, шок> = "(МОН, ШОК)

что означает cons("МОН, cons("ШОК, NIL)).

Операции над протоколами легко реализовать как функ­ции над списками. Так, например, голова и хвост непустого списка задаются примитивами car и cdr:

t0 = car(t)

t’ = cdr(t)

<x>^s = cons(x,s)

Конкатенация в общем виде реализуется с помощью известной функции append, которая задается рекурсивно:

s^t = append(s, t)

где append(s, t) = if s = NIL then t

else cons(car(s),append(cdr(s, t))

Корректность этого определения вытекает из законов

<>^t = t

s^t = <s0>^(s’^t) когда s ≠ <>.

Завершение ЛИСП–функции append гарантируется тем, что при каждом рекурсивном вызове список, подставляемый в качестве первого аргумента, короче, чем на предыдущем уровне рекурсии. Подобное рассуждение позволяет устано­вить корректность и других, приведенных ниже, реализаций. Для реализации сужения представим конечное множество списком его элементов. Проверка (xB) выполняется вы­зовом функции

принадлежит(х, В) = if В = NIL then ложь

else if х = саr(В) then истина

else принадлежит(x, cdr(В))

после чего сужение (s В) может быть реализовано функцией

сужение (s, B) = if s = NIL then NIL

else if принадлежит(car(s), B) then cons(car(s), сужение(cdr(s), В))

else сужение(cdr(s),В)

Проверка (s ≤ t) реализуется функцией, дающей ответ истина или ложь; реализация основана на законах 1.6.5 L1 и L5:

префикс_ли(s, t) = if s = NIL then истина

else if t = NIL then ложь

else car(s) = car(t) & префикс_ли (cdr(s), cdr(t))

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]