разрешимость задачи выполнимости, если предположить, что число
сообщений конечно. Кроме того, будем считать, что буферы S.out и
R.in ведут себя нормально – не «портят» и не теряют сообщения,
и сообщение не может находиться в буфере бесконечно долго. Схема
взаимодействия отправителя и получателя приведена на рис. 2.3.
Отправитель S S.out R.in Получатель R
Канал
Рис. 2.3. Взаимодействие отправителя и получателя
Формализуем следующие неформальные требования к каналу с
помощью LTL:
«Сообщение не может быть в обоих буферах одновременно»:
G (m S.out m R.in).
«Канал не теряет сообщения». Если канал не теряет сообщения, то
это означает, что сообщения, помещенные в S.out, в конечном
счете будут доставлены в R.in:
G(m S.out F(m R.in)).
Отметим, что если уникальность сообщений не подразумевается,
то этого свойства недостаточно, так как если, например, переданы
две копии m и только последняя из них получена, то такая ситуация
удовлетворяла бы этому свойству. Уникальность сообщений – это
предпосылка спецификации требований в темпоральной логике для
систем, передающих сообщения. Если предполагать
справедливость предыдущего свойства, то эквивалентно можно
записать:
G(m S.out XF(m R.in)),
так как m не может быть в S.out и R.in одновременно.
«Канал сохраняет порядок». Это означает, что если m, а затем m'
передано отправителем в его выходной буфер S.out, то m будет
принято получателем перед m':
G[m S.out m' S.out F(m' S.out)
F(m R.in m' R.in F(m' R.in))].
Отметим, что в предпосылке конъюнкт m' S.out требуется для
того, чтобы специфицировать, что m' отправлено в S.out после m.
F(m' S.out) само по себе не исключает, что m' в буфере
отправителя, когда m в S.out.
Канал не генерирует сообщения спонтанно. Это означает, что
любое m в R.in должно быть заранее послано отправителем S.
С использованием оператора предшествования F это может быть
удобно формализовано следующим образом: