Il s'agit de simuler à l'aide du langage Python l'exécution d'une machine de Turing
Voici les conventions utilisées
Voici le constructeur
class M_T:
long_ruban = 10
def __init__(self,table:dict,entree:list,etat_final:int):
self.table = table
self.etat = 0
self.entree = entree
self.ruban = entree+[-1]*(M_T.long_ruban - len(entree))
self.pos = 0
self.etat_final = etat_final
calculer() qui renvoie() -1 s'il y a blocage sinon renvoie le tuple constitué de l'entrée et de la bande si la machine arrive à l'état final
On suppose que la table de transitions ne génère pas de calcul infini
La fonction eval() de Python permet d'évaluer une expression
Par exemple
>>> x = 2
>>> y = 5
>>> eval('x+y')
7
Un autre exemple
>>> x = 2
>>> y = 5
>>> eval('x>y')
False
Par contre une instruction comme x = 5 n'est pas une expression de même qu'une boucle for ou while
Pour évaluer un code Python contenant plusieurs instructions avec éventuellement une boucle for ou while, on utilise la fonction exec()
Par exemple on peut afficher le plus grand de deux nombres x et y ainsi
>>> max_2 = "if x > y:print(x)\nelse:print(y)"
>>> x = 5
>>> y = 2
>>> exec(max_2)
5
On affiche la valeur maximale contenue dans une liste d'entiers l
>>> max_l = "m = l[0]\nfor i in range(len(l)):\n\tif l[i] > m:m = l[i]\nprint(m)"
>>> l = [2, 5, 1]
>>> exec(max_l)
5
On utilise \t pour l'indentation on aurait pu aussi utiliser 4 caractères
Un programme universel Python exécutant n'importe quel programme Python prgm en entrée sous la forme d'une chaîne de caractères à partir de n'importe quel entrée *args est (à condition de bien écrire prgm )
def universel(prgm,*args):
exec(prgm)
Voici un exemple de programme qui concatène une liste de mots quelconque
>>> prgm="res=''\nfor mot in args:res += mot\nprint(res)"
>>> universel(prgm,'py','thon')
python
Ecrire le programme du tri par sélection sous la forme d'une chaîne de caractères et l'exécuter sur une liste d'entiers quelconque