19 from __future__
import print_function
22 VERSION =
'urmCutland --- 2010 April 12'
34 """Une instruction pour la machine virtuelle UrmCutland"""
38 """Renvoie True si self représente la même instruction que value
39 (càd si même type d'instruction et mêmes arguments),
45 return (isinstance(value, UrmCutlandInstruction)
46 and (self.
_inst == value._inst)
and (self.
_a == value._a)
47 and ((self.
_inst != T)
or (self.
_b == value._b))
48 and ((self.
_inst != J)
or ((self.
_b == value._b)
and (self.
_c == value._c))))
53 """Si inst == Z alors initialise l'instruction à Z(a),
54 si inst == S alors initialise l'instruction à S(a),
55 si inst == T alors initialise l'instruction à T(a,b),
56 si inst == J alors initialise l'instruction à J(a,b,c)
59 alors tous les espaces ' ' et tabulations '\t' sont ignorés
60 et si inst est 'Z(a)' alors initialise l'instruction à Z(a),
61 si inst est 'S(a)' alors initialise l'instruction à S(a),
62 si inst est 'T(a,b)' alors initialise l'instruction à T(a,b),
63 si inst est 'J(a,b,c)' alors initialise l'instruction à J(a,b,c)
64 Si la syntaxe de inst est incorrecte alors une exception est levée
67 ou string de la forme 'Z(a)', 'S(a)', 'T(a,b)'
69 avec éventuellement des ' ' et '\t',
70 a, b et c représentants des naturels >= 1
77 if isinstance(inst, int):
78 assert Z <= inst <= J, inst
93 assert isinstance(inst, str), (type(inst), inst)
95 s = inst.replace(
' ',
'')
96 s = s.replace(
'\t',
'')
97 if (len(s) < 4)
or (s[1] !=
'(')
or (s[-1] !=
')'):
98 raise "syntax error in instruction '{0}'".format(inst)
100 args = s[2:-1].split(
',')
102 args = [int(t)
for t
in args]
104 raise "bad argument in instruction '{0}'".format(inst)
106 raise "bad 1st argument in instruction '{0}'".format(inst)
112 raise "Z take 1 argument ({0} given): '{1}'".format(len(args), inst)
116 raise "S take 1 argument ({0} given): '{1}'".format(len(args), inst)
120 raise "T take 2 arguments ({0} given): '{1}'".format(len(args), inst)
122 raise "bad 2nd argument in instruction '{0}'".format(inst)
127 raise "J take 3 arguments ({0} given): '{1}'".format(len(args), inst)
129 raise "bad 2nd argument in instruction '{0}'".format(inst)
132 raise "bad 3rd argument in instruction '{0}'".format(inst)
135 raise "bad instruction '{0}'".format(inst)
140 """Renvoie True si self représente une instruction différente de value
141 (càd si type d'instruction différent
142 ou au moins un argument différent),
148 return not (self == value)
153 """Renvoie l'instruction sous forme d'un string
159 return 'Z({0})'.format(self.
_a)
160 elif self.
_inst == S:
161 return 'S({0})'.format(self.
_a)
162 elif self.
_inst == T:
163 return 'T({0},{1})'.format(self.
_a, self.
_b)
167 return 'J({0},{1},{2})'.format(self.
_a, self.
_b, self.
_c)
172 """Renvoie le 1er argument de l'instruction
182 """Renvoie le 2e argument de l'instruction
183 (ou lève une exception s'il n'y en pas)
191 raise 'Not 2nd argument'
196 """Renvoie le 3e argument de l'instruction
197 (ou lève une exception s'il n'y en pas)
205 raise 'Not 3rd argument'
210 """Renvoie le "nombre de Gödel" associé à l'instruction,
211 càd 2**n * 3**(a - 1) * 5**(b - 1) * 7**(c - 1)
212 où n == 0, 1, 2 ou 3 pour instruction == Z, S, T ou J
217 if (self.
inst() == Z)
or (self.
inst() == S):
218 return 2**self.
inst() * 3**(self.
a() - 1)
219 elif self.
inst() == T:
220 return 2**self.
inst() * 3**(self.
a() - 1) * 5**(self.
b() - 1)
221 elif self.
inst() == J:
222 return 2**self.
inst() * 3**(self.
a() - 1) * 5**(self.
b() - 1) * 7**(self.
c() - 1)
228 """Renvoie le code associé à l'instruction
239 """Programme (suite de UrmCutlandInstruction)
240 pour la machine virtuelle UrmCutland"""
244 """Renvoie True si self représente le même programme que value
245 (càd si exactement la même suite d'instructions),
251 if (
not isinstance(value, UrmCutlandProg))
or (len(self) != len(value)):
253 for i
in range(1, len(self) + 1):
254 assert isinstance(self[i], UrmCutlandInstruction), type(self[i])
255 assert isinstance(value[i], UrmCutlandInstruction), type(value[i])
257 if self[i] != value[i]:
264 """Renvoie l'instruction numéro n
268 Result: UrmCutlandInstruction
279 """Initialise le programme pour la machine virtuelle UrmCutland
280 Si insts est une séquence de UrmCutlandInstruction
281 alors initialise simplement le programme
282 avec cette séquence d'instructions.
284 Si insts est un string ou séquence de string :
286 Si une instruction est incorrecte
287 alors une exception est levée.
292 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
294 De plus '#' désigne un commentaire
295 (dans lequel tous les caractères sont permis)
296 jusqu'à la fin du string ou une fin de ligne,
298 Tous les espaces ' ', tabulations '\t'
299 et à la ligne '\n' sont ignorés
301 Instructions permises : 'Z(a)'
305 où a, b et c représentent des naturels >= 1
308 Pseudo-instruction include : 'i(prog)'
309 où prog désigne une variable contenant
310 un programme qui sera inclus
311 (tous les numéros d'instructions de prog
312 sont décalés en conséquence)
315 peut précéder une (pseudo-)instruction : 'n)'
316 où n représente un naturel >= 1 écrit en base 10
317 (dans ce cas il doit être plus grand
318 que les numéros de ligne déjà traités)
319 (si des numéros d'instructions sont passés
320 alors ajoute des instructions neutres 'T(1,1)'
321 pour complèter les trous)
323 Pre: insts: séquence de UrmCutlandInstruction
324 ou string ou séquence de string
327 assert isinstance(insts, str)
or isinstance(insts, list)
or isinstance(insts, tuple), \
330 if ((isinstance(insts, list)
or isinstance(insts, tuple))
331 and ((len(insts) == 0)
332 or isinstance(insts[0],
333 UrmCutlandInstruction))) :
336 assert isinstance(inst, UrmCutlandInstruction), type(inst)
341 if isinstance(insts, list)
or isinstance(insts, tuple):
342 insts =
'\n'.join(insts)
343 insts = insts.split(
'\n')
352 for i
in range(1, len(insts) + 1):
353 assert isinstance(insts[i - 1], str), (i, type(insts[i - 1]), insts[i - 1])
358 for j
in range(len(insts[i - 1])):
359 assert insts[i - 1][j] !=
'\n', (i, j, insts[i - 1][j])
367 if (c !=
' ')
and (c !=
'\t'):
371 if (t[:1] !=
'i')
and not (c
in 'ZSTJi(,0123456789'):
372 raise (
"bad character '{0}' in line {1} column {2}: '{3}'"
378 raise "closed ')' with nothing in line {0} column {1}".format(i, j)
383 raise (
"bad instruction '{0})' in line {1} column {2}"
386 l += [NOTHING]*(num - 1 - len(l))
391 if (len(t) >= 2)
and (t[1] !=
'('):
392 raise (
"not opening '(' in line {0} column {1}: '{2})'"
395 l += [NOTHING]*(num - 1- len(l))
397 include = eval(t[2:])
399 raise (
"bad include program '{0})' in line {1} column {2}"
401 if not (isinstance(include, UrmCutlandProg)):
402 raise (
"not valid include program '{0})' in line {1} column {2}"
405 if not isinstance(inst, UrmCutlandInstruction):
406 raise (
"not valid instruction in include program '{0})'"
407 +
' in line {1} column {2}'
409 l += include.shiftInstrNum(num - 1)
414 raise (
'already number {0} to this instruction:'
415 +
" '{1})' in line {2} column {3}"
416 .format(num, t, i, j))
420 raise (
"bad number instruction '{0})'"
421 +
" in line {1} column {2} : '{3}'"
422 .format(t, i, j, insts[i - 1]))
424 raise (
'already number instruction {0} (greater: {1})'
425 +
" in line {2} column {3}: '{4}'"
426 .format(num, len(l) - 1, i, j, insts[i - 1]))
431 raise "piece of instruction '{0}'".format(t)
433 raise 'number instruction {0} without instruction'.format(num)
439 """Itère sur les instructions du programme
448 """Renvoie le nombre d'instructions du programme
458 """Renvoie True si self représente un programme différent de value
464 return not (value == value)
469 """Initialise la valeur de l'instruction numéro n à value
472 value: UrmCutlandInstruction
477 assert isinstance(value, UrmCutlandInstruction), type(value)
479 self.
_insts[n - 1] = value
484 """Renvoie dans un string
485 la suite des instructions du programme
491 return '\n'.join([str(inst)
for inst
in self.
_insts])
497 """Renvoie une copie du programme
498 dont tous les numéros d'instructions == c
499 mentionnés dans les instructions J sont changés en new
504 Result: UrmCutlandProg
516 assert isinstance(inst, UrmCutlandInstruction), type(inst)
519 if (inst.inst() == J)
and (inst.c() == c)
527 """Renvoie le code source correspondant au programme
529 alors passe les instructions T(a,a) avec a naturel
530 (dans ce cas il faut num != None)
532 alors chaque instruction est précédée
533 de son numéro puis de num
535 alors renvoie une liste de string,
536 chacune contenant une instruction
537 sinon concatène toutes les instructions
538 en un seul string séparées par concat
541 num: None ou string composée de ' ', '\t' ou '\n'
542 concat: None ou string composée de ' ', '\t' ou '\n'
544 Result: string ou liste de string
547 assert ((num ==
None)
and not skip)
or isinstance(num, str), (type(num), num, skip)
548 assert (concat ==
None)
or isinstance(concat, str), (type(concat), concat)
555 assert isinstance(inst, UrmCutlandInstruction), type(inst)
557 if (
not skip)
or (inst.inst() != T)
or (inst.a() != inst.b()):
558 l.append(str(inst)
if num ==
None
559 else '{0}{1}{2}'.format(n, num, inst))
562 return (l
if concat ==
None
568 """Renvoie le "nombre de Gödel" associé au programme,
569 càd 2**g_1 * 3**g_2 * 5**g_3 * 7**g_4 * ... * P_k**g_k
570 où g_i est le "nombre de Gödel" de l'instruction numéro i
577 l.append(inst.godelnumber())
578 return factors.godelnumber(l)
585 Pre: f: fichier (texte) ouvert en lecture
588 assert isinstance(f, file), f
590 raise NotImplementedError
596 """Renvoie une copie du programme dont tous les numéros d'instructions
597 mentionnés dans les instructions J sont décalés de offset.
598 Si une des valeurs devient < 1
599 alors elle est remplacée par underflow
602 underflow: naturel >= 1
604 Result: UrmCutlandProg
607 assert isinstance(offset, int), (type(offset), offset)
609 assert underflow >= 1, underflow
615 assert isinstance(inst, UrmCutlandInstruction), type(inst)
618 (inst.c() + offset
if inst.c() + offset > 0
619 else underflow))
if inst.inst() == J
629 Pre: f: fichier (texte) ouvert en lecture
632 assert isinstance(f, file), f
634 raise NotImplementedError
678 """Machine virtuelle UrmCutland :
679 Unlimited Register Machine de Cutland
680 (variante de la machine de Shepherdson - Sturgis)"""
684 """Renvoie la valeur du registre numéro n
695 return self.
_regs[n - 1]
700 """Initialise la machine virtuelle UrmCutland
701 en initialisant ses premiers registres.
703 Si init est un naturel
704 alors initialise les nb premiers registres avec la valeur init.
705 Si init est une séquence
706 alors initialise les premiers registres
707 avec les valeurs de init prises nb fois
709 Pre: init: naturel ou séquence de naturels
719 self.
_regs = [init]*nb
725 self.
_regs = list(init)*nb
730 """Itère sur les registres de la machine virtuelle
733 for reg
in self.
_regs:
739 """Renvoie le nombre de registres utilisés
740 (en fait le plus grand numéro de registre
741 parmi les registres ayant été utilisés)
746 return len(self.
_regs)
751 """Initialise la valeur du registre numéro n à value
762 self.
_regs[n - 1] = value
767 """Renvoie dans un string la suite des valeurs
768 des registres numérotés de 1 à len()
773 return '[' +
' '.join([str(n)
for n
in self.
_regs]) +
']'
777 def _extend(self, n):
778 """Si le registre numéro n n'est pas encore défini dans self._regs
779 alors étend self._regs avec des 0 et renvoie True
790 if n > len(self.
_regs):
799 """Renvoie le "nombre de Gödel" associé à la liste des registres,
800 càd 2**r_1 * 3**r_2 * 5**r_3 * 7**r_4 * ...
801 où r_i est la valeur du registre numéro i
806 return factors.godelnumber(self.
_regs)
812 si les registres numéro a et numéro b contiennent la même valeur,
834 """Initialise avec les valeurs lues dans le fichier f
835 les registres à partir du registre numéro n
836 (si nb != None alors lit au plus nb valeurs)
838 Pre: f: fichier (texte) ouvert en lecture
839 composé uniquement des caractères '0'..'9', ' ', ',', ';', '\t', 'n'
845 assert isinstance(f, file), f
848 assert (nb ==
None)
or _init__.natural_is(nb), (type(nb), nb)
851 line = line.replace(
'\t',
' ')
852 line = line.replace(
'\n',
' ')
853 line = line.replace(
';',
' ')
854 line = line.replace(
',',
' ')
855 l =
' '.split(line.replace(
' ',
' '))
861 raise 'number readed dont >= 1'
871 def run(self, prog, i=1, nb=None):
872 """Exécute au plus nb instructions (ou toutes si nb == None) de prog
873 à partir de l'instruction numéro i
874 et renvoie (numéro de l'instruction finale,
875 nombre d'instructions exécutées)
876 (le numéro de l'instruction finale est en fait
877 soit le numéro après la dernière instruction exécutée,
878 soit le numéro d'une instruction qui n'existe pas
879 mentionné par la dernière instruction J exécutée)
881 Pre: prog: UrmCutlandProg
885 Result: (naturel >= 1, naturel)
888 assert isinstance(prog, UrmCutlandProg), type(prog)
896 while (i <= len(prog))
and ((nb ==
None)
or (k < nb)):
897 assert isinstance(prog[i], UrmCutlandInstruction), (i, type(prog[i]), prog[i])
900 instruction = prog[i]
902 if instruction.inst() == Z:
903 self.
Z(instruction.a())
904 elif instruction.inst() == S:
905 self.
S(instruction.a())
906 elif instruction.inst() == T:
907 self.
T(instruction.a(), instruction.b())
908 elif self.
J_test(instruction.a(), instruction.b()):
909 assert instruction.inst() == J, instruction.inst()
918 """Instruction Successor : ajoute 1 dans le registre numéro a
927 self.
_regs[a - 1] += 1
933 """Instruction Transfer :
934 initialise le registre numéro b
935 avec la valeur du registre numéro a
954 Pre: f: fichier (texte) ouvert en lecture
957 assert isinstance(f, file), f
959 raise NotImplementedError
964 """Instruction Zero : initialise le registre numéro a à 0
973 self.
_regs[a - 1] = 0
1018 # INV: 0 <= a <= b ou 0 <= b <= a
1019 1) Z(3) # INV: _3 <= a <= b ou _3 <= b <= a
1021 # Boucle _3 de 0 à min(a, b) :
1022 2) J(1,3,6) # INV: _3 < a <= b ou _3 <= b <= a
1023 3) J(2,3,9) # INV: _3 < a <= b ou _3 < b <= a
1027 6) Z(1) # INV: _3 == a <= b
1031 9) Z(1) # INV: _3 == b < a
1041 1) J(1,2,10) # INV: 0 <= a < b ou 0 <= b < a
1042 2) Z(3) # INV: _3 <= a < b ou _3 <= b < a
1044 # Boucle _3 de 0 à min(a, b) :
1045 3) J(1,3,7) # INV: _3 < a < b ou _3 <= b < a
1046 4) J(2,3,10) # INV: _3 < a < b ou _3 < b < a
1050 7) Z(1) # INV: _3 == a < b
1054 10) Z(1) # INV: _3 == b < a
1063 # INV: 0 <= a <= b ou 0 <= b <= a
1064 1) Z(3) # INV: _3 <= a <= b ou _3 <= b <= a
1066 # Boucle _3 de 0 à min(a, b) :
1067 2) J(2,3,6) # INV: _3 <= a <= b ou _3 < b <= a
1068 3) J(1,3,9) # INV: _3 < a <= b ou _3 < b <= a
1072 6) Z(1) # INV: _3 == b <= a
1076 9) Z(1) # INV: _3 == a < b
1086 1) J(1,2,10) # INV: 0 <= a < b ou 0 <= b < a
1087 2) Z(3) # INV: _3 <= a < b ou _3 <= b < a
1089 # Boucle _3 de 0 à min(a, b) :
1090 3) J(2,3,7) # INV: _3 <= a < b ou _3 < b < a
1091 4) J(1,3,10) # INV: _3 < a < b ou _3 < b < a
1095 7) Z(1) # INV: _3 == b < a
1099 10) Z(1) # INV: _3 == a < b
1110 # INV: 0 <= a <= b ou 0 <= b <= a
1111 1) Z(3) # INV: _3 <= a <= b ou _3 <= b <= a
1113 # Boucle _3 de 0 à min(a, b) :
1114 2) J(1,3,6) # INV: _3 < a <= b ou _3 <= b <= a
1115 3) J(2,3,6) # INV: _3 < a <= b ou _3 < b <= a
1119 6) T(3,1) # INV: _3 == a <= b ou _3 == b < a
1128 # INV: 0 <= a <= b ou 0 <= b <= a
1129 1) Z(3) # INV: _3 <= a <= b ou _3 <= b <= a
1131 # Boucle _3 de 0 à min(a, b) :
1132 2) J(1,3,6) # INV: _3 < a <= b ou _3 <= b <= a
1133 3) J(2,3,7) # INV: _3 < a <= b ou _3 < b <= a
1137 6) T(2,1) # INV: _3 == a <= b
1159 # Boucle _2 de 1 à n :
1174 # Boucle _3 de 0 à b :
1190 # Boucle _2 de b à a :
1209 # Boucle _5 de 0 à b :
1225 4) J(1,2,4) # si b == 0
1229 # Boucle _5 de 0 à a :
1231 8) S(2) # reste += 1
1233 10) J(2,4,12) # si reste == b
1236 12) S(1) # quotient += 1
1237 13) Z(2) # reste = 0
1255 # Boucle _7 de 0 à b :
1272 # Boucle tant que _2 > 0 : (algorithme d'Euclide)
1275 3) i(DIV) # | a//b | a%b | a | b | a |
1276 17) T(4,1) # | b | a%b | a | b | a |
1295 # Boucle _5 de 0 à n :
1316 # Boucle _2 de 0 à n :
1329 if __name__ ==
'__main__':
1331 """Test du module"""
1332 import fractions, math, sys
1335 if not 'profile' in dir():
1344 debug.test_begin(VERSION, __debug__)
1346 print(
'Z == {0}'.format(Z)); sys.stdout.flush()
1350 print(
'S == {0}'.format(S)); sys.stdout.flush()
1354 print(
'T == {0}'.format(T)); sys.stdout.flush()
1358 print(
'J == {0}'.format(J)); sys.stdout.flush()
1365 print(
'UrmCutlandInstruction()...', end=
''); sys.stdout.flush()
1366 print(
'???', end=
'')
1367 print(
'ok'); sys.stdout.flush()
1370 print(
'UrmCutlandInstruction.__eq__()...', end=
''); sys.stdout.flush()
1371 print(
'???', end=
'')
1372 print(
'ok'); sys.stdout.flush()
1375 print(
'UrmCutlandInstruction.__ne__()...', end=
''); sys.stdout.flush()
1376 print(
'???', end=
'')
1377 print(
'ok'); sys.stdout.flush()
1380 print(
'UrmCutlandInstruction.__str__()...', end=
''); sys.stdout.flush()
1381 print(
'???', end=
'')
1382 print(
'ok'); sys.stdout.flush()
1385 print(
'UrmCutlandInstruction.a()...', end=
''); sys.stdout.flush()
1386 print(
'???', end=
'')
1387 print(
'ok'); sys.stdout.flush()
1390 print(
'UrmCutlandInstruction.b()...', end=
''); sys.stdout.flush()
1391 print(
'???', end=
'')
1392 print(
'ok'); sys.stdout.flush()
1395 print(
'UrmCutlandInstruction.c()...', end=
''); sys.stdout.flush()
1396 print(
'???', end=
'')
1397 print(
'ok'); sys.stdout.flush()
1400 print(
'UrmCutlandInstruction.godelnumber()...', end=
''); sys.stdout.flush()
1401 print(
'???', end=
'')
1402 print(
'ok'); sys.stdout.flush()
1405 print(
'UrmCutlandInstruction.inst()...', end=
''); sys.stdout.flush()
1406 print(
'???', end=
'')
1407 print(
'ok'); sys.stdout.flush()
1410 print(
"NOTHING == '%s'" % NOTHING); sys.stdout.flush()
1411 assert isinstance(NOTHING, UrmCutlandInstruction), type(NOTHING)
1412 assert str(NOTHING) ==
'T(1,1)', str(NOTHING)
1417 print(
'UrmCutlandProg()...', end=
''); sys.stdout.flush()
1418 print(
'???', end=
'')
1425 assert prog == INC, [str(i)
for i
in prog]
1428 ' J(2, 3, 000 # comment',
1429 ' 00 6 ) S(1) # comment \n S(3) J(1,1,\t2)'))
1430 assert prog == ADD, [str(i)
for i
in prog]
1433 T(2,4) # initialisation
1443 S(5) # boucle sur ADD
1445 assert prog == MUL, [str(i)
for i
in prog]
1446 print(
'ok'); sys.stdout.flush()
1449 print(
'UrmCutlandProg.__eq__()...', end=
''); sys.stdout.flush()
1450 print(
'???', end=
'')
1451 print(
'ok'); sys.stdout.flush()
1454 print(
'UrmCutlandProg.__getitem__()...', end=
''); sys.stdout.flush()
1455 print(
'???', end=
'')
1456 print(
'ok'); sys.stdout.flush()
1459 print(
'UrmCutlandProg.__iter__()...', end=
''); sys.stdout.flush()
1460 print(
'???', end=
'')
1461 print(
'ok'); sys.stdout.flush()
1464 print(
'UrmCutlandProg.__len__()...', end=
''); sys.stdout.flush()
1465 print(
'???', end=
'')
1466 print(
'ok'); sys.stdout.flush()
1469 print(
'UrmCutlandProg.__ne__()...', end=
''); sys.stdout.flush()
1470 print(
'???', end=
'')
1471 print(
'ok'); sys.stdout.flush()
1474 print(
'UrmCutlandProg.__setitem__()...', end=
''); sys.stdout.flush()
1475 print(
'???', end=
'')
1476 print(
'ok'); sys.stdout.flush()
1479 print(
'UrmCutlandProg.__str__()...', end=
''); sys.stdout.flush()
1480 print(
'???', end=
'')
1481 print(
'ok'); sys.stdout.flush()
1484 print(
'UrmCutlandProg.changeInstrNum()...', end=
''); sys.stdout.flush()
1485 print(
'???', end=
'')
1486 print(
'ok'); sys.stdout.flush()
1489 print(
'UrmCutlandProg.decompile()...', end=
''); sys.stdout.flush()
1490 print(
'???', end=
'')
1491 src = ADD.decompile(concat=
' ')
1492 assert src ==
'1) Z(3) 2) J(2,3,6) 3) S(1) 4) S(3) 5) J(1,1,2)', src
1494 src = ADD.decompile(concat=
None)
1495 assert src == [
'1) Z(3)',
1501 src = MUL.decompile(num=
') \t')
1502 assert src ==
"""1) \tT(2,4)
1513 12) \tJ(1,1,5)""", src
1514 print(
'ok'); sys.stdout.flush()
1517 print(
'UrmCutlandProg.godelnumber()...', end=
''); sys.stdout.flush()
1518 print(
'???', end=
'')
1519 print(
'ok'); sys.stdout.flush()
1522 print(
'UrmCutlandProg.read()...', end=
''); sys.stdout.flush()
1523 print(
'???', end=
'')
1524 print(
'ok'); sys.stdout.flush()
1527 print(
'UrmCutlandProg.shiftInstrNum()...', end=
''); sys.stdout.flush()
1528 print(
'???', end=
'')
1529 print(
'ok'); sys.stdout.flush()
1532 print(
'UrmCutlandProg.write()...', end=
''); sys.stdout.flush()
1533 print(
'???', end=
'')
1534 print(
'ok'); sys.stdout.flush()
1539 print(
'UrmCutland()...', end=
''); sys.stdout.flush()
1540 print(
'???', end=
'')
1541 print(
'ok'); sys.stdout.flush()
1544 print(
'UrmCutland.__getitem__()...', end=
''); sys.stdout.flush()
1545 print(
'???', end=
'')
1546 print(
'ok'); sys.stdout.flush()
1549 print(
'UrmCutland.__iter__()...', end=
''); sys.stdout.flush()
1550 print(
'???', end=
'')
1551 print(
'ok'); sys.stdout.flush()
1554 print(
'UrmCutland.__len__()...', end=
''); sys.stdout.flush()
1555 print(
'???', end=
'')
1556 print(
'ok'); sys.stdout.flush()
1559 print(
'UrmCutland.__setitem__()...', end=
''); sys.stdout.flush()
1560 print(
'???', end=
'')
1561 print(
'ok'); sys.stdout.flush()
1564 print(
'UrmCutland.__str__()...', end=
''); sys.stdout.flush()
1565 print(
'???', end=
'')
1566 print(
'ok'); sys.stdout.flush()
1569 print(
'UrmCutland._extend()...', end=
''); sys.stdout.flush()
1570 print(
'???', end=
'')
1571 print(
'ok'); sys.stdout.flush()
1574 print(
'UrmCutland.godelnumber()...', end=
''); sys.stdout.flush()
1575 print(
'???', end=
'')
1576 print(
'ok'); sys.stdout.flush()
1579 print(
'UrmCutland.J_test()...', end=
''); sys.stdout.flush()
1580 print(
'???', end=
'')
1581 print(
'ok'); sys.stdout.flush()
1584 print(
'UrmCutland.read()...', end=
''); sys.stdout.flush()
1585 print(
'???', end=
'')
1586 print(
'ok'); sys.stdout.flush()
1589 print(
'UrmCutland.run()...', end=
''); sys.stdout.flush()
1590 print(
'???', end=
'')
1591 print(
'ok'); sys.stdout.flush()
1594 print(
'UrmCutland.S()...', end=
''); sys.stdout.flush()
1595 print(
'???', end=
'')
1596 print(
'ok'); sys.stdout.flush()
1599 print(
'UrmCutland.T()...', end=
''); sys.stdout.flush()
1600 print(
'???', end=
'')
1601 print(
'ok'); sys.stdout.flush()
1604 print(
'UrmCutland.write()...', end=
''); sys.stdout.flush()
1605 print(
'???', end=
'')
1606 print(
'ok'); sys.stdout.flush()
1609 print(
'UrmCutland.Z()...', end=
''); sys.stdout.flush()
1610 print(
'???', end=
'')
1611 print(
'ok'); sys.stdout.flush()
1616 print(
'NOT...', end=
''); sys.stdout.flush()
1617 assert isinstance(NOT, UrmCutlandProg), type(NOT)
1619 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1621 for n
in range(100):
1623 (i, nb) = m.run(NOT)
1624 assert i == len(NOT) + 1, (n, i, len(NOT), nb)
1625 assert nb == 3 + (n != 0), (n, i, nb)
1626 assert len(m) == 2, (n, len(m))
1627 assert m[1] == (
not bool(n)), (n, m[1])
1628 assert m[2] == 0, (n, m[2])
1629 print(
'ok'); sys.stdout.flush()
1632 print(
'LESSOREQ...', end=
''); sys.stdout.flush()
1633 assert isinstance(LESSOREQ, UrmCutlandProg), type(LESSOREQ)
1634 for inst
in LESSOREQ:
1635 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1640 (i, nb) = m.run(LESSOREQ)
1641 assert i == len(LESSOREQ) + 1, (a, b, i, len(LESSOREQ), nb)
1642 assert nb <= len(LESSOREQ)*(min(a, b) + 1), (a, b, i, len(LESSOREQ), nb,
1643 len(LESSOREQ)*(min(a, b) + 1))
1644 assert len(m) == 3, (a, b, len(m))
1645 assert m[1] == (a <= b), (a, b, m[1], a <= b)
1646 assert m[2] == b, (a, b, m[2])
1647 assert m[3] == min(a, b), (a, b, m[3])
1648 print(
'ok'); sys.stdout.flush()
1651 print(
'LESS...', end=
''); sys.stdout.flush()
1652 assert isinstance(LESS, UrmCutlandProg), type(LESS)
1654 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1659 (i, nb) = m.run(LESS)
1660 assert i == len(LESS) + 1, (a, b, i, len(LESS), nb)
1661 assert nb <= len(LESS)*(min(a, b) + 1), (a, b, i, len(LESS), nb,
1662 len(LESS)*(min(a, b) + 1))
1663 assert len(m) == (2 + (a != b)), (a, b, len(m))
1664 assert m[1] == (a < b), (a, b, m[1], a < b)
1665 assert m[2] == b, (a, b, m[2])
1667 assert m[3] == min(a, b), (a, b, m[3])
1668 print(
'ok'); sys.stdout.flush()
1671 print(
'GREATOREQ...', end=
''); sys.stdout.flush()
1672 assert isinstance(GREATOREQ, UrmCutlandProg), type(GREATOREQ)
1673 for inst
in GREATOREQ:
1674 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1679 (i, nb) = m.run(GREATOREQ)
1680 assert i == len(GREATOREQ) + 1, (a, b, i, len(GREATOREQ), nb)
1681 assert nb <= len(GREATOREQ)*(min(a, b) + 1), (a, b, i, len(GREATOREQ), nb,
1682 len(GREATOREQ)*(min(a, b) + 1))
1683 assert len(m) == 3, (a, b, len(m))
1684 assert m[1] == (a >= b), (a, b, m[1], a >= b)
1685 assert m[2] == b, (a, b, m[2])
1686 assert m[3] == min(a, b), (a, b, m[3])
1687 print(
'ok'); sys.stdout.flush()
1690 print(
'GREAT...', end=
''); sys.stdout.flush()
1691 assert isinstance(GREAT, UrmCutlandProg), type(GREAT)
1693 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1698 (i, nb) = m.run(GREAT)
1699 assert i == len(GREAT) + 1, (a, b, i, len(GREAT), nb)
1700 assert nb <= len(GREAT)*(min(a, b) + 1), (a, b, i, len(GREAT), nb,
1701 len(GREAT)*(min(a, b) + 1))
1702 assert len(m) == (2 + (a != b)), (a, b, len(m))
1703 assert m[1] == (a > b), (a, b, m[1], a > b)
1704 assert m[2] == b, (a, b, m[2])
1706 assert m[3] == min(a, b), (a, b, m[3])
1707 print(
'ok'); sys.stdout.flush()
1710 print(
'MIN...', end=
''); sys.stdout.flush()
1711 assert isinstance(MIN, UrmCutlandProg), type(MIN)
1713 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1718 (i, nb) = m.run(MIN)
1719 assert i == len(MIN) + 1, (a, b, i, len(MIN), nb)
1720 assert nb <= len(MIN)*(min(a, b) + 1), (a, b, i, len(MIN), nb,
1721 len(MIN)*(min(a, b) + 1))
1722 assert len(m) == 3, (a, b, len(m))
1723 assert m[1] == min(a, b), (a, b, m[1], min(a, b))
1724 assert m[2] == b, (a, b, m[2])
1725 assert m[3] == min(a, b), (a, b, m[3])
1726 print(
'ok'); sys.stdout.flush()
1729 print(
'MAX...', end=
''); sys.stdout.flush()
1730 assert isinstance(MAX, UrmCutlandProg), type(MAX)
1732 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1737 (i, nb) = m.run(MAX)
1738 assert i == len(MAX) + 1, (a, b, i, len(MAX), nb)
1739 assert nb <= len(MAX)*(min(a, b) + 1), (a, b, i, len(MAX), nb,
1740 len(MAX)*(min(a, b) + 1))
1741 assert len(m) == 3, (a, b, len(m))
1742 assert m[1] == max(a, b), (a, b, m[1], max(a, b))
1743 assert m[2] == b, (a, b, m[2])
1744 assert m[3] == min(a, b), (a, b, m[3])
1745 print(
'ok'); sys.stdout.flush()
1748 print(
'INC...', end=
''); sys.stdout.flush()
1749 assert isinstance(INC, UrmCutlandProg), type(INC)
1751 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1753 for n
in range(100):
1755 (i, nb) = m.run(INC)
1756 assert i == len(INC) + 1, (n, i, len(INC), nb)
1757 assert nb == 1, (n, nb)
1758 assert len(m) == 1, (n, len(m))
1759 assert m[1] == n + 1, (n, m[1])
1761 assert m[5] == 0, (n, m[5])
1762 assert len(m) == 5, (n, len(m))
1763 assert m[1] == n + 1, (n, m[1])
1764 assert m[2] == 0, (n, m[2])
1765 assert m[3] == 0, (n, m[3])
1766 assert m[4] == 0, (n, m[4])
1767 assert len(m) == 5, (n, len(m))
1768 print(
'ok'); sys.stdout.flush()
1771 print(
'DEC...', end=
''); sys.stdout.flush()
1772 assert isinstance(DEC, UrmCutlandProg), type(DEC)
1774 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1777 (i, nb) = m.run(DEC, nb=10000)
1778 assert nb == 10000, (i, nb)
1780 for n
in range(1, 100):
1782 (i, nb) = m.run(DEC)
1783 assert i == len(DEC) + 1, (n, i, len(DEC), nb)
1784 assert nb <= len(DEC)*n, (n, i, len(DEC), nb, len(DEC)*(min(a, b) + 1))
1785 assert len(m) == 3, (n, len(m))
1786 assert m[1] == n - 1, (n, m[1])
1787 assert m[2] == n, (n, m[2])
1788 assert m[3] == n, (n, m[3])
1790 assert m[5] == 0, (n, m[5])
1791 assert len(m) == 5, (n, len(m))
1792 assert m[1] == n - 1, (n, m[1])
1793 assert m[2] == n, (n, m[2])
1794 assert m[3] == n, (n, m[3])
1795 assert m[4] == 0, (n, m[4])
1796 assert len(m) == 5, (n, len(m))
1797 print(
'ok'); sys.stdout.flush()
1800 print(
'ADD...', end=
''); sys.stdout.flush()
1801 assert isinstance(ADD, UrmCutlandProg), type(ADD)
1803 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1808 (i, nb) = m.run(ADD)
1809 assert i == len(ADD) + 1, (a, b, i, len(ADD), nb)
1810 assert nb <= len(ADD)*(b + 1), (a, b, i, len(ADD), nb, len(ADD)*(b + 1))
1811 assert len(m) == 3, (a, b, len(m))
1812 assert m[1] == a + b, (a, b, m[1], a + b)
1813 assert m[2] == b, (a, b, m[2])
1814 assert m[3] == b, (a, b, m[3])
1815 print(
'ok'); sys.stdout.flush()
1818 print(
'SUB...', end=
''); sys.stdout.flush()
1819 assert isinstance(SUB, UrmCutlandProg), type(SUB)
1821 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1827 (i, nb) = m.run(SUB)
1828 assert i == len(SUB) + 1, (a, b, i, len(SUB), nb)
1829 assert nb < 100, (a, b, i, nb)
1830 assert nb <= len(SUB)*(a - b + 1), (a, b, i, len(SUB), nb,
1831 len(SUB)*(a - b + 1))
1832 assert len(m) == 3, (a, b, len(m))
1833 assert m[1] == a - b, (a, b, m[1], a - b)
1834 assert m[2] == a, (a, b, m[2])
1835 assert m[3] == a, (a, b, m[3])
1836 elif debug.assertspeed >= debug.ASSERT_NORMAL:
1837 (i, nb) = m.run(SUB, nb=1000)
1838 assert nb == 1000, (a, b, i, nb)
1839 if debug.assertspeed < debug.ASSERT_NORMAL:
1840 print(debug.assertspeed_str(), end=
'')
1841 print(
'ok'); sys.stdout.flush()
1844 print(
'MUL...', end=
''); sys.stdout.flush()
1845 assert isinstance(MUL, UrmCutlandProg), type(MUL)
1847 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1849 for a
in range(40
if debug.assertspeed >= debug.ASSERT_NORMAL
else 20):
1850 for b
in range(15
if debug.assertspeed >= debug.ASSERT_NORMAL
else 10):
1852 (i, nb) = m.run(MUL)
1853 assert i == len(MUL) + 1, (a, b, i, len(MUL), nb)
1854 assert nb <= len(MUL)*((a + 1)*b + 1), (a, b, i, len(MUL), nb,
1855 len(MUL)*((a + 1)*b + 1))
1856 assert len(m) == 5, (a, b, len(m))
1857 assert m[1] == a*b, (a, b, m[1], a*b)
1858 assert m[2] == a, (a, b, m[2])
1860 assert m[3] == 0, (a, b, m[3])
1862 assert m[3] == a, (a, b, m[3])
1863 assert m[4] == b, (a, b, m[4])
1864 assert m[5] == b, (a, b, m[5])
1865 if debug.assertspeed < debug.ASSERT_NORMAL:
1866 print(debug.assertspeed_str(), end=
'')
1867 print(
'ok'); sys.stdout.flush()
1870 print(
'DIV...', end=
''); sys.stdout.flush()
1871 assert isinstance(DIV, UrmCutlandProg), type(DIV)
1873 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1875 for a
in range(50
if debug.assertspeed >= debug.ASSERT_NORMAL
else 20):
1877 if debug.assertspeed >= debug.ASSERT_NORMAL:
1878 (i, nb) = m.run(DIV, nb=5000)
1879 assert nb == 5000, (a, i, nb)
1880 for b
in range(1, 20):
1882 (i, nb) = m.run(DIV)
1883 assert i == len(DIV) + 1, (a, b, i, len(DIV), nb)
1884 assert nb < 500, (a, b, i, nb)
1885 assert nb <= len(DIV)*(a + 1), (a, b, i, len(DIV), nb, len(DIV)*(a + 1))
1886 assert len(m) == 5, (a, b, len(m))
1887 assert m[1] == a//b, (a, b, m[1], a//b)
1888 assert m[2] == a%b, (a, b, m[2], a%b)
1889 assert m[3] == a, (a, b, m[3])
1890 assert m[4] == b, (a, b, m[4])
1891 assert m[5] == a, (a, b, m[5])
1892 if debug.assertspeed < debug.ASSERT_NORMAL:
1893 print(debug.assertspeed_str(), end=
'')
1894 print(
'ok'); sys.stdout.flush()
1897 print(
'POW...', end=
''); sys.stdout.flush()
1898 assert isinstance(POW, UrmCutlandProg), type(POW)
1900 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1902 for a
in range(10
if debug.assertspeed >= debug.ASSERT_NORMAL
else 5):
1905 (i, nb) = m.run(POW)
1906 assert nb <= len(POW)*((a + 2)**(b + 1)), (a, b, i, len(POW), nb,
1907 len(POW)*((a + 1)**(b + 1)))
1908 assert i == len(POW) + 1, (a, b, i, len(POW), nb)
1909 assert len(m) == 7, (a, b, len(m))
1910 assert m[1] == a**b, (a, b, m[1], a**b)
1911 assert m[2] == a, (a, b, m[2])
1913 assert m[3] == 0, (a, b, m[3])
1914 assert m[4] == 0, (a, b, m[4])
1915 assert m[5] == 0, (a, b, m[5])
1918 assert m[3] == 0, (a, b, m[3])
1920 assert m[3] == a**(b - 1), (a, b, m[3], a**(b - 1))
1921 assert m[4] == a, (a, b, m[4])
1922 assert m[5] == a, (a, b, m[5])
1923 assert m[6] == b, (a, b, m[6])
1924 assert m[7] == b, (a, b, m[7])
1925 if debug.assertspeed < debug.ASSERT_NORMAL:
1926 print(debug.assertspeed_str(), end=
'')
1927 print(
'ok'); sys.stdout.flush()
1930 print(
'GCD...', end=
''); sys.stdout.flush()
1931 assert isinstance(GCD, UrmCutlandProg), type(GCD)
1933 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1935 for a
in range(50
if debug.assertspeed >= debug.ASSERT_NORMAL
else 20):
1938 if (a == 0)
and (b == 0):
1939 (i, nb) = m.run(GCD, nb=10000)
1940 assert nb == 10000, (i, nb)
1942 (i, nb) = m.run(GCD)
1943 assert i == len(GCD) + 1, (a, b, i, len(GCD), nb)
1944 assert nb < 1000, (a, b, i, nb)
1945 assert nb <= len(GCD)*(max(a, b) + 2), (a, b, i, len(GCD), nb,
1946 len(GCD)*(max(a, b) + 2))
1947 assert len(m) == 5, (a, b, len(m))
1948 gcd_a_b = fractions.gcd(a, b)
1949 assert m[1] == gcd_a_b, (a, b, m[1], gcd_a_b)
1950 assert m[2] == 0, (a, b, m[2])
1951 if (a == 0)
or (b == 0):
1952 assert m[3] == 0, (a, b, m[3])
1954 assert m[3] != 0, (a, b)
1955 assert gcd_a_b <= m[3], (a, b, m[3], gcd_a_b)
1956 assert m[3]%gcd_a_b == 0, (a, b, m[3], gcd_a_b,
1958 assert m[3] <= max(a, b), (a, b, m[3])
1960 assert m[4] == 0, (a, b, m[4])
1962 assert m[4] == gcd_a_b, (a, b, m[4], gcd_a_b)
1963 assert m[5] == 0, (a, b, m[5])
1964 if debug.assertspeed < debug.ASSERT_NORMAL:
1965 print(debug.assertspeed_str(), end=
'')
1966 print(
'ok'); sys.stdout.flush()
1969 print(
'FIBONACCI2...', end=
''); sys.stdout.flush()
1970 assert isinstance(FIBONACCI2, UrmCutlandProg), type(FIBONACCI2)
1971 for inst
in FIBONACCI2:
1972 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1974 for n
in range(20
if debug.assertspeed >= debug.ASSERT_NORMAL
else 10):
1976 (i, nb) = m.run(FIBONACCI2)
1977 assert i == len(FIBONACCI2) + 1, (n, i, len(FIBONACCI2), nb)
1978 assert nb <= len(FIBONACCI2)*(nat32.fibonacci(n + 1) + 1), \
1979 (n, i, len(FIBONACCI2),
1980 nb, nat32.fibonacci(n + 1),len(FIBONACCI2)*(nat32.fibonacci(n + 1) + 1))
1981 assert len(m) == 5, (n, len(m))
1982 assert m[1] == nat32.fibonacci(n), (n, m[1], nat32.fibonacci(n))
1983 assert m[2] == nat32.fibonacci(n + 1), (n, m[2], nat32.fibonacci(n + 1))
1984 assert m[3] == nat32.fibonacci(n), (n, m[3], nat32.fibonacci(n))
1985 assert m[4] == n, (n, m[4])
1986 assert m[5] == n, (n, m[5])
1987 if debug.assertspeed < debug.ASSERT_NORMAL:
1988 print(debug.assertspeed_str(), end=
'')
1989 print(
'ok'); sys.stdout.flush()
1992 print(
'FACTORIAL...', end=
''); sys.stdout.flush()
1993 assert isinstance(FACTORIAL, UrmCutlandProg), type(FACTORIAL)
1994 for inst
in FACTORIAL:
1995 assert (inst.inst() != T)
or (inst.a() != inst.b()), inst
1997 for n
in range(9
if debug.assertspeed >= debug.ASSERT_NORMAL
else 5):
1999 (i, nb) = m.run(FACTORIAL)
2000 assert i == len(FACTORIAL) + 1, (n, i, len(FACTORIAL), nb)
2001 assert nb <= len(FACTORIAL)*(math.factorial(n) + 1), \
2002 (n, i, len(FACTORIAL), nb, math.factorial(n),
2003 len(FACTORIAL)*(math.factorial(n) + 1))
2004 assert len(m) == 6, (n, len(m))
2005 assert m[1] == math.factorial(n), (n, m[1], math.factorial(n))
2006 assert m[2] == n, (n, m[2])
2008 assert m[3] == 0, (n, m[3])
2010 assert m[3] == math.factorial(n - 1), (n, m[3], math.factorial(n - 1))
2011 assert m[4] == n, (n, m[4])
2012 assert m[5] == n, (n, m[5])
2013 assert m[6] == n, (n, m[6])
2014 if debug.assertspeed < debug.ASSERT_NORMAL:
2015 print(debug.assertspeed_str(), end=
'')
2016 print(
'ok'); sys.stdout.flush()