Академический Документы
Профессиональный Документы
Культура Документы
Требования и процессы
Параллельные процессы:
1. Вращение дверей
2. Датчик приближения пользователя(2)
3. Датчик внутри каждой секции(3)
4. Датчик касания на перегородки(3)
5. Контроллер
6. Пользователь
События-состояния процессов
● Вращение дверей - engine_on, engine_off
● Пользователь - user_present, user_absent, user_touching
● Датчик приближения пользователя - detected_user, not_detecting,
user_present, user_absent
● Датчик внутри каждой секции - detected_user, not_detecting, user_present,
user_absent
● Датчик касания на перегородки - detected_touching, not_detecting,
user_touching
● Контроллер- почти половина от всего выше перечисленного
Структуры Крипке процессов
Требования в LTL
Требования к функционированию системы:
1. При приближении пользователя, двери начинают вращаться
G(user_detected(proximity sensor)→ F (engine_on) )
2. Вращение останавливается, если пользователь покидает пространство
G(not_detecting(proximity sensor) → F (engine_off U user_detected(proximity
sensor) ))
3. Вращение приостанавливается на некоторое время, когда пользователь
оказывает давление на секционные перегородки
G(user_touching → F ((engine off) ∧ F (engine_on)) )
CSP-процессы
Датчик приближения:
● αProximitySensor= { detected_user, not_detecting, user_present,
user_absent}.
● ProximitySensor=not_detecting → ProximitySensorMain
● ProximitySensorMain = not_detecting→ ProximitySensorMain |
not_detecting→ user_present→ detected_user→user_absent→
ProximitySensor
Датчик присутствия:
● αPresenceSensor= { detected_user, not_detecting, user_present,
user_absent}.
● PresenceSensor=not_detecting → PresenceSensorMain
● PresenceSensorMain = not_detecting→ PresenceSensorMain |
not_detecting→ user_present→ detected_user→user_absent→
PresenceSensor
Датчик прикосновения:
● αTouchSensor= { not_detecting, user_touching, detected_touching}.
● TouchSensor=not_detecting → TouchMain
● TouchMain = not_detecting→ TouchMain |
not_detecting→ user_touching→ detected_touching → TouchSensor
Двигатель:
● αEngine= { engine_on, engine_off }.
● Engine= engine_on → engine_off→ Engine
Контроллер:
● αCont= {wait, detected_touching, engine_off, engine_on,
detected_user(ProxS), not_detecting(ProxS), not_detecting(PresS),
detected_user(PresS) }.
● Cont= wait → detected_user(ProxS) → engine_on → ContChoice |
wait → detected_user(PresS) → engine_on → ContChoice
● ContChoice = not_detecting(ProxS) → engine_off→ wait → Cont |
not_detecting(PresS) → engine_off→ wait → Cont |
detected_touching → engine_off→ wait → Cont
Пользователь:
Трейсы процессов
Формализуйте 3 вида трейсов Контроллера длины 10
● t1 = <wait, detected_user(ProxS), engine_on, detected_touching, engine_off, wait,
detected_user(PresS), engine_on, not_detecting(PresS), wait>
● t2 = <wait, detected_user(ProxS), engine_on, not_detecting(PresS), engine_off,
wait, detected_user(ProxS), engine_on, not_detecting(PresS), wait>
● t3 = <wait, detected_user(ProxS), engine_on, detected_touching, engine_off, wait,
detected_user(PresS), engine_on, detected_touching, wait>
Двигатель:
● αEngine= { engine_on, engine_off }.
● Engine= engine_on → engine_off→ Engine
Контроллер:
Д-во:
То есть никто не может сесть, пока философ не возьмет две вилки.
Предположим, что у нас есть философ A, который пока голодает. Почему он не
сможет голодать вечно в такой системе. Предположим, что он будет голодать
все время, но соседи(то есть либо левый, либо правый), не может вечно есть,
значит левый или правый сосед уйдет и тогда, чтобы наш философ продолжил
голодать, то новый пришедший сосед должен взять вилку раньше, чем наш. Но
это невозможно, потому что FOOTMAN не будет провожать соседа, пока наш
философ не возьмет вилку. То есть, что мы предположили, было неверно.
Deadlock - быть не может, ибо FOOTMAN ограничивает философов - 4-мя.
P.S.: Проблема моей реализации, что в ней ограничения больше, чем надо. То
есть можно было сделать ограничение только на то, что нельзя садиться
соседним философам, а не всем. Но я пока не смог придумать, как это
реализовать.
Specifications. Nondeterminism.
Communication.
TouchSensor=not_detecting → TouchMain
TouchMain = not_detecting→ TouchMain |
not_detecting→ TouchChannel ? user_touching → detected_touching
→ TouchSensor
Subordination
Задать CSP-спецификацию параллельного взаимодействия
с подчинением для пары процессов системы.
Я взял процессы Двигатель и Контроллер(Двигатель подчиняется Контроллеру):
αCont ⊆ αEngine
Двигатель:
Контроллер:
Тут по сути Контроллер отправляет текущее состояние двигателя в левый
канал, а на правый получает новое состояние двигателя и продолжает работу,
или нет, если что-то не то.
m: Engine // Cont
Sharing by interleaving
Multiple resources.
Найти процессы системы, которые могут быть
множественными ресурсами, которые разделяют другие
процессы системы. Записать соответствующую
модификацию этих процессов и всей системы.
Вращающаяся дверь:
RevolvingDoor = ProximitySensor || PresenceSensor || TouchSensor || Engine ||
Cont
Вращающиеся двери:
RevolvingDoors = ||(i<B) i:RevolvingDoor
Датчик приближения:
● αProximitySensor= { detected_user, not_detecting, user_present,
user_absent}.
● ProximitySensor=not_detecting → ProximitySensorMain
● ProximitySensorMain = not_detecting→ ProximitySensorMain |
not_detecting → user_present→ □(i<B) RevolvingDoor.i.detected_user
→prox.right ! i. → user_absent→ ProximitySensor
Датчик присутствия:
● αPresenceSensor= { detected_user, not_detecting, user_present,
user_absent}.
● PresenceSensor=not_detecting → PresenceSensorMain
● PresenceSensorMain = not_detecting→ PresenceSensorMain |
not_detecting→ user_present→ □(i<B) RevolvingDoor.i.detected_user
→press.right ! i. →user_absent→ PresenceSensor
Датчик прикосновения:
● αTouchSensor= { not_detecting, user_touching, detected_touching}.
● TouchSensor=not_detecting → TouchMain
● TouchMain = not_detecting→ TouchMain |
not_detecting→ user_touching→ □(i<B)
RevolvingDoor.i.detected_touching →touch.right ! i.→ TouchSensor
Двигатель:
● αEngine= { engine_on, engine_off }.
● Engine= engine_on → engine_off→ Engine
Контроллер:
● αCont= {wait, detected_touching, engine_off, engine_on,
detected_user(ProxS), not_detecting(ProxS), not_detecting(PresS),
detected_user(PresS) }.
● Cont(i)= wait → detected_user(ProxS) → engine_on → ContChoice(i) |
wait → detected_user(PresS) → engine_on → ContChoice(i)
● ContChoice(i) = not_detecting(ProxS) → engine_off→ wait → Cont (i) |
not_detecting(PresS) → engine_off→ wait → Cont (i) |
detected_touching → engine_off→ wait → Cont(i)
Пользователь:
User(i) = user_absent → User_main(i)
User_main(i) = user_absent → User_main ⊓ user_absent → user_present →
prox.right ? i → User_main ⊓ user_absent → user_present → prox.right ? i
→pres.right ? i → User_main ⊓ user_absent → user_present → press.right ?
i → user_touching → touch.right ? i → User(i)