2bb549180d05c3a5378dd54fdd57969ab6210663
[sec1415.git] / an_faculteit.tex
1 \subsection{Faculteit}
2 Als we de analyse op een compleet programma toepassen komt er een \textit{Piet}
3 programma uit dat behoorlijk fors is maar netjes zijn werk doet. Dit programma
4 berekent de faculteit van $x$ en stopt dat uiteindelijk in $y$.
5 \begin{lstlisting}[title=Faculteit in \textit{While}]
6 x:=5;
7 y:=1;
8 while $\neg$(x=1)
9 do (
10 y:=y*x;
11 x:=x-1
12 )
13 \end{lstlisting}
14
15 In \textit{Piet} ziet dit er als volgt uit...
16 \begin{lstlisting}[title=Faculteit in \textit{Piet'}]
17 push 5 // x:=5
18 push 1 // y:=1
19
20 MARKERING A:
21 // Un(2)
22 // $\neg$(x=1) $\equiv$ \neg(x-1)>0)
23
24
25 // x-1
26 // Twee waardes ervoor gepushed dus $n=n+2$
27 // Un(3)
28 push 3 //
29 push 1 //
30 roll //
31 dup //
32 push 4 //
33 push 1 //
34 roll //
35 push 1 //
36 sub //
37 not // $\neg(x-1)$
38
39 push 1 // zet $0$ op de stack
40 push 1
41 sub
42
43 gre // $\neg(x-1)>0$ oftewel x=1
44
45 pointer // als x=0 dan draait de DP niet en gaat het programma naar pad B
46 // als x$\neq$ dan draait de DP en gaat het programma naar pad A
47
48 PAD A:
49 skip //een oneindig aantal witte blokken, y is nu x!
50
51 PAD B:
52 // y:=y*x
53 // Bin(1, 2)
54 dup // Un(1)
55 push 3 // Un(2+1)
56 push 2 //
57 roll //
58 dup //
59 push 5 //
60 push 1 //
61 roll //
62 mul // x*y
63 push 3 // Ass(2)
64 push 2
65 roll
66 pop
67 push 2
68 push 1
69 roll
70 // x:=x-1
71 dup // Un(1)
72 push 1 //
73 sub // x-1
74 push 2 // Ass(1)
75 push 1
76 roll
77 pop
78 // nu gaat het programma weer via een wit pad naar markering A
79 \end{lstlisting}