119/191
\begin{frame}[fragile,t]{Program Variables and Logical Variables}
  \vspace*{-1.25ex}
  \begin{exampleblock}{$\forestgreen{\texttt{Fac2}}$}
  \vspace*{-1.25ex}  
  \begin{lstlisting}
    y = 1;
    while (x != 0) {
      y = y * x;
      x = x - 1;
    }
  \end{lstlisting}
  \vspace*{-1.25ex}  
  \end{exampleblock}
  \pause\smallskip
  
  \mpause[1]{
  Note that $\forestgreen{\texttt{Fac2}}$ `consumes' its input:
    \begin{itemize}
      \item If $x > 0$ before execution, we have $x=0$ afterwards. 
    \end{itemize}
  }  
  \mpause{Although $\forestgreen{\texttt{Fac2}}$ computes the factorial function, we have:}
  \begin{itemize}
  \mpause{
    \item $\;{\satisfiesnotpar} \hoaretriple{x = n}{\forestgreen{\texttt{Fac2}}}{y = \fac{x}}$ \hspace*{3ex} (for $n = 2,3,\ldots$).
  }
  \mpause[?0]{
    \item
      $\malt[4]{\gray{\satisfiesparblack}}{\satisfiesnotpar} \hoaretriple{x \ge 0}{\forestgreen{\texttt{Fac2}}}{y = \fac{x}}$
  }
  \end{itemize}
  \updatepause\pause\medskip
  
  \begin{goal}{}
  Remedy: use of a \alert{logical variable} $\freevar{x_0}\,$.
  \pause
  Then we expect:
  \begin{itemize}
    \item
      $\; \satisfiespar \hoaretriple{\logand{(x \ge 0)}{\equalto{\freevar{x_0}}{x}}}
                                 {\forestgreen{\texttt{Fac2}}}
                                 {y = \fac{\freevar{x_0}}}$
  \pause
    \item
      $\; \satisfiestot \hoaretriple{\logand{(x \ge 0)}{\equalto{\freevar{x_0}}{x}}}
                                 {\forestgreen{\texttt{Fac2}}}
                                 {y = \fac{\freevar{x_0}}}$
  \end{itemize}
  \end{goal}
\end{frame}