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

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+twki9][5h)6050i0B0K0u0N0p0b0r0h0p0u0b0b0G010K0N0v010406050b0j0A0A0u0x0q040w0d0p0j0/0d0s050n0_0{0}0 0@0v04181f051i0n1i1k1f0@0i0N0l0%0)0+0-0S0N0m0S0p1y0S0K0=050Y0g0p0B1t0*0,011x1z1B1z0K1H1J1F0K0g0d0i0 1G0x1g0K0S0%120b0v0u0s0-0F011L1v010k0!0B0s0u0A0B1F1-1/1@1N1`1J1}1 0=0a0r0E0x0d0v0d0b0N150s0r0W1+0x0x0B0h2k18220s1g0n1)2x0K1%1$1(0i240-1B0s1|2h1F1q1s0(1M2H0N2J0s1Z1r1F0v2q1g2v2x2#0^1.2l2P1^2U0x0|0p0=0r0y2u2)0?2(232+1N2-2/2;0F2@1/2_2v2G012~0u2:040r0c322w0@352|0-383a0r0H3e342)363k2;0R3o3g3q3i370d2.392;0U3v2`2*1u2}3A2 3b0t3F3h3I3j3K3C3b0f3O3x3Q3z3B3l0O3W2{3Y3s040y0o3%3H2Q3Z3L0y2?192^3w3(3:3*0y313^331h2Z182N2A0i2E360h1Z201g451j432%402w054a0W2!3X3:0M0=0W0k3o3G360L2;4u3P3|0k0=0|0h1x2J4z4o1^0;040D4I3{2,0=1U0B4O3/4K0=0C3o0r4v3y0s0=0x0j0g1/4U364L4Y4i3b4#3)0=0N4-3y4L0T0I3v0r504!4A4Q040X0u0K4Z4?3:0d0=0G59531N0b1=04010B0e0o014 515a54135f4J1N5c045e4;525w3j4(4*4,4;5s1N4L0Q4`4@044_5I5g0-4L0P5q505J0-4q040L1x1J5v4P5K0=4N5R5D370=56585.5*5T4X5)4V2}0=5u5@5|5_040T5{360d4x5P175B5Y5:044S5N3:4L4~4;06516m5C5^6d0u2s0N166g4W044:2#6o616d5=653y5y5A6z6c4%6e0u1I4T604.0=0Q5-2%5S6C0Y5?6U5/4/6E5O5 6Z6p4|5V6k6n5r6V5!0N4t6b6V6K6r2t6@5/6G6H2^6A365i0=010m5p6P4{0=6j2#6l6.6n6J4^6$5b5d7i545Q6I6V5y0z7l1N0A0N0=3@7c7e713y5!0B1B6?7o5/6_6s6u6|6p6~7s0-735k0i776)6B6i5W7z7A5O7n706c6G7O6d7#337Z7j040J7)7u7w7X6m6c7C0#6O7U6Q047b3_7Y6/7H5F4+6a7}79045M787!6v5+046,7G7M7k7L6B7I6{7y7e7g046(7$7p8k8i8m855H883Y5L8e5E5P8E015U3F0n4l0B2x2Y8N441r462A2C2y1Y1!2A6M1J2x450@0n0W0Y0!0b04.
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

.128013so_bcdufvg/0ly napSr1me,(P2=}:tih{)050g0x0F0r0G0n0b0p0f0n0r0b0b0C010F0G0s010406050b0h0w0w0r0u0o040t0c0n0h0!0c0q050l0+0-0/0;0)0s040}1405170l1719140)0g0G0j0S0U0W0Y0H0G0k0H0n1n0H0F0%050N0e0n0x1i0V0X011m1o1q1o0F1w1y1u0F0e0c0g0;1v0u150F0H0S0@0b0s0r0q0Y0B011A1k010i0P0x0q0r0w0x1u1Y1!1)1C1,1y1/1;0%0a0p0A0u0c0s0c0b0G0`0q0p0L1W0u0u0x0f290}1@0q150l1U2m0F1S1R1T0g1_0Y1q0q1.261u1f1h0T1B2w0G2y0q1O1g1u0s2f152k2m2Q0*1Z2a2E1*2J0u0.0n0%0v2j2U0(2T1^2W1C2Y2!0%0B2(1!2m2N0x2m2C2p0g2t2v010f1O1=152|182O2+2l2?3a320L2P2U300q0%1J0x3b040p39300c0%0C3m3o2k300$040I0z3m3p2-0Y0b1%04010x0d0m013C3w3E013y0y3u3D1j1C3G0%013M3O3g3Q3y0J0E3U3P3W0Y3y3B0~2)3V2F013Y3I0v3N3=2@3@1*3S3,3%3.3_3H3J0d3|3$2,453)3T3~2l3v443^3:4b2V453`483#4g3f4c4k0%4f2Q4i4u1*4p4a4s401C3)3+4s4z4n4v043;2S3-3^4p4r4P4j414w434A3X473K4D4U4Z3/0%0J4x2)060p4:4;4;4F4*4N4m304p4$3}4(4L4W044-2@4K4{474T3?4Q513*4Y504G0%4O594V4!3Z0g4~5i4)3R4X4J4@463Z3K583 5a5f044,5d3x5g4`3Q4|495n5y5j4^534h5t4C5K3a5z4^5c5s5U5q4_4E5Y4p5m5G4d5r4y5Q4#3L5S4t5e5V0D3m0)0l3d2`16380l362n2~0}2q2p1N1P2p0r1x5|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

.128013s3o_;èbcdufvgM/0lyàq nAaêpS.r1meh,(P2=}:jtkiR{)é050j0G0Q0y0S0r0b0v0i0r0y0b0b0M010Q0S0A010406050b0k0F0F0y0D0s040B0d0r0k0;0d0w0v020y0F0A0f0v0T0G0~0D0u0k0G0b050p0{0}0 110_0A041p1w051z0p1z1B1w0_0j0S0m0)0+0-0/0H0S0n0H0r1P0H0Q0@050!0h0r0G1K0,0.011O1Q1S1Q0Q1Y1!1W0Q0h0d0j111X0D1x0Q0H0)140b0A0y0w0/0L011$1M010l0$0G0w1c0G1W2123281(2b1!2e0F2g040a0v0K0D0d0A0d0b0S17190Y1 0D0D0G0i2B1p2i0w1x0p1}2N0Q1{1`1|0j2k0/1S0w2d2y1W1H1J0*1%2X0S2Z0w1@1I1W0A2G1x2L2N2^0`22192)292.0D0~0r0@0E2K2|0^2{2j2~1(30320@0L36232N2=0G2N2%2Q0j2U2W010i1@2q0X1I1x3k2@373h2M053t0Y3A3a1L3c0@1/0G3C040v392}3J0/0d0@0M3O3Q2L3r0?040U0J3O3R3r0b2604010G0e0q013*3!3b0/3$0I3Y3+3`013-0@013?3^2|3#0@0V0O3~3_3T013$3)1q3B4d2*413.010e3@4i3i3 4e3|4c4740423/3;0E4q2`4k293$0V3}4r2M3Z4x4u0@4h4E4N4l4z3:3=4D4j4S4G0@4J2^4M3I4T4n4C464)4!044a4w4.1(4g4-3S4*434p4_48044$374(4`294U4B4X4s4F4@49513i060v5g5h5h4t4l4^4K3H541(560e4,5n5k4/5d4L5v5q4n4}5u5a3{494b5n534 4Q4Y4?0/4U0j583D5E4f4#4=5p5O4n3;455D4Z5b4:0N3O0_0p3F3l1y2?1p3n1p0Q3p5@2S2O1?1^2Q0y1Z5/0p3n1v5o3r2G0F0e0l0y0R3;0H0c0@1h1j1l1n0v5H2`1C381w0x1.2d2B0I0v2z0v180v2Z1 0w2z0j0g2G0v1l000k190b0G0k0r0v0W0!0Q3Q5.4A4W1p6X0v0y0m2H0v1!0(2,0b2R0k2I0S180b0O066y0+0v0Q0z0Q1#1S6V6M6W3u3/5#6#0G0r1!6S0i0D2A743G4o4q6X6w6y797b710v733E75015t787a1#0W7d7f7s7h5C786V7m7x6*7B6X7i6!750v7n1#6O0v0j0W0A0+0i1#6(0D0(6{0j2v2A0G6w2d0v2G6.236V0Q0d0k0P7@7#7T237$006T0y6V7C3l4V77751f0y0r0d7{6{0~0i1O6C0G0l6b7Y0v0h0S7-6+7g84863G7P6V8q833/7v750C3Q6p650o0#7$1#2=0d1Z0g2p7P6.6J1m0)0Z6 0v8e8g1#6C0b000 0D6~8J0,6w6{6}8V3t0w0;0w8S0t6x1#7U7W0y7Y0D0v7!7$0y7T7)6 0C1y38630Z0#0%04.