- •05.12.12 Лекция 12
- •Темпоральная логика
- •Определение Модальной логики
- •Динамически порождаемые процессы
- •Радиус-сервер интернет-телефонии
- •Спецификация скелета радиус-сервера.
- •Главный процесс радиусСервер
- •Сеанс входящего звонка
- •Авторизация внешнего абонента, номера и пути
- •Сеанс звонка
- •Сеанс исходящего звонка
- •Авторизация внутреннего абонента
- •Свойства спецификации сеанса
- •Реализация скелета радиус-сервера
- •Этап4. Замена receive на if
- •Этап6. Сборка обработчика из разных кусков сопрограммы
- •class SEANCE {
- •else if (AuthPathBillingReply(ID j, bool ответ))
- •Реализация для ненадежных каналов
- •Изменившаяся часть реализации радиус-сервера
- •Процессорная спецификация языка исчисления вычислимых предикатов
- •type ID;
- •Исполнение программы
- •runRight(SECT s, RIGHT right) {
- •Исполнение параллельной композиции
05.12.12 Лекция 12
Предикатное программирование
8. Язык, технология и методы верификации других классов программ (прод.)
Класс реактивных систем (прод.)
Темпоральная логика Спецификация скелета радиус-сервера
Сеанс исходящего звонка
Свойства спецификации сеанса
Реализация скелета радиус-сервера Реализация для ненадежных каналов
Процессорная спецификация языка исчисления вычислимых предикатов
Темпоральная логика
Классическая логика (propositional logic)
–Примитивная модель истины: “черно-белая”модель, не существует степени уверенности - неуверенности, высказывания статичны, неизменны во времени
–Пример - некоммутативность конъюнкции, A&B ≠B&A :
•“Джону стало страшно и он убил” ? “Джон убил и ему стало страшно” •“Смит умер и его похоронили” ? “Смита похоронили и он умер” •“Джейн вышла замуж и родила ребенка” ?
“Джейн родила ребенка и вышла замуж”
Определение Модальной логики
–Модальность(от лат. modus – вид, способ, наклонение) –это категория, определяющая отношение высказывания к действительности (“необходимо, чтобы А”, “возможно, что А”, “когда-нибудь в будущем будет верно, что А”и т.п.)
–Модальная логика – любая формальная логическая система, в которой присутствуют модальные операторы
Примеры модальных операторов:
–М-“возможно, что” (Мр – “возможно, что р”)
–L-“необходимо, что”
(Lq – “q обязательно должно выполниться”)
–F – “когда-нибудь в будущем будет верно, что...”
–G - “всегда в будущем будет верно, что...”
–P - “когда-то в прошлом было верно, что...” Соотношения между модальностями:
Мр ≡ ¬L¬р, Lр ≡ ¬M¬р, Fр ≡ ¬G¬р, Gр ≡ ¬F¬р
Динамически порождаемые процессы
Создание и запуск нового процесса: new <имя процесса>(<параметры вызова>)
Происходит создание объекта класса, в котором находится программа данного процесса (аналогично конструктору класса). Создается новый процесс и запускается на исполнение параллельно с текущим процессом, исполняющим данную конструкцию. Результат конструкции – порожденный объект.
Радиус-сервер интернет-телефонии
Система интернет-телефонии (СИТ)
внутренние и внешние абоненты, удаленные узлы,
сеанс связи абонента и СИТ
сеанс исходящего звонка сеанс входящего звонка сеанс внешнего абонента
авторизация внутреннего абонента (номер + код), внешнего абонента (IP-адреса + пути к удаленному телефону)
радиус-сервер (РС), биллинговый сервер (БС)
СИТ РС БС
процесс = скелет + функциональное наполнение
скелет действия и структуры данных, от которых зависит выбор следующего состояния
Типовая схема взаимодействия
AuthNum() |
AuthNumBilling() |
СИТ |
РС |
БС |
AuthNumReply(bool ответ)
AuthNumBillingReply(bool ответ)
Спецификация скелета радиус-сервера.
Множество сеансов
type ID; |
// тип уникального идентификатора сеанса |
class SEANCE; { |
|
ID id; |
// идентификатора данного сеанса |
process сеансВходящегоЗвонка1(ID j); process сеансВходящегоЗвонка2(ID j); process сеансИсходящегоЗвонка(ID j);
} to be continued
interface множествоСеансов; {
создатьСеанс(ID j, SEANCE se); // в множество сеансов добавляется новый сеанс se с идентификатором j
cеанс(ID j: SEANCE se); // в множестве сеансов находится сеанс se, соответствующий идентификатору j
удалитьСеанс(ID j); |
// из множества сеансов удаляется сеанс с идентификатором j |
} |
|
Главный процесс радиусСервер
process радиусСервер()
{loop: обработкаОчередногоСообщения( : #loop) }
process обработкаОчередногоСообщения( : #loop) { receive {
AuthIncoming(ID j):
создатьСеанс(j, new сеансВходящегоЗвонка1(j)) case AuthIncomingPath(ID j):
создатьСеанс(j, new сеансВходящегоЗвонка2(j)) case AuthOutgoing(ID j):
создатьСеанс(j, new сеансИсходящегоЗвонка(j))
case |
Stop(ID j): сеанс(j) ! Stop( ) |
|
case |
AuthNum(ID j): |
сеанс(j) ! AuthNum( ) |
case AuthNumBillingReply(ID j, bool ответ): сеанс(j) ! AuthNumBillingReply (ответ)
……….. и т.д., всего 15 сообщений
}
#loop
}
Сеанс входящего звонка
process сеансВходящегоЗвонка1(ID id: #end) { |
|
|
|
авторизацияВнешнегоНомера( : #path| #stop); |
|
path: |
авторизацияПутиЗвонок( : #nextcall | #stop); |
|
nextcall: |
#stop |
|
stop: |
БС ! StopBilling(); удалитьСеанс(id) |
#end |
} |
|
|
process сеансВходящегоЗвонка2(ID id: #end) { |
|
|
|
авторизацияВнешнегоНомераПути( : #call| #stop); |
|
call: |
сеансЗвонка( : #nextcall | #stop); |
|
nextcall: |
#stop |
|
stop: |
БС ! StopBilling(); удалитьСеанс(id) |
#end |
}
Авторизация внешнего абонента, номера и пути
process авторизацияВнешнегоНомера( : #path| #stop) {
|
авторизацияВнешнего( : #yes1| #stop); |
yes1: |
авторизацияНомера( : #yes2| #no| #stop); |
yes2: |
#path |
no: |
#stop |
} |
|
process авторизацияВнешнегоНомераПути( : #call| #stop) {
|
авторизацияВнешнего( : #yes1| #stop); |
yes1: |
авторизацияНомера( : #yes2| #no| #stop); |
yes2: |
авторизацияПути( : #yes3| #no| #stop); |
yes3: |
#call |
no: |
#stop |
} |
|
process авторизацияВнешнего( : #yes| #stop) { БС ! AuthIncomingBilling();
$sAuthIncoming: receive AuthIncomingBillingReply(bool ответ); СИТ ! AuthIncomingReply(ответ);
if (Stop() ответ) #stop else #yes
}
process авторизацияНомера( : #yes| #no| #stop) { БС ! AuthNumBilling();
$sAuthNumBilling: receive AuthNumBillingReply(bool ответ); СИТ ! AuthNumReply(ответ);
if (Stop()) #stop else if (ответ) #yes else #no
}
process авторизацияПути( : #yes| #no| #stop) { БС ! AuthPathBilling();
$sAuthPathBilling: receive AuthPathBillingReply(bool ответ); СИТ ! AuthPathReply(ответ);
if (Stop()) #stop else if (ответ) #yes else #no
}