Given a goal predicate ($\textsc{State}\to\textsc{Bool}$) as first argument, the step function becomes a state transformer as required by Gast ($\textsc{State}\times\textsc{Action}\to\textsc{State}\times\textsc{Bool}$) (line 2).
Given a goal predicate ($\textsc{State}\to\textsc{Bool}$) as first argument, the step function becomes a state transformer as required by Gast ($\textsc{State}\times\textsc{Action}\to\textsc{State}\times\textsc{Bool}$) (\cref{ex:stepFunction:type}).
For technical reasons the step function actually returns a list of states with a list of outputs, but we use it with singleton results, so it should be seen as returning $\textsc{State}\times\textsc{Bool}$.
The output is a Boolean that indicates whether the returned state satisfies the goal predicate.
The arguments of actions are translated to constructor arguments for the \textsc{Action} data type (line 1).
The guard expressions are translated to guards (lines 4 and 5).
The effect statements are translated to record updates (line 9).
The arguments of actions are translated to constructor arguments for the \textsc{Action} data type (\cref{ex:stepFunction:action}).
The guard expressions are translated to guards (\cref{ex:stepFunction:guard1,ex:stepFunction:guard2}).
The effect statements are translated to record updates (\cref{ex:stepFunction:recordUpdate}).
The synthesizer uses the step function as model for Gast.
As IUT it uses a dummy that always outputs $\false$ (line 13).
As IUT it uses a dummy that always outputs $\false$ (\cref{ex:stepFunction:iut}).