Als we de analyse op een compleet programma toepassen komt er een \textit{Piet}
programma uit dat behoorlijk fors is maar netjes zijn werk doet. Dit programma
berekent de faculteit van $x$ en stopt dat uiteindelijk in $y$.
-\begin{lstlisting}[
- mathescape=true,
- basicstyle=\scriptsize,
- keepspaces=true,
- columns=flexible,
- numbers=left,
- numbersep=2pt,
- title=Faculteit in \textit{While},
- ]
+\begin{lstlisting}[title=Faculteit in \textit{While}]
x:=5;
y:=1;
while $\neg$(x=1)
do (
- y:=y*x;
- x:=x-1
+ y:=y*x;
+ x:=x-1
)
\end{lstlisting}
-In piet ziet dit er als volgt uit...
+In \textit{Piet} ziet dit er als volgt uit...
+\begin{lstlisting}[title=Faculteit in \textit{Piet'}]
+push 5 // x is vanaf nu variabele 1
+push 1 // y is vanaf nu variabele 2
+
+MARKERING A:
+Un(1) // variabele x wordt klaargezet
+push 1 // de waarde 1 wordt klaargezet
+sub // subtractie om straks gelijkheid te kunnen bepalen
+push 1 // de waarde 1 word gepushed om 0 te maken
+dup // de waarde 1 staat er nu twee keer op
+sub // 0 staat op de stack om groterdan relatie te bepalen
+push 2 // klaarmaken om de bovenste twee te swappen
+push 1 // idem
+roll // swappen
+gre // als x>0 dan ligt 1 op de stack anders 0
+not // als x=0 dan ligt 1 op de stack anders 0
+pointer // als x=0 dan draait de DP niet en gaat het programma naar pad A
+ // als x$\neq$ dan draait de DP en gaat het programma naar pad B
+
+PAD A:
+skip //een oneindig aantal witte blokken, y is nu x!
+
+PAD B:
+Bin(1, 2) // x en y worden klaargezet om y opnieuw te assignen
+mul // x*y ligt boven op de stack
+Ass(2) // x*y wordt geassigned aan y
+Un(1) // x wordt klaargezet
+push 1 // 1 wordt klaargezet
+sub // x-1 ligt op de stack
+Ass(1) // x-1 wordt geassigned aan x
+ // nu gaat het programma weer via een wit pad naar markering A
+
+\end{lstlisting}