X
    Categories: Oz

Programmation concurrente et systèmes multi-agents

Il y a quelques jours, un petit exercice nous était demandé après une séance de travaux pratique dans le cadre de notre cours de programmation (dans le fameux langage Oz).

Voici l’énoncé

Nous pouvons également implémenter un consommateur qui soit aussi un producteur, comme un filtre. Soient, par exemple, un agent qui génère un flot de 10000 entiers, un autre agent filtre les nombres impairs dans le flot et un dernier agent additionne les éléments du flot résultant. Le producteur, le filtre, et le consommateur fonctionnent dans des fils distincts, en formant un système multi-agents. Implémentez ces différents agents.

Ma solution était :
[sourcecode language= »erlang »]
declare

fun{Impair L}
case L of nil then nil
[] X|Xr then
if (X mod 2) \= 0 then X|{Impair Xr}
else {Impair Xr}
end
end
end

fun{ProduceInts N Acc}
{Delay 500}
if Acc > N then nil
else Acc|{ProduceInts N Acc+1}
end
end

fun{Sum L}
case L of nil then 0
[] X|Xr then 0+X+{Sum Xr}
end
end

declare Xs S1 S2
thread Xs = {ProduceInts 10000 1} end
thread S1 = {Impair Xs} end
thread S2 = {Sum S1} end
{Browse Xs}
{Browse S1}
{Browse S2}
[/sourcecode]

J’ai mis un délai d’attente d’une demi seconde dans la méthode ProduceInts pour qu’on puisse bien voir ce qui se passe (avec les Browse).

Pyo: Webmaster et blogueur depuis plusieurs années et étudiant en sciences informatiques (UCL, Belgique), j'ai un intérêt particulier pour les nouvelles technologies et le blogging. Sur ce blog, je vous fais part de mes découvertes qui, je l'espère, vous intéresseront.