9f11a5376b18938bad4fa9032dea9f7c785b9478
[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 // Un(2)
27 push 2 //
28 push 1 //
29 roll //
30 dup //
31 push 3 //
32 push 1 //
33 roll //
34 push 1 //
35 sub //
36 not // $\neg(x-1)$
37
38 push 1 // zet $0$ op de stack
39 push 1
40 sub
41
42 gre // $\neg(x-1)>0$ oftewel x=1
43
44 pointer // als x=0 dan draait de DP niet en gaat het programma naar pad B
45 // als x$\neq$ dan draait de DP en gaat het programma naar pad A
46
47 PAD A:
48 skip // een oneindig aantal witte blokken, y is nu x!
49 // evt een outchar om $y$ naar standardout te printen
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 4 //
60 push 1 //
61 roll //
62 mul // x*y
63 push 2 // Ass(1)
64 push 1
65 roll
66 pop
67
68 // x:=x-1
69 push 2 // Un(2)
70 push 1
71 roll
72 dup
73 push 3
74 push 1
75 roll
76
77
78 push 1 //
79 sub // x-1
80 push 3 // Ass(2)
81 push 2
82 roll
83 pop
84 push 2
85 push 1
86 roll
87 // nu gaat het programma weer via een wit pad naar markering A
88 \end{lstlisting}