  Reactive languages are dedicated to the programming of systems which interact
continuously and concurrently with their environment. Values take the form of
unbounded streams modeling the (discrete) passing of time or the sequence of
concurrent interactions. While conventional reactivity models recurrences
forward in time, we introduce a symmetric reactive construct enabling backward
recurrences. Constraints on the latter allow to make the implementation
practical. Machine Learning (ML) systems provide numerous motivations for all
of this: we demonstrate that reverse-mode automatic differentiation,
backpropagation, batch normalization, bidirectional recurrent neural networks,
training and reinforcement learning algorithms, are all naturally captured as
bidirectional reactive programs.
