% vim: spelllang=nl:
\subsection{Hulp bij bewijzen}
\label{sec:cleansmurf:proofs}

Omdat aan de linkerkant van Smurftransities niet alleen het programma en de
toestand, maar ook de input staat, heeft een Smurfprogramma voor iedere input
een andere afleidingsboom. Deze afleidingsbomen zijn vervolgens met
\emph{CleanSmurf} te genereren. Vaak zullen we echter uitspraken willen doen
die abstraheren van de input, zoals ``Voor iedere input $s_1:s_2:\Nil$ zal de
output $s_2:\Nil$ zijn.'' Hier kan \emph{CleanSmurf} niet mee overweg, wat het
een weinig behulpzame toepassing voor bewijshulp maakt.

Een uitbreiding op \emph{CleanSmurf} implementeert een simplistische bewijshulp
die in sommige gevallen met variabelen overweg kan. Op dit moment is het een
\emph{proof of concept}. Sommige delen zijn nog niet geïmplementeerd. Wel is
het al bruikbaar in bepaalde gevallen, zoals we in \autoref{sec:analyse} zullen
zien. De bewijshulp is te vinden in de \texttt{prover} branch van
\emph{CleanSmurf}~\cite{cleansmurf}.

De oplossing hiervoor is complex. Waar hierboven de stack werd gemodelleerd met
een lijst van strings, zal dit nu niet meer voldoende zijn: we moeten
onderscheid maken tussen \emph{literals} en \emph{bewijsvariabelen}. Voor de
duidelijkheid maken we vanaf nu onderscheid tussen variabelen (elementen op de
stack of in de variable store) en bewijsvariabelen (variabelen waar de
bewijshulp mee werkt).

Combinaties van literals en bewijsvariabelen moeten ook voor kunnen komen (bv.
literal \lit{s} geconcateneerd met variabele $t$). Bovendien kunnen
bewijsvariabelen ook in een Smurfprogramma terechtkomen, omdat Smurf geen
duidelijk onderscheid kent tussen variabelen en Smurfprogramma's (middels
$\StmExec$ kan een variabele uitgevoerd worden). Dit laatste moet de bewijshulp
ten minste deels ondersteunen: variabelen komen al snel in programma's terecht
op het moment dat iteratie gewenst is. Zolang de variabele in een
$\StmPush$-commando wordt gebruikt kan de bewijshulp er mee omgaan.

Om variabelen te modelleren definiëren we een nieuw type, \CI{Expr}:

\lstinputlisting[firstline=15,lastline=20]{CleanSmurfProver/Smurf.dcl}

Vervolgens vervangen we \CI{String} door \CI{Expr} in de definities van
\CI{Stm}, \CI{Stack} en \CI{Store}.

Dit heeft gevolgen voor de \CI{step}-functie en zijn hulpfuncties. Waar we
eerst \CI{head} op een \CI{String} toepasten, doen we dat nu op een \CI{Expr}.
Deze functie moeten we dus herschrijven naar de onderstaande code. Soortgelijke
aanpassingen moeten we maken voor andere functies.

\lstinputlisting[firstline=272,lastline=277]{CleanSmurfProver/Smurf.icl}

Op deze manier kunnen we de head van een variabele nemen. Dit wordt, volgens
het laatste alternatief, opgeslagen als \CI{EHead (Var ..)}. Er wordt in dit
geval niet gecontroleerd of die variabele niet leeg is. Het is aan de gebruiker
van de bewijshulp dit na te gaan. In het bijzonder kunnen er dingen fout gaan
voor expressies als \CI{ECat (Var "s") (Lit "xyz")}: nemen we hier de head van,
dan zal dit worden opgeslagen als \CI{EHead (Var "s")}, terwijl dit \CI{Lit
"x"} zou moeten zijn als \CI{s} leeg is. Dit zijn dingen waar uiteindelijk wel
op te controleren valt, maar nog niet volledig geïmplementeerd zijn.

Helaas werkt de oude functie om een boom te maken, \CI{tree}, niet meer na deze
veranderingen: op een gegeven moment zal \CI{step} moeten weten wat de inhoud
van een bewijsvariabele is.

Om dit op te lossen introduceren we \emph{bewijshints}. Dit zijn transities
waarvan we de bewijshulp vertellen dat hij mag aannemen dat die bestaan. De
\CI{prover}, de bewijshulp-variant van \CI{tree}, zal bomen slechts maken tot
het punt dat zo'n bewijshint gevonden wordt. Het type van \CI{prover} is
hetzelfde als dat van \CI{tree}, behalve dat een extra argument is toegevoegd
voor de bewijshints:

\lstinputlisting[firstline=72,lastline=73]{CleanSmurfProver/Smurf.dcl}

Het eerste argument is een functie die voor een argument \CI{(pgm,i,st)} een
\CI{Just (i',o,st')} oplevert dan en slechts dan als de bewijshulp mag aannemen
dat er een afleidingsboom bestaat voor de transitie
$\trans\pgm\ip\st{\ip'}\op{\st'}$. Willen we geen bewijshints meegeven, dan
kunnen we hier simpelweg \CI{(\\_ -> Nothing)} voor invullen. De oude \CI{tree}
is dus te herdefiniëren als:

\lstinputlisting[firstline=74,lastline=74]{CleanSmurfProver/Smurf.dcl}

De bewijshulp kan afleidingsbomen in \TeX{} genereren. Hiervoor wordt
\texttt{prooftree.sty}~\cite{prooftree} gebruikt. Door een probleem in dit
package, dat niet herzien is sinds 1996, kan bij grote bomen \TeX{}'s
\emph{grouping limit} worden overschreven. Dit kan verholpen worden door
LuaLaTeX te gebruiken. Alle bomen in \autoref{sec:app:trees} zijn op deze
manier gegenereerd.
