\item \self Use lazy encoding to check if the following formula from $\mathcal{T}_{EUF}$ is satisfiable. Perform DPLL to obtain a \textbf{full assignment} for the equalities which you can then check with the \textbf{Congruence-Closure} algorithm. If you find a theory conflict, obtain a \textbf{blocking clause} from the Congruence-Closure algorithm, restart the DPLL algorithm at decision level $0$ with the new blocking clause added. For simplicity, do not use conflict-driven clause learning. I.e., the only clauses you are supposed to add are blocking clauses coming from Congruence Closure.

In each step of the DPLL algorithm, first try to perform Boolean Constraint Propagation (BCP), if applicable, then try to set Pure Literals (if applicable). If neither BCP nor Pure Literals are applicable, make a decision. \textbf{When backtracking, always undo exactly one decision}. (Note that undoing one decision implies undoing all BCP- and Pure-Literal-based assignments that were done because of this decision.)

  \textbf{Important:} 
  \begin{itemize}
    \item 
      Always assign \emph{false} to the literal first, and \emph{true} second.
    \item 
      If you have to make a decision in DPLL, use the following order of literals to select a 
      theory literal to assign a truth value to.
        \begin{enumerate}
          \item x = y
          \item x = z
          \item y = z
          \item f(x) = f(y) 
        \end{enumerate}
  \end{itemize}
  
  Formula to check:
  \begin{align*}
    \mathcal{T}_{EUF} :=    & (x = y \lor f(x) = f(y))        ~\land \\
                            & (x = y \lor f(x) \neq f(y))     ~\land \\
                            & (x \neq y \lor  y = z)          ~\land \\
                            & (x \neq z \lor y \neq z)  
  \end{align*}