% vim: spelllang=nl: \subsection{Bewijs} \label{sec:analyse:proof} We zullen het buitenste programma als beschreven op~\pageref{pgm:reverse} met $P_1$ aanduiden, en het recursieve binnenste programma met $P_2$. Nu laten we zien dat deze code daadwerkelijk alle mogelijke strings omdraait, oftewel: er is een afleidingsboom voor $$ \trans {P_1}{[s:\Nil]}{(\Nil,\emptystore)} {\Nil}{[s^R:\Nil]}{\emptystore} $$ voor alle $s\in\String$, met \begin{align*} \lambda^R &= \lambda, \\ (c~s)^R &= s^R c. \end{align*} Het bewijs gaat in twee stappen. Eerst bewijzen we dat $P_2$ de eerste string op de stack achter de omgedraaide versie van de tweede string op de stack plaatst, en dat output. Dit wordt bewezen in \autoref{thm:p2}. Hiermee kunnen we van $P_1$ bewijzen dat het de eerste string op de stack omgedraaid output. Dit doen we in \autoref{thm:p1}. \begin{thm} { Voor alle $s,t\in\String$ met $t\ne\lambda$ hebben we een afleidingsboom voor \normalfont \belowdisplayskip=-1em $$ \trans {P_2}{[s:t:\Nil]}{(\Nil,\emptystore)} {\Nil}{[t^R~s:\Nil]}{\emptystore}. $$ } \label{thm:p2} \begin{proof}[Bewijs] Met inductie naar de lengte van $t$. Inductiebasis: stel $t=c$, met $c$ een willekeurig karakter. In dit geval krijgen we de boom in \autoref{fig:tree:bootstrap-base}. Hier is $c$ geen variabele maar het werkelijke karakter \lit{c}. We kunnen \emph{CleanSmurf} namelijk helaas nog niet vertellen dat een bepaalde variabele lengte $1$ heeft. Uit de afleidingsboom blijkt dat $c$ niet gebruikt wordt als naam in de variable store, waardoor we ons geen zorgen hoeven te maken over situaties waar $c$ gelijk is aan \'e\'en van de variabelenamen die we gebruiken. Uit de boom in \autoref{fig:tree:bootstrap-base} volgt dus dat bovenstaande stelling geldt voor $t$ van lengte $1$. \medskip Inductiestap: we nemen aan dat we een afleidingsboom hebben voor \begin{equation}\tag{IH}\label{eq:p2:ih} \trans {P_2}{[s:t:\Nil]}{(\Nil,\emptystore)} {\Nil}{[t^R:s:\Nil]}{\emptystore} \end{equation} Vervolgens laten we zien dat we voor elke $c\in\Char$ ook een afleidingsboom hebben voor $$ \trans {P_2}{[s:c~t:\Nil]}{(\Nil,\emptystore)} {\Nil}{[t^R~c~s:\Nil]}{\emptystore}. $$ Ook hiervoor kunnen we \emph{CleanSmurf} gebruiken. Geven we~\eqref{eq:p2:ih} mee als aanname, dan krijgen we de boom in~\autoref{fig:tree:bootstrap-step}. Net zoals bij de inductiebasis moeten we $c$ als letterlijk \lit{c} meegeven. Eenzelfde inspectie van de boom wijst uit dat dit geen problemen oplevert met andere waarden voor $c$. \medskip Uit het principe van inductie naar de structuur van de string $t$ volgt nu voor alle $s,t\in\String$ met $t\ne\lambda$ dat we een afleidingsboom hebben voor $$ \trans {P_2}{[s:t:\Nil]}{(\Nil,\emptystore)} {\Nil}{[t^R~s:\Nil]}{\emptystore}. $$ \end{proof} \end{thm} \begin{thm} { Voor alle $s\in\String$ hebben we een afleidingsboom voor \normalfont \belowdisplayskip=-1em $$ \trans {P_1}{[s:\Nil]}{(\Nil,\emptystore)} {\Nil}{[s^R:\Nil]}{\emptystore}. $$ } \label{thm:p1} \begin{proof}[Bewijs] We maken een gevalsonderscheiding over de structuur van $s$. \begin{enumerate}[label={Geval \arabic*.},itemindent=1.5\parindent] \item Stel $s=\lambda$. In dit geval hebben we geen enkele variabele. We kunnen dus simpelweg een boom maken. Dit geeft de boom in \autoref{fig:tree:lambda}, waaruit blijkt dat de stelling inderdaad geldt voor $s=\lambda$: $$ \trans {P_1}{[\lambda:\Nil]}{(\Nil,\emptystore)} {\Nil}{[\lambda:\Nil]}{\emptystore}. $$ \item Stel $s=c~t$. In dit geval gaat $P_1$ het recursieve binnenste programma gebruiken. We maken dus een boom die het resultaat van \autoref{thm:p2} als aanname mag gebruiken. Dit geeft de afleidingsboom in \autoref{fig:tree:bootstrap}, waaruit blijkt dat de bovenstaande stelling geldt voor alle $s\ne\lambda$. \end{enumerate} \end{proof} \end{thm}