<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://cygal.info/blog/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Dissidents - prolog</title>
  <link>http://cygal.info/blog/index.php/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Wed, 25 Aug 2010 16:39:12 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>« Ca ne marchera pas ...</title>
    <link>http://cygal.info/blog/index.php/post/Ca-ne-marchera-pas</link>
    <guid isPermaLink="false">urn:md5:dfc82c01f9845324d0d87dc8ec15a362</guid>
    <pubDate>Mon, 05 Nov 2007 16:16:00 +0100</pubDate>
    <dc:creator>Dark-Side</dc:creator>
        <category>Algo</category>
        <category>IA</category><category>prolog</category><category>sex</category>    
    <description>... Vous savez pourquoi ? Parce que ça nous amuse. Vous trouvez quelque chose pour m’emmerder, je trouve quelque chose pour vous emmerder. C’est un jeu et je vais gagner. J’ai un coup d’avance. Vous êtes déjà emmerdé. »&lt;br /&gt;&lt;ins&gt;&lt;strong&gt;Edité le 25/12/07&lt;/strong&gt;&lt;/ins&gt;&lt;br /&gt;    Je crois que je vais faire comme ça désormais, toujours commencer mes articles par une citation sans rapport (ou du moins sans rapport logique apparent).&lt;br /&gt;
Bref, je suis là parce que j'avais dis que je vous montrerai une IA en &lt;strong&gt;&lt;em&gt;prolog&lt;/em&gt;&lt;/strong&gt;. Donc voilà je vais vous en montrer une.&lt;br /&gt;
Pour qu'on soit d'accord tout de suite : &lt;ol&gt;&lt;li&gt;oui le code est sale&lt;/li&gt;
&lt;li&gt;oui je m'en fous&lt;/li&gt;
&lt;li&gt;non je n'accepterai aucune remarque&lt;/li&gt;
&lt;/ol&gt;
Bien. Ceci mis au clair, voici le code : &lt;pre&gt;est_vainqueur(papier, pierre).&lt;br /&gt;est_vainqueur(pierre, ciseaux).&lt;br /&gt;est_vainqueur(ciseaux, papier).&lt;br /&gt;&lt;br /&gt;corres(pierre, 1).&lt;br /&gt;corres(papier, 2).&lt;br /&gt;corres(ciseaux, 3).&lt;br /&gt;&lt;br /&gt;corresp(perdu, 0).&lt;br /&gt;corresp(nul, 1).&lt;br /&gt;corresp(gagne, 2).&lt;br /&gt;&lt;br /&gt;same(X, X).&lt;br /&gt;&lt;br /&gt;plus_joue([Papier,Pierre,Ciseaux], X) :- Pierre &amp;gt;= Papier, Pierre &amp;gt;= Ciseaux, same(X, pierre).&lt;br /&gt;plus_joue([Papier,Pierre,Ciseaux], X):- Pierre =&amp;lt; Papier, Papier &amp;gt;= Ciseaux, same(X, papier).&lt;br /&gt;plus_joue([Papier,Pierre,Ciseaux], X) :- Ciseaux &amp;gt;= Papier, Pierre =&amp;lt; Ciseaux, same(X, ciseaux).&lt;br /&gt; &lt;br /&gt;traiter(perdu, pierre, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).&lt;br /&gt;traiter(perdu, ciseaux, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).&lt;br /&gt;traiter(perdu, papier, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).&lt;br /&gt; &lt;br /&gt;traiter(nul, papier, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).&lt;br /&gt;traiter(nul, pierre, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).&lt;br /&gt;traiter(nul, ciseaux, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).&lt;br /&gt; &lt;br /&gt;traiter(gagne, ciseaux, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).&lt;br /&gt;traiter(gagne, papier, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).&lt;br /&gt;traiter(gagne, pierre, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).&lt;br /&gt; &lt;br /&gt;alea(X) :- random(1,4, X).&lt;br /&gt;&lt;br /&gt;stat(Coups, Nb) :- &lt;br /&gt;	plus_joue(Coups, Adv),&lt;br /&gt;	est_vainqueur(Coup, Adv),&lt;br /&gt;        corres(Coup, Nb).&lt;br /&gt;&lt;br /&gt;jouer(Coups, X) :- &lt;br /&gt;	random(1, 11, Al),&lt;br /&gt;	(Al =:= 1 -&amp;gt; alea(Nb);&lt;br /&gt;	stat(Coups, Nb)),&lt;br /&gt;	write(Nb), nl,&lt;br /&gt;	write('Gagné, nul ou perdu ?'), nl,&lt;br /&gt;	read(Score),&lt;br /&gt;	corresp(S, Score),&lt;br /&gt;	traiter(S, Coup, Coups, X).&lt;br /&gt;&lt;br /&gt;boucle(Coups) :-&lt;br /&gt;	jouer(Coups, N_coups),&lt;br /&gt;	write('1 pour rejouer, 0 pour arreter.'), nl,&lt;br /&gt;	read(X),&lt;br /&gt;	X =:= 1,&lt;br /&gt;	boucle(N_coups).&lt;br /&gt;	&lt;br /&gt;init :- boucle([0,0,0]).&lt;/pre&gt;
&lt;br /&gt;
Naturellement je vais faire quelques remarque, alors il faut savoir que c'est mon premier code en prolog, c'est pour ça qu'il est sale. Ensuite : ce code est surement optimisable (surtout au niveau des fonctions &lt;em&gt;traiter&lt;/em&gt;) mais ce n'est pas important, ce qu'il faut voir c'est que même si ce code est un peu plus long qu'un code OCaml bien optimisé il est quand même bien plus facile à comprendre par un non initié. Et c'est &lt;strong&gt;ça&lt;/strong&gt; l'important !
&lt;br /&gt;&lt;br /&gt;
Voilà, bonne journée !</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Ca-ne-marchera-pas#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Ca-ne-marchera-pas#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/42</wfw:commentRss>
      </item>
    
  <item>
    <title>Même les foetus mentent ...</title>
    <link>http://cygal.info/blog/index.php/post/Meme-les-foetus-mentent</link>
    <guid isPermaLink="false">urn:md5:d4f94b55791878ea8d83a74515d956ed</guid>
    <pubDate>Sun, 04 Nov 2007 15:24:00 +0100</pubDate>
    <dc:creator>Dark-Side</dc:creator>
        <category>Script</category>
        <category>prolog</category><category>sex</category>    
    <description>Bonjour, bonjour.&lt;br /&gt;
Bon avant de commencer : le titre n'a rien à voir avec l'article, mais depuis 3x17 je reve de sortir cette phrase, alors bon ... c'est fait ! :]    &lt;h3&gt;Le prolog&lt;/h3&gt;

&lt;h4&gt;Présentation&lt;/h4&gt;

Le Prolog est un langage de programmation. Sa particularité est d'être un langage de programmation &lt;i&gt;logique&lt;/i&gt;, d'où son nom : PROgrammation LOGique. Ce type de programmation se démarque des autres par son absence de notions tels que les fonctions (qu'on retrouve bien entendu, mais c'est pas aussi explicite qu'en impératif ou même en fonctionnel) ou boucles, ...&lt;br /&gt;
Par contre on y trouve des idées intéressantes. En effet un programme développé en prolog repose sur un ensembles de &lt;b&gt;clauses&lt;/b&gt;, des &lt;i&gt;faits&lt;/i&gt; ou des &lt;i&gt;règles&lt;/i&gt;.&lt;br /&gt;
Il faut savoir que le &lt;b&gt;&lt;i&gt;prolog&lt;/i&gt;&lt;/b&gt; est très utilisé pour établir des &lt;i&gt;intelligences artificielles&lt;/i&gt;, en effet grâce on clauses on va très facilement définir le comportement de notre IA.
&lt;br /&gt;&lt;br /&gt;
&lt;h4&gt;Un code en exemple : factoriel&lt;/h4&gt;

Oui, je sais, j'ai dit que les fonctions n'éxistaient pas. Mais ça ne veut pas dire qu'on ne peut pas en créer, ça veut dire qu'elles sont moins apparentes que d'habitude.&lt;br /&gt;
Comment ça je suis tordu ?&lt;br /&gt;
Bref voici le code :
&lt;pre&gt;fact(0,1). % ceci est un fait
fact(X, Y) :- N is X-1, fact(N, M), Y is X * M. % et ça une règle&lt;/pre&gt;
Comme vous pouvez le voir la première clause est un fait, c-a-d que pour tout X fact(0, X) renverra X = 1. Ce qui est marrant avec les faits c'est que leur réciproque marche de la même manière, ainsi fact(X, 1) renverra toujours X = 0. Donc avec un unique fait on a déclaré deux clauses.&lt;br /&gt;
Un autre truc marrant c'est que si jamais vous demandez à l'interpreteur si la relation fact(0,2) est vrai il va gentillement vous répondre : «No.»&lt;br /&gt;
L'autre truc fun c'est que si après on avait écrit fact(0, 2). lorsqu'on aurait demandé fact(0, X). l'interpreteur nous aurait fait la liste de toutes les réponses possibles.
&lt;br /&gt;&lt;br /&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;

Il est vrai que je n'ai pas fini de vous détailler le code précédent mais je suis pas là pour vour apprendre à coder, juste pour vous faire découvrir.&lt;br /&gt;
J'essayerai de vous montrer une belle IA un de ces jours histoire que vous vous rendiez bien compte de l'interet du prolog. En attendant j'espère vous avoir suffisament intéressé pour que vous vous documentiez un peu sur le prolog.&lt;br /&gt;
Au revoir.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Liens externes :&lt;/h4&gt;
:: &lt;a href=&quot;http://fr.wikipedia.org/wiki/Prolog&quot;&gt;Le prolog sur wikipedia&lt;/a&gt;. (fr)&lt;br /&gt;
:: &lt;a href=&quot;http://bat710.univ-lyon1.fr/~csolnon/prolog.html&quot;&gt;Une bonne introduction pour débuter en prolog&lt;/a&gt;. (fr)&lt;br /&gt;
:: &lt;a href=&quot;http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html&quot;&gt;Un bon tuto&lt;/a&gt;. (en)</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Meme-les-foetus-mentent#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Meme-les-foetus-mentent#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/41</wfw:commentRss>
      </item>
    
</channel>
</rss>