{% extends "articles/complexite-et-machine-de-turing/_layout.html" %}
{% import "articles/complexite-et-machine-de-turing/_decklist.html" as decklist with context %}

{% block section %}
{% trans trimmed
	infest=card("Infest"),
	rotlung_reanimator=card("Rotlung Reanimator"),
	xathrid_necromancer=card("Xathrid Necromancer"),
	ancient_tomb=card("Ancient Tomb"),
	lotus_petal=card("Lotus Petal"),
	grim_monolith=card("Grim Monolith"),
	power_artifact=card("Power Artifact"),
	staff_of_domination=card("Staff of Domination"),
	gemstone_array=card("Gemstone Array"),
	djinn_illuminatus=card("Djinn Illuminatus"),
	reito_lantern=card("Reito Lantern"),
	memnarch=card("Memnarch"),
	stolen_identity=card("Stolen Identity"),
	donate=card("Donate"),
	artificial_evolution=card("Artificial Evolution"),
	glamerdye=card("Glamerdye"),
	prismatic_lace=card("Prismatic Lace"),
	fathom_feeder=card("Fathom Feeder"),
	karn_liberated=card("Karn Liberated"),
	capsize=card("Capsize"),
	decklist=decklist.deck(),
	cloak_of_invisibility=card("Cloak of Invisibility"),
	shared_triumph=card("Shared Triumph"),
	fungus_sliver=card("Fungus Sliver"),
	steely_resolve=card("Steely Resolve"),
	dread_of_night=card("Dread of Night"),
	wild_evocation=card("Wild Evocation"),
	recycle=card("Recycle"),
	privileged_position=card("Privileged Position"),
	blazing_archon=card("Blazing Archon"),
	vigor=card("Vigor"),
	wheel_of_sun_and_moon=card("Wheel of Sun and Moon"),
	mesmeric_orb=card("Mesmeric Orb"),
	prismatic_omen=card("Prismatic Omen"),
	choke=card("Choke"),
	olivia_voldaren=card("Olivia Voldaren"),
	cleansing_beam=card("Cleansing Beam"),
	coalition_victory=card("Coalition Victory"),
	soul_snuffers=card("Soul Snuffers"),
	illusory_gains=card("Illusory Gains"),
	incarnation=card("Incarnation")
%}
<h2>Une machine de Turing en carte Magic</h2>
<p>
	Assez tourné autour du pot, il est temps de vous dire ce qu'est exactement une machine de
	Turing.
</p>
<p>
	En théorie une machine de Turing est composée de quatre choses :
</p>
<ul>
	<li>
		d'un ruban comportant une infinité de cases dans lesquelles on pourra inscrire des
		caractères.
	</li>
	<li>
		d'une tête de lecture qui peut lire le contenu d'une case mais aussi qui peut y inscrire un
		nouveau caractère.
	</li>
	<li>
		d'un registre d'état. Notre machine peut être dans un certain nombre d'états et en fonction
		de son état fera des actions différentes.
	</li>
	<li>
		d'une table d'actions qui va décrire quelles actions doit faire la machine à chaque étape.
		(Ecrire, déplacer la tête de lecture vers la droite ou la gauche du ruban, changer d'état)
	</li>
</ul>
<p>
	A première vu cette machine n'a pas l'air de faire grand chose en comparaison de nos
	ordinateurs. En gros elle écrit des caractères sur un ruban en se déplaçant le long de ce
	ruban. Au cours de ce programme elle peut potentiellement changer d'état et finalement
	lorsqu'elle se trouve dans une position pour laquelle elle n'a plus d'instruction elle
	s'arrête. En réalité, une machine de Turing a une puissance de calcul équivalente à celui de la
	plupart des langages de programmation tel que le C ou le Java. Oui, rien que ça !
</p>
<ul>
	<li>
		<p>
			<strong>Comment faire pour représenter un ruban avec des cartes Magic ?</strong>
		<p>
		<p>
			L'idée sera d'utiliser des créatures sur le champ de bataille à la place des cases. La
			case  sous la tête de lecture sera matérialisés par un jeton 2/2. Les cases situées
			immédiatement à gauche et à droite seront matérialisées par des jetons 3/3, puis les
			cases suivantes par des jetons 4/4 et ainsi de suites. Pour bien différencier les cases
			situées à gauche de la tête de  lecture des cases situées à droite de la tête de
			lecture on considérera que les cases à droite  correspondront à des jetons de couleur
			verte et que les cases à gauche correspondront à des  jetons de couleur blanche. Quant
			à la 2/2 correspondant à la case sous la tête de lecture on a  à priori pas de
			contrainte pour sa couleur.
		</p>
	</li>
	<li>
		<p>
			<strong>Comment faire pour avoir des caractères dans les cases du ruban ?</strong>
		</p>
		<p>
			Pour cela il faudrait pouvoir donner à chaque jeton une caractéristique que l'on
			associerait à un caractère. L'idée va être de se servir des types de créatures. Il en
			existe à Magic largement assez pour pouvoir associer à chaque caractère un type de
			créature. J'en profite pour faire remarquer que la tête de lecture peut changer le
			caractère de la case qu'elle lit, cela signifie qu'il va falloir trouver un effet qui
			va affecter uniquement le jeton 2/2 et pas les autres jetons. Lancer un sort tel que
			{{ infest }} semble le moyen idéal. La mort du jeton 2/2 pourrait alors déclencher un
			trigger créant un nouveau jeton 2/2 d'un autre type ce qui correspondrait exactement au
			fait de réécrire un caractère sous la tête de lecture. Pour cela pas de soucis il
			suffit d'utiliser au choix {{ rotlung_reanimator }} ou {{ xathrid_necromancer }} pour
			lesquels on aurait modifié les types de créatures et couleurs présents dans leur texte.
		</p>
	</li>
	<li>
		<p>
			<strong>Comment décaler le ruban vers la droite ou la gauche ?</strong>
		</p>
		<p>
			Pour décaler le ruban vers la droite, il suffit d'ajouter un marqueur +1/+1 à toutes
			les créatures blanches et de mettre un marqueur -1/-1 à toutes les créatures vertes et
			inversement pour décaler le ruban vers la gauche.
		</p>
		<p>
			On comprend très vite que pour que cette méthode puisse marcher il faut que le jeton 2/
			2 soit vert lorsque l'on souhaite décaler le ruban vers la droite et qu'il soit blanc
			lorsqu'on veut décaler le ruban vers la gauche. En réalité le problème doit être pris à
			l'envers en considérant que la couleur du jeton 2/2 va définir la direction du décalage.
		</p>
	</li>
</ul>
<p>
	Bon tout ce qu'on a fait là n'est que théorique et il faut maintenant arriver à construire cela
	dans une vraie partie de Magic et mettre les joueurs dans une situation où ils seront forcés
	d’exécuter le programme de notre choix. En fait toutes toutes les cartes dont on va avoir
	besoin pour mettre en place cette situation seront dans le deck du premier joueur la bien
	nommée Alice et celle-ci va créer notre machine de Turing au premier tour à condition qu'elle
	ait une main de départ parfaite. Et pour arriver à ça on va avoir besoin d'utiliser seulement
	42 cartes différentes sur les 20 000 existantes. Voici la decklist d'Alice :
</p>
{{ decklist }}
<p>
	C'est parti !
</p>
<p>
	Alice joue {{ ancient_tomb }} et trois {{ lotus_petal }}s afin de jouer {{ grim_monolith }} et
	{{ power_artifact }} afin de générer une quantité arbitrairement grande de mana incolore. Puis
	{{ staff_of_domination }} permet de piocher la totalité du deck et {{ gemstone_array }} fournit
	le mana coloré nécessaire pour jouer tous les sorts.
</p>
<p>
	A partir de là on a quelques cartes qui vont aider à la mise en place des choses :
</p>
<ul>
	<li>
		{{ djinn_illuminatus }} et {{ reito_lantern }} nous permettent de jouer tout nos sorts
		autant de fois qu'on le veut.
	</li>
	<li>
		{{ memnarch }} nous permet de transformer tous nos permanents en artefacts
	</li>
	<li>
		{{ stolen_identity }} nous permet du coup de faire autant de copies qu'on le souhaite de
		tous nos permanents.
	</li>
	<li>
		{{ donate }} nous permet de donner à notre adversaire tous les permanents que l'on souhaite.
	</li>
	<li>
		{{ artificial_evolution }} et {{ glamerdye }} vont permettre de modifier les textes à notre
		guise des permanents et {{ prismatic_lace }} de changer leur couleur.
	</li>
	<li>
		La bibliothèque de Bob et la main de Bob vont être entièrement exilées avec
		{{ fathom_feeder}}, {{ karn_liberated }} et {{ capsize }} (ciblant Karn).
	</li>
</ul>
<p>
	Grâce à {{ donate }} on va donner à Bob un certain nombre de permanents : 31
	{{ rotlung_reanimator }} et 7 {{ xathrid_necromancer }} dont les textes (types et couleurs) ont
	tous été soigneusement modifiés pour créer la table d'action de notre machine de Turing. En
	effet comme dit précédemment, on souhaite que lorsqu'un jeton 2/2 d'un certain type meurt, un
	jeton d'un autre type particulier soit créé et qu'il ait la couleur de notre choix. Tout ceci
	peut en effet être soigneusement préparé en amont grâce à {{ artificial_evolution }} et
	{{ glamerdye }}. Et qu'en est-il des jetons qui vont former la bande infinie de notre machine ?
	Et bien ces jetons sont créés à l'aide de {{ riptide_replicator }} et {{ capsize }}. Ainsi donc
	la table des actions ainsi que le ruban sont maintenant sous le contrôle de Bob, mais on ne va
	pas s'arrêter là. A côté de cette partie technique donc, on donne à Bob 5 autres permanents :
	{{ wild_evocation }}, {{ recycle }}, {{ privileged_position }}, {{ blazing_archon }},
	{{ vigor }}. Bob va ainsi se retrouver dans une situation un peu délicate. Il n'a aucune carte
	en main ou en bibliothèque mais ne meurt pas à la pioche parce qu'il contrôle {{ recycle }}. Il
	n'a pas non plus de mana ou de capacité à activer. Enfin il ne pourra pas non plus attaquer
	Alice avec ses créatures car celle-ci possède aussi comme on va le voir un
	{{ blazing_archon }}. En définitive Bob va donc demeurer simple spectateur pour le reste de la
	partie.
</p>
<p>
	Du côté d'Alice il y a aussi une mise en place particulière et complexe comportant :
</p>
<ul>
	<li>
		36 {{ cloak_of_invisibility }} enchantant 7 {{ xathrid_necromancer }} et 29
		{{ rotlung_reanimator }} de Bob. On reviendra sur le rôle de ces auras plus tard mais vous
		vous doutez bien qu'elles vont jouer un rôle important.
	</li>
	<li>
		2 {{ shared_triumph }}, 2 {{ rotlung_reanimator }}, 1 {{ fungus_sliver }}, 1
		{{ steely_resolve }} avec des types modifiés dans le texte.
	</li>
	<li>
		2 {{ dread_of_night }} avec la couleur modifié.
	</li>
</ul>
<p>
	A côté de ça, Alice contrôle aussi quelques permanents auxquels on va s'intéresser :
	{{ wheel_of_sun_and_moon }} l'enchantant, {{ vigor }}, {{ mesmeric_orb }}, {{ ancient_tomb }},
	{{ prismatic_omen }}, {{ choke }} et bien entendu {{ blazing_archon }}.
</p>
<p>
	En plus de ça Alice aura pris soin de cibler toutes les créatures avec {{ olivia_voldaren }}
	pour leur mettre un marqueur +1/+1 et leur donner un type commun.
</p>
<p>
	Enfin pour que la mise en place soit complète il faut que la bibliothèque d'Alice contienne
	dans cet ordre : {{ cleansing_beam }}, {{ coalition_victory }}, {{ soul_snuffers }}, placés
	ainsi grâce à {{ reito_lantern }} et seul doit rester dans sa main {{ infest }}. Tous les
	autres permanents ayant été exilés à l'aide de {{ karn_liberated }} et {{ capsize }} (Karn
	pouvant exiler aussi Capsize et lui même).
</p>
<p>
	Bien ! Regardons ce qu'il se passe maintenant du côté d'Alice.
</p>
<ul>
	<li>
		Tout d'abord, Bob contrôle un {{ blazing_archon }} donc Alice ne peut pas l'attaquer pour
		gagner la partie.
	</li>
	<li>
		Ensuite Alice contrôle un terrain : {{ ancient_tomb }}. Ce dernier est même un terrain de
		tous les types grâce {{ prismatic_omen }} mais hélas il ne se dégage pas à cause de
		{{ choke }}. Ainsi Alice tout comme Bob ne peut produire aucun mana.
	</li>
	<li>
		Alice a une carte en main qu'elle sera obligée de jouer à son upkeep à cause de
		{{ wild_evocation }} contrôlé par Bob. Une fois sa carte jouée, elle ira en dessous de sa
		bibliothèque puisqu'Alice est enchantée par {{ wheel_of_sun_and_moon }} ce qui l'obligera à
		jouer inlassablement les même cartes sans avoir non plus le moindre choix à effectuer
		jusqu'à la fin de la partie. Le programme se lance donc et les joueurs ne peuvent
		qu'assister impuissants au déroulement de l'algorithme et voir quel destin il leur réserve.
	</li>
</ul>
<ol>
	<li>
		<p>
			<strong>Tour 1</strong> :
		</p>
		<p>
			Au début de son entretien, Alice lance {{ infest }}. Elle va en réalité tuer ainsi
			l'unique jeton 2/2 contrôlé par Bob. Ce dernier suivant son type de créature va
			déclencher la capacité d'un {{ rotlung_reanimator }} ou d'un {{ xathrid_necromancer }}
			spécifique qui va créer un nouveau jeton d'une couleur (soit vert soit blanc), d'un
			type spécifique, soit dégagé, soit engagé. Ce jeton nouvellement créé va alors se
			retrouver enchanté par {{ illusory_gains }} et arriver sous le contrôle d'Alice. Vous
			l'aurez compris ce jeton donc sous le contrôle d'Alice correspond au jeton sous la tête
			de lecture.
		</p>
		<p>
			Je rappelle au passage que {{ infest }} n'a tué aucun {{ rotlung_reanimator }} ou
			{{ xathrid_necromancer }} car ces derniers ont un marqueur +1/+1 sur eux grâce à
			{{ olivia_voldaren }}.
		</p>
		<p>
			Enfin lors de sa phase de pioche Alice va piocher {{ cleansing_beam }}.
		</p>
	</li>
	<li>
		<p>
			<strong>Tour 2</strong> :
		</p>
		<p>
			A la phase de dégagement d'Alice le jeton enchanté par {{ illusory_gains }} va se
			dégager s'il était engagé et se faisant va meuler Alice d'une carte à cause de
			{{ mesmeric_orb }}, et donc {{ coalition_victory }} va se retrouver en dessous de la
			bibliothèque. On reviendra sur les conséquences de ce trigger plus tard lorsqu'il a
			lieu.
		</p>
		<p>
			Alice doit lancer maintenant {{ cleansing_beam }} et doit donc choisir une cible.
			Seulement grâce à {{ olivia_voldaren }}, toutes les créatures du champ de bataille
			partagent un même type de créature et ce type est justement celui que l'on a donné à
			{{ steely_resolve }} pour que ces créatures aient le linceul. Les créatures de Bob
			quand à elles ne peuvent pas être ciblées car il contrôle {{ privileged_position }}.
			Cela ne laisse qu'une seule cible valide pour Alice : le jeton enchantée par
			{{ illusory_gains }} qui vient d'arriver sous son contrôle. Comme dit précédemment, ce
			jeton est soit vert soit blanc. Comme Alice et Bob possèdent tous deux {{ vigor }} à la
			résolution de {{ cleansing_beam }}, ils vont placer deux marqueurs +1/+1 sur toutes les
			créatures qu'ils contrôlent qui sont de la même couleur que ce jeton.
		</p>
		<p>
			Lors de sa phase de pioche, Alice pioche {{ coalition_victory }} si la carte n'a pas
			été mise en dessous de sa bibliothèque, et dans le cas contraire elle pioche
			{{ soul_snuffers }}
		</p>
	</li>
	<li>
		<p>
			<strong>Tour 3</strong> :
		</p>
		<ul>
			<li>
				Si {{ coalition_victory }} a été meulé au tour précédant, Alice lance
				{{ soul_snuffers }} qui met un marqueur -1/-1 sur toutes les créatures. Finalement,
				entre ce tour et le tour précédant, toutes les créatures d'une couleur ont gagné -1/
				-1 et toutes celles de l'autre couleur ont gagné +1/+1. Il s'agit du décalage du
				ruban vers la droite ou la gauche tel qu'on l'a évoqué précédemment qui a lieu ici.
				Le hic c'est qu'à force de mettre des marqueurs -1/-1 sur toutes nos créatures, on
				risque de tuer nos créatures. Pour les sauver rien de plus simple, on leur donne à
				la fois la couleur verte et la couleur blanche avec {{ prismatic_lace }} et donc il
				recevront toujours deux marqueurs +1/+1 avant de recevoir leur marqueur -1/-1 ce
				qui les sauvera. Voilà qui marche bien, mais pas pour {{ vigor }} car son effet qui
				ajoute des marqueurs ne fonctionne pas sur lui même... C'est à ce niveau là
				qu'intervient {{ fungus_sliver }}. Il suffit de changer le type de créature dans
				son texte par {{ incarnation }} et là on est enfin bon.
			</li>
			<li>
				Si {{ coalition_victory }} n'a pas été meulé, alors {{ soul_snuffers }} est joué
				lors d'un tour 4. Cela crée donc un cycle de longueur 4 si le jeton est arrivé
				dégagé ou de longueur 3 si le jeton est arrivé engagé. L'intérêt de ce décalage est
				de modifier l'état de la machine de Turing. En effet après un cycle de longueur
				impair les {{ rotlung_reanimator }} et {{ xathrid_necromancer }} qui seront
				déphasés par les {{ cloak_of_invisibility }} ne sont plus les mêmes ! C'est avec
				cette utilisation astucieuse du déphasage que l'on obtient deux états pour notre
				machine. Ce changement d'état est donc prévu dans la table des actions par
				l'utilisation de {{ xathrid_necromancer }} plutôt que de {{ rotlung_reanimator }}.
				Et il se trouve que deux états différents étaient justement ce qu'il fallait pour
				cette preuve.
			</li>
		</ul>
	</li>
</ol>
<p>
	Mais qu'en est-il de la fin de partie ? Et bien parmi tous les caractères encodés par notre
	machine de Turing il y a un symbole en particulier qui correspond à un symbole d'arrêt. Ce type
	de créature lorsqu'il est mis dans un cimetière crée un jeton particulier dégagé de couleur
	bleu chez Alice. Or Alice possède grâce à {{ prismatic_lace }} déjà des permanents rouges,
	verts, noirs et blancs mais aucun bleu ! Aussi grâce à {{ prismatic_omen }} Alice possède aussi
	un terrain de chaque type. Ainsi lorsqu'elle lancera {{ coalition_victory }} elle gagnera la
	partie. Si en revanche ce programme ne s'arrête pas alors selon les règles de Magic la partie
	se termine par un Match nul. Ainsi l'issu de la partie dépend uniquement de la faculté qu'à un
	certain programme à s'arrêter.
</p>
<p>
	J'ai en définitive volontairement passé sous silence certaines parties techniques (oui, oui...)
	de cette démonstration mathématique pas comme les autres et pour tout ceux qui souhaiteraient
	lire la publication originale, je vous renvoie vers les liens externes situés à la fin de cet
	article. J'espère néanmoins vous avoir donné une bonne idée de ce qui a été démontré et comment
	cela a été démontré.
</p>
{% endtrans %}
{% endblock %}
