83 lines
2.7 KiB
Text
83 lines
2.7 KiB
Text
|
|
F run_utm(halt, state, Char blank; rules_in, [Char] &tape = [Char](); =pos = 0)
|
|||
|
|
V st = state
|
|||
|
|
I tape.empty
|
|||
|
|
tape.append(blank)
|
|||
|
|
I pos < 0
|
|||
|
|
pos += tape.len
|
|||
|
|
V rules = Dict(rules_in, r -> ((r[0], Char(r[1])), (Char(r[2]), r[3], r[4])))
|
|||
|
|
|
|||
|
|
L
|
|||
|
|
print(st.ljust(4), end' ‘ ’)
|
|||
|
|
L(v) tape
|
|||
|
|
V i = L.index
|
|||
|
|
I i == pos
|
|||
|
|
print(‘[’v‘]’, end' ‘ ’)
|
|||
|
|
E
|
|||
|
|
print(v, end' ‘ ’)
|
|||
|
|
print()
|
|||
|
|
|
|||
|
|
I st == halt
|
|||
|
|
L.break
|
|||
|
|
I (st, tape[pos]) !C rules
|
|||
|
|
L.break
|
|||
|
|
|
|||
|
|
V (v1, dr, s1) = rules[(st, tape[pos])]
|
|||
|
|
tape[pos] = v1
|
|||
|
|
I dr == ‘left’
|
|||
|
|
I pos > 0
|
|||
|
|
pos--
|
|||
|
|
E
|
|||
|
|
tape.insert(0, blank)
|
|||
|
|
I dr == ‘right’
|
|||
|
|
pos++
|
|||
|
|
I pos >= tape.len
|
|||
|
|
tape.append(blank)
|
|||
|
|
st = s1
|
|||
|
|
|
|||
|
|
print("incr machine\n")
|
|||
|
|
run_utm(
|
|||
|
|
halt' ‘qf’,
|
|||
|
|
state' ‘q0’,
|
|||
|
|
blank' Char(‘B’),
|
|||
|
|
rules_in' [‘q0 1 1 right q0’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘q0 B 1 stay qf’.split(‘ ’, group_delimiters' 1B)],
|
|||
|
|
tape' &[‘1’, ‘1’, ‘1’]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
print("\nbusy beaver\n")
|
|||
|
|
run_utm(
|
|||
|
|
halt' ‘halt’,
|
|||
|
|
state' ‘a’,
|
|||
|
|
blank' Char(‘0’),
|
|||
|
|
rules_in'
|
|||
|
|
[‘a 0 1 right b’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘a 1 1 left c’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘b 0 1 left a’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘b 1 1 right b’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘c 0 1 left b’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘c 1 1 stay halt’.split(‘ ’, group_delimiters' 1B)]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
print("\nsorting test\n")
|
|||
|
|
run_utm(
|
|||
|
|
halt' ‘STOP’,
|
|||
|
|
state' ‘A’,
|
|||
|
|
blank' Char(‘0’),
|
|||
|
|
rules_in'
|
|||
|
|
[‘A 1 1 right A’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘A 2 3 right B’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘A 0 0 left E’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘B 1 1 right B’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘B 2 2 right B’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘B 0 0 left C’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘C 1 2 left D’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘C 2 2 left C’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘C 3 2 left E’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘D 1 1 left D’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘D 2 2 left D’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘D 3 1 right A’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘E 1 1 left E’.split(‘ ’, group_delimiters' 1B),
|
|||
|
|
‘E 0 0 right STOP’.split(‘ ’, group_delimiters' 1B)],
|
|||
|
|
tape' &‘2 2 2 1 2 2 1 2 1 2 1 2 1 2’.split(‘ ’).map(Char)
|
|||
|
|
)
|