\myheading{Why variables are declared using \textit{declare-fun}?} They mean this is nullary function, only returning a constant, nothing else. SMT-LIB language has no idea about variables. Can you get rid of variables? For example, in C/C++ you can use this function for $\Pi$ constant instead of accessing a constant variable or using preprocessor macro: \begin{lstlisting} double PI () { return 3.1415926; }; \end{lstlisting} In SMT-LIB world, you don't declare variables, you declare argumentless functions that value is either fixed: \begin{lstlisting} ... (declare-fun const1 () (_ BitVec 32)) (assert (= const1 (_ bv214013 32))) ... \end{lstlisting} ... or it's \textit{connected} to another expression/function's value/etc. This is why variables are declared using \TT{declare-fun} directive. (However, Z3 support \TT{declare-const} directive, which is merely a syntactic sugar.) One can go further: there are programming languages with no variables, but they are not very practical for our mundane endeavours: \url{https://en.wikipedia.org/wiki/Lambda_calculus}. (And to extreme minimalism: \url{https://en.wikipedia.org/wiki/Iota_and_Jot}, \url{https://en.wikipedia.org/wiki/Unlambda}.) LISP has borrowed from some features of lambda calculus, while SMT-LIB language is a very simplified LISP.