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).
Bref, je suis là parce que j'avais dis que je vous montrerai une IA en prolog. Donc voilà je vais vous en montrer une.
Pour qu'on soit d'accord tout de suite :
  1. oui le code est sale
  2. oui je m'en fous
  3. non je n'accepterai aucune remarque
Bien. Ceci mis au clair, voici le code :
est_vainqueur(papier, pierre).
est_vainqueur(pierre, ciseaux).
est_vainqueur(ciseaux, papier).

corres(pierre, 1).
corres(papier, 2).
corres(ciseaux, 3).

corresp(perdu, 0).
corresp(nul, 1).
corresp(gagne, 2).

same(X, X).

plus_joue([Papier,Pierre,Ciseaux], X) :- Pierre >= Papier, Pierre >= Ciseaux, same(X, pierre).
plus_joue([Papier,Pierre,Ciseaux], X):- Pierre =< Papier, Papier >= Ciseaux, same(X, papier).
plus_joue([Papier,Pierre,Ciseaux], X) :- Ciseaux >= Papier, Pierre =< Ciseaux, same(X, ciseaux).

traiter(perdu, pierre, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).
traiter(perdu, ciseaux, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).
traiter(perdu, papier, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).

traiter(nul, papier, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).
traiter(nul, pierre, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).
traiter(nul, ciseaux, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).

traiter(gagne, ciseaux, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).
traiter(gagne, papier, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).
traiter(gagne, pierre, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).

alea(X) :- random(1,4, X).

stat(Coups, Nb) :-
plus_joue(Coups, Adv),
est_vainqueur(Coup, Adv),
corres(Coup, Nb).

jouer(Coups, X) :-
random(1, 11, Al),
(Al =:= 1 -> alea(Nb);
stat(Coups, Nb)),
write(Nb), nl,
write('Gagné, nul ou perdu ?'), nl,
read(Score),
corresp(S, Score),
traiter(S, Coup, Coups, X).

boucle(Coups) :-
jouer(Coups, N_coups),
write('1 pour rejouer, 0 pour arreter.'), nl,
read(X),
X =:= 1,
boucle(N_coups).

init :- boucle([0,0,0]).

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 traiter) 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 ça l'important !

Voilà, bonne journée !