6
6
Dec = namedtuple ('Dec' , 'reg label1 label2' )
7
7
Halt = namedtuple ('Halt' , '' )
8
8
9
- '''
9
+ print ( r '''
10
10
__ ________ _ _____ ____ __ __ ______
11
11
\ \ / / ____| | / ____/ __ \| \/ | ____|
12
12
\ \ /\ / /| |__ | | | | | | | | \ / | |__
27
27
Halt()
28
28
29
29
To ensure your latex will compile, make sure you have commands for, these are
30
- available on my github (Oliver Killane) (Imperial-Computing-Year-2-Notes) :
30
+ available in the notes repository :
31
31
32
32
% register machine helper commands:
33
33
\newcommand{\instrlabel}[1]{\text{\textcolor{teal}{$L_{#1}$}}}
38
38
\newcommand{\halt}{\text{\textcolor{red}{\textbf{HALT}}}}
39
39
40
40
To see examples, go to the end of this file.
41
- '''
41
+ ''' )
42
42
43
43
# for encoding numbers as <a,b>
44
44
def encode_large (x : int , y : int ) -> int :
@@ -72,18 +72,22 @@ def encode_large_list_helper(lst: List[int], step: int) -> Tuple[int, int]:
72
72
if (step == 0 ):
73
73
print (r"\begin{center}\begin{tabular}{r l l}" )
74
74
if len (lst ) == 0 :
75
- print (f"{ step } &" + rf"$ { buffer } 0$ & (No more numbers in the list, can unwrap recursion) \\" )
75
+ print (f"{ step } &" + rf"$ { buffer } 0$ & (No more numbers in the list, " +
76
+ "can unwrap recursion) \\ " )
76
77
return (0 , step )
77
78
else :
78
79
79
- print (rf"{ step } & $ { buffer } \langle \langle { lst [0 ]} , \ulcorner { lst [1 :]} \urcorner \rangle \rangle $ & (Take next element { lst [0 ]} , and encode the rest { lst [1 :]} ) \\" )
80
+ print (rf"{ step } & $ { buffer } \langle \langle { lst [0 ]} , \ulcorner " +
81
+ rf"{ lst [1 :]} \urcorner \rangle \rangle $ & (Take next element " +
82
+ rf" { lst [0 ]} , and encode the rest { lst [1 :]} ) \\" )
80
83
81
84
(b , step2 ) = encode_large_list_helper (lst [1 :], step + 1 )
82
85
c = encode_large (lst [0 ], b )
83
86
84
87
step2 += 1
85
88
86
- print (f"{ step2 } & $ { buffer } \langle \langle { lst [0 ]} , { b } \\ rangle \\ rangle = { c } $ & (Can now encode) \\ \\ " )
89
+ print (f"{ step2 } & $ { buffer } \langle \langle { lst [0 ]} , { b } \\ rangle " +
90
+ f"\\ rangle = { c } $ & (Can now encode) \\ \\ " )
87
91
88
92
if (step == 0 ):
89
93
print (r"\end{tabular}\end{center}" )
@@ -102,7 +106,8 @@ def decode_large_list_helper(n : int, prev : List[int], step : int = 0) -> List[
102
106
else :
103
107
(a ,b ) = decode_large (n )
104
108
prev .append (a )
105
- print (rf"{ step } & ${ n } = \langle \langle { a } , { b } \rangle \rangle \ \ $&$ { prev } $ & (Decode into two integers) \\ " )
109
+ print (rf"{ step } & ${ n } = \langle \langle { a } , { b } \rangle \rangle \ \ " +
110
+ rf"$&$ { prev } $ & (Decode into two integers) \\ " )
106
111
107
112
next = decode_large_list_helper (b , prev , step + 1 )
108
113
@@ -115,13 +120,17 @@ def decode_large_list_helper(n : int, prev : List[int], step : int = 0) -> List[
115
120
# R+(i) -> L(j)
116
121
def encode_inc (instr : Inc ) -> int :
117
122
encode = encode_large (2 * instr .reg , instr .label )
118
- print (rf"$\ulcorner \inc{{{ instr .reg } }}{{{ instr .label } }} \urcorner = \langle \langle 2 \times { instr .reg } , { instr .label } \rangle \rangle = { encode } $" )
123
+ print (rf"$\ulcorner \inc{{{ instr .reg } }}{{{ instr .label } }} \urcorner = " +
124
+ rf"\langle \langle 2 \times { instr .reg } , { instr .label } \rangle " +
125
+ rf"\rangle = { encode } $" )
119
126
return encode
120
127
121
128
# R-(i) -> L(j), L(k)
122
129
def encode_dec (instr : Dec ) -> int :
123
- encode : int = encode_large (2 * instr .reg + 1 , encode_small (instr .label1 ,instr .label2 ))
124
- print (rf"$\ulcorner \dec {{{ instr .reg } }}{{{ instr .label1 } }}{{{ instr .label2 } }} \urcorner = \langle \langle 2 \times { instr .reg } + 1, \langle { instr .label1 } , { instr .label2 } \rangle \rangle \rangle = { encode } $" )
130
+ encode : int = encode_large (2 * instr .reg + 1 , encode_small (instr .label1 , instr .label2 ))
131
+ print (rf"$\ulcorner \dec {{{ instr .reg } }}{{{ instr .label1 } }}{{{ instr .label2 } }}" +
132
+ rf" \urcorner = \langle \langle 2 \times { instr .reg } + 1, \langle " +
133
+ rf"{ instr .label1 } , { instr .label2 } \rangle \rangle \rangle = { encode } $" )
125
134
return encode
126
135
127
136
# Halt
@@ -201,11 +210,14 @@ def program_str(prog) -> str:
201
210
def program_run (prog , instr_no : int , registers : List [int ])-> Tuple [int , List [int ]]:
202
211
# step instruction label R0 R1 R2 ... (info)
203
212
print (rf"\begin{{center}}\begin{{tabular}}{{l l l c" + " c" * len (registers ) + " }" )
204
- print (r"\textbf{Step} & \textbf{Instruction} & \instrlabel{{i}} &" + " & " .join ([rf"$\reglabel{{{ n } }}$" for n in range (0 , len (registers ))]) + r" & \textbf{Description}\\" )
213
+ print (r"\textbf{Step} & \textbf{Instruction} & \instrlabel{{i}} &" +
214
+ " & " .join ([rf"$\reglabel{{{ n } }}$" for n in range (0 , len (registers ))]) +
215
+ r" & \textbf{Description}\\" )
205
216
print (r"\hline" )
206
217
step = 0
207
218
while True :
208
- step_str = rf"{ step } & ${ instr_to_str (prog [instr_no ])} $ & ${ instr_no } $ & " + "&" .join ([f"${ n } $" for n in registers ]) + "&"
219
+ step_str = (rf"{ step } & ${ instr_to_str (prog [instr_no ])} $ & ${ instr_no } $ & " +
220
+ "&" .join ([f"${ n } $" for n in registers ]) + "&" )
209
221
instr = prog [instr_no ]
210
222
if type (instr ) == Inc :
211
223
if (instr .reg >= len (registers )):
@@ -229,14 +241,18 @@ def program_run(prog, instr_no : int, registers : List[int])-> Tuple[int, List[i
229
241
else :
230
242
registers [instr .reg ] -= 1
231
243
instr_no = instr .label1
232
- print (step_str + rf"(Subtract 1 from register { instr .reg } and jump to instruction { instr .label1 } )\\" )
244
+ print (step_str +
245
+ rf"(Subtract 1 from register { instr .reg } and " +
246
+ rf"jump to instruction { instr .label1 } )\\" )
233
247
else :
234
248
if instr .label2 >= len (prog ):
235
249
print (step_str + rf"(label { instr .label2 } is does not exist)\\" )
236
250
break
237
251
else :
238
252
instr_no = instr .label2
239
- print (step_str + rf"(Register { instr .reg } is zero, jump to instruction { instr .label2 } )\\" )
253
+ print (step_str +
254
+ rf"(Register { instr .reg } is zero, jump to " +
255
+ rf"instruction { instr .label2 } )\\" )
240
256
else :
241
257
print (step_str + rf"(Halt!)\\" )
242
258
break
@@ -288,22 +304,23 @@ def examples():
288
304
Inc (0 ,0 )
289
305
], 0 , [0 ,7 ])
290
306
291
- encode_program_to_list ([
292
- Inc (1 ,1 ),
293
- Inc (0 ,2 ),
294
- Inc (0 ,3 ),
295
- Inc (0 ,4 ),
296
- ])
307
+ # encode_program_to_list([
308
+ # Inc(1,1),
309
+ # Inc(0,2),
310
+ # Inc(0,3),
311
+ # Inc(0,4),
312
+ # ])
297
313
298
- encode_program_to_int ([
299
- Dec (1 ,2 ,1 ),
300
- Halt (),
301
- Dec (1 ,3 ,4 ),
302
- Dec (1 ,5 ,4 ),
303
- Halt (),
304
- Inc (0 ,0 )
305
- ])
314
+ # encode_program_to_int([
315
+ # Dec(1,2,1),
316
+ # Halt(),
317
+ # Dec(1,3,4),
318
+ # Dec(1,5,4),
319
+ # Halt(),
320
+ # Inc(0,0)
321
+ # ])
306
322
307
- decode_program ((2 ** 46 ) * 20483 )
323
+ # decode_program((2 ** 46) * 20483)
308
324
309
325
# examples()
326
+ # test()
0 commit comments