History Types¶
In order to improve the expressivity of Kind 2’s specification language,
the tool provides a built-in type constructor that allows users to
refer to an unbounded number of previous values of a stream.
Specifically, the unary type constructor history(x), that
takes a stream x of arbitrary type T as its single argument,
represents the set of all streams z of values of type T such that
at any time t >= 0, there exists a k in the interval [0, t] such that
z(t) = x(k).
For instance, given a node with an input stream x and an output
stream y, both with the same type, the property the current value of stream y
equals the current value or a previous value of a stream x plus one
can’t be expressed in Lustre. However, using the type constructor
history, one can easily express the property as
exists (z: history(x)) y=z+1.
Notice that history(x) denotes a refinement type,
suggesting its applicability wherever a type is expected in the model.
However, at present, the implementation restricts the use of the
type constructor history to the type of a quantified variable.
We plan to lift this restriction in future versions of Kind 2.