You could use gather*
and the first four lines in a nested align*
, but the result would not be pretty.
You can make the last row to be half before the arrow and half after it.
In the code, \tv
stands for “textual variable”. Using a semantic command will allow to change the typographical realization of all these objects in one swoop by modifying just the definition.
\documentclass{article}
\usepackage{amsmath}
\newcommand{\tv}[1]{\mathit{#1}}
\begin{document}
\begin{align*}
\tv{countingUp} \wedge \tv{counter} < 100
&\to [\tv{counter} \leftarrow \tv{counter} + 1] \\
\neg \tv{countingUp} \wedge \tv{counter} > 0
&\to [\tv{counter} \leftarrow \tv{counter} - 1] \\
\tv{counter} = 100
&\to \neg \tv{countingUp} \\
\tv{counter} = 0
&\to \tv{countingUp} \\
&\makebox[0.5\width][r]{$\hphantom{\to{}}0 \leq counter \leq 100$}
\end{align*}
\end{document}
I'd consider left alignment, though.
\begin{align*}
& \tv{countingUp} \wedge \tv{counter} < 100 \to [\tv{counter} \leftarrow \tv{counter} + 1] \\
& \neg \tv{countingUp} \wedge \tv{counter} > 0 \to [\tv{counter} \leftarrow \tv{counter} - 1] \\
& \tv{counter} = 100 \to \neg \tv{countingUp} \\
& \tv{counter} = 0 \to \tv{countingUp} \\
& 0 \leq counter \leq 100
\end{align*}