<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Parlons Code</title>
	<atom:link href="https://blog.developpez.com/gnuvince/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/gnuvince</link>
	<description></description>
	<lastBuildDate>Mon, 29 Nov 2010 04:10:23 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Simulateur de machines de Turing (partie 1)</title>
		<link>https://blog.developpez.com/gnuvince/p9539/ocaml/simulateur_de_machines_de_turing_partie_1</link>
		<comments>https://blog.developpez.com/gnuvince/p9539/ocaml/simulateur_de_machines_de_turing_partie_1#comments</comments>
		<pubDate>Mon, 29 Nov 2010 04:10:23 +0000</pubDate>
		<dc:creator><![CDATA[gnuvince]]></dc:creator>
				<category><![CDATA[ocaml]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet est le premier d&#8217;une série dans lequel je vais décrire l&#8217;implantation d&#8217;un simulateur simple de machines de Turing dans le langage OCaml. De billet en billet, nous verrons comment améliorer le code pour obtenir un simulateur plus rapide. Commençons tout d&#8217;abord par définir une machine de Turing; si vous ouvrez un livre d&#8217;informatique théorique, vous y trouverez une définition très formelle et un peu intimidante des machines de Turing avec des lettres grecques: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce billet est le premier d&rsquo;une série dans lequel je vais décrire l&rsquo;implantation d&rsquo;un simulateur simple de machines de Turing dans le langage OCaml.  De billet en billet, nous verrons comment améliorer le code pour obtenir un simulateur plus rapide.</p>
<p>Commençons tout d&rsquo;abord par définir une machine de Turing; si vous ouvrez un livre d&rsquo;informatique théorique, vous y trouverez une définition très formelle et un peu intimidante des machines de Turing avec des lettres grecques:</p>
<p>MT = (Q, &#931;, &#915;, &#948;, q0, qa, qr)</p>
<p>Qu&rsquo;est-ce que c&rsquo;est ce charabia?  Commençons par décrire plus informellement une machine de Turing et son fonctionnement:</p>
<pre>
+----------+
|          |
| CONTRÔLE |----
|          |   |
+----------+   |  TÊTE
               |
               v
 +---+---+---+---+---+---+---+---+---
     |   |   | a | b | c | b | a |
 +---+---+---+---+---+---+---+---+---
            RUBAN
</pre>
<p>La machine de Turing possède trois partie:</p>
<ul>
<li>Le contrôle: cette partie contient une seule information: l&rsquo;état actuel de la machine de Turing.  C&rsquo;est le programmeur qui décide de l&rsquo;état qui va dans le contrôle.</li>
<li>Le ruban: un ruban infini vers la gauche et vers la droite où se trouve dans chaque cellule un caractère ou un blanc.</li>
<li>La tête: la tête pointe vers un caractère dans le ruban.  La tête peut se déplacer à gauche ou à droite d&rsquo;une seule cellule et elle ne peut pas rester sur place.</li>
</ul>
<p>Si on reprend la définition formelle de la machine de Turing, voici ce que signifie chacune des 7 composantes du tuple:</p>
<ul>
<li>Q: un ensemble fini d&rsquo;états (ceux-ci iront dans le contrôle)</li>
<li>&#931;: l&rsquo;alphabet d&rsquo;entrée: un ensemble fini et non-vide de caractères acceptés pour l&rsquo;entrée.</li>
<li>&#915;: l&rsquo;alphabet du ruban: un sur-ensemble de &#931; qui décrit les caractères acceptés sur le ruban.  Au minimum, &#915; = &#931; plus le caractère blanc.</li>
<li>&#948;: la fonction de transition: elle prend la configuration actuelle de la machine de Turing (l&rsquo;état actuel, et le caractère pointé par la tête) et donne le nouvel état, le caractère à écrire sur le ruban et la direction dans laquelle la tête de lecture doit se déplacer.</li>
<li>q0: l&rsquo;état initial</li>
<li>qa: l&rsquo;état acceptant: nous utiliserons toujours le mot &laquo;&nbsp;ACCEPTE&nbsp;&raquo;</li>
<li>qr: l&rsquo;état rejetant: nous utiliserons toujours le mot &laquo;&nbsp;REJETTE&nbsp;&raquo;</li>
</ul>
<p>Voici un exemple d&rsquo;une machine de Turing qui accepte si le mot donné en entrée possède un nombre pair de &lsquo;a&rsquo; et rejette si l&rsquo;entrée possède un nombre impair de &lsquo;a':</p>
<pre>
pair,   a, pair,     a, D
pair,   b, impair,   b, D
pair,   _, ACCEPTE,  _, D

impair, a, impair,   a, D
impair, b, pair,     b, D
impair, _, REJETTE,  _, D
</pre>
<p>Chaque ligne possède 5 informations séparées par des virgules: les deux premières sont les configurations possibles: est-ce qu&rsquo;on est dans l&rsquo;état &laquo;&nbsp;pair&nbsp;&raquo; et que le caractère sous la tête de lecture est &lsquo;a&rsquo;?  Si oui, le nouvel état est &laquo;&nbsp;pair&nbsp;&raquo;, on écrit &lsquo;a&rsquo; sur le ruban et on déplace la tête de lecture vers la droite.</p>
<p>Ce programme va lire tous les caractères de l&rsquo;entrée et les réécrire sur le ruban.  Quand il lit un &lsquo;b&rsquo;, il change l&rsquo;état du contrôleur de pair à impair et vice-versa.  Quand on lit le caractère blanc, cela indique la fin de l&rsquo;entrée et on accepte si on est dans l&rsquo;état pair et on rejette si on est dans l&rsquo;état impair.</p>
<p>Nous allons concevoir un simulateur qui prendra en entrée un tel fichier, un état de départ et une chaîne d&rsquo;entrée et qui simulera la machine sur cet entrée.  La machine affichera à la fin si on accepte ou rejette l&rsquo;entrée et en combien d&rsquo;étapes:</p>
<pre>
$ ./tm pair.tm aaaba pair
ACCEPTE (6)
</pre>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faire des cycles avec des fermetures</title>
		<link>https://blog.developpez.com/gnuvince/p9538/code/faire_des_cycles_avec_des_fermetures</link>
		<comments>https://blog.developpez.com/gnuvince/p9538/code/faire_des_cycles_avec_des_fermetures#comments</comments>
		<pubDate>Sun, 28 Nov 2010 21:24:21 +0000</pubDate>
		<dc:creator><![CDATA[gnuvince]]></dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans une discussion sur des structures de contrôle alternatives, une personne sur le site social StackOverflow disait désirer un contrôle qu&#8217;il appelait alternate qui permettrait de boucler parmis un choix de valeurs. Voici quelques exemples d&#8217;usages qu&#8217;il donnait: table_row_color = alternate(RED, GREEN, BLUE); player_color = alternate(color_list); // cycles through list items alternate( led_on(), led_off() ); Pour les gens qui utilisent des langages avec des fermetures (closures en anglais) ont la possibilité d&#8217;implémenter ce genre de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans une discussion sur des structures de contrôle alternatives, une personne sur le site social <a href="http://www.stackoverflow.com">StackOverflow</a> disait désirer un contrôle qu&rsquo;il appelait <i>alternate</i> qui permettrait de boucler parmis un choix de valeurs.  Voici quelques exemples d&rsquo;usages qu&rsquo;il donnait:</p>
<pre>
table_row_color = alternate(RED, GREEN, BLUE);

player_color = alternate(color_list); // cycles through list items

alternate(
    led_on(),
    led_off()
);
</pre>
<p>Pour les gens qui utilisent des langages avec des fermetures (closures en anglais) ont la possibilité d&rsquo;implémenter ce genre de mécanisme eux mêmes.  Je vais démontrer comme le faire avec le langage JavaScript, mais il est trivial de convertir ce code dans un autre langage.</p>
<pre>
function cycle(choix) {
    var i = 0;
    return function () {
        var courant = i;
        i = (i + 1) % choix.length;
        return choix[courant];
    };
}
</pre>
<p>Si simple, n&rsquo;est-ce pas?  Voici une brève explication de comment cela fonctionne.</p>
<p>À l&rsquo;intérieur du corps de cycle(), nous avons deux variables locales: choix et i.  La fonction anonyme que nous retournons a accès à ces variables.  Et plus intéressant, même si choix et i tombent hors-portée après le retour, la fonction anonyme retournée peut quand même y accéder.  Cela lui permet donc de manipuler choix et i et de leur assigner des nouvelles valeurs.</p>
<p>Voici maintenant comment on pourrait se servir de ce code:</p>
<pre>
var couleurs = cycle(["bleu", "blanc", "rouge"]); // couleurs est une fonction

for (var i = 0; i &lt; 5; ++i) {
    console.log(couleurs());
}

// Sortie =&gt;
// blue
// blanc
// rouge
// bleu
// blanc
</pre>
<p>Il est également possible de cycler des fonctions:</p>
<pre>
var salutations = cycles([
    function (s) { return "Bonjour " + s; },
    function (s) { return "Salut " + s; },
    function (s) { return "Allo " + s; }
]);

for (var i = 0; i &lt; 3; ++i) {
    console.log(salutations()("developpez.net"));
}

// Sortie =&gt;
// Bonjour developpez.net
// Salut developpez.net
// Allo developpez.net
</pre>
<p>Si vous ne connaissez pas beaucoup les fermetures et qu&rsquo;elles sont disponibles dans votre langage de programmation de choix, je vous suggère fortement de trouver un livre ou un tutoriel qui vous fera découvrir leur puissance.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
