Aller au contenu

Machine de Turing (1)⚓︎

Une machine de Turing est une machine abstraite imaginée par Turing en 1936. Elle est composée de quatre éléments:

  • un ruban de longueur infinie sur lequel on peut lire et écrire;

  • une tête de lecture et écriture, qui peut lire, écrire et se déplacer sur le ruban;

  • un état interne qui peut changer à chaque étape;

  • une table des transitions qui décrit les règles de "calcul", (écriture, déplacement, changement d'état), basées sur l'état en cours de la machine et ce qui est lu sur le ruban.

Le nombre d'états est fini et il y a un état initial. Le ruban est divisé en cases qui contiennent chacune un symbole. La tête peut se déplacer d'une case vers la gauche ou vers la droite. Elle peut lire ou écrire un symbole sur la case du ruban qui lui fait face.

Les différents états peuvent être notés "e_0", "e_1", "e_2", ..., "e_0" étant l'état initial.

Pour les symboles lus et écrits, on se limite à "0", "1", ou "_", ce dernier symbole représentant un blanc.

Pour les déplacements, on utilise "g" et "d" pour un déplacement de la tête vers la gauche ou vers la droite.

Une règle de calcul, une instruction, peut être représentée par un quadruplet. Par exemple la règle ("e_2", "1", "0", "e_1") signifie que si la machine est dans l'état "e_2" et qu'elle lit sur le ruban un "1", alors elle écrit un "0", (à la place du "1"), et passe dans l'état "e_1". La règle ("e_1", "0", "g", "e_1") signifie que si la machine est dans l'état "e_1" et qu'elle lit sur le ruban un "0", alors elle se déplace d'une case vers la gauche et reste dans l'état "e_1".

De manière générale, à chaque étape, soit la machine écrit un symbole, soit elle se déplace, soit elle s'arrête. Ce dernier cas se produit s'il n'y a pas de règle correspondant à l'état en cours avec le symbole lu.

Une machine de Turing particulière peut être considérée comme un algorithme ou comme une fonction écrite en langage Python.

Implémentation⚓︎

Pour gagner en efficacité, la table des transitions est réprésentée par un dictionnaire. Par exemple les deux règles ("e_0", "0", "d", "e_0") et ("e_0", "1", "0", "e_0") sont représentées par le dictionnaire: {("e_0", "0"): ("d", "e_0"), ("e_0", "1"): ("0", "e_0")} signifiant que si la machine est dans l'état "e_0" et lit un "0" la tête se déplace vers la droite et la machine reste dans l'état "e_0", si elle est dans l'état "e_0" et lit un "1" la tête écrit un "0" et la machine reste dans l'état "e_0".

Si le couple (etat, symbole_lu) n'est pas une clé du dictionnaire, la machine s'arrête.

Le ruban est représenté par une liste ruban. Chaque élément de la liste correspond à une case du ruban et la position de la tête est repérée par un indice.

Un élément de la liste peut être un "0", un "1" ou un "_". On l'obtient avec ruban[i].

Écrire "_" à la place d'un "0" ou d'un "1", soit ruban[i] = "_", revient à effacer le contenu de la case.

Les instructions i = i - 1 et i = i + 1 correspondent respectivement à un déplacement vers la gauche ou vers la droite de la tête.

Une machine de Turing doit produire un résultat après un nombre fini d'étapes donc n'utilise qu'un nombre fini de cases du ruban et un temps limité. On suppose donc la liste suffisammment grande pour pouvoir exécuter l'algorithme.

Question 1

Compléter la fonction machine qui prend en paramètres un dictionnaire, une liste et un entier, le dictionnaire et la liste représentant respectivement une table des transitions et un ruban décrits précédemment, l'entier est l'indice représentant la position initiale de la tête sur le ruban. Cet indice sera toujours le plus petit indice tels que le caractère lu par la tête est soit un "0" soit un "1".

La fonction modifie le ruban à l'aide de la table des transitions.

Cette fonction machine simule une machine de Turing universelle, c'est-à-dire que pour chaque table des transitions passée en argument, elle se comporte comme une machine de Turing particulière.

Exemple

L'exemple qui suit ne nécessite qu'un seul état, l'état initial "e_0". À chaque étape, si la tête lit un "0", elle se déplace vers la droite, sinon si elle lit un "1" elle écrit un "0", sinon elle s'arrête.

>>> table = {("e_0", "0"): ("d", "e_0"), ("e_0", "1"): ("0", "e_0")}  # la table
>>> ruban = ['_', '_', '1', '0', '1', '1', '0', '1', '_', '_']  # le ruban
>>> machine(table, ruban, 2)  # la tête est positionnée sur l'élément d'indice 3
>>> ruban
['_', '_', '0', '0', '0', '0', '0', '0', '_', '_']

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(40i2+edm3s7= 1o5w_lSnatf-)9h]6,crg[yPku8/050m0l0C0B0i0y0p0s0L0y0B0p0p0r010C0i0c010406050p0S0n0n0B0M0P040z0u0y0S0/0u0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0m0i0e0%0)0+0-0H0i0N0H0y1y0H0C0=050Y0d0y0l1t0*0,011x1z1B1z0C1H1J1F0C0d0u0m0 1G0M1g0C0H0%120p0c0B0A0-0j011L1v010D0!0l0A0B0n0l1F1-1/1@1N1`1J1}1 0=0a0s0Q0M0u0c0u0p0i150A0s0W1+0M0M0l0L2k18220A1g0U1)2x0C1%1$1(0m240-1B0A1|2h1F1q1s0(1M2H0i2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0M0|0y0=0s0t2u2)0?2(232+1N2-2/2;0j2@1/2_2v2G012~0B2:040s0o322w0@352|0-383a0s0g3e342)363k2;0v3o3g3q3i370u2.392;0J3v2`2*1u2}3A2 3b0q3F3h3I3j3K3C3b0T3O3x3Q3z3B3l0G3W2{3Y3s040t0h3%3H2Q3Z3L0t2?192^3w3(3:3*0t313^331h2Z182N2A0m2E360L1Z201g451j432%402w054a0W2!3X3:0R0=0W0D3o3G360w2;4u3P3|0D0=0|0L1x2J4z4o1^0;040f4I3{2,0=1U0l4O3/4K0=0K3o0s4v3y0A0=0M0S0d1/4U364L4Y4i3b4#3)0=0i4-3y4L0F0b3v0s504!4A4Q040X0B0C4Z4?3:0u0=0r59531N0p1=04010l0x0h014 515a54135f4J1N5c045e4;525w3j4(4*4,4;5s1N4L0O4`4@044_5I5g0-4L0I5q505J0-4q040w1x1J5v4P5K0=4N5R5D370=56585.5*5T4X5)4V2}0=5u5@5|5_040F5{360u4x5P175B5Y5:044S5N3:4L4~4;06516m5C5^6d0B2s0i166g4W044:2#6o616d5=653y5y5A6z6c4%6e0B1I4T604.0=0O5-2%5S6C0Y5?6U5/4/6E5O5 6Z6p4|5V6k6n5r6V5!0i4t6b6V6K6r2t6@5/6G6H2^6A365i0=010N5p6P4{0=6j2#6l6.6n6J4^6$5b5d7i545Q6I6V5y0E7l1N0n0i0=3@7c7e713y5!0l1B6?7o5/6_6s6u6|6p6~7s0-735k0m776)6B6i5W7z7A5O7n706c6G7O6d7#337Z7j040k7)7u7w7X6m6c7C0#6O7U6Q047b3_7Y6/7H5F4+6a7}79045M787!6v5+046,7G7M7k7L6B7I6{7y7e7g046(7$7p8k8i8m855H883Y5L8e5E5P8E015U3F0U4l0l2x2Y8N441r462A2C2y1Y1!2A6M1J2x450@0U0W0Y0!0p04.
Question 2

Compléter, en utilisant le minimum d'états distincts, la table des transitions table pour une machine qui remplace les "0" par des "1" et les "1" par des "0". Le nom de l'état initial est toujours "e_0".

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pv(u0i2edms= 1}o_lSnatf)h{,crgyPb/050k0j0x0w0h0t0m0o0D0t0w0m0m0n010x0h0c010406050m0f0l0l0w0E0G040u0r0t0f0!0r0v050J0+0-0/0;0)0c040}1405170J1719140)0k0h0d0S0U0W0Y0A0h0F0A0t1n0A0x0%050N0I0t0j1i0V0X011m1o1q1o0x1w1y1u0x0I0r0k0;1v0E150x0A0S0@0m0c0w0v0Y0i011A1k010y0P0j0v0w0l0j1u1Y1!1)1C1,1y1/1;0%0a0o0H0E0r0c0r0m0h0`0v0o0L1W0E0E0j0D290}1@0v150J1U2m0x1S1R1T0k1_0Y1q0v1.261u1f1h0T1B2w0h2y0v1O1g1u0c2f152k2m2Q0*1Z2a2E1*2J0E0.0t0%0p2j2U0(2T1^2W1C2Y2!0%0i2(1!2m2N0j2m2C2p0k2t2v010D1O1=152|182O2+2l2?3a320L2P2U300v0%1J0j3b040o39300r0%0n3m3o2k300$040B0e3m3p2-0Y0m1%04010j0s0g013C3w3E013y0C3u3D1j1C3G0%013M3O3g3Q3y0z0b3U3P3W0Y3y3B0~2)3V2F013Y3I0p3N3=2@3@1*3S3,3%3.3_3H3J0s3|3$2,453)3T3~2l3v443^3:4b2V453`483#4g3f4c4k0%4f2Q4i4u1*4p4a4s401C3)3+4s4z4n4v043;2S3-3^4p4r4P4j414w434A3X473K4D4U4Z3/0%0z4x2)060o4:4;4;4F4*4N4m304p4$3}4(4L4W044-2@4K4{474T3?4Q513*4Y504G0%4O594V4!3Z0k4~5i4)3R4X4J4@463Z3K583 5a5f044,5d3x5g4`3Q4|495n5y5j4^534h5t4C5K3a5z4^5c5s5U5q4_4E5Y4p5m5G4d5r4y5Q4#3L5S4t5e5V0q3m0)0J3d2`16380J362n2~0}2q2p1N1P2p0w1x5|5 1g2*5 0M0O0Q04.
Question 3

Compléter, en utilisant le minimum d'états distincts, la table des transitions table pour une machine qui remplace les "0" et les "1" par des "_". Autrement dit, la machine efface le ruban. Le nom de l'état initial est toujours "e_0".

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbvMà(0i2edm3;s= 1j}o_lSAênatf)h{R,qcrg.éyPkuè/050m0l0E0D0j0y0q0s0M0y0D0q0q0r010E0j0c010406050q0U0n0n0D0N0R040z0w0y0U0;0w0C0s020D0n0c0p0s0J0l0~0N0L0U0l0q050W0{0}0 110_0c041p1w051z0W1z1B1w0_0m0j0e0)0+0-0/0H0j0O0H0y1P0H0E0@050!0d0y0l1K0,0.011O1Q1S1Q0E1Y1!1W0E0d0w0m111X0N1x0E0H0)140q0c0D0C0/0k011$1M010F0$0l0C1c0l1W2123281(2b1!2e0n2g040a0s0S0N0w0c0w0q0j17190Y1 0N0N0l0M2B1p2i0C1x0W1}2N0E1{1`1|0m2k0/1S0C2d2y1W1H1J0*1%2X0j2Z0C1@1I1W0c2G1x2L2N2^0`22192)292.0N0~0y0@0t2K2|0^2{2j2~1(30320@0k36232N2=0l2N2%2Q0m2U2W010M1@2q0X1I1x3k2@373h2M053t0Y3A3a1L3c0@1/0l3C040s392}3J0/0w0@0r3O3Q2L3r0?040I0h3O3R3r0q2604010l0x0i013*3!3b0/3$0K3Y3+3`013-0@013?3^2|3#0@0G0b3~3_3T013$3)1q3B4d2*413.010x3@4i3i3 4e3|4c4740423/3;0t4q2`4k293$0G3}4r2M3Z4x4u0@4h4E4N4l4z3:3=4D4j4S4G0@4J2^4M3I4T4n4C464)4!044a4w4.1(4g4-3S4*434p4_48044$374(4`294U4B4X4s4F4@49513i060s5g5h5h4t4l4^4K3H541(560x4,5n5k4/5d4L5v5q4n4}5u5a3{494b5n534 4Q4Y4?0/4U0m583D5E4f4#4=5p5O4n3;455D4Z5b4:0v3O0_0W3F3l1y2?1p3n1p0E3p5@2S2O1?1^2Q0D1Z5/0W3n1v5o3r2G0n0x0F0D0T3;0H0o0@1h1j1l1n0s5H2`1C381w0A1.2d2B0K0s2z0s180s2Z1 0C2z0m0V2G0s1l000U190q0l0U0y0s0Q0!0E3Q5.4A4W1p6X0s0D0e2H0s1!0(2,0q2R0U2I0j180q0b066y0+0s0E0B0E1#1S6V6M6W3u3/5#6#0l0y1!6S0M0N2A743G4o4q6X6w6y797b710s733E75015t787a1#0Q7d7f7s7h5C786V7m7x6*7B6X7i6!750s7n1#6O0s0m0Q0c0+0M1#6(0N0(6{0m2v2A0l6w2d0s2G6.236V0E0w0U0u7@7#7T237$006T0D6V7C3l4V77751f0D0y0w7{6{0~0M1O6C0l0F6b7Y0s0d0j7-6+7g84863G7P6V8q833/7v750P3Q6p650f0#7$1#2=0w1Z0V2p7P6.6J1m0)0Z6 0s8e8g1#6C0q000 0N6~8J0,6w6{6}8V3t0C0;0C8S0g6x1#7U7W0D7Y0N0s7!7$0D7T7)6 0P1y38630Z0#0%04.