Fluents and LTL properties
With the fluent
keyword we can define a set of transitions that if taken will make the fluent be True
(if the transition was in the left set) or False
(for transitions in the second set) as shown below.
assert
can be conjunction and disjunction of fluents
with the &&
and ||
operators respectively.
ltl_property
can have temporal operators as well, []
indicates that the following must always hold, and <>
eventually.
The liveness
keyword in controllerSpec takes one
assertion L
and will make it so the built controller ensures []<>L
.
The assumption
keyword can be used in the same way as liveness
, and the controller will guarantee that []<>A -> []<>L
Example of a controllable case, using DCS as algorithm:
Example = A0,
A0 = (a -> A1),
A1 = (c_1 -> Up | u_1 -> Down),
Up = (u_2 -> Up),
Down = (u_3 -> Down).
fluent UpF = <u_2, {a, u_3}>
fluent DownF = <u_3, {a, u_2}>
assert idealDirection = DownF
||Plant = Example.
controllerSpec Goal = {
liveness = {idealDirection}
controllable = {c_1}
}
heuristic ||DirectedController = Plant~{Goal}.