[guided]The satisfaction relation is most cleanly constructed by assigning to each formula the set of all assignments that make it true. Thus, for each formula $\varphi$, we define a subset
\begin{align*}
\llbracket \varphi\rrbracket_M\subseteq \operatorname{Ass}(M).
\end{align*}
The notation means: $s\in \llbracket \varphi\rrbracket_M$ precisely when the assignment $s$ satisfies $\varphi$ in $M$.
For equality, the formula $t_1=t_2$ should hold exactly when the two interpreted terms have the same value:
\begin{align*}
\llbracket t_1=t_2\rrbracket_M
=\{s\in \operatorname{Ass}(M):t_1^M[s]=t_2^M[s]\}.
\end{align*}
For an atomic relation formula $R(t_1,\dots,t_n)$, the tuple of interpreted term values must lie in the interpreted relation $R^M\subseteq |M|^n$:
\begin{align*}
\llbracket R(t_1,\dots,t_n)\rrbracket_M
=\{s\in \operatorname{Ass}(M):(t_1^M[s],\dots,t_n^M[s])\in R^M\}.
\end{align*}
The Boolean clauses are set-theoretic translations of the ordinary truth tables. Negation becomes complement in $\operatorname{Ass}(M)$, conjunction becomes intersection, disjunction becomes union, and implication becomes “not the antecedent or the consequent”:
\begin{align*}
\llbracket \neg\varphi\rrbracket_M
&=\operatorname{Ass}(M)\setminus \llbracket \varphi\rrbracket_M,\\
\llbracket \varphi\wedge\psi\rrbracket_M
&=\llbracket \varphi\rrbracket_M\cap \llbracket \psi\rrbracket_M,\\
\llbracket \varphi\vee\psi\rrbracket_M
&=\llbracket \varphi\rrbracket_M\cup \llbracket \psi\rrbracket_M,\\
\llbracket \varphi\to\psi\rrbracket_M
&=\bigl(\operatorname{Ass}(M)\setminus \llbracket \varphi\rrbracket_M\bigr)\cup \llbracket \psi\rrbracket_M.
\end{align*}
For quantifiers, the only new operation is changing the value of the quantified variable. The modified assignment $s[x\mapsto a]$ keeps all variable values fixed except that it sends $x$ to $a$. Therefore $\exists x\,\varphi$ holds under $s$ exactly when some possible value $a\in |M|$ for $x$ makes $\varphi$ true:
\begin{align*}
\llbracket \exists x\,\varphi\rrbracket_M
=\{s\in \operatorname{Ass}(M):\text{there exists }a\in |M|\text{ such that }s[x\mapsto a]\in \llbracket \varphi\rrbracket_M\}.
\end{align*}
Likewise, $\forall x\,\varphi$ holds under $s$ exactly when every possible value $a\in |M|$ for $x$ makes $\varphi$ true:
\begin{align*}
\llbracket \forall x\,\varphi\rrbracket_M
=\{s\in \operatorname{Ass}(M):\text{for every }a\in |M|,\ s[x\mapsto a]\in \llbracket \varphi\rrbracket_M\}.
\end{align*}
The recursion is well-founded because every formula has finite syntactic complexity, and every recursive clause refers only to immediate subformulas of smaller complexity. Hence induction on formula complexity gives a unique set $\llbracket \varphi\rrbracket_M$ for each formula $\varphi$.[/guided]