#Machine de Turing universelle # GAUCHE = 1 DROITE = -1 VIDE = -1 FIN = -1 #Ajouter 1 etat0={VIDE:(VIDE, GAUCHE,1)} etat1={0:(0, GAUCHE, 1), 1:(1, GAUCHE, 1),VIDE:(VIDE,DROITE,2)} etat2={0:(1,DROITE,FIN),1:(0,DROITE,2),VIDE:(1,DROITE,FIN)} ajouter1 = [etat0, etat1, etat2] #pour lancer le prgramme on lancer MT_univ(machine_turing,tableau) def MT_univ(machine_turing, entree): """machine_turing: un tableau qui represente le programme à faire entrer : un tableau qui represente le nombre à mdifier"""" etat = 0 pos = -1 process(etat, entree, pos) #process(0, [0,1,1], -1) def process(indEtat, tab, position): #Etat à executer etat = ajouter1[indEtat] # if (position < 0 or position >= len(tab)): lect = VIDE else: lect = tab[position] #cree un dico ecriSym, depl, nvIndiceEtat = etat[lect] #Fonctionnement du ruban infini if ecriSym != VIDE : if position >= len(tab): tab = tab.append(ecriSym) elif position < 0: tab = [ecriSym] + tab position = position + 1 else : tab[position] = ecriSym #Tête de lecture qui avance position = position + depl #Passe d'état en état if nvIndiceEtat == FIN : return tab else : return process(nvIndiceEtat, tab, position) #soustraire 1 : #etat0={VIDE:(VIDE, GAUCHE,1)} #etat1={"0":("0", GAUCHE, 1), "1":("1", GAUCHE, 1),VIDE:(VIDE,DROITE,2)} #etat2={"0":("1",DROITE,2),"1":("0",DROITE,FIN),VIDE:(VIDE,DROITE,FIN)} #soustraire1=[etat0,etat1,etat2] #Multiplication par 2 : #etat0={VIDE:(VIDE,GAUCHE,1)} #etat1={"0":("0",GAUCHE,1),"1":("1",GAUCHE,1),VIDE:("0",GAUCHE,FIN)} #multi_par_2=[etat0,etat1] #Double la liste par 2 #etat0={VIDE:(VIDE,GAUCHE,1)} #etat1={"0":("0", GAUCHE, 1), "1":("0", DROITE, 2),VIDE:(VIDE,DROITE,3)} #etat2={"0":("0", DROITE, 2), VIDE:("0", GAUCHE, 1)} #etat3={"0":("1", DROITE, 3), VIDE:(VIDE, DROITE, FIN)} #double_list_par2=[etat0,etat1,etat2,etat3]