Операторы темпоральной логики
Операторы темпоральной логики — это механизмы, которые задают момент, когда конечный автомат должен выполнять определенные операторы языка Julia и задаются на переходах до/внутри условий и в состояниях:
Где используются |
Пример |
На переходах, внутри условий, а также внутри действий, указанных в квадратных скобках |
|
Внутри состояний вместе с группой операторов on или внутри кода Julia |
Например, с помощью операторов темпоральной логики и группы операторов on
можно изменять значения переменных во времени:
Здесь:
-
en, du: y = x
— при входе в состояние A и пока оно активно, переменнойy
присваивается значениеx
. Это действие выполняется сразу и повторяется, пока состояние активно. -
on after(2.5, sec): y = 0
— если состояние A активно2.5
или более секунд, тоy
становится равным0
. -
on after(5, sec): y = -1
— если состояние A активно5
или более секунд, тоy
становится равным-1
.
В Engee доступны следующие операторы темпоральной логики:
-
after — срабатывает после заданного количества действий или времени. Например,
after(5, sec)
активирует переход через5
секунд после начала текущего состояния; -
at — срабатывает на конкретном шаге. Например,
at(10, tick)
будет истинно на шаге, когда у ассоциированного состояния группа операторовduring
будет выполняться в десятый раз (начиная счет с единицы); -
before — остается истинным до достижения определенного момента времени или количества тактов машины состояний. Например,
before(3, sec)
срабатывает, пока не прошло3
секунды с момента активации ассоциированного состояния; -
count — подсчитывает, сколько раз блок состояния выполнялся с момента, когда логическое выражение в параметре стало истинным. Например, команда
on at(10, tick): y = count(true)
присвоит переменнойy
значение10
, если состояние будет активно в течение10
шагов машины состояний.; -
duration — является аналогом оператора
count
, но вместо количества шагов возвращает время, в течение которого указанное логическое выражение остается истинным. Например, командаon after(10, sec): y = duration(true, sec)
будет присваивать переменнойy
значения, которые становятся больше10
, если состояние останется активным спустя10
секунд после активации; -
elapsed, et — возвращает время, прошедшее с момента входа в текущее состояние. Например,
et >= 2
будет истинным, если состояние активно в течение двух или более секунд; -
every — срабатывает через заданное количество шагов машины состояний, пока ассоциированное состояние остается активным. Например, если ассоциированное состояние будет активно
10
шагов, тоon every(3, tick): y += 1
трижды последовательно увеличит переменнуюy
на единицу. -
t, getSimulationTime — возвращает текущее время симуляции. Например,
t >= 10
будет истинным, если время симуляции достигло10
секунд; -
temporalCount — это счетчик, который помогает отслеживать, сколько шагов выполнила машина состояний или сколько времени прошло, пока состояние оставалось активным. Например, вызов
temporalCount(tick)
покажет, сколько шагов машина состояний находилась в этом состоянии. А использованиеtemporalCount(sec)
вернет, сколько секунд прошло с момента активации этого состояния.
after
after — оператор, который реализует темпоральную логику на переходах. Он имеет два варианта вызова:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает |
Выход из текущего состояния, когда блок активируется не менее трех раз с тех пор, как состояние стало активным, при условии, что |
|
Возвращает |
Для лучшего понимания приводимых примеров рассмотрим:
Eсли значение переменной |
at
at — оператор, который проверяет, произошло ли действие в определенный момент времени. Он имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает |
Для лучшего понимания приводимых примеров рассмотрим:
Если во время выполнения 4-го такта с момента активации ассоциированного состояния значение переменной |
before
before — оператор, который проверяет, произошло ли действие до указанного момента времени. Он имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает |
Переход происходит, если прошло меньше 3 секунд с момента активации состояния, при условии, что |
|
Возвращает |
Для лучшего понимания приводимых примеров рассмотрим:
Переход происходит, если прошло меньше |
count
count — оператор, которая подсчитывает количество выполнений ассоциированного блока состояния с момента, когда переданное логическое выражение стало истинным. Оператор сount имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает количество тактов машины состояний, прошедших с тех пор, как выражение |
Переход происходит, если значение переменной |
duration
duration — оператор, который проверяет, сколько времени остается истинным определенное условие. Оператор duration имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает количество единиц времени, прошедшего с момента, когда |
Переход происходит, если прошло более |
elapsed, et
elapsed (et) — оператор, который отслеживает, сколько времени прошло с момента активации состояния. Оператор elapsed имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
или
|
Возвращает количество единиц времени, прошедших с момента, когда ассоциированное состояние стало активным. |
Переход происходит, если прошло 3 или более секунды с момента активации состояния. |
every
every — оператор, который помогает выполнять действия с заданной периодичностью. Он имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает |
Для лучшего понимания приводимых примеров рассмотрим:
Если каждый четвертый такт с момента активации ассоциированного состояния значение переменной |
t, getSimulationTime
t (getSimulationTime) — оператор, который отслеживает текущее время симуляции. Он имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
или
|
Возвращает время в секундах, прошедшее с начала симуляции. |
Переход происходит, если текущее время симуляции достигло 5 секунд или больше. |
temporalCount
temporalCount — оператор, который подсчитывает количество тактов или время, прошедшее с момента активации ассоциированного состояния. Оператор temporalCount имеет следующий синтаксис:
Синтаксис | Описание | Пример |
---|---|---|
|
Возвращает количество тактов машины состояний, прошедших с момента активации ассоциированного состояния. |
|
|
Возвращает количество заданных единиц времени, прошедших с момента активации ассоциированного состояния. |
Возвращает время, прошедшее с момента активации ассоциированного состояния, в миллисекундах. |