\subsubsection{Properties of expression semantics}
Since we have recursive definitions for the semantics and syntax, we can use structural induction.

\begin{recall}[]{Structural Induction}
    For the data structure \texttt{Nat}, given by
    \mint{haskell}+data Nat = Zero | Succ Nat+
    the structural induction derivation rule is given by
    \[
        \begin{prooftree}
            \hypo{\Gamma \vdash P(\texttt{Zero})}
            \hypo{\Gamma, P(m) \vdash P(\texttt{Succ}\; m)}
            \infer2[$m$ not free in $\Gamma$]{\Gamma \vdash \forall n \in \texttt{Nat}. P(n)}
        \end{prooftree}
    \]
    Where we now write $P(m)$ instead of $P[n \mapsto m]$ and the second premise needs to be proven for all $m$
\end{recall}


\paragraph{Inductive Definitions}
If we are to introduce a new arithmetic expression $-e$, we could do this in two ways.
For one, we could define $\cA\llbracket -e \rrbracket \sigma = 0 - \cA\llbracket e \rrbracket \sigma$. This \textit{is} an inductive definition because $e$ is a subterm of $-e$.

If on the other hand we define $\cA\llbracket -e \rrbracket \sigma = \cA\llbracket 0 - e \rrbracket \sigma$,
it is \textit{not} an inductive definition because $0 - e$ is \textit{not} a subterm of $-e$


\paragraph{Free Variables}
For Arithmetic Expressions
\begin{align*}
    FV(e_1 \; \texttt{op} \; e_2) & = FV(e_1) \cup FV(e_2) \\
    FV(n)                         & = \varnothing          \\
    FV(x)                         & = \{ x \}
\end{align*}

For Boolean Expressions
\begin{align*}
    FV(b_1 \; \texttt{op} \; b_2)  & = FV(b_1) \cup FV(b_2) \\
    FV(\texttt{not}\; b)           & = FV(b)                \\
    FV(b_1 \; \texttt{or} \; b_2)  & = FV(b_1) \cup FV(b_2) \\
    FV(b_1 \; \texttt{and} \; b_2) & = FV(b_1) \cup FV(b_2)
\end{align*}

And finally for Statements:
\begin{align*}
    FV(\texttt{skip})                                                                  & = \varnothing                     \\
    FV(x := e)                                                                         & = \{ x \} \cup FV(s_2)            \\
    FV(s_1; s_2)                                                                       & = FV(s_1) \cup FV(s_2)            \\
    FV(\texttt{if}\; b\; \texttt{then} \; s_1 \; \texttt{else} \; s_2 \; \texttt{end}) & = FV(b) \cup FV(s_1) \cup FV(s_2) \\
    FV(\texttt{while}\; b\; \texttt{do} \; s \; \texttt{end})                          & = FV(b) \cup FV(s)
\end{align*}


\paragraph{Substitution}
{\scriptsize We have already seen this kind of expression in the states, with this explanation it should make a lot more sense intuitively.}

A substitution $f[x \mapsto e]$ replaces each free occurrence of variable $x$ in $f$ by $e$, where $f$ is any expression.

Detailed rules for arithmetic expressions (for the last, if variable $y$ is $x$, it is replaced, otherwise not):
\begin{align*}
    (e_1 \; \texttt{op} \; e_2)[x \mapsto e] & \equiv (e_1[x \mapsto e] \; \texttt{op} \; e_2[x \mapsto e]) \\
    n[x \mapsto e]                           & \equiv n                                                     \\
    y[x \mapsto e]                           & \equiv \begin{cases}
                                                          e & \text{if } x \equiv y \\
                                                          y & \text{otherwise}
                                                      \end{cases}
\end{align*}

The same for boolean expressions:
\begin{align*}
    (e_1 \; \texttt{op} \; e_2)[x \mapsto e]  & \equiv (e_1[x \mapsto e] \; \texttt{op} \; e_2[x \mapsto e])  \\
    (\texttt{not} \; b)[x \mapsto e]          & \equiv \texttt{not} \; (b[x \mapsto e])                       \\
    (b_1 \; \texttt{or} \; b_2)[x \mapsto e]  & \equiv (b_1[x \mapsto e] \; \texttt{or} \; b_2[x \mapsto e])  \\
    (b_1 \; \texttt{and} \; b_2)[x \mapsto e] & \equiv (b_1[x \mapsto e] \; \texttt{and} \; b_2[x \mapsto e])
\end{align*}

\begin{lemma}[]{Substitution Lemma}
    \[
        \cB\llbracket b[x \mapsto e] \rrbracket \Leftrightarrow \cB\llbracket b \rrbracket (\sigma[x \mapsto \cA\llbracket e \rrbracket \sigma])
    \]
\end{lemma}
