Enum snowcap::hard_policies::LTLModal [−][src]
Temporal modal operators of LTL. For reconfiguration purpose, in the last state, we assume that nothing changes anymore, and every propositional variable does not change its state. See here
As an example, let $\phi_1$ be the policy that needs to be satisfied initially, and $\phi_2$ the policy that needs to be satisfied at the end. Additionally, we would like that we switch once from $\phi_1$ to $\phi_2$. This would be the following expression:
$$\phi_1\ \mathbf{U}\ \mathbf{G}\ \phi_2$$
Variants
Now(Box<dyn LTLOperator>)
$\phi$: $\phi$ holds at the current state.
Next(Box<dyn LTLOperator>)
$\mathbf{X}\ \phi$: $\phi$ holds at the next state. If the sequence is finished, then $\mathbf{X} \phi \iff \phi$ is identical to stating that $\phi$ holds now.
Finally(Box<dyn LTLOperator>)
$\mathbf{F}\ \phi$: $\phi$ needs to hold eventually (once)
Globally(Box<dyn LTLOperator>)
$\mathbf{G}\ \phi$: $\phi$ needs to hold in the current and every future state
Until(Box<dyn LTLOperator>, Box<dyn LTLOperator>)
$\psi\ \mathbf{U}\ \phi$: $\psi$ has to hold at least until (but not including the state where) $\phi$ becomes true. $\phi$ can hold at the current or a future position (once). Until then, $psi$ must be true. $\phi$ must hold eventually!
Release(Box<dyn LTLOperator>, Box<dyn LTLOperator>)
$\psi\ \mathbf{R}\ \phi$: $\phi$ has to hold until and including the point where $\psi$ first holds. If $\psi$ never holds, then $\phi$ must hold forever.
WeakUntil(Box<dyn LTLOperator>, Box<dyn LTLOperator>)
$\psi\ \mathbf{W}\ \phi$: $\psi$ has to hold at least at least util (but not including the state where) $\phi$ becomes true. If $\phi$ never holds, $\psi$ must hold forever.
StrongRelease(Box<dyn LTLOperator>, Box<dyn LTLOperator>)
$\psi\ \mathbf{M}\ \phi$: $\phi$ has to hold until and including the point where $\psi$ first holds. $\psi$ can hold now or at any future state, but $\psi$ must hold eventually!
Trait Implementations
impl Clone for LTLModal
[src]
impl Debug for LTLModal
[src]
impl LTLOperator for LTLModal
[src]
fn check(&self, history: &[Vec<bool>]) -> bool
[src]
fn partial(&self, history: &[Vec<bool>]) -> LTLResult
[src]
fn watch(&self, history: &[Vec<bool>]) -> Vec<usize>
[src]
Generate the watch of the operator at the current state. All operations and their behavior is explained:
-
Now: Simply generate the watch of the current history
-
Next: Generate the watch of the next step. if there exists no next step, then generate the watch of the current state.
-
Finally: Tis is anaolg to the Or boolean operation for computing the watch
-
Globally: This is analog to the And boolean operation for computing the watch.
-
Unitl($psi$, $phi$): If the expression is True, then create the union of all ways in which this expression can become false:
- Watch $psi$ at every state before (not including where) $phi$ first holds.
- Watch $phi$ at every point where $phi$ holds, while (but not including where) $psi$ is true
If the expression is false, try all possible ways in which it can turn true. For this, we need to iterate over all possible cases how it might become true. This means, iterating over every position and trying to make it true. Since we build the union of this, this is the same as building the union over all watches of $psi$ and $phi$, where $psi$ or $phi$ are false.
-
Release($psi$, $phi$): If the expression is True, then create the union of all ways in which this expression can become false:
- Watch $phi$ at every state before (and including where) $psi$ first holds.
- If $phi$ does not hold forever, watch $psi$ at every point where $psi$ holds, while (and including where) $phi$ is true
If the expression is false, try all possible ways in which it can turn true. For this, we need to iterate over all possible cases how it might become true. This means, iterating over every position and trying to make it true. Since we build the union of this, this is the same as building the union over all watches of $psi$ and $phi$, where $psi$ or $phi$ are false.
-
WeakUntil($psi$, $phi$): Here, we do exactly the same as for Until.
-
StrongRelease($psi$, $phi$): Here, we do exactly the same as for Release.
fn watch_partial(&self, history: &[Vec<bool>]) -> Vec<usize>
[src]
Here, we do the exact samething as for watch
. However, if the result is undefined, then
return an empty watch list.
fn repr(&self) -> String
[src]
Auto Trait Implementations
impl RefUnwindSafe for LTLModal
[src]
impl Send for LTLModal
[src]
impl !Sync for LTLModal
[src]
impl Unpin for LTLModal
[src]
impl UnwindSafe for LTLModal
[src]
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
[src]
V: MultiLane<T>,